]> Git Repo - VerusCoin.git/blob - patches
Test
[VerusCoin.git] / patches
1 diff -crB ./configure.ac ../../komodo-jl777/configure.ac
2 *** ./configure.ac      2017-01-03 10:40:50.155326332 +0000
3 --- ../../komodo-jl777/configure.ac     2017-01-03 09:49:08.848505929 +0000
4 ***************
5 *** 2,8 ****
6   AC_PREREQ([2.60])
7   define(_CLIENT_VERSION_MAJOR, 1)
8   define(_CLIENT_VERSION_MINOR, 0)
9 ! define(_CLIENT_VERSION_REVISION, 0)
10   define(_CLIENT_VERSION_BUILD, 50)
11   define(_ZC_BUILD_VAL, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, m4_incr(_CLIENT_VERSION_BUILD), m4_eval(_CLIENT_VERSION_BUILD < 50), 1, m4_eval(_CLIENT_VERSION_BUILD - 24), m4_eval(_CLIENT_VERSION_BUILD == 50), 1, , m4_eval(_CLIENT_VERSION_BUILD - 50)))
12   define(_CLIENT_VERSION_SUFFIX, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, _CLIENT_VERSION_REVISION-beta$1, m4_eval(_CLIENT_VERSION_BUILD < 50), 1, _CLIENT_VERSION_REVISION-rc$1, m4_eval(_CLIENT_VERSION_BUILD == 50), 1, _CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION-$1)))
13 --- 2,8 ----
14   AC_PREREQ([2.60])
15   define(_CLIENT_VERSION_MAJOR, 1)
16   define(_CLIENT_VERSION_MINOR, 0)
17 ! define(_CLIENT_VERSION_REVISION, 3)
18   define(_CLIENT_VERSION_BUILD, 50)
19   define(_ZC_BUILD_VAL, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, m4_incr(_CLIENT_VERSION_BUILD), m4_eval(_CLIENT_VERSION_BUILD < 50), 1, m4_eval(_CLIENT_VERSION_BUILD - 24), m4_eval(_CLIENT_VERSION_BUILD == 50), 1, , m4_eval(_CLIENT_VERSION_BUILD - 50)))
20   define(_CLIENT_VERSION_SUFFIX, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, _CLIENT_VERSION_REVISION-beta$1, m4_eval(_CLIENT_VERSION_BUILD < 50), 1, _CLIENT_VERSION_REVISION-rc$1, m4_eval(_CLIENT_VERSION_BUILD == 50), 1, _CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION-$1)))
21 Only in ../../komodo-jl777/contrib: bitcoin-cli.bash-completion
22 diff -crB ./contrib/bitcoind.bash-completion ../../komodo-jl777/contrib/bitcoind.bash-completion
23 *** ./contrib/bitcoind.bash-completion  2017-01-03 10:40:50.159326534 +0000
24 --- ../../komodo-jl777/contrib/bitcoind.bash-completion 2017-01-03 09:49:08.848505929 +0000
25 ***************
26 *** 1,102 ****
27 ! # bash programmable completion for bitcoind(1) and bitcoin-cli(1)
28 ! # Copyright (c) 2012,2014 Christian von Roques <[email protected]>
29   # Distributed under the MIT software license, see the accompanying
30   # file COPYING or http://www.opensource.org/licenses/mit-license.php.
31   
32 ! have bitcoind && {
33
34 ! # call $bitcoind for RPC
35 ! _bitcoin_rpc() {
36 !     # determine already specified args necessary for RPC
37 !     local rpcargs=()
38 !     for i in ${COMP_LINE}; do
39 !         case "$i" in
40 !             -conf=*|-proxy*|-rpc*)
41 !                 rpcargs=( "${rpcargs[@]}" "$i" )
42 !                 ;;
43 !         esac
44 !     done
45 !     $bitcoind "${rpcargs[@]}" "$@"
46 ! }
47
48 ! # Add bitcoin accounts to COMPREPLY
49 ! _bitcoin_accounts() {
50 !     local accounts
51 !     accounts=$(_bitcoin_rpc listaccounts | awk '/".*"/ { a=$1; gsub(/"/, "", a); print a}')
52 !     COMPREPLY=( "${COMPREPLY[@]}" $( compgen -W "$accounts" -- "$cur" ) )
53 ! }
54
55 ! _bitcoind() {
56       local cur prev words=() cword
57       local bitcoind
58   
59 !     # save and use original argument to invoke bitcoind
60 !     # bitcoind might not be in $PATH
61       bitcoind="$1"
62   
63       COMPREPLY=()
64       _get_comp_words_by_ref -n = cur prev words cword
65   
66 -     if ((cword > 4)); then
67 -         case ${words[cword-4]} in
68 -             listtransactions)
69 -                 COMPREPLY=( $( compgen -W "true false" -- "$cur" ) )
70 -                 return 0
71 -                 ;;
72 -             signrawtransaction)
73 -                 COMPREPLY=( $( compgen -W "ALL NONE SINGLE ALL|ANYONECANPAY NONE|ANYONECANPAY SINGLE|ANYONECANPAY" -- "$cur" ) )
74 -                 return 0
75 -                 ;;
76 -         esac
77 -     fi
78
79 -     if ((cword > 3)); then
80 -         case ${words[cword-3]} in
81 -             addmultisigaddress)
82 -                 _bitcoin_accounts
83 -                 return 0
84 -                 ;;
85 -             getbalance|gettxout|importaddress|importprivkey|listreceivedbyaccount|listreceivedbyaddress|listsinceblock)
86 -                 COMPREPLY=( $( compgen -W "true false" -- "$cur" ) )
87 -                 return 0
88 -                 ;;
89 -         esac
90 -     fi
91
92 -     if ((cword > 2)); then
93 -         case ${words[cword-2]} in
94 -             addnode)
95 -                 COMPREPLY=( $( compgen -W "add remove onetry" -- "$cur" ) )
96 -                 return 0
97 -                 ;;
98 -             getblock|getrawtransaction|gettransaction|listaccounts|listreceivedbyaccount|listreceivedbyaddress|sendrawtransaction)
99 -                 COMPREPLY=( $( compgen -W "true false" -- "$cur" ) )
100 -                 return 0
101 -                 ;;
102 -             move|setaccount)
103 -                 _bitcoin_accounts
104 -                 return 0
105 -                 ;;
106 -         esac
107 -     fi
108
109 -     case "$prev" in
110 -         backupwallet|dumpwallet|importwallet)
111 -             _filedir
112 -             return 0
113 -             ;;
114 -         getmempool|lockunspent|setgenerate)
115 -             COMPREPLY=( $( compgen -W "true false" -- "$cur" ) )
116 -             return 0
117 -             ;;
118 -         getaccountaddress|getaddressesbyaccount|getbalance|getnewaddress|getreceivedbyaccount|listtransactions|move|sendfrom|sendmany)
119 -             _bitcoin_accounts
120 -             return 0
121 -             ;;
122 -     esac
123
124       case "$cur" in
125 !         -conf=*|-pid=*|-loadblock=*|-wallet=*|-rpcsslcertificatechainfile=*|-rpcsslprivatekeyfile=*)
126               cur="${cur#*=}"
127               _filedir
128               return 0
129 --- 1,21 ----
130 ! # bash programmable completion for bitcoind(1) and bitcoin-qt(1)
131 ! # Copyright (c) 2012-2016 The Bitcoin Core developers
132   # Distributed under the MIT software license, see the accompanying
133   # file COPYING or http://www.opensource.org/licenses/mit-license.php.
134   
135 ! _zcashd() {
136       local cur prev words=() cword
137       local bitcoind
138   
139 !     # save and use original argument to invoke bitcoind for -help
140 !     # it might not be in $PATH
141       bitcoind="$1"
142   
143       COMPREPLY=()
144       _get_comp_words_by_ref -n = cur prev words cword
145   
146       case "$cur" in
147 !         -conf=*|-pid=*|-loadblock=*|-rootcertificates=*|-rpccookiefile=*|-wallet=*|-rpcsslcertificatechainfile=*|-rpcsslprivatekeyfile=*)
148               cur="${cur#*=}"
149               _filedir
150               return 0
151 ***************
152 *** 110,129 ****
153               return 0
154               ;;
155           *)
156 -             local helpopts commands
157   
158 !             # only parse --help if senseful
159               if [[ -z "$cur" || "$cur" =~ ^- ]]; then
160 !                 helpopts=$($bitcoind --help 2>&1 | awk '$1 ~ /^-/ { sub(/=.*/, "="); print $1 }' )
161               fi
162   
163 -             # only parse help if senseful
164 -             if [[ -z "$cur" || "$cur" =~ ^[a-z] ]]; then
165 -                 commands=$(_bitcoin_rpc help 2>/dev/null | awk '$1 ~ /^[a-z]/ { print $1; }')
166 -             fi
167
168 -             COMPREPLY=( $( compgen -W "$helpopts $commands" -- "$cur" ) )
169
170               # Prevent space if an argument is desired
171               if [[ $COMPREPLY == *= ]]; then
172                   compopt -o nospace
173 --- 29,42 ----
174               return 0
175               ;;
176           *)
177   
178 !             # only parse -help if senseful
179               if [[ -z "$cur" || "$cur" =~ ^- ]]; then
180 !                 local helpopts
181 !                 helpopts=$($bitcoind -help 2>&1 | awk '$1 ~ /^-/ { sub(/=.*/, "="); print $1 }' )
182 !                 COMPREPLY=( $( compgen -W "$helpopts" -- "$cur" ) )
183               fi
184   
185               # Prevent space if an argument is desired
186               if [[ $COMPREPLY == *= ]]; then
187                   compopt -o nospace
188 ***************
189 *** 131,140 ****
190               return 0
191               ;;
192       esac
193 ! }
194
195 ! complete -F _bitcoind bitcoind bitcoin-cli
196 ! }
197   
198   # Local variables:
199   # mode: shell-script
200 --- 44,51 ----
201               return 0
202               ;;
203       esac
204 ! } &&
205 ! complete -F _zcashd zcashd
206   
207   # Local variables:
208   # mode: shell-script
209 Only in ../../komodo-jl777/contrib: bitcoin-tx.bash-completion
210 diff -crB ./contrib/DEBIAN/changelog ../../komodo-jl777/contrib/DEBIAN/changelog
211 *** ./contrib/DEBIAN/changelog  2017-01-03 10:40:50.155326332 +0000
212 --- ../../komodo-jl777/contrib/DEBIAN/changelog 2017-01-03 09:49:08.848505929 +0000
213 ***************
214 *** 1,3 ****
215 --- 1,21 ----
216 + zcash (1.0.3) jessie; urgency=medium
217
218 +   * 1.0.3 release.
219
220 +  -- Zcash Company <[email protected]>  Wed, 17 Nov 2016 15:56:00 -0700
221
222 + zcash (1.0.2) jessie; urgency=medium
223
224 +   * 1.0.2 release.
225
226 +  -- Zcash Company <[email protected]>  Mon, 07 Nov 2016 19:01:35 -0600
227
228 + zcash (1.0.1) jessie; urgency=medium
229
230 +   * 1.0.1 release.
231
232 +  -- Zcash Company <[email protected]>  Thu, 03 Nov 2016 23:21:09 -0500
233
234   zcash (1.0.0-sprout) jessie; urgency=medium
235   
236     * 1.0.0 release.
237 diff -crB ./contrib/DEBIAN/control ../../komodo-jl777/contrib/DEBIAN/control
238 *** ./contrib/DEBIAN/control    2017-01-03 10:40:50.155326332 +0000
239 --- ../../komodo-jl777/contrib/DEBIAN/control   2017-01-03 09:49:08.848505929 +0000
240 ***************
241 *** 10,16 ****
242   Vcs-Git: https://github.com/zcash/zcash.git
243   Vcs-Browser: https://github.com/zcash/zcash
244   Package: zcash
245 ! Version: 1.0.0-sprout
246   Architecture: amd64
247   Depends: libgomp1
248   Description: An implementation of the "Zerocash" protocol.
249 --- 10,16 ----
250   Vcs-Git: https://github.com/zcash/zcash.git
251   Vcs-Browser: https://github.com/zcash/zcash
252   Package: zcash
253 ! Version: 1.0.3
254   Architecture: amd64
255   Depends: libgomp1
256   Description: An implementation of the "Zerocash" protocol.
257 diff -crB ./contrib/DEBIAN/manpages/zcash-cli.1 ../../komodo-jl777/contrib/DEBIAN/manpages/zcash-cli.1
258 *** ./contrib/DEBIAN/manpages/zcash-cli.1       2017-01-03 10:40:50.155326332 +0000
259 --- ../../komodo-jl777/contrib/DEBIAN/manpages/zcash-cli.1      2017-01-03 09:49:08.848505929 +0000
260 ***************
261 *** 1,9 ****
262   .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.3.
263 ! .TH ZCASH-CLI "1" "October 2016" "Zcash RPC client version v1.0.0-409dcb7" "User Commands"
264   .SH NAME
265   zcash-cli \- RPC client for the Zcash daemon
266   .SH DESCRIPTION
267 ! Zcash RPC client version v1.0.0
268   .SS "Usage:"
269   .TP
270   zcash\-cli [options] <command> [params]
271 --- 1,9 ----
272   .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.3.
273 ! .TH ZCASH-CLI "1" "November 2016" "Zcash RPC client version v1.0.3" "User Commands"
274   .SH NAME
275   zcash-cli \- RPC client for the Zcash daemon
276   .SH DESCRIPTION
277 ! Zcash RPC client version v1.0.3
278   .SS "Usage:"
279   .TP
280   zcash\-cli [options] <command> [params]
281 diff -crB ./contrib/DEBIAN/manpages/zcashd.1 ../../komodo-jl777/contrib/DEBIAN/manpages/zcashd.1
282 *** ./contrib/DEBIAN/manpages/zcashd.1  2017-01-03 10:40:50.155326332 +0000
283 --- ../../komodo-jl777/contrib/DEBIAN/manpages/zcashd.1 2017-01-03 09:49:08.848505929 +0000
284 ***************
285 *** 1,9 ****
286   .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.3.
287 ! .TH ZCASHD "1" "October 2016" "Zcash Daemon version v1.0.0-409dcb7" "User Commands"
288   .SH NAME
289   zcashd \- Network daemon for interacting with the Zcash blockchain
290   .SH DESCRIPTION
291 ! Zcash Daemon version v1.0.0
292   .SS "Usage:"
293   .TP
294   zcashd [options]
295 --- 1,9 ----
296   .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.3.
297 ! .TH ZCASHD "1" "November 2016" "Zcash Daemon version v1.0.3" "User Commands"
298   .SH NAME
299   zcashd \- Network daemon for interacting with the Zcash blockchain
300   .SH DESCRIPTION
301 ! Zcash Daemon version v1.0.3
302   .SS "Usage:"
303   .TP
304   zcashd [options]
305 ***************
306 *** 62,68 ****
307   .HP
308   \fB\-par=\fR<n>
309   .IP
310 ! Set the number of script verification threads (\fB\-4\fR to 16, 0 = auto, <0 =
311   leave that many cores free, default: 0)
312   .HP
313   \fB\-pid=\fR<file>
314 --- 62,68 ----
315   .HP
316   \fB\-par=\fR<n>
317   .IP
318 ! Set the number of script verification threads (\fB\-8\fR to 16, 0 = auto, <0 =
319   leave that many cores free, default: 0)
320   .HP
321   \fB\-pid=\fR<file>
322 diff -crB ./contrib/gitian-descriptors/gitian-linux.yml ../../komodo-jl777/contrib/gitian-descriptors/gitian-linux.yml
323 *** ./contrib/gitian-descriptors/gitian-linux.yml       2017-01-03 10:40:50.159326534 +0000
324 --- ../../komodo-jl777/contrib/gitian-descriptors/gitian-linux.yml      2017-01-03 09:49:08.848505929 +0000
325 ***************
326 *** 1,5 ****
327   ---
328 ! name: "zcash-1.0.0"
329   enable_cache: true
330   distro: "debian"
331   suites:
332 --- 1,5 ----
333   ---
334 ! name: "zcash-1.0.3"
335   enable_cache: true
336   distro: "debian"
337   suites:
338 diff -crB ./depends/packages/miniupnpc.mk ../../komodo-jl777/depends/packages/miniupnpc.mk
339 *** ./depends/packages/miniupnpc.mk     2017-01-03 10:40:50.179327547 +0000
340 --- ../../komodo-jl777/depends/packages/miniupnpc.mk    2017-01-03 09:49:08.848505929 +0000
341 ***************
342 *** 3,8 ****
343 --- 3,9 ----
344   $(package)_download_path=http://miniupnp.free.fr/files
345   $(package)_file_name=$(package)-$($(package)_version).tar.gz
346   $(package)_sha256_hash=d434ceb8986efbe199c5ca53f90ed53eab290b1e6d0530b717eb6fa49d61f93b
347 + $(package)_patches=fix-solaris-compilation.patch strlen-before-memcmp.patch patch-strlen-patch.patch
348   
349   define $(package)_set_vars
350   $(package)_build_opts=CC="$($(package)_cc)"
351 ***************
352 *** 14,20 ****
353   define $(package)_preprocess_cmds
354     mkdir dll && \
355     sed -e 's|MINIUPNPC_VERSION_STRING \"version\"|MINIUPNPC_VERSION_STRING \"$($(package)_version)\"|' -e 's|OS/version|$(host)|' miniupnpcstrings.h.in > miniupnpcstrings.h && \
356 !   sed -i.old "s|miniupnpcstrings.h: miniupnpcstrings.h.in wingenminiupnpcstrings|miniupnpcstrings.h: miniupnpcstrings.h.in|" Makefile.mingw
357   endef
358   
359   define $(package)_build_cmds
360 --- 15,24 ----
361   define $(package)_preprocess_cmds
362     mkdir dll && \
363     sed -e 's|MINIUPNPC_VERSION_STRING \"version\"|MINIUPNPC_VERSION_STRING \"$($(package)_version)\"|' -e 's|OS/version|$(host)|' miniupnpcstrings.h.in > miniupnpcstrings.h && \
364 !   sed -i.old "s|miniupnpcstrings.h: miniupnpcstrings.h.in wingenminiupnpcstrings|miniupnpcstrings.h: miniupnpcstrings.h.in|" Makefile.mingw && \
365 !   patch -p2 < $($(package)_patch_dir)/fix-solaris-compilation.patch && \
366 !   patch -p2 < $($(package)_patch_dir)/strlen-before-memcmp.patch && \
367 !   patch -p2 < $($(package)_patch_dir)/patch-strlen-patch.patch
368   endef
369   
370   define $(package)_build_cmds
371 Only in ../../komodo-jl777/depends/patches: miniupnpc
372 Only in ../../komodo-jl777/doc: authors.md
373 diff -crB ./doc/developer-notes.md ../../komodo-jl777/doc/developer-notes.md
374 *** ./doc/developer-notes.md    2017-01-03 10:40:50.191328153 +0000
375 --- ../../komodo-jl777/doc/developer-notes.md   2017-01-03 09:49:08.848505929 +0000
376 ***************
377 *** 102,108 ****
378   If the code is behaving strangely, take a look in the debug.log file in the data directory;
379   error and debugging messages are written there.
380   
381 ! The -debug=... command-line option controls debugging; running with just -debug will turn
382   on all categories (and give you a very large debug.log file).
383   
384   The Qt code routes qDebug() output to debug.log under category "qt": run with -debug=qt
385 --- 102,108 ----
386   If the code is behaving strangely, take a look in the debug.log file in the data directory;
387   error and debugging messages are written there.
388   
389 ! The -debug=... command-line option controls debugging; running with just -debug or -debug=1 will turn
390   on all categories (and give you a very large debug.log file).
391   
392   The Qt code routes qDebug() output to debug.log under category "qt": run with -debug=qt
393 diff -crB ./doc/payment-api.md ../../komodo-jl777/doc/payment-api.md
394 *** ./doc/payment-api.md        2017-01-03 10:40:50.191328153 +0000
395 --- ../../komodo-jl777/doc/payment-api.md       2017-01-03 09:49:08.848505929 +0000
396 ***************
397 *** 29,35 ****
398   RPC calls by category:
399   
400   * Accounting: z_getbalance, z_gettotalbalance
401 ! * Addresses : z_getnewaddress, z_listaddresses
402   * Keys : z_exportkey, z_importkey, z_exportwallet, z_importwallet
403   * Operation: z_getoperationresult, z_getoperationstatus, z_listoperationids
404   * Payment : z_listreceivedbyaddress, z_sendmany
405 --- 29,35 ----
406   RPC calls by category:
407   
408   * Accounting: z_getbalance, z_gettotalbalance
409 ! * Addresses : z_getnewaddress, z_listaddresses, z_validateaddress
410   * Keys : z_exportkey, z_importkey, z_exportwallet, z_importwallet
411   * Operation: z_getoperationresult, z_getoperationstatus, z_listoperationids
412   * Payment : z_listreceivedbyaddress, z_sendmany
413 ***************
414 *** 55,60 ****
415 --- 55,61 ----
416   --- | --- | ---
417   z_getnewaddress | | Return a new zaddr for sending and receiving payments. The spending key for this zaddr will be added to the node’s wallet.<br><br>Output:<br>zN68D8hSs3...
418   z_listaddresses | | Returns a list of all the zaddrs in this node’s wallet for which you have a spending key.<br><br>Output:<br>{ [“z123…”, “z456...”, “z789...”] }
419 + z_validateaddress | | Return information about a given zaddr.<br><br>Output:<br>{"isvalid" : true,<br>"address" : "zcWsmq...",<br>"payingkey" : "f5bb3c...",<br>"transmissionkey" : "7a58c7...",<br>"ismine" : true}
420   
421   ### Key Management
422   
423 ***************
424 *** 70,76 ****
425   Command | Parameters | Description
426   --- | --- | ---
427   z_listreceivedbyaddress<br> | zaddr [minconf=1] | Return a list of amounts received by a zaddr belonging to the node’s wallet.<br><br>Optionally set the minimum number of confirmations which a received amount must have in order to be included in the result.  Use 0 to count unconfirmed transactions.<br><br>Output:<br>[{<br>“txid”: “4a0f…”,<br>“amount”: 0.54,<br>“memo”:”F0FF…”,}, {...}, {...}<br>]
428 ! z_sendmany<br> | fromaddress amounts [minconf=1] | _This is an Asynchronous RPC call_<br><br>Send funds from an address to multiple outputs.  The address can be either a taddr or a zaddr.<br><br>Amounts is a list containing key/value pairs corresponding to the addresses and amount to pay.  Each output address can be in taddr or zaddr format.<br><br>When sending to a zaddr, you also have the option of attaching a memo in hexadecimal format.<br><br>**NOTE:**When sending coinbase funds to a zaddr, the node's wallet does not allow any change. Put another way, spending a partial amount of a coinbase utxo is not allowed. This is not a consensus rule but a local wallet rule due to the current implementation of z_sendmany. In future, this rule may be removed.<br><br>Example of Outputs parameter:<br>[{“address”:”t123…”, “amount”:0.005},<br>,{“address”:”z010…”,”amount”:0.03, “memo”:”f508af…”}]<br><br>Optionally set the minimum number of confirmations which a private or transparent transaction must have in order to be used as an input.<br><br>The transaction fee will be determined by the node’s wallet.  Any transparent change will be sent to a new transparent address.  Any private change will be sent back to the zaddr being used as the source of funds.<br><br>Returns an operationid.  You use the operationid value with z_getoperationstatus and z_getoperationresult to obtain the result of sending funds, which if successful, will be a txid.
429   
430   ### Operations
431   
432 --- 71,77 ----
433   Command | Parameters | Description
434   --- | --- | ---
435   z_listreceivedbyaddress<br> | zaddr [minconf=1] | Return a list of amounts received by a zaddr belonging to the node’s wallet.<br><br>Optionally set the minimum number of confirmations which a received amount must have in order to be included in the result.  Use 0 to count unconfirmed transactions.<br><br>Output:<br>[{<br>“txid”: “4a0f…”,<br>“amount”: 0.54,<br>“memo”:”F0FF…”,}, {...}, {...}<br>]
436 ! z_sendmany<br> | fromaddress amounts [minconf=1] [fee=0.0001] | _This is an Asynchronous RPC call_<br><br>Send funds from an address to multiple outputs.  The address can be either a taddr or a zaddr.<br><br>Amounts is a list containing key/value pairs corresponding to the addresses and amount to pay.  Each output address can be in taddr or zaddr format.<br><br>When sending to a zaddr, you also have the option of attaching a memo in hexadecimal format.<br><br>**NOTE:**When sending coinbase funds to a zaddr, the node's wallet does not allow any change. Put another way, spending a partial amount of a coinbase utxo is not allowed. This is not a consensus rule but a local wallet rule due to the current implementation of z_sendmany. In future, this rule may be removed.<br><br>Example of Outputs parameter:<br>[{“address”:”t123…”, “amount”:0.005},<br>,{“address”:”z010…”,”amount”:0.03, “memo”:”f508af…”}]<br><br>Optionally set the minimum number of confirmations which a private or transparent transaction must have in order to be used as an input.<br><br>Optionally set a transaction fee, which by default is 0.0001 ZEC.<br><br>Any transparent change will be sent to a new transparent address.  Any private change will be sent back to the zaddr being used as the source of funds.<br><br>Returns an operationid.  You use the operationid value with z_getoperationstatus and z_getoperationresult to obtain the result of sending funds, which if successful, will be a txid.
437   
438   ### Operations
439   
440 ***************
441 *** 97,99 ****
442 --- 98,168 ----
443   z_getoperationresult <br>| [operationids] | Return OperationStatus JSON objects for all completed operations the node is currently aware of, and then remove the operation from memory.<br><br>Operationids is an optional array to filter which operations you want to receive status objects for.<br><br>Output is a list of operation status objects, where the status is either "failed", "cancelled" or "success".<br>[<br>{“operationid”: “opid-11ee…”,<br>“status”: “cancelled”},<br>{“operationid”: “opid-9876”, “status”: ”failed”},<br>{“operationid”: “opid-0e0e”,<br>“status”:”success”,<br>“execution_time”:”25”,<br>“result”: {“txid”:”af3887654…”,...}<br>},<br>]
444   z_getoperationstatus <br>| [operationids] | Return OperationStatus JSON objects for all operations the node is currently aware of.<br><br>Operationids is an optional array to filter which operations you want to receive status objects for.<br><br>Output is a list of operation status objects.<br>[<br>{“operationid”: “opid-12ee…”,<br>“status”: “queued”},<br>{“operationid”: “opd-098a…”, “status”: ”executing”},<br>{“operationid”: “opid-9876”, “status”: ”failed”}<br>]<br><br>When the operation succeeds, the status object will also include the result.<br><br>{“operationid”: “opid-0e0e”,<br>“status”:”success”,<br>“execution_time”:”25”,<br>“result”: {“txid”:”af3887654…”,...}<br>}
445   z_listoperationids <br>| [state] | Return a list of operationids for all operations which the node is currently aware of.<br><br>State is an optional string parameter to filter the operations you want listed by their state.  Acceptable parameter values are ‘queued’, ‘executing’, ‘success’, ‘failed’, ‘cancelled’.<br><br>[“opid-0e0e…”, “opid-1af4…”, … ]
446
447 + ## Asynchronous RPC call Error Codes
448
449 + Zcash error codes are defined in https://github.com/zcash/zcash/blob/master/src/rpcprotocol.h
450
451 + ### z_sendmany error codes
452
453 + RPC_INVALID_PARAMETER (-8) | _Invalid, missing or duplicate parameter_
454 + ---------------------------| -------------------------------------------------
455 + "Minconf cannot be negative" | Cannot accept negative minimum confirmation number.
456 + "Minimum number of confirmations cannot be less than 0" | Cannot accept negative minimum confirmation number.
457 + "From address parameter missing" | Missing an address to send funds from.
458 + "No recipients" | Missing recipient addresses.
459 + "Memo must be in hexadecimal format" | Encrypted memo field data must be in hexadecimal format.
460 + "Memo size of __ is too big, maximum allowed is __ " | Encrypted memo field data exceeds maximum size of 512 bytes.
461 + "From address does not belong to this node, zaddr spending key not found." | Sender address spending key not found.
462 + "Invalid parameter, expected object" | Expected object.
463 + "Invalid parameter, unknown key: __" | Unknown key.
464 + "Invalid parameter, expected valid size" | Invalid size.
465 + "Invalid parameter, expected hex txid" | Invalid txid.
466 + "Invalid parameter, vout must be positive" | Invalid vout.
467 + "Invalid parameter, duplicated address" | Address is duplicated.
468 + "Invalid parameter, amounts array is empty" | Amounts array is empty.
469 + "Invalid parameter, unknown key" | Key not found.
470 + "Invalid parameter, unknown address format" | Unknown address format.
471 + "Invalid parameter, size of memo" | Invalid memo field size.
472 + "Invalid parameter, amount must be positive" | Invalid or negative amount.
473 + "Invalid parameter, too many zaddr outputs" | z_address outputs exceed maximum allowed.
474 + "Invalid parameter, expected memo data in hexadecimal format" | Encrypted memo field is not in hexadecimal format.
475 + "Invalid parameter, size of memo is larger than maximum allowed __ " | Encrypted memo field data exceeds maximum size of 512 bytes.
476
477
478 + RPC_INVALID_ADDRESS_OR_KEY (-5) | _Invalid address or key_
479 + --------------------------------| ---------------------------
480 + "Invalid from address, no spending key found for zaddr" | z_address spending key not found.
481 + "Invalid output address, not a valid taddr."            | Transparent output address is invalid.
482 + "Invalid from address, should be a taddr or zaddr."     | Sender address is invalid.
483 + "From address does not belong to this node, zaddr spending key not found."  | Sender address spending key not found.
484
485
486 + RPC_WALLET_INSUFFICIENT_FUNDS (-6) | _Not enough funds in wallet or account_
487 + -----------------------------------| ------------------------------------------
488 + "Insufficient funds, no UTXOs found for taddr from address." | Insufficient funds for sending address.
489 + "Could not find any non-coinbase UTXOs to spend. Coinbase UTXOs can only be sent to a single zaddr recipient." | Must send Coinbase UTXO to a single z_address.
490 + "Could not find any non-coinbase UTXOs to spend." | No available non-coinbase UTXOs.
491 + "Insufficient funds, no unspent notes found for zaddr from address." | Insufficient funds for sending address.
492 + "Insufficient transparent funds, have __, need __ plus fee __" | Insufficient funds from transparent address.
493 + "Insufficient protected funds, have __, need __ plus fee __" | Insufficient funds from shielded address.
494
495 + RPC_WALLET_ERROR (-4) | _Unspecified problem with wallet_
496 + ----------------------| -------------------------------------
497 + "Could not find previous JoinSplit anchor" | Try restarting node with `-reindex`.
498 + "Error decrypting output note of previous JoinSplit: __"  |
499 + "Could not find witness for note commitment" | Try restarting node with `-reindex`.
500 + "Witness for note commitment is null" | Missing witness for note commitement.
501 + "Witness for spendable note does not have same anchor as change input" | Invalid anchor for spendable note witness.
502 + "Not enough funds to pay miners fee" | Retry with sufficient funds.
503 + "Missing hex data for raw transaction" | Raw transaction data is null.
504 + "Missing hex data for signed transaction" | Hex value for signed transaction is null.
505 + "Send raw transaction did not return an error or a txid." |
506
507 + RPC_WALLET_ENCRYPTION_FAILED (-16)                                       | _Failed to encrypt the wallet_
508 + -------------------------------------------------------------------------| -------------------------------------
509 + "Failed to sign transaction"                                             | Transaction was not signed, sign transaction and retry.
510
511 + RPC_WALLET_KEYPOOL_RAN_OUT (-12)                                         | _Keypool ran out, call keypoolrefill first_
512 + -------------------------------------------------------------------------| -----------------------------------------------
513 + "Could not generate a taddr to use as a change address"                  | Call keypoolrefill and retry.
514 diff -crB ./doc/release-notes/release-notes-0.11.2.z6.md ../../komodo-jl777/doc/release-notes/release-notes-0.11.2.z6.md
515 *** ./doc/release-notes/release-notes-0.11.2.z6.md      2017-01-03 10:40:50.191328153 +0000
516 --- ../../komodo-jl777/doc/release-notes/release-notes-0.11.2.z6.md     2017-01-03 09:49:08.848505929 +0000
517 ***************
518 *** 1,19 ****
519 ! Jack Grigg:
520         Equihash: Only compare the first n/(k+1) bits when sorting.
521         Randomise the nonce in the block header.
522         Clear mempool before using it for benchmark test, fix parameter name.
523         Fix memory leak in large tx benchmark.
524   
525 ! Sean Bowe:
526         Increase block size to 2MB and update performance test.
527         Make sigop limit `20000` just as in Bitcoin, ignoring our change to the blocksize limit.
528         Remove the mainnet checkpoints.
529         Fix performance test for block verification.
530         Make `validatelargetx` test more accurate.
531   
532 ! Taylor Hornby:
533         Add example mock test of CheckTransaction.
534   
535 ! aniemerg:
536         Suppress Libsnark Debugging Info.
537
538 --- 1,18 ----
539 ! Jack Grigg (4):
540         Equihash: Only compare the first n/(k+1) bits when sorting.
541         Randomise the nonce in the block header.
542         Clear mempool before using it for benchmark test, fix parameter name.
543         Fix memory leak in large tx benchmark.
544   
545 ! Sean Bowe (5):
546         Increase block size to 2MB and update performance test.
547         Make sigop limit `20000` just as in Bitcoin, ignoring our change to the blocksize limit.
548         Remove the mainnet checkpoints.
549         Fix performance test for block verification.
550         Make `validatelargetx` test more accurate.
551   
552 ! Taylor Hornby (1):
553         Add example mock test of CheckTransaction.
554   
555 ! aniemerg (1):
556         Suppress Libsnark Debugging Info.
557 diff -crB ./doc/release-notes/release-notes-0.11.2.z9.md ../../komodo-jl777/doc/release-notes/release-notes-0.11.2.z9.md
558 *** ./doc/release-notes/release-notes-0.11.2.z9.md      2017-01-03 10:40:50.191328153 +0000
559 --- ../../komodo-jl777/doc/release-notes/release-notes-0.11.2.z9.md     2017-01-03 09:49:08.848505929 +0000
560 ***************
561 *** 1,5 ****
562
563 ! Sean Bowe:
564         Change memo field size and relocate `ciphertexts` field of JoinSplit description.
565         Implement zkSNARK compression.
566         Perform curve parameter initialization at start of gtest suite.
567 --- 1,4 ----
568 ! Sean Bowe (6):
569         Change memo field size and relocate `ciphertexts` field of JoinSplit description.
570         Implement zkSNARK compression.
571         Perform curve parameter initialization at start of gtest suite.
572 ***************
573 *** 7,13 ****
574         Enable MONTGOMERY_OUTPUT everywhere.
575         Update proving/verifying keys.
576   
577 ! Jack Grigg:
578         Add support for spending keys to the basic key store.
579         Merge AddSpendingKeyPaymentAddress into AddSpendingKey to simplify API.
580         Add methods for byte array expansion and compression.
581 --- 6,12 ----
582         Enable MONTGOMERY_OUTPUT everywhere.
583         Update proving/verifying keys.
584   
585 ! Jack Grigg (11):
586         Add support for spending keys to the basic key store.
587         Merge AddSpendingKeyPaymentAddress into AddSpendingKey to simplify API.
588         Add methods for byte array expansion and compression.
589 ***************
590 *** 20,26 ****
591         Add separate lock for SpendingKey key store operations.
592         Test conversion between solution indices and minimal representation.
593   
594 ! Daira Hopwood:
595         Move bigint arithmetic implementations to libsnark.
596         Add mostly-static checks on consistency of Equihash parameters, MAX_HEADERS_RESULTS, and MAX_PROTOCOL_MESSAGE_LENGTH.
597         Change some asserts in equihash.cpp to be static.
598 --- 19,25 ----
599         Add separate lock for SpendingKey key store operations.
600         Test conversion between solution indices and minimal representation.
601   
602 ! Daira Hopwood (6):
603         Move bigint arithmetic implementations to libsnark.
604         Add mostly-static checks on consistency of Equihash parameters, MAX_HEADERS_RESULTS, and MAX_PROTOCOL_MESSAGE_LENGTH.
605         Change some asserts in equihash.cpp to be static.
606 ***************
607 *** 28,57 ****
608         Increment version numbers for z9 release.
609         Add these release notes for z9.
610   
611 ! Taylor Hornby:
612         Disable hardening when building for coverage reports.
613         Upgrade libsodium for AVX2-detection bugfix.
614         Fix inconsistent optimization flags; single source of truth.
615         Add -fwrapv -fno-strict-aliasing; fix libzcash flags.
616         Use libsodium's s < L check, instead checking that libsodium checks that.
617   
618 ! Simon Liu:
619         Fixes #1193 so that during verification benchmarking it does not unncessarily create thousands of CTransaction objects.
620         Closes #701 by adding documentation about the Payment RPC interface.
621         Add note about zkey and encrypted wallets.
622   
623 ! Gaurav Rana:
624         Update zcash-cli stop message.
625   
626 ! Tom Ritter:
627         Clarify comment about nonce space for Note Encryption.
628   
629 ! Robert C. Seacord:
630         Memory safety and correctness fixes found in NCC audit.
631   
632 ! Patrick Strateman (merged by Taylor Hornby):
633         Pull in some DoS mitigations from upstream. (#1258)
634   
635 ! Wladimir J. van der Laan:
636         net: correctly initialize nMinPingUsecTime.
637
638 --- 27,55 ----
639         Increment version numbers for z9 release.
640         Add these release notes for z9.
641   
642 ! Taylor Hornby (5):
643         Disable hardening when building for coverage reports.
644         Upgrade libsodium for AVX2-detection bugfix.
645         Fix inconsistent optimization flags; single source of truth.
646         Add -fwrapv -fno-strict-aliasing; fix libzcash flags.
647         Use libsodium's s < L check, instead checking that libsodium checks that.
648   
649 ! Simon Liu (3):
650         Fixes #1193 so that during verification benchmarking it does not unncessarily create thousands of CTransaction objects.
651         Closes #701 by adding documentation about the Payment RPC interface.
652         Add note about zkey and encrypted wallets.
653   
654 ! Gaurav Rana (1):
655         Update zcash-cli stop message.
656   
657 ! Tom Ritter (1):
658         Clarify comment about nonce space for Note Encryption.
659   
660 ! Robert C. Seacord (1):
661         Memory safety and correctness fixes found in NCC audit.
662   
663 ! Patrick Strateman (1):
664         Pull in some DoS mitigations from upstream. (#1258)
665   
666 ! Wladimir J. van der Laan (1):
667         net: correctly initialize nMinPingUsecTime.
668 Only in ../../komodo-jl777/doc/release-notes: release-notes-1.0.1.md
669 Only in ../../komodo-jl777/doc/release-notes: release-notes-1.0.2.md
670 Only in ../../komodo-jl777/doc/release-notes: release-notes-1.0.3.md
671 diff -crB ./doc/release-process.md ../../komodo-jl777/doc/release-process.md
672 *** ./doc/release-process.md    2017-01-03 10:40:50.191328153 +0000
673 --- ../../komodo-jl777/doc/release-process.md   2017-01-03 09:49:08.848505929 +0000
674 ***************
675 *** 38,43 ****
676 --- 38,45 ----
677       contrib/DEBIAN/control
678       contrib/gitian-descriptors/gitian-linux.yml
679   
680 +     Build and commit to update versions, and then perform the following commands:
681
682       help2man -n "RPC client for the Zcash daemon" src/zcash-cli > contrib/DEBIAN/manpages/zcash-cli.1
683       help2man -n "Network daemon for interacting with the Zcash blockchain" src/zcashd > contrib/DEBIAN/manpages/zcashd.1
684   
685 ***************
686 *** 57,66 ****
687   
688   ### B2. Write release notes
689   
690 ! git shortlog helps a lot, for example:
691   
692 !     $ git shortlog --no-merges v${ZCASH_RELEASE_PREV}..HEAD \
693 !         > ./doc/release-notes/release-notes-${ZCASH_RELEASE}.md
694   
695   Update the Debian package changelog:
696   
697 --- 59,67 ----
698   
699   ### B2. Write release notes
700   
701 ! Run the release-notes.py script to generate release notes and update authors.md file. For example:
702   
703 !     $ python zcutil/release-notes.py --version $ZCASH_RELEASE
704   
705   Update the Debian package changelog:
706   
707 diff -crB ./doc/security-warnings.md ../../komodo-jl777/doc/security-warnings.md
708 *** ./doc/security-warnings.md  2017-01-03 10:40:50.191328153 +0000
709 --- ../../komodo-jl777/doc/security-warnings.md 2017-01-03 09:49:08.848505929 +0000
710 ***************
711 *** 35,44 ****
712     from the earlier issue).
713   
714   - We were concerned about the resistance of the algorithm used to derive wallet
715 !   encryption keys (inherited from Bitcoin) to dictionary attacks by a powerful
716 !   attacker. If and when we re-enable wallet encryption, it is likely to be with
717 !   a modern passphrase-based key derivation algorithm designed for greater
718 !   resistance to dictionary attack, such as Argon2i.
719   
720   You should use full-disk encryption (or encryption of your home directory) to
721   protect your wallet at rest, and should assume (even unprivileged) users who are
722 --- 35,44 ----
723     from the earlier issue).
724   
725   - We were concerned about the resistance of the algorithm used to derive wallet
726 !   encryption keys (inherited from [Bitcoin](https://bitcoin.org/en/secure-your-wallet))
727 !   to dictionary attacks by a powerful attacker. If and when we re-enable wallet 
728 !   encryption, it is likely to be with a modern passphrase-based key derivation 
729 !   algorithm designed for greater resistance to dictionary attack, such as Argon2i.
730   
731   You should use full-disk encryption (or encryption of your home directory) to
732   protect your wallet at rest, and should assume (even unprivileged) users who are
733 diff -crB ./doc/tor.md ../../komodo-jl777/doc/tor.md
734 *** ./doc/tor.md        2017-01-03 10:40:50.191328153 +0000
735 --- ../../komodo-jl777/doc/tor.md       2017-01-03 09:49:08.848505929 +0000
736 ***************
737 *** 18,24 ****
738         -proxy=ip:port  Set the proxy server. If SOCKS5 is selected (default), this proxy
739                         server will be used to try to reach .onion addresses as well.
740   
741 !       -onion=ip:port  Set the proxy server to use for tor hidden services. You do not
742                         need to set this if it's the same as -proxy. You can use -noonion
743                         to explicitly disable access to hidden service.
744   
745 --- 18,24 ----
746         -proxy=ip:port  Set the proxy server. If SOCKS5 is selected (default), this proxy
747                         server will be used to try to reach .onion addresses as well.
748   
749 !       -onion=ip:port  Set the proxy server to use for Tor hidden services. You do not
750                         need to set this if it's the same as -proxy. You can use -noonion
751                         to explicitly disable access to hidden service.
752   
753 diff -crB ./Dockerfile ../../komodo-jl777/Dockerfile
754 *** ./Dockerfile        2017-01-03 10:40:50.151326129 +0000
755 --- ../../komodo-jl777/Dockerfile       2017-01-03 09:49:08.848505929 +0000
756 ***************
757 *** 1,15 ****
758 ! FROM ubuntu:16.04
759 ! MAINTAINER Mihail Fedorov <[email protected]>
760
761 ! # All the stuff
762 ! # And clean out packages, keep space minimal
763 ! RUN apt-get -y update && \
764 !     apt-get -y upgrade && \
765 !     apt-get -y install build-essential pkg-config libc6-dev m4 g++-multilib autoconf libtool ncurses-dev \
766 !     unzip python zlib1g-dev wget bsdmainutils automake libboost-all-dev libssl-dev libprotobuf-dev \
767 !     protobuf-compiler libqt4-dev libqrencode-dev libdb++-dev software-properties-common libcurl4-openssl-dev && \
768 !     apt-get clean && \
769 !     rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
770   
771   ADD ./ /komodo
772   ENV HOME /komodo
773 --- 1,5 ----
774 ! FROM kolobus/ubuntu:komodo
775 ! MAINTAINER Mihail Fedorov <[email protected]>
776   
777   ADD ./ /komodo
778   ENV HOME /komodo
779 ***************
780 *** 19,25 ****
781   RUN cd /komodo && \
782       ./autogen.sh && \
783       ./configure --with-incompatible-bdb --with-gui || true && \
784 !     ./zcutil/build.sh -j4
785   
786   # Unknown stuff goes here
787   
788 --- 9,15 ----
789   RUN cd /komodo && \
790       ./autogen.sh && \
791       ./configure --with-incompatible-bdb --with-gui || true && \
792 !     ./zcutil/build.sh -j$(nproc)
793   
794   # Unknown stuff goes here
795   
796 diff -crB ./.git/config ../../komodo-jl777/.git/config
797 *** ./.git/config       2017-01-03 10:40:50.131325117 +0000
798 --- ../../komodo-jl777/.git/config      2017-01-03 09:49:08.884507813 +0000
799 ***************
800 *** 4,11 ****
801         bare = false
802         logallrefupdates = true
803   [remote "origin"]
804 !       url = https://github.com/j-cimb-barker/komodo.git
805         fetch = +refs/heads/*:refs/remotes/origin/*
806   [branch "master"]
807         remote = origin
808         merge = refs/heads/master
809 --- 4,14 ----
810         bare = false
811         logallrefupdates = true
812   [remote "origin"]
813 !       url = https://github.com/jl777/komodo.git
814         fetch = +refs/heads/*:refs/remotes/origin/*
815   [branch "master"]
816         remote = origin
817         merge = refs/heads/master
818 + [branch "dev"]
819 +       remote = origin
820 +       merge = refs/heads/dev
821 diff -crB ./.git/HEAD ../../komodo-jl777/.git/HEAD
822 *** ./.git/HEAD 2017-01-03 10:40:50.131325117 +0000
823 --- ../../komodo-jl777/.git/HEAD        2017-01-03 09:49:08.884507813 +0000
824 ***************
825 *** 1 ****
826 ! ref: refs/heads/master
827 --- 1 ----
828 ! ref: refs/heads/dev
829 Binary files ./.git/index and ../../komodo-jl777/.git/index differ
830 diff -crB ./.git/logs/HEAD ../../komodo-jl777/.git/logs/HEAD
831 *** ./.git/logs/HEAD    2017-01-03 10:40:50.131325117 +0000
832 --- ../../komodo-jl777/.git/logs/HEAD   2017-01-03 09:49:08.884507813 +0000
833 ***************
834 *** 1 ****
835 ! 0000000000000000000000000000000000000000 d03fbd981fce86504b78d2a9582e4da988d59823 joel <joel@abigail> 1483440050 +0000        clone: from https://github.com/j-cimb-barker/komodo.git
836 --- 1,2 ----
837 ! 0000000000000000000000000000000000000000 d03fbd981fce86504b78d2a9582e4da988d59823 joel <joel@abigail> 1483436901 +0000        clone: from https://github.com/jl777/komodo.git
838 ! d03fbd981fce86504b78d2a9582e4da988d59823 26ac06c4f5a6b4dc3163b36a1e5d24bfa7eccbd2 joel <joel@abigail> 1483436948 +0000        checkout: moving from master to dev
839 Only in ../../komodo-jl777/.git/logs/refs/heads: dev
840 diff -crB ./.git/logs/refs/heads/master ../../komodo-jl777/.git/logs/refs/heads/master
841 *** ./.git/logs/refs/heads/master       2017-01-03 10:40:50.131325117 +0000
842 --- ../../komodo-jl777/.git/logs/refs/heads/master      2017-01-03 09:48:21.598032424 +0000
843 ***************
844 *** 1 ****
845 ! 0000000000000000000000000000000000000000 d03fbd981fce86504b78d2a9582e4da988d59823 joel <joel@abigail> 1483440050 +0000        clone: from https://github.com/j-cimb-barker/komodo.git
846 --- 1 ----
847 ! 0000000000000000000000000000000000000000 d03fbd981fce86504b78d2a9582e4da988d59823 joel <joel@abigail> 1483436901 +0000        clone: from https://github.com/jl777/komodo.git
848 diff -crB ./.git/logs/refs/remotes/origin/HEAD ../../komodo-jl777/.git/logs/refs/remotes/origin/HEAD
849 *** ./.git/logs/refs/remotes/origin/HEAD        2017-01-03 10:40:50.131325117 +0000
850 --- ../../komodo-jl777/.git/logs/refs/remotes/origin/HEAD       2017-01-03 09:48:21.598032424 +0000
851 ***************
852 *** 1 ****
853 ! 0000000000000000000000000000000000000000 d03fbd981fce86504b78d2a9582e4da988d59823 joel <joel@abigail> 1483440050 +0000        clone: from https://github.com/j-cimb-barker/komodo.git
854 --- 1 ----
855 ! 0000000000000000000000000000000000000000 d03fbd981fce86504b78d2a9582e4da988d59823 joel <joel@abigail> 1483436901 +0000        clone: from https://github.com/jl777/komodo.git
856 Only in ./.git/objects/pack: pack-12e7bdf654b29f95604673fb1b3ee01a9bd52369.idx
857 Only in ./.git/objects/pack: pack-12e7bdf654b29f95604673fb1b3ee01a9bd52369.pack
858 Only in ../../komodo-jl777/.git/objects/pack: pack-3d08e40e89111c75a81ccd6099e05e09fd0e0f08.idx
859 Only in ../../komodo-jl777/.git/objects/pack: pack-3d08e40e89111c75a81ccd6099e05e09fd0e0f08.pack
860 diff -crB ./.git/packed-refs ../../komodo-jl777/.git/packed-refs
861 *** ./.git/packed-refs  2017-01-03 10:40:50.131325117 +0000
862 --- ../../komodo-jl777/.git/packed-refs 2017-01-03 09:48:21.598032424 +0000
863 ***************
864 *** 2,10 ****
865   fcd361184f09fe17546698b0d13caddac5b63500 refs/remotes/origin/PoS
866   730a5006cbbfb0607ed93067db1a74d57584eb1f refs/remotes/origin/acspeed
867   80259d4b4f193c7c438f3c057ce70af3beb1a099 refs/remotes/origin/auto
868 ! 060c9a92939c62bbedb5fe560bf8ef6856e2b8f1 refs/remotes/origin/beta
869   ba9104dd7e9b6ba2b68ad352253ac8f3298092f4 refs/remotes/origin/dPoW
870 ! cb42e5518262235ed4e4dbff43179e0308114d6a refs/remotes/origin/dev
871   76b6eacf41395ddd2badd5d5dc3352e603c59df2 refs/remotes/origin/kolo
872   bb40eb8b043a1e63c3dc3b1c2e4d0f6e67e771d4 refs/remotes/origin/kolo-dev
873   d03fbd981fce86504b78d2a9582e4da988d59823 refs/remotes/origin/master
874 --- 2,10 ----
875   fcd361184f09fe17546698b0d13caddac5b63500 refs/remotes/origin/PoS
876   730a5006cbbfb0607ed93067db1a74d57584eb1f refs/remotes/origin/acspeed
877   80259d4b4f193c7c438f3c057ce70af3beb1a099 refs/remotes/origin/auto
878 ! f6f296f1acf8c2b177451ed0c9f8660f3a80ec3d refs/remotes/origin/beta
879   ba9104dd7e9b6ba2b68ad352253ac8f3298092f4 refs/remotes/origin/dPoW
880 ! 26ac06c4f5a6b4dc3163b36a1e5d24bfa7eccbd2 refs/remotes/origin/dev
881   76b6eacf41395ddd2badd5d5dc3352e603c59df2 refs/remotes/origin/kolo
882   bb40eb8b043a1e63c3dc3b1c2e4d0f6e67e771d4 refs/remotes/origin/kolo-dev
883   d03fbd981fce86504b78d2a9582e4da988d59823 refs/remotes/origin/master
884 Only in ../../komodo-jl777/.git/refs/heads: dev
885 diff -crB ./.gitignore ../../komodo-jl777/.gitignore
886 *** ./.gitignore        2017-01-03 10:40:50.151326129 +0000
887 --- ../../komodo-jl777/.gitignore       2017-01-03 09:49:08.848505929 +0000
888 ***************
889 *** 65,70 ****
890 --- 65,71 ----
891   *.a
892   *.pb.cc
893   *.pb.h
894 + .vscode
895   
896   *.log
897   *.trs
898 diff -crB ./Makefile.am ../../komodo-jl777/Makefile.am
899 *** ./Makefile.am       2017-01-03 10:40:50.151326129 +0000
900 --- ../../komodo-jl777/Makefile.am      2017-01-03 09:49:08.848505929 +0000
901 ***************
902 *** 258,267 ****
903         @qa/pull-tester/run-bitcoind-for-test.sh $(JAVA) -jar $(JAVA_COMPARISON_TOOL) qa/tmp/compTool $(COMPARISON_TOOL_REORG_TESTS) 2>&1
904   endif
905   
906 ! dist_noinst_SCRIPTS = autogen.sh
907   
908   EXTRA_DIST = $(top_srcdir)/share/genbuild.sh qa/pull-tester/rpc-tests.sh qa/pull-tester/run-bitcoin-cli qa/rpc-tests qa/zcash $(DIST_DOCS) $(BIN_CHECKS)
909   
910   CLEANFILES = $(OSX_DMG) $(BITCOIN_WIN_INSTALLER)
911   
912   .INTERMEDIATE: $(COVERAGE_INFO)
913 --- 258,271 ----
914         @qa/pull-tester/run-bitcoind-for-test.sh $(JAVA) -jar $(JAVA_COMPARISON_TOOL) qa/tmp/compTool $(COMPARISON_TOOL_REORG_TESTS) 2>&1
915   endif
916   
917 ! dist_bin_SCRIPTS = zcutil/fetch-params.sh
918 ! dist_noinst_SCRIPTS = autogen.sh zcutil/build-debian-package.sh zcutil/build.sh
919   
920   EXTRA_DIST = $(top_srcdir)/share/genbuild.sh qa/pull-tester/rpc-tests.sh qa/pull-tester/run-bitcoin-cli qa/rpc-tests qa/zcash $(DIST_DOCS) $(BIN_CHECKS)
921   
922 + install-exec-hook:
923 +       mv $(DESTDIR)$(bindir)/fetch-params.sh $(DESTDIR)$(bindir)/zcash-fetch-params
924
925   CLEANFILES = $(OSX_DMG) $(BITCOIN_WIN_INSTALLER)
926   
927   .INTERMEDIATE: $(COVERAGE_INFO)
928 Only in .: patches
929 diff -crB ./qa/pull-tester/rpc-tests.sh ../../komodo-jl777/qa/pull-tester/rpc-tests.sh
930 *** ./qa/pull-tester/rpc-tests.sh       2017-01-03 10:40:50.195328356 +0000
931 --- ../../komodo-jl777/qa/pull-tester/rpc-tests.sh      2017-01-03 09:49:08.848505929 +0000
932 ***************
933 *** 11,16 ****
934 --- 11,17 ----
935   #Run the tests
936   
937   testScripts=(
938 +     'wallet_treestate.py'
939       'wallet_protectcoinbase.py'
940       'wallet.py'
941       'wallet_nullifiers.py'
942 diff -crB ./qa/rpc-tests/httpbasics.py ../../komodo-jl777/qa/rpc-tests/httpbasics.py
943 *** ./qa/rpc-tests/httpbasics.py        2017-01-03 10:40:50.195328356 +0000
944 --- ../../komodo-jl777/qa/rpc-tests/httpbasics.py       2017-01-03 09:49:08.856506348 +0000
945 ***************
946 *** 38,50 ****
947           conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
948           out1 = conn.getresponse().read();
949           assert_equal('"error":null' in out1, True)
950 !         assert_equal(conn.sock!=None, True) #according to http/1.1 connection must still be open!
951 !         
952 !         #send 2nd request without closing connection
953 !         conn.request('POST', '/', '{"method": "getchaintips"}', headers)
954 !         out2 = conn.getresponse().read();
955 !         assert_equal('"error":null' in out1, True) #must also response with a correct json-rpc message
956 !         assert_equal(conn.sock!=None, True) #according to http/1.1 connection must still be open!
957           conn.close()
958           
959           #same should be if we add keep-alive because this should be the std. behaviour
960 --- 38,46 ----
961           conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
962           out1 = conn.getresponse().read();
963           assert_equal('"error":null' in out1, True)
964
965 !         # TODO #1856: Re-enable support for persistent connections.
966 !         assert_equal(conn.sock!=None, False)
967           conn.close()
968           
969           #same should be if we add keep-alive because this should be the std. behaviour
970 ***************
971 *** 55,67 ****
972           conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
973           out1 = conn.getresponse().read();
974           assert_equal('"error":null' in out1, True)
975 !         assert_equal(conn.sock!=None, True) #according to http/1.1 connection must still be open!
976 !         
977 !         #send 2nd request without closing connection
978 !         conn.request('POST', '/', '{"method": "getchaintips"}', headers)
979 !         out2 = conn.getresponse().read();
980 !         assert_equal('"error":null' in out1, True) #must also response with a correct json-rpc message
981 !         assert_equal(conn.sock!=None, True) #according to http/1.1 connection must still be open!
982           conn.close()
983           
984           #now do the same with "Connection: close"
985 --- 51,59 ----
986           conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
987           out1 = conn.getresponse().read();
988           assert_equal('"error":null' in out1, True)
989
990 !         # TODO #1856: Re-enable support for persistent connections.
991 !         assert_equal(conn.sock!=None, False)
992           conn.close()
993           
994           #now do the same with "Connection: close"
995 ***************
996 *** 96,102 ****
997           conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
998           out1 = conn.getresponse().read();
999           assert_equal('"error":null' in out1, True)
1000 !         assert_equal(conn.sock!=None, True) #connection must be closed because bitcoind should use keep-alive by default
1001           
1002   if __name__ == '__main__':
1003       HTTPBasicsTest ().main ()
1004 --- 88,97 ----
1005           conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
1006           out1 = conn.getresponse().read();
1007           assert_equal('"error":null' in out1, True)
1008
1009 !         # TODO #1856: Re-enable support for persistent connections.
1010 !         assert_equal(conn.sock!=None, False)
1011 !         conn.close()
1012           
1013   if __name__ == '__main__':
1014       HTTPBasicsTest ().main ()
1015 diff -crB ./qa/rpc-tests/wallet_protectcoinbase.py ../../komodo-jl777/qa/rpc-tests/wallet_protectcoinbase.py
1016 *** ./qa/rpc-tests/wallet_protectcoinbase.py    2017-01-03 10:40:50.199328558 +0000
1017 --- ../../komodo-jl777/qa/rpc-tests/wallet_protectcoinbase.py   2017-01-03 09:49:08.856506348 +0000
1018 ***************
1019 *** 8,14 ****
1020   from test_framework.util import *
1021   from time import *
1022   
1023 ! class Wallet2Test (BitcoinTestFramework):
1024   
1025       def setup_chain(self):
1026           print("Initializing test directory "+self.options.tmpdir)
1027 --- 8,14 ----
1028   from test_framework.util import *
1029   from time import *
1030   
1031 ! class WalletProtectCoinbaseTest (BitcoinTestFramework):
1032   
1033       def setup_chain(self):
1034           print("Initializing test directory "+self.options.tmpdir)
1035 ***************
1036 *** 23,43 ****
1037           self.is_network_split=False
1038           self.sync_all()
1039   
1040 !     def wait_for_operationd_success(self, myopid):
1041           print('waiting for async operation {}'.format(myopid))
1042           opids = []
1043           opids.append(myopid)
1044 !         timeout = 120
1045           status = None
1046           for x in xrange(1, timeout):
1047               results = self.nodes[0].z_getoperationresult(opids)
1048               if len(results)==0:
1049                   sleep(1)
1050               else:
1051                   status = results[0]["status"]
1052                   break
1053           print('...returned status: {}'.format(status))
1054 !         assert_equal("success", status)
1055   
1056       def run_test (self):
1057           print "Mining blocks..."
1058 --- 23,55 ----
1059           self.is_network_split=False
1060           self.sync_all()
1061   
1062 !     # Returns txid if operation was a success or None
1063 !     def wait_and_assert_operationid_status(self, myopid, in_status='success', in_errormsg=None):
1064           print('waiting for async operation {}'.format(myopid))
1065           opids = []
1066           opids.append(myopid)
1067 !         timeout = 300
1068           status = None
1069 +         errormsg = None
1070 +         txid = None
1071           for x in xrange(1, timeout):
1072               results = self.nodes[0].z_getoperationresult(opids)
1073               if len(results)==0:
1074                   sleep(1)
1075               else:
1076                   status = results[0]["status"]
1077 +                 if status == "failed":
1078 +                     errormsg = results[0]['error']['message']
1079 +                 elif status == "success":
1080 +                     txid = results[0]['result']['txid']
1081                   break
1082           print('...returned status: {}'.format(status))
1083 !         assert_equal(in_status, status)
1084 !         if errormsg is not None:
1085 !             assert(in_errormsg is not None)
1086 !             assert_equal(in_errormsg in errormsg, True)
1087 !             print('...returned error: {}'.format(errormsg))
1088 !         return txid
1089   
1090       def run_test (self):
1091           print "Mining blocks..."
1092 ***************
1093 *** 94,100 ****
1094           recipients = []
1095           recipients.append({"address":myzaddr, "amount": Decimal('20.0') - Decimal('0.0001')})
1096           myopid = self.nodes[0].z_sendmany(mytaddr, recipients)
1097 !         self.wait_for_operationd_success(myopid)
1098           self.sync_all()
1099           self.nodes[1].generate(1)
1100           self.sync_all()
1101 --- 106,112 ----
1102           recipients = []
1103           recipients.append({"address":myzaddr, "amount": Decimal('20.0') - Decimal('0.0001')})
1104           myopid = self.nodes[0].z_sendmany(mytaddr, recipients)
1105 !         self.wait_and_assert_operationid_status(myopid)
1106           self.sync_all()
1107           self.nodes[1].generate(1)
1108           self.sync_all()
1109 ***************
1110 *** 109,116 ****
1111           recipients = []
1112           recipients.append({"address":mytaddr, "amount":Decimal('10.0')})
1113           myopid = self.nodes[0].z_sendmany(myzaddr, recipients)
1114 !         self.wait_for_operationd_success(myopid)
1115           self.sync_all()
1116           self.nodes[1].generate(1)
1117           self.sync_all()
1118   
1119 --- 121,134 ----
1120           recipients = []
1121           recipients.append({"address":mytaddr, "amount":Decimal('10.0')})
1122           myopid = self.nodes[0].z_sendmany(myzaddr, recipients)
1123 !         mytxid = self.wait_and_assert_operationid_status(myopid)
1124 !         assert(mytxid is not None)
1125           self.sync_all()
1126
1127 +         # check that priority of the tx sending from a zaddr is not 0
1128 +         mempool = self.nodes[0].getrawmempool(True)
1129 +         assert(Decimal(mempool[mytxid]['startingpriority']) >= Decimal('1000000000000'))
1130
1131           self.nodes[1].generate(1)
1132           self.sync_all()
1133   
1134 ***************
1135 *** 120,125 ****
1136 --- 138,152 ----
1137           assert_equal(Decimal(resp["private"]), Decimal('9.9998'))
1138           assert_equal(Decimal(resp["total"]), Decimal('39.9998'))
1139   
1140 +         # z_sendmany will return an error if there is transparent change output considered dust.
1141 +         # UTXO selection in z_sendmany sorts in ascending order, so smallest utxos are consumed first.
1142 +         # At this point in time, unspent notes all have a value of 10.0 and standard z_sendmany fee is 0.0001.
1143 +         recipients = []
1144 +         amount = Decimal('10.0') - Decimal('0.00010000') - Decimal('0.00000001')    # this leaves change at 1 zatoshi less than dust threshold
1145 +         recipients.append({"address":self.nodes[0].getnewaddress(), "amount":amount })
1146 +         myopid = self.nodes[0].z_sendmany(mytaddr, recipients)
1147 +         self.wait_and_assert_operationid_status(myopid, "failed", "Insufficient transparent funds, have 10.00, need 0.00000545 more to avoid creating invalid change output 0.00000001 (dust threshold is 0.00000546)")
1148
1149           # Send will fail because send amount is too big, even when including coinbase utxos
1150           errorString = ""
1151           try:
1152 ***************
1153 *** 128,133 ****
1154 --- 155,168 ----
1155               errorString = e.error['message']
1156           assert_equal("Insufficient funds" in errorString, True)
1157   
1158 +         # z_sendmany will fail because of insufficient funds
1159 +         recipients = []
1160 +         recipients.append({"address":self.nodes[1].getnewaddress(), "amount":Decimal('10000.0')})
1161 +         myopid = self.nodes[0].z_sendmany(mytaddr, recipients)
1162 +         self.wait_and_assert_operationid_status(myopid, "failed", "Insufficient transparent funds, have 10.00, need 10000.0001")
1163 +         myopid = self.nodes[0].z_sendmany(myzaddr, recipients)
1164 +         self.wait_and_assert_operationid_status(myopid, "failed", "Insufficient protected funds, have 9.9998, need 10000.0001")
1165
1166           # Send will fail because of insufficient funds unless sender uses coinbase utxos
1167           try:
1168               self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 21)
1169 ***************
1170 *** 135,140 ****
1171 --- 170,227 ----
1172               errorString = e.error['message']
1173           assert_equal("Insufficient funds, coinbase funds can only be spent after they have been sent to a zaddr" in errorString, True)
1174   
1175 +         # Verify that mempools accept tx with joinsplits which have at least the default z_sendmany fee.
1176 +         # If this test passes, it confirms that issue #1851 has been resolved, where sending from
1177 +         # a zaddr to 1385 taddr recipients fails because the default fee was considered too low
1178 +         # given the tx size, resulting in mempool rejection.
1179 +         errorString = ''
1180 +         recipients = []
1181 +         num_t_recipients = 2500
1182 +         amount_per_recipient = Decimal('0.00000546') # dust threshold
1183 +         # Note that regtest chainparams does not require standard tx, so setting the amount to be
1184 +         # less than the dust threshold, e.g. 0.00000001 will not result in mempool rejection.
1185 +         for i in xrange(0,num_t_recipients):
1186 +             newtaddr = self.nodes[2].getnewaddress()
1187 +             recipients.append({"address":newtaddr, "amount":amount_per_recipient})
1188 +         myopid = self.nodes[0].z_sendmany(myzaddr, recipients)
1189 +         try:
1190 +             self.wait_and_assert_operationid_status(myopid)
1191 +         except JSONRPCException as e:
1192 +             print("JSONRPC error: "+e.error['message'])
1193 +             assert(False)
1194 +         except Exception as e:
1195 +             print("Unexpected exception caught during testing: "+str(sys.exc_info()[0]))
1196 +             assert(False)
1197
1198 +         self.sync_all()
1199 +         self.nodes[1].generate(1)
1200 +         self.sync_all()
1201
1202 +         # check balance
1203 +         node2balance = amount_per_recipient * num_t_recipients
1204 +         assert_equal(self.nodes[2].getbalance(), node2balance)
1205
1206 +         # Send will fail because fee is negative
1207 +         try:
1208 +             self.nodes[0].z_sendmany(myzaddr, recipients, 1, -1)
1209 +         except JSONRPCException,e:
1210 +             errorString = e.error['message']
1211 +         assert_equal("Invalid amount" in errorString, True)
1212
1213 +         # Send will fail because fee is larger than MAX_MONEY
1214 +         try:
1215 +             self.nodes[0].z_sendmany(myzaddr, recipients, 1, Decimal('21000000.00000001'))
1216 +         except JSONRPCException,e:
1217 +             errorString = e.error['message']
1218 +         assert_equal("Invalid amount" in errorString, True)
1219
1220 +         # Send will fail because fee is larger than sum of outputs
1221 +         try:
1222 +             self.nodes[0].z_sendmany(myzaddr, recipients, 1, (amount_per_recipient * num_t_recipients) + Decimal('0.00000001'))
1223 +         except JSONRPCException,e:
1224 +             errorString = e.error['message']
1225 +         assert_equal("is greater than the sum of outputs" in errorString, True)
1226
1227           # Send will succeed because the balance of non-coinbase utxos is 10.0
1228           try:
1229               self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 9)
1230 ***************
1231 *** 146,152 ****
1232           self.sync_all()
1233   
1234           # check balance
1235 !         assert_equal(self.nodes[2].getbalance(), 9)
1236   
1237   if __name__ == '__main__':
1238 !     Wallet2Test ().main ()
1239 --- 233,263 ----
1240           self.sync_all()
1241   
1242           # check balance
1243 !         node2balance = node2balance + 9
1244 !         assert_equal(self.nodes[2].getbalance(), node2balance)
1245
1246 !         # Check that chained joinsplits in a single tx are created successfully.
1247 !         recipients = []
1248 !         num_recipients = 3
1249 !         amount_per_recipient = Decimal('0.002')
1250 !         minconf = 1
1251 !         send_amount = num_recipients * amount_per_recipient
1252 !         custom_fee = Decimal('0.00012345')
1253 !         zbalance = self.nodes[0].z_getbalance(myzaddr)
1254 !         for i in xrange(0,num_recipients):
1255 !             newzaddr = self.nodes[2].z_getnewaddress()
1256 !             recipients.append({"address":newzaddr, "amount":amount_per_recipient})
1257 !         myopid = self.nodes[0].z_sendmany(myzaddr, recipients, minconf, custom_fee)
1258 !         self.wait_and_assert_operationid_status(myopid)
1259 !         self.sync_all()
1260 !         self.nodes[1].generate(1)
1261 !         self.sync_all()
1262
1263 !         # check balances
1264 !         resp = self.nodes[2].z_gettotalbalance()
1265 !         assert_equal(Decimal(resp["private"]), send_amount)
1266 !         resp = self.nodes[0].z_getbalance(myzaddr)
1267 !         assert_equal(Decimal(resp), zbalance - custom_fee - send_amount)
1268   
1269   if __name__ == '__main__':
1270 !     WalletProtectCoinbaseTest().main()
1271 diff -crB ./qa/rpc-tests/wallet.py ../../komodo-jl777/qa/rpc-tests/wallet.py
1272 *** ./qa/rpc-tests/wallet.py    2017-01-03 10:40:50.199328558 +0000
1273 --- ../../komodo-jl777/qa/rpc-tests/wallet.py   2017-01-03 09:49:08.856506348 +0000
1274 ***************
1275 *** 244,249 ****
1276 --- 244,295 ----
1277           myvjoinsplits = mytxdetails["vjoinsplit"]
1278           assert_equal(0, len(myvjoinsplits))
1279   
1280 +         # z_sendmany is expected to fail if tx size breaks limit
1281 +         myzaddr = self.nodes[0].z_getnewaddress()
1282
1283 +         recipients = []
1284 +         num_t_recipients = 3000
1285 +         amount_per_recipient = Decimal('0.00000001')
1286 +         errorString = ''
1287 +         for i in xrange(0,num_t_recipients):
1288 +             newtaddr = self.nodes[2].getnewaddress()
1289 +             recipients.append({"address":newtaddr, "amount":amount_per_recipient})
1290 +         try:
1291 +             self.nodes[0].z_sendmany(myzaddr, recipients)
1292 +         except JSONRPCException,e:
1293 +             errorString = e.error['message']
1294 +         assert("Too many outputs, size of raw transaction" in errorString)
1295
1296 +         recipients = []
1297 +         num_t_recipients = 2000
1298 +         num_z_recipients = 50
1299 +         amount_per_recipient = Decimal('0.00000001')
1300 +         errorString = ''
1301 +         for i in xrange(0,num_t_recipients):
1302 +             newtaddr = self.nodes[2].getnewaddress()
1303 +             recipients.append({"address":newtaddr, "amount":amount_per_recipient})
1304 +         for i in xrange(0,num_z_recipients):
1305 +             newzaddr = self.nodes[2].z_getnewaddress()
1306 +             recipients.append({"address":newzaddr, "amount":amount_per_recipient})
1307 +         try:
1308 +             self.nodes[0].z_sendmany(myzaddr, recipients)
1309 +         except JSONRPCException,e:
1310 +             errorString = e.error['message']
1311 +         assert("size of raw transaction would be larger than limit" in errorString)
1312
1313 +         recipients = []
1314 +         num_z_recipients = 100
1315 +         amount_per_recipient = Decimal('0.00000001')
1316 +         errorString = ''
1317 +         for i in xrange(0,num_z_recipients):
1318 +             newzaddr = self.nodes[2].z_getnewaddress()
1319 +             recipients.append({"address":newzaddr, "amount":amount_per_recipient})
1320 +         try:
1321 +             self.nodes[0].z_sendmany(myzaddr, recipients)
1322 +         except JSONRPCException,e:
1323 +             errorString = e.error['message']
1324 +         assert("Invalid parameter, too many zaddr outputs" in errorString)
1325
1326           # add zaddr to node 2
1327           myzaddr = self.nodes[2].z_getnewaddress()
1328   
1329 Only in ../../komodo-jl777/qa/rpc-tests: wallet_treestate.py
1330 diff -crB ./qa/rpc-tests/zcjoinsplit.py ../../komodo-jl777/qa/rpc-tests/zcjoinsplit.py
1331 *** ./qa/rpc-tests/zcjoinsplit.py       2017-01-03 10:40:50.203328760 +0000
1332 --- ../../komodo-jl777/qa/rpc-tests/zcjoinsplit.py      2017-01-03 09:49:08.856506348 +0000
1333 ***************
1334 *** 36,41 ****
1335 --- 36,49 ----
1336           receive_result = self.nodes[0].zcrawreceive(zcsecretkey, joinsplit_result["encryptednote1"])
1337           assert_equal(receive_result["exists"], True)
1338   
1339 +         # The pure joinsplit we create should be mined in the next block
1340 +         # despite other transactions being in the mempool.
1341 +         addrtest = self.nodes[0].getnewaddress()
1342 +         for xx in range(0,10):
1343 +             self.nodes[0].generate(1)
1344 +             for x in range(0,50):
1345 +                 self.nodes[0].sendtoaddress(addrtest, 0.01);
1346
1347           joinsplit_tx = self.nodes[0].createrawtransaction([], {})
1348           joinsplit_result = self.nodes[0].zcrawjoinsplit(joinsplit_tx, {receive_result["note"] : zcsecretkey}, {zcaddress: 39.8}, 0, 0.1)
1349   
1350 diff -crB ./qa/zcash/performance-measurements.sh ../../komodo-jl777/qa/zcash/performance-measurements.sh
1351 *** ./qa/zcash/performance-measurements.sh      2017-01-03 10:40:50.203328760 +0000
1352 --- ../../komodo-jl777/qa/zcash/performance-measurements.sh     2017-01-03 09:49:08.856506348 +0000
1353 ***************
1354 *** 88,93 ****
1355 --- 88,99 ----
1356               validatelargetx)
1357                   zcash_rpc zcbenchmark validatelargetx 5
1358                   ;;
1359 +             trydecryptnotes)
1360 +                 zcash_rpc zcbenchmark trydecryptnotes 1000 "${@:3}"
1361 +                 ;;
1362 +             incnotewitnesses)
1363 +                 zcash_rpc zcbenchmark incnotewitnesses 100 "${@:3}"
1364 +                 ;;
1365               *)
1366                   zcashd_stop
1367                   echo "Bad arguments."
1368 ***************
1369 *** 116,121 ****
1370 --- 122,133 ----
1371               verifyequihash)
1372                   zcash_rpc zcbenchmark verifyequihash 1
1373                   ;;
1374 +             trydecryptnotes)
1375 +                 zcash_rpc zcbenchmark trydecryptnotes 1 "${@:3}"
1376 +                 ;;
1377 +             incnotewitnesses)
1378 +                 zcash_rpc zcbenchmark incnotewitnesses 1 "${@:3}"
1379 +                 ;;
1380               *)
1381                   zcashd_massif_stop
1382                   echo "Bad arguments."
1383 ***************
1384 *** 145,150 ****
1385 --- 157,168 ----
1386               verifyequihash)
1387                   zcash_rpc zcbenchmark verifyequihash 1
1388                   ;;
1389 +             trydecryptnotes)
1390 +                 zcash_rpc zcbenchmark trydecryptnotes 1 "${@:3}"
1391 +                 ;;
1392 +             incnotewitnesses)
1393 +                 zcash_rpc zcbenchmark incnotewitnesses 1 "${@:3}"
1394 +                 ;;
1395               *)
1396                   zcashd_valgrind_stop
1397                   echo "Bad arguments."
1398 diff -crB ./README.md ../../komodo-jl777/README.md
1399 *** ./README.md 2017-01-03 10:40:50.151326129 +0000
1400 --- ../../komodo-jl777/README.md        2017-01-03 09:49:08.848505929 +0000
1401 ***************
1402 *** 1,43 ****
1403 - <<<<<<< HEAD
1404   
1405 - Zcash
1406 - =====
1407 -  
1408 - https://z.cash/
1409 -  
1410 - Where do I begin?
1411 - -----------------
1412
1413 - We have a guide for joining the public testnet: https://github.com/zcash/zcash/wiki/Beta-Guide
1414
1415 - What is Zcash?
1416 - --------------
1417 -  
1418 - Zcash is an implementation of the "Zerocash" protocol. Based on Bitcoin's code, it intends to
1419 - offer a far higher standard of privacy and anonymity through a sophisticiated zero-knowledge
1420 - proving scheme which preserves confidentiality of transaction metadata.
1421 -  
1422 - **Zcash is unfinished and highly experimental.** Use at your own risk.
1423 -  
1424 - Participation in the Zcash project is subject to a [Code of Conduct](code_of_conduct.md).
1425 -  
1426 - =======
1427 - Zcash 1.0.0
1428 - ===========
1429   
1430   What is Zcash?
1431   --------------
1432   
1433   [Zcash](https://z.cash/) is an implementation of the "Zerocash" protocol.
1434   Based on Bitcoin's code, it intends to offer a far higher standard of privacy
1435 ! and anonymity through a sophisticated zero-knowledge proving scheme that
1436 ! preserves confidentiality of transaction metadata. Technical details are
1437 ! available in our [Protocol Specification](https://github.com/zcash/zips/raw/master/protocol/protocol.pdf).
1438   
1439   This software is the Zcash client. It downloads and stores the entire history
1440   of Zcash transactions; depending on the speed of your computer and network
1441   connection, the synchronization process could take a day or more once the
1442 ! block chain has reached a significant size.
1443   
1444   Security Warnings
1445   -----------------
1446 --- 1,18 ----
1447   
1448   
1449   What is Zcash?
1450   --------------
1451   
1452   [Zcash](https://z.cash/) is an implementation of the "Zerocash" protocol.
1453   Based on Bitcoin's code, it intends to offer a far higher standard of privacy
1454 ! through a sophisticated zero-knowledge proving scheme that preserves
1455 ! confidentiality of transaction metadata. Technical details are available
1456 ! in our [Protocol Specification](https://github.com/zcash/zips/raw/master/protocol/protocol.pdf).
1457   
1458   This software is the Zcash client. It downloads and stores the entire history
1459   of Zcash transactions; depending on the speed of your computer and network
1460   connection, the synchronization process could take a day or more once the
1461 ! blockchain has reached a significant size.
1462   
1463   Security Warnings
1464   -----------------
1465 ***************
1466 *** 165,173 ****
1467   
1468   Where do I begin?
1469   -----------------
1470
1471 ! We have a guide for joining the public testnet:
1472 ! https://github.com/zcash/zcash/wiki/Beta-Guide
1473   
1474   ### Need Help?
1475   
1476 --- 140,147 ----
1477   
1478   Where do I begin?
1479   -----------------
1480 ! We have a guide for joining the main Zcash network:
1481 ! https://github.com/zcash/zcash/wiki/1.0-User-Guide
1482   
1483   ### Need Help?
1484   
1485 ***************
1486 *** 182,188 ****
1487   --------
1488   
1489   Build Zcash along with most dependencies from source by running
1490 ! ./zcutil/build.sh. Currently only Linux is supported.
1491   
1492   License
1493   -------
1494 --- 156,162 ----
1495   --------
1496   
1497   Build Zcash along with most dependencies from source by running
1498 ! ./zcutil/build.sh. Currently only Linux is officially supported.
1499   
1500   License
1501   -------
1502 diff -crB ./src/assetchains ../../komodo-jl777/src/assetchains
1503 *** ./src/assetchains   2017-01-03 10:40:50.211329166 +0000
1504 --- ../../komodo-jl777/src/assetchains  2017-01-03 09:49:08.856506348 +0000
1505 ***************
1506 *** 3,96 ****
1507   source pubkey.txt
1508   echo $pubkey
1509   
1510 ! ./komodod -pubkey=$pubkey -ac_name=REVS -ac_supply=1300000 -addnode=78.47.196.146 $1 &
1511 ! ./komodod -pubkey=$pubkey -ac_name=SUPERNET -ac_supply=816061 -addnode=78.47.196.146 $1 &
1512 ! ./komodod -pubkey=$pubkey -ac_name=DEX -ac_supply=999999 -addnode=78.47.196.146 $1 &
1513 ! ./komodod -pubkey=$pubkey -ac_name=PANGEA -ac_supply=999999 -addnode=78.47.196.146 $1 &
1514 ! ./komodod -pubkey=$pubkey -ac_name=JUMBLR -ac_supply=999999 -addnode=78.47.196.146 $1 &
1515 ! ./komodod -pubkey=$pubkey -ac_name=BET -ac_supply=999999 -addnode=78.47.196.146 $1 &
1516 ! ./komodod -pubkey=$pubkey -ac_name=CRYPTO -ac_supply=999999 -addnode=78.47.196.146 $1 &
1517 ! ./komodod -pubkey=$pubkey -ac_name=HODL -ac_supply=9999999 -addnode=78.47.196.146 $1 &
1518 ! ./komodod -pubkey=$pubkey -ac_name=SHARK -ac_supply=1401 -addnode=78.47.196.146 $1 &
1519 ! ./komodod -pubkey=$pubkey -ac_name=BOTS -ac_supply=999999 -addnode=78.47.196.146 $1 &
1520 ! ./komodod -pubkey=$pubkey -ac_name=MGW -ac_supply=999999 -addnode=78.47.196.146 $1 &
1521   
1522 ! ./komodod -pubkey=$pubkey -ac_name=USD -addnode=78.47.196.146 $1 &
1523 ! ./komodod -pubkey=$pubkey -ac_name=EUR -addnode=78.47.196.146 $1 &
1524 ! ./komodod -pubkey=$pubkey -ac_name=JPY -addnode=78.47.196.146 $1 &
1525 ! ./komodod -pubkey=$pubkey -ac_name=GBP -addnode=78.47.196.146 $1 &
1526 ! ./komodod -pubkey=$pubkey -ac_name=AUD -addnode=78.47.196.146 $1 &
1527 ! ./komodod -pubkey=$pubkey -ac_name=CAD -addnode=78.47.196.146 $1 &
1528 ! ./komodod -pubkey=$pubkey -ac_name=CHF -addnode=78.47.196.146 $1 &
1529 ! ./komodod -pubkey=$pubkey -ac_name=NZD -addnode=78.47.196.146 $1 &
1530 ! ./komodod -pubkey=$pubkey -ac_name=CNY -addnode=78.47.196.146 $1 &
1531 ! ./komodod -pubkey=$pubkey -ac_name=RUB -addnode=78.47.196.146 $1 &
1532 ! ./komodod -pubkey=$pubkey -ac_name=MXN -addnode=78.47.196.146 $1 &
1533 ! ./komodod -pubkey=$pubkey -ac_name=BRL -addnode=78.47.196.146 $1 &
1534 ! ./komodod -pubkey=$pubkey -ac_name=INR -addnode=78.47.196.146 $1 &
1535 ! ./komodod -pubkey=$pubkey -ac_name=HKD -addnode=78.47.196.146 $1 &
1536 ! ./komodod -pubkey=$pubkey -ac_name=TRY -addnode=78.47.196.146 $1 &
1537 ! ./komodod -pubkey=$pubkey -ac_name=ZAR -addnode=78.47.196.146 $1 &
1538 ! ./komodod -pubkey=$pubkey -ac_name=PLN -addnode=78.47.196.146 $1 &
1539 ! ./komodod -pubkey=$pubkey -ac_name=NOK -addnode=78.47.196.146 $1 &
1540 ! ./komodod -pubkey=$pubkey -ac_name=SEK -addnode=78.47.196.146 $1 &
1541 ! ./komodod -pubkey=$pubkey -ac_name=DKK -addnode=78.47.196.146 $1 &
1542 ! ./komodod -pubkey=$pubkey -ac_name=CZK -addnode=78.47.196.146 $1 &
1543 ! ./komodod -pubkey=$pubkey -ac_name=HUF -addnode=78.47.196.146 $1 &
1544 ! ./komodod -pubkey=$pubkey -ac_name=ILS -addnode=78.47.196.146 $1 &
1545 ! ./komodod -pubkey=$pubkey -ac_name=KRW -addnode=78.47.196.146 $1 &
1546 ! ./komodod -pubkey=$pubkey -ac_name=MYR -addnode=78.47.196.146 $1 &
1547 ! ./komodod -pubkey=$pubkey -ac_name=PHP -addnode=78.47.196.146 $1 &
1548 ! ./komodod -pubkey=$pubkey -ac_name=RON -addnode=78.47.196.146 $1 &
1549 ! ./komodod -pubkey=$pubkey -ac_name=SGD -addnode=78.47.196.146 $1 &
1550 ! ./komodod -pubkey=$pubkey -ac_name=THB -addnode=78.47.196.146 $1 &
1551 ! ./komodod -pubkey=$pubkey -ac_name=BGN -addnode=78.47.196.146 $1 &
1552 ! ./komodod -pubkey=$pubkey -ac_name=IDR -addnode=78.47.196.146 $1 &
1553 ! ./komodod -pubkey=$pubkey -ac_name=HRK -addnode=78.47.196.146 $1 &
1554
1555 ! curl --url "http://127.0.0.1:7776" --data "{\"timeout\":60000,\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"REVS\",\"pubkey\":\"$pubkey\"}"
1556
1557 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"SUPERNET\",\"pubkey\":\"$pubkey\"}"
1558 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"DEX\",\"pubkey\":\"$pubkey\"}"
1559 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"PANGEA\",\"pubkey\":\"$pubkey\"}"
1560 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"JUMBLR\",\"pubkey\":\"$pubkey\"}"
1561 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"BET\",\"pubkey\":\"$pubkey\"}"
1562 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CRYPTO\",\"pubkey\":\"$pubkey\"}"
1563 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"HODL\",\"pubkey\":\"$pubkey\"}"
1564 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"SHARK\",\"pubkey\":\"$pubkey\"}"
1565 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"BOTS\",\"pubkey\":\"$pubkey\"}"
1566 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"MGW\",\"pubkey\":\"$pubkey\"}"
1567 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"USD\",\"pubkey\":\"$pubkey\"}"
1568 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"EUR\",\"pubkey\":\"$pubkey\"}"
1569 !  
1570 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"JPY\",\"pubkey\":\"$pubkey\"}"
1571 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"GBP\",\"pubkey\":\"$pubkey\"}"
1572 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"AUD\",\"pubkey\":\"$pubkey\"}"
1573 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CAD\",\"pubkey\":\"$pubkey\"}"
1574 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CHF\",\"pubkey\":\"$pubkey\"}"
1575 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"NZD\",\"pubkey\":\"$pubkey\"}"
1576 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CNY\",\"pubkey\":\"$pubkey\"}"
1577 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"RUB\",\"pubkey\":\"$pubkey\"}"
1578 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"MXN\",\"pubkey\":\"$pubkey\"}"
1579 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"BRL\",\"pubkey\":\"$pubkey\"}"
1580 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"INR\",\"pubkey\":\"$pubkey\"}"
1581 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"HKD\",\"pubkey\":\"$pubkey\"}"
1582 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"TRY\",\"pubkey\":\"$pubkey\"}"
1583 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"ZAR\",\"pubkey\":\"$pubkey\"}"
1584 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"PLN\",\"pubkey\":\"$pubkey\"}"
1585 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"NOK\",\"pubkey\":\"$pubkey\"}"
1586 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"SEK\",\"pubkey\":\"$pubkey\"}"
1587 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"DKK\",\"pubkey\":\"$pubkey\"}"
1588 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CZK\",\"pubkey\":\"$pubkey\"}"
1589 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"HUF\",\"pubkey\":\"$pubkey\"}"
1590 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"ILS\",\"pubkey\":\"$pubkey\"}"
1591 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"KRW\",\"pubkey\":\"$pubkey\"}"
1592 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"MYR\",\"pubkey\":\"$pubkey\"}"
1593 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"PHP\",\"pubkey\":\"$pubkey\"}"
1594 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"RON\",\"pubkey\":\"$pubkey\"}"
1595 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"SGD\",\"pubkey\":\"$pubkey\"}"
1596 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"THB\",\"pubkey\":\"$pubkey\"}"
1597 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"BGN\",\"pubkey\":\"$pubkey\"}"
1598 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"IDR\",\"pubkey\":\"$pubkey\"}"
1599 ! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"HRK\",\"pubkey\":\"$pubkey\"}"
1600   
1601 --- 3,50 ----
1602   source pubkey.txt
1603   echo $pubkey
1604   
1605 ! ./komodod -pubkey=$pubkey -ac_name=REVS -ac_supply=1300000 -addnode=78.47.196.146 $1 -gen &
1606 ! ./komodod -pubkey=$pubkey -ac_name=SUPERNET -ac_supply=816061 -addnode=78.47.196.146 $1 -gen &
1607 ! ./komodod -pubkey=$pubkey -ac_name=DEX -ac_supply=999999 -addnode=78.47.196.146 $1 -gen &
1608 ! ./komodod -pubkey=$pubkey -ac_name=PANGEA -ac_supply=999999 -addnode=78.47.196.146 $1 -gen &
1609 ! ./komodod -pubkey=$pubkey -ac_name=JUMBLR -ac_supply=999999 -addnode=78.47.196.146 $1 -gen &
1610 ! ./komodod -pubkey=$pubkey -ac_name=BET -ac_supply=999999 -addnode=78.47.196.146 $1 -gen &
1611 ! ./komodod -pubkey=$pubkey -ac_name=CRYPTO -ac_supply=999999 -addnode=78.47.196.146 $1 -gen &
1612 ! ./komodod -pubkey=$pubkey -ac_name=HODL -ac_supply=9999999 -addnode=78.47.196.146 $1 -gen &
1613 ! ./komodod -pubkey=$pubkey -ac_name=SHARK -ac_supply=1401 -addnode=78.47.196.146 $1 -gen &
1614 ! ./komodod -pubkey=$pubkey -ac_name=BOTS -ac_supply=999999 -addnode=78.47.196.146 $1 -gen &
1615 ! ./komodod -pubkey=$pubkey -ac_name=MGW -ac_supply=999999 -addnode=78.47.196.146 $1 -gen &
1616   
1617 ! ./komodod -pubkey=$pubkey -ac_name=USD -addnode=78.47.196.146 $1 -gen &
1618 ! ./komodod -pubkey=$pubkey -ac_name=EUR -addnode=78.47.196.146 $1 -gen &
1619 ! ./komodod -pubkey=$pubkey -ac_name=JPY -addnode=78.47.196.146 $1 -gen &
1620 ! ./komodod -pubkey=$pubkey -ac_name=GBP -addnode=78.47.196.146 $1 -gen &
1621 ! ./komodod -pubkey=$pubkey -ac_name=AUD -addnode=78.47.196.146 $1 -gen &
1622 ! ./komodod -pubkey=$pubkey -ac_name=CAD -addnode=78.47.196.146 $1 -gen &
1623 ! ./komodod -pubkey=$pubkey -ac_name=CHF -addnode=78.47.196.146 $1 -gen &
1624 ! ./komodod -pubkey=$pubkey -ac_name=NZD -addnode=78.47.196.146 $1 -gen &
1625 ! ./komodod -pubkey=$pubkey -ac_name=CNY -addnode=78.47.196.146 $1 -gen &
1626 ! ./komodod -pubkey=$pubkey -ac_name=RUB -addnode=78.47.196.146 $1 -gen &
1627 ! ./komodod -pubkey=$pubkey -ac_name=MXN -addnode=78.47.196.146 $1 -gen &
1628 ! ./komodod -pubkey=$pubkey -ac_name=BRL -addnode=78.47.196.146 $1 -gen &
1629 ! ./komodod -pubkey=$pubkey -ac_name=INR -addnode=78.47.196.146 $1 -gen &
1630 ! ./komodod -pubkey=$pubkey -ac_name=HKD -addnode=78.47.196.146 $1 -gen &
1631 ! ./komodod -pubkey=$pubkey -ac_name=TRY -addnode=78.47.196.146 $1 -gen &
1632 ! ./komodod -pubkey=$pubkey -ac_name=ZAR -addnode=78.47.196.146 $1 -gen &
1633 ! ./komodod -pubkey=$pubkey -ac_name=PLN -addnode=78.47.196.146 $1 -gen &
1634 ! ./komodod -pubkey=$pubkey -ac_name=NOK -addnode=78.47.196.146 $1 -gen &
1635 ! ./komodod -pubkey=$pubkey -ac_name=SEK -addnode=78.47.196.146 $1 -gen &
1636 ! ./komodod -pubkey=$pubkey -ac_name=DKK -addnode=78.47.196.146 $1 -gen &
1637 ! ./komodod -pubkey=$pubkey -ac_name=CZK -addnode=78.47.196.146 $1 -gen &
1638 ! ./komodod -pubkey=$pubkey -ac_name=HUF -addnode=78.47.196.146 $1 -gen &
1639 ! ./komodod -pubkey=$pubkey -ac_name=ILS -addnode=78.47.196.146 $1 -gen &
1640 ! ./komodod -pubkey=$pubkey -ac_name=KRW -addnode=78.47.196.146 $1 -gen &
1641 ! ./komodod -pubkey=$pubkey -ac_name=MYR -addnode=78.47.196.146 $1 -gen &
1642 ! ./komodod -pubkey=$pubkey -ac_name=PHP -addnode=78.47.196.146 $1 -gen &
1643 ! ./komodod -pubkey=$pubkey -ac_name=RON -addnode=78.47.196.146 $1 -gen &
1644 ! ./komodod -pubkey=$pubkey -ac_name=SGD -addnode=78.47.196.146 $1 -gen &
1645 ! ./komodod -pubkey=$pubkey -ac_name=THB -addnode=78.47.196.146 $1 -gen &
1646 ! ./komodod -pubkey=$pubkey -ac_name=BGN -addnode=78.47.196.146 $1 -gen &
1647 ! ./komodod -pubkey=$pubkey -ac_name=IDR -addnode=78.47.196.146 $1 -gen &
1648 ! ./komodod -pubkey=$pubkey -ac_name=HRK -addnode=78.47.196.146 $1 -gen &
1649   
1650 diff -crB ./src/bitcoind.cpp ../../komodo-jl777/src/bitcoind.cpp
1651 *** ./src/bitcoind.cpp  2017-01-03 10:40:50.215329368 +0000
1652 --- ../../komodo-jl777/src/bitcoind.cpp 2017-01-03 09:49:08.856506348 +0000
1653 ***************
1654 *** 41,47 ****
1655       // Tell the main threads to shutdown.
1656       while (!fShutdown)
1657       {
1658 !         MilliSleep(10000);
1659           komodo_passport_iteration();
1660           fShutdown = ShutdownRequested();
1661       }
1662 --- 41,47 ----
1663       // Tell the main threads to shutdown.
1664       while (!fShutdown)
1665       {
1666 !         MilliSleep(16000);
1667           komodo_passport_iteration();
1668           fShutdown = ShutdownRequested();
1669       }
1670 diff -crB ./src/chainparams.cpp ../../komodo-jl777/src/chainparams.cpp
1671 *** ./src/chainparams.cpp       2017-01-03 10:40:50.215329368 +0000
1672 --- ../../komodo-jl777/src/chainparams.cpp      2017-01-03 09:49:08.856506348 +0000
1673 ***************
1674 *** 43,48 ****
1675 --- 43,49 ----
1676       CMainParams()
1677       {
1678           strNetworkID = "main";
1679 +         strCurrencyUnits = "KMD";
1680           consensus.fCoinbaseMustBeProtected = false;//true;
1681           consensus.nSubsidySlowStartInterval = 20000;
1682           consensus.nSubsidyHalvingInterval = 840000;
1683 ***************
1684 *** 119,129 ****
1685           checkpointData = (Checkpoints::CCheckpointData)
1686           {
1687               boost::assign::map_list_of
1688 !             ( 0, consensus.hashGenesisBlock),
1689 !             genesis.nTime, // * UNIX timestamp of last checkpoint block
1690 !             0,   // * total number of transactions between genesis and last checkpoint
1691 !                  //   (the tx=... number in the SetBestChain debug.log lines)
1692 !             0    // * estimated number of transactions per day after checkpoint
1693           };
1694           if ( pthread_create((pthread_t *)malloc(sizeof(pthread_t)),NULL,chainparams_commandline,(void *)&consensus) != 0 )
1695           {
1696 --- 120,134 ----
1697           checkpointData = (Checkpoints::CCheckpointData)
1698           {
1699               boost::assign::map_list_of
1700 !             (0, consensus.hashGenesisBlock),
1701 !             //(2500, uint256S("0x0e6a3d5a46eba97c4e7618d66a39f115729e1176433c98481124c2bf733aa54e"))
1702 !             //(15000, uint256S("0x00f0bd236790e903321a2d22f85bd6bf8a505f6ef4eddb20458a65d37e14d142")),
1703 !             //(100000, uint256S("0x0f02eb1f3a4b89df9909fec81a4bd7d023e32e24e1f5262d9fc2cc36a715be6f")),
1704 !             1481120910,     // * UNIX timestamp of last checkpoint block
1705 !             110415,         // * total number of transactions between genesis and last checkpoint
1706 !                             //   (the tx=... number in the SetBestChain debug.log lines)
1707 !             4240            // * estimated number of transactions per day after checkpoint
1708 !                             //   total number of tx / (checkpoint block height / (24 * 24))
1709           };
1710           if ( pthread_create((pthread_t *)malloc(sizeof(pthread_t)),NULL,chainparams_commandline,(void *)&consensus) != 0 )
1711           {
1712 ***************
1713 *** 160,165 ****
1714 --- 165,171 ----
1715   public:
1716       CTestNetParams() {
1717           strNetworkID = "test";
1718 +         strCurrencyUnits = "TAZ";
1719           consensus.nMajorityEnforceBlockUpgrade = 51;
1720           consensus.nMajorityRejectBlockOutdated = 75;
1721           consensus.nMajorityWindow = 400;
1722 ***************
1723 *** 222,227 ****
1724 --- 228,234 ----
1725   public:
1726       CRegTestParams() {
1727           strNetworkID = "regtest";
1728 +         strCurrencyUnits = "REG";
1729           consensus.fCoinbaseMustBeProtected = false;
1730           consensus.nSubsidySlowStartInterval = 0;
1731           consensus.nSubsidyHalvingInterval = 150;
1732 diff -crB ./src/chainparams.h ../../komodo-jl777/src/chainparams.h
1733 *** ./src/chainparams.h 2017-01-03 10:40:50.215329368 +0000
1734 --- ../../komodo-jl777/src/chainparams.h        2017-01-03 09:49:08.856506348 +0000
1735 ***************
1736 *** 69,74 ****
1737 --- 69,75 ----
1738       int64_t PruneAfterHeight() const { return nPruneAfterHeight; }
1739       unsigned int EquihashN() const { return nEquihashN; }
1740       unsigned int EquihashK() const { return nEquihashK; }
1741 +     std::string CurrencyUnits() const { return strCurrencyUnits; }
1742       /** Make miner stop after a block is found. In RPC, don't return until nGenProcLimit blocks are generated */
1743       bool MineBlocksOnDemand() const { return fMineBlocksOnDemand; }
1744       /** In the future use NetworkIDString() for RPC fields */
1745 ***************
1746 *** 107,112 ****
1747 --- 108,114 ----
1748       std::vector<CDNSSeedData> vSeeds;
1749       std::vector<unsigned char> base58Prefixes[MAX_BASE58_TYPES];
1750       std::string strNetworkID;
1751 +     std::string strCurrencyUnits;
1752       CBlock genesis;
1753       std::vector<SeedSpec6> vFixedSeeds;
1754       bool fRequireRPCPassword = false;
1755 diff -crB ./src/clientversion.h ../../komodo-jl777/src/clientversion.h
1756 *** ./src/clientversion.h       2017-01-03 10:40:50.215329368 +0000
1757 --- ../../komodo-jl777/src/clientversion.h      2017-01-03 09:49:08.856506348 +0000
1758 ***************
1759 *** 16,22 ****
1760   //! These need to be macros, as clientversion.cpp's and bitcoin*-res.rc's voodoo requires it
1761   #define CLIENT_VERSION_MAJOR 1
1762   #define CLIENT_VERSION_MINOR 0
1763 ! #define CLIENT_VERSION_REVISION 0
1764   #define CLIENT_VERSION_BUILD 50
1765   
1766   //! Set to true for release, false for prerelease or test build
1767 --- 16,22 ----
1768   //! These need to be macros, as clientversion.cpp's and bitcoin*-res.rc's voodoo requires it
1769   #define CLIENT_VERSION_MAJOR 1
1770   #define CLIENT_VERSION_MINOR 0
1771 ! #define CLIENT_VERSION_REVISION 3
1772   #define CLIENT_VERSION_BUILD 50
1773   
1774   //! Set to true for release, false for prerelease or test build
1775 diff -crB ./src/coins.cpp ../../komodo-jl777/src/coins.cpp
1776 *** ./src/coins.cpp     2017-01-03 10:40:50.215329368 +0000
1777 --- ../../komodo-jl777/src/coins.cpp    2017-01-03 09:49:08.856506348 +0000
1778 ***************
1779 *** 6,11 ****
1780 --- 6,12 ----
1781   
1782   #include "memusage.h"
1783   #include "random.h"
1784 + #include "version.h"
1785   
1786   #include <assert.h>
1787   
1788 ***************
1789 *** 176,186 ****
1790       // case restoring the "old" anchor during a reorg must
1791       // have no effect.
1792       if (currentRoot != newrt) {
1793 !         CAnchorsMap::iterator ret = cacheAnchors.insert(std::make_pair(currentRoot, CAnchorsCacheEntry())).first;
1794   
1795 !         ret->second.entered = false;
1796 !         ret->second.flags = CAnchorsCacheEntry::DIRTY;
1797   
1798           hashAnchor = newrt;
1799       }
1800   }
1801 --- 177,196 ----
1802       // case restoring the "old" anchor during a reorg must
1803       // have no effect.
1804       if (currentRoot != newrt) {
1805 !         // Bring the current best anchor into our local cache
1806 !         // so that its tree exists in memory.
1807 !         {
1808 !             ZCIncrementalMerkleTree tree;
1809 !             assert(GetAnchorAt(currentRoot, tree));
1810 !         }
1811   
1812 !         // Mark the anchor as unentered, removing it from view
1813 !         cacheAnchors[currentRoot].entered = false;
1814   
1815 +         // Mark the cache entry as dirty so it's propagated
1816 +         cacheAnchors[currentRoot].flags = CAnchorsCacheEntry::DIRTY;
1817
1818 +         // Mark the new root as the best anchor
1819           hashAnchor = newrt;
1820       }
1821   }
1822 ***************
1823 *** 303,318 ****
1824               CAnchorsMap::iterator parent_it = cacheAnchors.find(child_it->first);
1825   
1826               if (parent_it == cacheAnchors.end()) {
1827 !                 if (child_it->second.entered) {
1828 !                     // Parent doesn't have an entry, but child has a new commitment root.
1829
1830 !                     CAnchorsCacheEntry& entry = cacheAnchors[child_it->first];
1831 !                     entry.entered = true;
1832 !                     entry.tree = child_it->second.tree;
1833 !                     entry.flags = CAnchorsCacheEntry::DIRTY;
1834   
1835 !                     cachedCoinsUsage += memusage::DynamicUsage(entry.tree);
1836 !                 }
1837               } else {
1838                   if (parent_it->second.entered != child_it->second.entered) {
1839                       // The parent may have removed the entry.
1840 --- 313,324 ----
1841               CAnchorsMap::iterator parent_it = cacheAnchors.find(child_it->first);
1842   
1843               if (parent_it == cacheAnchors.end()) {
1844 !                 CAnchorsCacheEntry& entry = cacheAnchors[child_it->first];
1845 !                 entry.entered = child_it->second.entered;
1846 !                 entry.tree = child_it->second.tree;
1847 !                 entry.flags = CAnchorsCacheEntry::DIRTY;
1848   
1849 !                 cachedCoinsUsage += memusage::DynamicUsage(entry.tree);
1850               } else {
1851                   if (parent_it->second.entered != child_it->second.entered) {
1852                       // The parent may have removed the entry.
1853 ***************
1854 *** 332,345 ****
1855               CNullifiersMap::iterator parent_it = cacheNullifiers.find(child_it->first);
1856   
1857               if (parent_it == cacheNullifiers.end()) {
1858 !                 if (child_it->second.entered) {
1859 !                     // Parent doesn't have an entry, but child has a SPENT nullifier.
1860 !                     // Move the spent nullifier up.
1861
1862 !                     CNullifiersCacheEntry& entry = cacheNullifiers[child_it->first];
1863 !                     entry.entered = true;
1864 !                     entry.flags = CNullifiersCacheEntry::DIRTY;
1865 !                 }
1866               } else {
1867                   if (parent_it->second.entered != child_it->second.entered) {
1868                       parent_it->second.entered = child_it->second.entered;
1869 --- 338,346 ----
1870               CNullifiersMap::iterator parent_it = cacheNullifiers.find(child_it->first);
1871   
1872               if (parent_it == cacheNullifiers.end()) {
1873 !                 CNullifiersCacheEntry& entry = cacheNullifiers[child_it->first];
1874 !                 entry.entered = child_it->second.entered;
1875 !                 entry.flags = CNullifiersCacheEntry::DIRTY;
1876               } else {
1877                   if (parent_it->second.entered != child_it->second.entered) {
1878                       parent_it->second.entered = child_it->second.entered;
1879 ***************
1880 *** 469,474 ****
1881 --- 470,476 ----
1882   {
1883       if (tx.IsCoinBase())
1884           return 0.0;
1885 +     CAmount nTotalIn = 0;
1886       double dResult = 0.0;
1887       BOOST_FOREACH(const CTxIn& txin, tx.vin)
1888       {
1889 ***************
1890 *** 477,484 ****
1891 --- 479,512 ----
1892           if (!coins->IsAvailable(txin.prevout.n)) continue;
1893           if (coins->nHeight < nHeight) {
1894               dResult += coins->vout[txin.prevout.n].nValue * (nHeight-coins->nHeight);
1895 +             nTotalIn += coins->vout[txin.prevout.n].nValue;
1896           }
1897       }
1898
1899 +     // If a transaction contains a joinsplit, we boost the priority of the transaction.
1900 +     // Joinsplits do not reveal any information about the value or age of a note, so we
1901 +     // cannot apply the priority algorithm used for transparent utxos.  Instead, we pick a
1902 +     // very large number and multiply it by the transaction's fee per 1000 bytes of data.
1903 +     // One trillion, 1000000000000, is equivalent to 1 ZEC utxo * 10000 blocks (~17 days).
1904 +     if (tx.vjoinsplit.size() > 0) {
1905 +         unsigned int nTxSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION);
1906 +         nTotalIn += tx.GetJoinSplitValueIn();
1907 +         CAmount fee = nTotalIn - tx.GetValueOut();
1908 +         CFeeRate feeRate(fee, nTxSize);
1909 +         CAmount feePerK = feeRate.GetFeePerK();
1910
1911 +         if (feePerK == 0) {
1912 +             feePerK = 1;
1913 +         }
1914
1915 +         dResult += 1000000000000 * double(feePerK);
1916 +         // We cast feePerK from int64_t to double because if feePerK is a large number, say
1917 +         // close to MAX_MONEY, the multiplication operation will result in an integer overflow.
1918 +         // The variable dResult should never overflow since a 64-bit double in C++ is typically
1919 +         // a double-precision floating-point number as specified by IEE 754, with a maximum
1920 +         // value DBL_MAX of 1.79769e+308.
1921 +     }
1922
1923       return tx.ComputePriority(dResult);
1924   }
1925   
1926 Only in ../../komodo-jl777/src: dpowassets
1927 Only in ../../komodo-jl777/src: fundnotaries
1928 diff -crB ./src/gtest/test_checkblock.cpp ../../komodo-jl777/src/gtest/test_checkblock.cpp
1929 *** ./src/gtest/test_checkblock.cpp     2017-01-03 10:40:50.227329975 +0000
1930 --- ../../komodo-jl777/src/gtest/test_checkblock.cpp    2017-01-03 09:49:08.856506348 +0000
1931 ***************
1932 *** 29,31 ****
1933 --- 29,74 ----
1934       EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "version-too-low", false)).Times(1);
1935       EXPECT_FALSE(CheckBlock(0,0,block, state, false, false));
1936   }
1937
1938 + TEST(ContextualCheckBlock, BadCoinbaseHeight) {
1939 +     SelectParams(CBaseChainParams::MAIN);
1940
1941 +     // Create a block with no height in scriptSig
1942 +     CMutableTransaction mtx;
1943 +     mtx.vin.resize(1);
1944 +     mtx.vin[0].prevout.SetNull();
1945 +     mtx.vin[0].scriptSig = CScript() << OP_0;
1946 +     mtx.vout.resize(1);
1947 +     mtx.vout[0].scriptPubKey = CScript() << OP_TRUE;
1948 +     mtx.vout[0].nValue = 0;
1949 +     CTransaction tx {mtx};
1950 +     CBlock block;
1951 +     block.vtx.push_back(tx);
1952
1953 +     // Treating block as genesis should pass
1954 +     MockCValidationState state;
1955 +     EXPECT_TRUE(ContextualCheckBlock(block, state, NULL));
1956
1957 +     // Treating block as non-genesis should fail
1958 +     mtx.vout.push_back(CTxOut(GetBlockSubsidy(1, Params().GetConsensus())/5, Params().GetFoundersRewardScriptAtHeight(1)));
1959 +     CTransaction tx2 {mtx};
1960 +     block.vtx[0] = tx2;
1961 +     CBlock prev;
1962 +     CBlockIndex indexPrev {prev};
1963 +     indexPrev.nHeight = 0;
1964 +     EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "bad-cb-height", false)).Times(1);
1965 +     EXPECT_FALSE(ContextualCheckBlock(block, state, &indexPrev));
1966
1967 +     // Setting to an incorrect height should fail
1968 +     mtx.vin[0].scriptSig = CScript() << 2 << OP_0;
1969 +     CTransaction tx3 {mtx};
1970 +     block.vtx[0] = tx3;
1971 +     EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "bad-cb-height", false)).Times(1);
1972 +     EXPECT_FALSE(ContextualCheckBlock(block, state, &indexPrev));
1973
1974 +     // After correcting the scriptSig, should pass
1975 +     mtx.vin[0].scriptSig = CScript() << 1 << OP_0;
1976 +     CTransaction tx4 {mtx};
1977 +     block.vtx[0] = tx4;
1978 +     EXPECT_TRUE(ContextualCheckBlock(block, state, &indexPrev));
1979 + }
1980 diff -crB ./src/gtest/test_joinsplit.cpp ../../komodo-jl777/src/gtest/test_joinsplit.cpp
1981 *** ./src/gtest/test_joinsplit.cpp      2017-01-03 10:40:50.227329975 +0000
1982 --- ../../komodo-jl777/src/gtest/test_joinsplit.cpp     2017-01-03 09:49:08.856506348 +0000
1983 ***************
1984 *** 15,20 ****
1985 --- 15,23 ----
1986   
1987   void test_full_api(ZCJoinSplit* js)
1988   {
1989 +     // Create verification context.
1990 +     auto verifier = libzcash::ProofVerifier::Strict();
1991
1992       // The recipient's information.
1993       SpendingKey recipient_key = SpendingKey::random();
1994       PaymentAddress recipient_addr = recipient_key.address();
1995 ***************
1996 *** 69,74 ****
1997 --- 72,78 ----
1998       // Verify the transaction:
1999       ASSERT_TRUE(js->verify(
2000           proof,
2001 +         verifier,
2002           pubKeyHash,
2003           randomSeed,
2004           macs,
2005 ***************
2006 *** 143,148 ****
2007 --- 147,153 ----
2008       // Verify the transaction:
2009       ASSERT_TRUE(js->verify(
2010           proof,
2011 +         verifier,
2012           pubKeyHash,
2013           randomSeed,
2014           macs,
2015 ***************
2016 *** 154,159 ****
2017 --- 159,222 ----
2018       ));
2019   }
2020   
2021 + // Invokes the API (but does not compute a proof)
2022 + // to test exceptions
2023 + void invokeAPI(
2024 +     ZCJoinSplit* js,
2025 +     const boost::array<JSInput, 2>& inputs,
2026 +     const boost::array<JSOutput, 2>& outputs,
2027 +     uint64_t vpub_old,
2028 +     uint64_t vpub_new,
2029 +     const uint256& rt
2030 + ) {
2031 +     uint256 ephemeralKey;
2032 +     uint256 randomSeed;
2033 +     uint256 pubKeyHash = random_uint256();
2034 +     boost::array<uint256, 2> macs;
2035 +     boost::array<uint256, 2> nullifiers;
2036 +     boost::array<uint256, 2> commitments;
2037 +     boost::array<ZCNoteEncryption::Ciphertext, 2> ciphertexts;
2038
2039 +     boost::array<Note, 2> output_notes;
2040
2041 +     ZCProof proof = js->prove(
2042 +         inputs,
2043 +         outputs,
2044 +         output_notes,
2045 +         ciphertexts,
2046 +         ephemeralKey,
2047 +         pubKeyHash,
2048 +         randomSeed,
2049 +         macs,
2050 +         nullifiers,
2051 +         commitments,
2052 +         vpub_old,
2053 +         vpub_new,
2054 +         rt,
2055 +         false
2056 +     );
2057 + }
2058
2059 + void invokeAPIFailure(
2060 +     ZCJoinSplit* js,
2061 +     const boost::array<JSInput, 2>& inputs,
2062 +     const boost::array<JSOutput, 2>& outputs,
2063 +     uint64_t vpub_old,
2064 +     uint64_t vpub_new,
2065 +     const uint256& rt,
2066 +     std::string reason
2067 + )
2068 + {
2069 +     try {
2070 +         invokeAPI(js, inputs, outputs, vpub_old, vpub_new, rt);
2071 +         FAIL() << "It worked, when it shouldn't have!";
2072 +     } catch(std::invalid_argument const & err) {
2073 +         EXPECT_EQ(err.what(), reason);
2074 +     } catch(...) {
2075 +         FAIL() << "Expected invalid_argument exception.";
2076 +     }
2077 + }
2078
2079   TEST(joinsplit, h_sig)
2080   {
2081       auto js = ZCJoinSplit::Unopened();
2082 ***************
2083 *** 233,242 ****
2084 --- 296,515 ----
2085       delete js;
2086   }
2087   
2088 + void increment_note_witnesses(
2089 +     const uint256& element,
2090 +     std::vector<ZCIncrementalWitness>& witnesses,
2091 +     ZCIncrementalMerkleTree& tree
2092 + )
2093 + {
2094 +     tree.append(element);
2095 +     for (ZCIncrementalWitness& w : witnesses) {
2096 +         w.append(element);
2097 +     }
2098 +     witnesses.push_back(tree.witness());
2099 + }
2100
2101   TEST(joinsplit, full_api_test)
2102   {
2103       auto js = ZCJoinSplit::Generate();
2104   
2105 +     {
2106 +         std::vector<ZCIncrementalWitness> witnesses;
2107 +         ZCIncrementalMerkleTree tree;
2108 +         increment_note_witnesses(uint256(), witnesses, tree);
2109 +         SpendingKey sk = SpendingKey::random();
2110 +         PaymentAddress addr = sk.address();
2111 +         Note note1(addr.a_pk, 100, random_uint256(), random_uint256());
2112 +         increment_note_witnesses(note1.cm(), witnesses, tree);
2113 +         Note note2(addr.a_pk, 100, random_uint256(), random_uint256());
2114 +         increment_note_witnesses(note2.cm(), witnesses, tree);
2115 +         Note note3(addr.a_pk, 2100000000000001, random_uint256(), random_uint256());
2116 +         increment_note_witnesses(note3.cm(), witnesses, tree);
2117 +         Note note4(addr.a_pk, 1900000000000000, random_uint256(), random_uint256());
2118 +         increment_note_witnesses(note4.cm(), witnesses, tree);
2119 +         Note note5(addr.a_pk, 1900000000000000, random_uint256(), random_uint256());
2120 +         increment_note_witnesses(note5.cm(), witnesses, tree);
2121
2122 +         // Should work
2123 +         invokeAPI(js,
2124 +         {
2125 +             JSInput(),
2126 +             JSInput()
2127 +         },
2128 +         {
2129 +             JSOutput(),
2130 +             JSOutput()
2131 +         },
2132 +         0,
2133 +         0,
2134 +         tree.root());
2135
2136 +         // lhs > MAX_MONEY
2137 +         invokeAPIFailure(js,
2138 +         {
2139 +             JSInput(),
2140 +             JSInput()
2141 +         },
2142 +         {
2143 +             JSOutput(),
2144 +             JSOutput()
2145 +         },
2146 +         2100000000000001,
2147 +         0,
2148 +         tree.root(),
2149 +         "nonsensical vpub_old value");
2150
2151 +         // rhs > MAX_MONEY
2152 +         invokeAPIFailure(js,
2153 +         {
2154 +             JSInput(),
2155 +             JSInput()
2156 +         },
2157 +         {
2158 +             JSOutput(),
2159 +             JSOutput()
2160 +         },
2161 +         0,
2162 +         2100000000000001,
2163 +         tree.root(),
2164 +         "nonsensical vpub_new value");
2165
2166 +         // input witness for the wrong element
2167 +         invokeAPIFailure(js,
2168 +         {
2169 +             JSInput(witnesses[0], note1, sk),
2170 +             JSInput()
2171 +         },
2172 +         {
2173 +             JSOutput(),
2174 +             JSOutput()
2175 +         },
2176 +         0,
2177 +         100,
2178 +         tree.root(),
2179 +         "witness of wrong element for joinsplit input");
2180
2181 +         // input witness doesn't match up with
2182 +         // real root
2183 +         invokeAPIFailure(js,
2184 +         {
2185 +             JSInput(witnesses[1], note1, sk),
2186 +             JSInput()
2187 +         },
2188 +         {
2189 +             JSOutput(),
2190 +             JSOutput()
2191 +         },
2192 +         0,
2193 +         100,
2194 +         uint256(),
2195 +         "joinsplit not anchored to the correct root");
2196
2197 +         // input is in the tree now! this should work
2198 +         invokeAPI(js,
2199 +         {
2200 +             JSInput(witnesses[1], note1, sk),
2201 +             JSInput()
2202 +         },
2203 +         {
2204 +             JSOutput(),
2205 +             JSOutput()
2206 +         },
2207 +         0,
2208 +         100,
2209 +         tree.root());
2210
2211 +         // Wrong secret key
2212 +         invokeAPIFailure(js,
2213 +         {
2214 +             JSInput(witnesses[1], note1, SpendingKey::random()),
2215 +             JSInput()
2216 +         },
2217 +         {
2218 +             JSOutput(),
2219 +             JSOutput()
2220 +         },
2221 +         0,
2222 +         0,
2223 +         tree.root(),
2224 +         "input note not authorized to spend with given key");
2225
2226 +         // Absurd input value
2227 +         invokeAPIFailure(js,
2228 +         {
2229 +             JSInput(witnesses[3], note3, sk),
2230 +             JSInput()
2231 +         },
2232 +         {
2233 +             JSOutput(),
2234 +             JSOutput()
2235 +         },
2236 +         0,
2237 +         0,
2238 +         tree.root(),
2239 +         "nonsensical input note value");
2240
2241 +         // Absurd total input value
2242 +         invokeAPIFailure(js,
2243 +         {
2244 +             JSInput(witnesses[4], note4, sk),
2245 +             JSInput(witnesses[5], note5, sk)
2246 +         },
2247 +         {
2248 +             JSOutput(),
2249 +             JSOutput()
2250 +         },
2251 +         0,
2252 +         0,
2253 +         tree.root(),
2254 +         "nonsensical left hand size of joinsplit balance");
2255
2256 +         // Absurd output value
2257 +         invokeAPIFailure(js,
2258 +         {
2259 +             JSInput(),
2260 +             JSInput()
2261 +         },
2262 +         {
2263 +             JSOutput(addr, 2100000000000001),
2264 +             JSOutput()
2265 +         },
2266 +         0,
2267 +         0,
2268 +         tree.root(),
2269 +         "nonsensical output value");
2270
2271 +         // Absurd total output value
2272 +         invokeAPIFailure(js,
2273 +         {
2274 +             JSInput(),
2275 +             JSInput()
2276 +         },
2277 +         {
2278 +             JSOutput(addr, 1900000000000000),
2279 +             JSOutput(addr, 1900000000000000)
2280 +         },
2281 +         0,
2282 +         0,
2283 +         tree.root(),
2284 +         "nonsensical right hand side of joinsplit balance");
2285
2286 +         // Absurd total output value
2287 +         invokeAPIFailure(js,
2288 +         {
2289 +             JSInput(),
2290 +             JSInput()
2291 +         },
2292 +         {
2293 +             JSOutput(addr, 1900000000000000),
2294 +             JSOutput()
2295 +         },
2296 +         0,
2297 +         0,
2298 +         tree.root(),
2299 +         "invalid joinsplit balance");
2300 +     }
2301
2302       test_full_api(js);
2303   
2304       js->saveProvingKey("./zcashTest.pk");
2305 diff -crB ./src/gtest/test_merkletree.cpp ../../komodo-jl777/src/gtest/test_merkletree.cpp
2306 *** ./src/gtest/test_merkletree.cpp     2017-01-03 10:40:50.227329975 +0000
2307 --- ../../komodo-jl777/src/gtest/test_merkletree.cpp    2017-01-03 09:49:08.856506348 +0000
2308 ***************
2309 *** 5,10 ****
2310 --- 5,11 ----
2311   #include "test/data/merkle_serialization.json.h"
2312   #include "test/data/merkle_witness_serialization.json.h"
2313   #include "test/data/merkle_path.json.h"
2314 + #include "test/data/merkle_commitments.json.h"
2315   
2316   #include <iostream>
2317   
2318 ***************
2319 *** 55,86 ****
2320   }
2321   
2322   template<typename Tree, typename Witness>
2323 ! void test_tree(Array root_tests, Array ser_tests, Array witness_ser_tests, Array path_tests) {
2324       Array::iterator root_iterator = root_tests.begin();
2325       Array::iterator ser_iterator = ser_tests.begin();
2326       Array::iterator witness_ser_iterator = witness_ser_tests.begin();
2327       Array::iterator path_iterator = path_tests.begin();
2328   
2329 -     uint256 test_commitment = uint256S("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
2330
2331       Tree tree;
2332   
2333       // The root of the tree at this point is expected to be the root of the
2334       // empty tree.
2335       ASSERT_TRUE(tree.root() == Tree::empty_root());
2336   
2337       // We need to witness at every single point in the tree, so
2338       // that the consistency of the tree and the merkle paths can
2339       // be checked.
2340       vector<Witness> witnesses;
2341   
2342       for (size_t i = 0; i < 16; i++) {
2343           // Witness here
2344           witnesses.push_back(tree.witness());
2345   
2346           // Now append a commitment to the tree
2347           tree.append(test_commitment);
2348   
2349           // Check tree root consistency
2350           expect_test_vector(root_iterator, tree.root());
2351   
2352 --- 56,101 ----
2353   }
2354   
2355   template<typename Tree, typename Witness>
2356 ! void test_tree(
2357 !     Array commitment_tests,
2358 !     Array root_tests,
2359 !     Array ser_tests,
2360 !     Array witness_ser_tests,
2361 !     Array path_tests
2362 ! )
2363 ! {
2364 !     Array::iterator commitment_iterator = commitment_tests.begin();
2365       Array::iterator root_iterator = root_tests.begin();
2366       Array::iterator ser_iterator = ser_tests.begin();
2367       Array::iterator witness_ser_iterator = witness_ser_tests.begin();
2368       Array::iterator path_iterator = path_tests.begin();
2369   
2370       Tree tree;
2371   
2372       // The root of the tree at this point is expected to be the root of the
2373       // empty tree.
2374       ASSERT_TRUE(tree.root() == Tree::empty_root());
2375   
2376 +     // The tree doesn't have a 'last' element added since it's blank.
2377 +     ASSERT_THROW(tree.last(), std::runtime_error);
2378
2379       // We need to witness at every single point in the tree, so
2380       // that the consistency of the tree and the merkle paths can
2381       // be checked.
2382       vector<Witness> witnesses;
2383   
2384       for (size_t i = 0; i < 16; i++) {
2385 +         uint256 test_commitment = uint256S((commitment_iterator++)->get_str());
2386
2387           // Witness here
2388           witnesses.push_back(tree.witness());
2389   
2390           // Now append a commitment to the tree
2391           tree.append(test_commitment);
2392   
2393 +         // Last element added to the tree was `test_commitment`
2394 +         ASSERT_TRUE(tree.last() == test_commitment);
2395
2396           // Check tree root consistency
2397           expect_test_vector(root_iterator, tree.root());
2398   
2399 ***************
2400 *** 95,100 ****
2401 --- 110,116 ----
2402   
2403               if (first) {
2404                   ASSERT_THROW(wit.path(), std::runtime_error);
2405 +                 ASSERT_THROW(wit.element(), std::runtime_error);
2406               } else {
2407                   auto path = wit.path();
2408   
2409 ***************
2410 *** 119,125 ****
2411   
2412                       std::vector<bool> commitment_bv;
2413                       {
2414 !                         std::vector<unsigned char> commitment_v(test_commitment.begin(), test_commitment.end());
2415                           commitment_bv = convertBytesVectorToVector(commitment_v);
2416                       }
2417   
2418 --- 135,142 ----
2419   
2420                       std::vector<bool> commitment_bv;
2421                       {
2422 !                         uint256 witnessed_commitment = wit.element();
2423 !                         std::vector<unsigned char> commitment_v(witnessed_commitment.begin(), witnessed_commitment.end());
2424                           commitment_bv = convertBytesVectorToVector(commitment_v);
2425                       }
2426   
2427 ***************
2428 *** 174,181 ****
2429       Array ser_tests = read_json(std::string(json_tests::merkle_serialization, json_tests::merkle_serialization + sizeof(json_tests::merkle_serialization)));
2430       Array witness_ser_tests = read_json(std::string(json_tests::merkle_witness_serialization, json_tests::merkle_witness_serialization + sizeof(json_tests::merkle_witness_serialization)));
2431       Array path_tests = read_json(std::string(json_tests::merkle_path, json_tests::merkle_path + sizeof(json_tests::merkle_path)));
2432   
2433 !     test_tree<ZCTestingIncrementalMerkleTree, ZCTestingIncrementalWitness>(root_tests, ser_tests, witness_ser_tests, path_tests);
2434   }
2435   
2436   TEST(merkletree, emptyroots) {
2437 --- 191,199 ----
2438       Array ser_tests = read_json(std::string(json_tests::merkle_serialization, json_tests::merkle_serialization + sizeof(json_tests::merkle_serialization)));
2439       Array witness_ser_tests = read_json(std::string(json_tests::merkle_witness_serialization, json_tests::merkle_witness_serialization + sizeof(json_tests::merkle_witness_serialization)));
2440       Array path_tests = read_json(std::string(json_tests::merkle_path, json_tests::merkle_path + sizeof(json_tests::merkle_path)));
2441 +     Array commitment_tests = read_json(std::string(json_tests::merkle_commitments, json_tests::merkle_commitments + sizeof(json_tests::merkle_commitments)));
2442   
2443 !     test_tree<ZCTestingIncrementalMerkleTree, ZCTestingIncrementalWitness>(commitment_tests, root_tests, ser_tests, witness_ser_tests, path_tests);
2444   }
2445   
2446   TEST(merkletree, emptyroots) {
2447 Only in ../../komodo-jl777/src/gtest: test_metrics.cpp
2448 diff -crB ./src/gtest/test_proofs.cpp ../../komodo-jl777/src/gtest/test_proofs.cpp
2449 *** ./src/gtest/test_proofs.cpp 2017-01-03 10:40:50.227329975 +0000
2450 --- ../../komodo-jl777/src/gtest/test_proofs.cpp        2017-01-03 09:49:08.856506348 +0000
2451 ***************
2452 *** 336,341 ****
2453 --- 336,364 ----
2454       auto example = libsnark::generate_r1cs_example_with_field_input<curve_Fr>(250, 4);
2455       example.constraint_system.swap_AB_if_beneficial();
2456       auto kp = libsnark::r1cs_ppzksnark_generator<curve_pp>(example.constraint_system);
2457 +     auto vkprecomp = libsnark::r1cs_ppzksnark_verifier_process_vk(kp.vk);
2458
2459 +     for (size_t i = 0; i < 20; i++) {
2460 +         auto badproof = ZCProof::random_invalid();
2461 +         auto proof = badproof.to_libsnark_proof<libsnark::r1cs_ppzksnark_proof<curve_pp>>();
2462 +         
2463 +         auto verifierEnabled = ProofVerifier::Strict();
2464 +         auto verifierDisabled = ProofVerifier::Disabled();
2465 +         // This verifier should catch the bad proof
2466 +         ASSERT_FALSE(verifierEnabled.check(
2467 +             kp.vk,
2468 +             vkprecomp,
2469 +             example.primary_input,
2470 +             proof
2471 +         ));
2472 +         // This verifier won't!
2473 +         ASSERT_TRUE(verifierDisabled.check(
2474 +             kp.vk,
2475 +             vkprecomp,
2476 +             example.primary_input,
2477 +             proof
2478 +         ));
2479 +     }
2480   
2481       for (size_t i = 0; i < 20; i++) {
2482           auto proof = libsnark::r1cs_ppzksnark_prover<curve_pp>(
2483 ***************
2484 *** 345,350 ****
2485 --- 368,390 ----
2486               example.constraint_system
2487           );
2488   
2489 +         {
2490 +             auto verifierEnabled = ProofVerifier::Strict();
2491 +             auto verifierDisabled = ProofVerifier::Disabled();
2492 +             ASSERT_TRUE(verifierEnabled.check(
2493 +                 kp.vk,
2494 +                 vkprecomp,
2495 +                 example.primary_input,
2496 +                 proof
2497 +             ));
2498 +             ASSERT_TRUE(verifierDisabled.check(
2499 +                 kp.vk,
2500 +                 vkprecomp,
2501 +                 example.primary_input,
2502 +                 proof
2503 +             ));
2504 +         }
2505
2506           ASSERT_TRUE(libsnark::r1cs_ppzksnark_verifier_strong_IC<curve_pp>(
2507               kp.vk,
2508               example.primary_input,
2509 diff -crB ./src/gtest/test_random.cpp ../../komodo-jl777/src/gtest/test_random.cpp
2510 *** ./src/gtest/test_random.cpp 2017-01-03 10:40:50.227329975 +0000
2511 --- ../../komodo-jl777/src/gtest/test_random.cpp        2017-01-03 09:49:08.856506348 +0000
2512 ***************
2513 *** 24,27 ****
2514 --- 24,35 ----
2515       std::vector<int> em2 {0, 1, 2, 3, 4};
2516       EXPECT_EQ(ea2, a2);
2517       EXPECT_EQ(em2, m2);
2518
2519 +     auto a3 = a;
2520 +     auto m3 = m;
2521 +     MappedShuffle(a3.begin(), m3.begin(), a3.size(), GenIdentity);
2522 +     std::vector<int> ea3 {8, 4, 6, 3, 5};
2523 +     std::vector<int> em3 {0, 1, 2, 3, 4};
2524 +     EXPECT_EQ(ea3, a3);
2525 +     EXPECT_EQ(em3, m3);
2526   }
2527 diff -crB ./src/init.cpp ../../komodo-jl777/src/init.cpp
2528 *** ./src/init.cpp      2017-01-03 10:40:50.227329975 +0000
2529 --- ../../komodo-jl777/src/init.cpp     2017-01-03 09:49:08.856506348 +0000
2530 ***************
2531 *** 62,68 ****
2532   bool fFeeEstimatesInitialized = false;
2533   
2534   #ifdef WIN32
2535 ! // Win32 LevelDB doesn't use filedescriptors, and the ones used for
2536   // accessing block files don't count towards the fd_set size limit
2537   // anyway.
2538   #define MIN_CORE_FILEDESCRIPTORS 0
2539 --- 62,68 ----
2540   bool fFeeEstimatesInitialized = false;
2541   
2542   #ifdef WIN32
2543 ! // Win32 LevelDB doesn't use file descriptors, and the ones used for
2544   // accessing block files don't count towards the fd_set size limit
2545   // anyway.
2546   #define MIN_CORE_FILEDESCRIPTORS 0
2547 ***************
2548 *** 348,354 ****
2549           strUsage += HelpMessageOpt("-mintxfee=<amt>", strprintf("Fees (in BTC/Kb) smaller than this are considered zero fee for transaction creation (default: %s)",
2550               FormatMoney(CWallet::minTxFee.GetFeePerK())));
2551       strUsage += HelpMessageOpt("-paytxfee=<amt>", strprintf(_("Fee (in BTC/kB) to add to transactions you send (default: %s)"), FormatMoney(payTxFee.GetFeePerK())));
2552 !     strUsage += HelpMessageOpt("-rescan", _("Rescan the block chain for missing wallet transactions") + " " + _("on startup"));
2553       strUsage += HelpMessageOpt("-salvagewallet", _("Attempt to recover private keys from a corrupt wallet.dat") + " " + _("on startup"));
2554       strUsage += HelpMessageOpt("-sendfreetransactions", strprintf(_("Send transactions as zero-fee transactions if possible (default: %u)"), 0));
2555       strUsage += HelpMessageOpt("-spendzeroconfchange", strprintf(_("Spend unconfirmed change when sending transactions (default: %u)"), 1));
2556 --- 348,354 ----
2557           strUsage += HelpMessageOpt("-mintxfee=<amt>", strprintf("Fees (in BTC/Kb) smaller than this are considered zero fee for transaction creation (default: %s)",
2558               FormatMoney(CWallet::minTxFee.GetFeePerK())));
2559       strUsage += HelpMessageOpt("-paytxfee=<amt>", strprintf(_("Fee (in BTC/kB) to add to transactions you send (default: %s)"), FormatMoney(payTxFee.GetFeePerK())));
2560 !     strUsage += HelpMessageOpt("-rescan", _("Rescan the blockchain for missing wallet transactions") + " " + _("on startup"));
2561       strUsage += HelpMessageOpt("-salvagewallet", _("Attempt to recover private keys from a corrupt wallet.dat") + " " + _("on startup"));
2562       strUsage += HelpMessageOpt("-sendfreetransactions", strprintf(_("Send transactions as zero-fee transactions if possible (default: %u)"), 0));
2563       strUsage += HelpMessageOpt("-spendzeroconfchange", strprintf(_("Spend unconfirmed change when sending transactions (default: %u)"), 1));
2564 ***************
2565 *** 380,386 ****
2566       if (mode == HMM_BITCOIN_QT)
2567           debugCategories += ", qt";
2568       strUsage += HelpMessageOpt("-debug=<category>", strprintf(_("Output debugging information (default: %u, supplying <category> is optional)"), 0) + ". " +
2569 !         _("If <category> is not supplied, output all debugging information.") + _("<category> can be:") + " " + debugCategories + ".");
2570   #ifdef ENABLE_WALLET
2571       strUsage += HelpMessageOpt("-gen", strprintf(_("Generate coins (default: %u)"), 0));
2572       strUsage += HelpMessageOpt("-genproclimit=<n>", strprintf(_("Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)"), 1));
2573 --- 380,386 ----
2574       if (mode == HMM_BITCOIN_QT)
2575           debugCategories += ", qt";
2576       strUsage += HelpMessageOpt("-debug=<category>", strprintf(_("Output debugging information (default: %u, supplying <category> is optional)"), 0) + ". " +
2577 !         _("If <category> is not supplied or if <category> = 1, output all debugging information.") + _("<category> can be:") + " " + debugCategories + ".");
2578   #ifdef ENABLE_WALLET
2579       strUsage += HelpMessageOpt("-gen", strprintf(_("Generate coins (default: %u)"), 0));
2580       strUsage += HelpMessageOpt("-genproclimit=<n>", strprintf(_("Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)"), 1));
2581 ***************
2582 *** 425,431 ****
2583       strUsage += HelpMessageOpt("-rpcport=<port>", strprintf(_("Listen for JSON-RPC connections on <port> (default: %u or testnet: %u)"), 8232, 18232));
2584       strUsage += HelpMessageOpt("-rpcallowip=<ip>", _("Allow JSON-RPC connections from specified source. Valid for <ip> are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24). This option can be specified multiple times"));
2585       strUsage += HelpMessageOpt("-rpcthreads=<n>", strprintf(_("Set the number of threads to service RPC calls (default: %d)"), 4));
2586 !     strUsage += HelpMessageOpt("-rpckeepalive", strprintf(_("RPC support for HTTP persistent connections (default: %d)"), 1));
2587   
2588       // Disabled until we can lock notes and also tune performance of libsnark which by default uses multiple threads
2589       //strUsage += HelpMessageOpt("-rpcasyncthreads=<n>", strprintf(_("Set the number of threads to service Async RPC calls (default: %d)"), 1));
2590 --- 425,434 ----
2591       strUsage += HelpMessageOpt("-rpcport=<port>", strprintf(_("Listen for JSON-RPC connections on <port> (default: %u or testnet: %u)"), 8232, 18232));
2592       strUsage += HelpMessageOpt("-rpcallowip=<ip>", _("Allow JSON-RPC connections from specified source. Valid for <ip> are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24). This option can be specified multiple times"));
2593       strUsage += HelpMessageOpt("-rpcthreads=<n>", strprintf(_("Set the number of threads to service RPC calls (default: %d)"), 4));
2594
2595 !     // TODO #1856: Re-enable support for persistent connections.
2596 !     // Disabled to avoid rpc deadlock #1680, until we backport upstream changes which replace boost::asio with libevent, or another solution is implemented.
2597 !     //strUsage += HelpMessageOpt("-rpckeepalive", strprintf(_("RPC support for HTTP persistent connections (default: %d)"), 1));
2598   
2599       // Disabled until we can lock notes and also tune performance of libsnark which by default uses multiple threads
2600       //strUsage += HelpMessageOpt("-rpcasyncthreads=<n>", strprintf(_("Set the number of threads to service Async RPC calls (default: %d)"), 1));
2601 ***************
2602 *** 447,452 ****
2603 --- 450,460 ----
2604           strUsage += HelpMessageOpt("-min", _("Start minimized"));
2605           strUsage += HelpMessageOpt("-rootcertificates=<file>", _("Set SSL root certificates for payment request (default: -system-)"));
2606           strUsage += HelpMessageOpt("-splash", _("Show splash screen on startup (default: 1)"));
2607 +     } else if (mode == HMM_BITCOIND) {
2608 +         strUsage += HelpMessageGroup(_("Metrics Options (only if -daemon and -printtoconsole are not set):"));
2609 +         strUsage += HelpMessageOpt("-showmetrics", _("Show metrics on stdout (default: 1 if running in a console, 0 otherwise)"));
2610 +         strUsage += HelpMessageOpt("-metricsui", _("Set to 1 for a persistent metrics screen, 0 for sequential metrics output (default: 1 if running in a console, 0 otherwise)"));
2611 +         strUsage += HelpMessageOpt("-metricsrefreshtime", strprintf(_("Number of seconds between metrics refreshes (default: %u if running in a console, %u otherwise)"), 1, 600));
2612       }
2613   
2614       return strUsage;
2615 ***************
2616 *** 538,548 ****
2617       RenameThread("zcash-loadblk");
2618       // -reindex
2619       if (fReindex) {
2620 - #ifdef ENABLE_WALLET
2621 -         if (pwalletMain) {
2622 -             pwalletMain->ClearNoteWitnessCache();
2623 -         }
2624 - #endif
2625           CImportingNow imp;
2626           int nFile = 0;
2627           while (true) {
2628 --- 546,551 ----
2629 ***************
2630 *** 980,1000 ****
2631       CScheduler::Function serviceLoop = boost::bind(&CScheduler::serviceQueue, &scheduler);
2632       threadGroup.create_thread(boost::bind(&TraceThread<CScheduler::Function>, "scheduler", serviceLoop));
2633   
2634       if ((chainparams.NetworkIDString() != "regtest") &&
2635 !             GetBoolArg("-showmetrics", false) &&
2636               !fPrintToConsole && !GetBoolArg("-daemon", false)) {
2637           // Start the persistent metrics interface
2638           ConnectMetricsScreen();
2639           threadGroup.create_thread(&ThreadShowMetricsScreen);
2640       }
2641   
2642 -     // Initialize Zcash circuit parameters
2643 -     ZC_LoadParams();
2644       // These must be disabled for now, they are buggy and we probably don't
2645       // want any of libsnark's profiling in production anyway.
2646       libsnark::inhibit_profiling_info = true;
2647       libsnark::inhibit_profiling_counters = true;
2648   
2649       /* Start the RPC server already.  It will be started in "warmup" mode
2650        * and not really process calls already (but it will signify connections
2651        * that the server is there and will be ready later).  Warmup mode will
2652 --- 983,1007 ----
2653       CScheduler::Function serviceLoop = boost::bind(&CScheduler::serviceQueue, &scheduler);
2654       threadGroup.create_thread(boost::bind(&TraceThread<CScheduler::Function>, "scheduler", serviceLoop));
2655   
2656 +     // Count uptime
2657 +     MarkStartTime();
2658
2659       if ((chainparams.NetworkIDString() != "regtest") &&
2660 !             GetBoolArg("-showmetrics", 0) &&
2661               !fPrintToConsole && !GetBoolArg("-daemon", false)) {
2662           // Start the persistent metrics interface
2663           ConnectMetricsScreen();
2664           threadGroup.create_thread(&ThreadShowMetricsScreen);
2665       }
2666   
2667       // These must be disabled for now, they are buggy and we probably don't
2668       // want any of libsnark's profiling in production anyway.
2669       libsnark::inhibit_profiling_info = true;
2670       libsnark::inhibit_profiling_counters = true;
2671   
2672 +     // Initialize Zcash circuit parameters
2673 +     ZC_LoadParams();
2674
2675       /* Start the RPC server already.  It will be started in "warmup" mode
2676        * and not really process calls already (but it will signify connections
2677        * that the server is there and will be ready later).  Warmup mode will
2678 ***************
2679 *** 1379,1385 ****
2680 --- 1386,1395 ----
2681   
2682           CBlockIndex *pindexRescan = chainActive.Tip();
2683           if (GetBoolArg("-rescan", false))
2684 +         {
2685 +             pwalletMain->ClearNoteWitnessCache();
2686               pindexRescan = chainActive.Genesis();
2687 +         }
2688           else
2689           {
2690               CWalletDB walletdb(strWalletFile);
2691 diff -crB ./src/komodo_gateway.h ../../komodo-jl777/src/komodo_gateway.h
2692 *** ./src/komodo_gateway.h      2017-01-03 10:40:50.231330177 +0000
2693 --- ../../komodo-jl777/src/komodo_gateway.h     2017-01-03 09:49:08.856506348 +0000
2694 ***************
2695 *** 87,95 ****
2696 --- 87,105 ----
2697       return(pax);
2698   }
2699   
2700 + void komodo_paxdelete(struct pax_transaction *pax)
2701 + {
2702 +     return; // breaks when out of order
2703 +     pthread_mutex_lock(&komodo_mutex);
2704 +     HASH_DELETE(hh,PAX,pax);
2705 +     pthread_mutex_unlock(&komodo_mutex);
2706 + }
2707
2708   void komodo_gateway_deposit(char *coinaddr,uint64_t value,char *symbol,uint64_t fiatoshis,uint8_t *rmd160,uint256 txid,uint16_t vout,uint8_t type,int32_t height,int32_t otherheight,char *source,int32_t approved) // assetchain context
2709   {
2710       struct pax_transaction *pax; uint8_t buf[35]; int32_t addflag = 0; struct komodo_state *sp; char str[16],dest[16],*s;
2711 +     if ( KOMODO_PAX == 0 )
2712 +         return;
2713       sp = komodo_stateptr(str,dest);
2714       pthread_mutex_lock(&komodo_mutex);
2715       pax_keyset(buf,txid,vout,type);
2716 ***************
2717 *** 178,190 ****
2718   int32_t komodo_issued_opreturn(char *base,uint256 *txids,uint16_t *vouts,int64_t *values,int64_t *srcvalues,int32_t *kmdheights,int32_t *otherheights,int8_t *baseids,uint8_t *rmd160s,uint8_t *opretbuf,int32_t opretlen,int32_t iskomodo)
2719   {
2720       struct pax_transaction p,*pax; int32_t i,n=0,j,len=0,incr,height,otherheight; uint8_t type,rmd160[20]; uint64_t fiatoshis; char symbol[16];
2721 !     incr = 34 + (iskomodo * (2*sizeof(fiatoshis) + 2*sizeof(height) + 20 + 4));
2722 !     for (i=0; i<4; i++)
2723 !         base[i] = opretbuf[opretlen-4+i];
2724       //for (i=0; i<opretlen; i++)
2725       //    printf("%02x",opretbuf[i]);
2726       //printf(" opretlen.%d (%s)\n",opretlen,base);
2727 !     //printf(" opretlen.%d vs %d incr.%d\n",opretlen,(int32_t)(2*sizeof(fiatoshis) + 2*sizeof(height) + 20 + 4),incr);
2728       //if ( ASSETCHAINS_SYMBOL[0] == 0 || strncmp(ASSETCHAINS_SYMBOL,base,strlen(base)) == 0 )
2729       {
2730           type = opretbuf[0];
2731 --- 188,201 ----
2732   int32_t komodo_issued_opreturn(char *base,uint256 *txids,uint16_t *vouts,int64_t *values,int64_t *srcvalues,int32_t *kmdheights,int32_t *otherheights,int8_t *baseids,uint8_t *rmd160s,uint8_t *opretbuf,int32_t opretlen,int32_t iskomodo)
2733   {
2734       struct pax_transaction p,*pax; int32_t i,n=0,j,len=0,incr,height,otherheight; uint8_t type,rmd160[20]; uint64_t fiatoshis; char symbol[16];
2735 !     if ( KOMODO_PAX == 0 )
2736 !         return(0);
2737 !     incr = 34 + (iskomodo * (2*sizeof(fiatoshis) + 2*sizeof(height) + 20));
2738 !     //41e77b91cb68dc2aa02fa88550eae6b6d44db676a7e935337b6d1392d9718f03cb0200305c90660400000000fbcbeb1f000000bde801006201000058e7945ad08ddba1eac9c9b6c8e1e97e8016a2d152
2739       //for (i=0; i<opretlen; i++)
2740       //    printf("%02x",opretbuf[i]);
2741       //printf(" opretlen.%d (%s)\n",opretlen,base);
2742 !     //printf(" opretlen.%d vs %d incr.%d (%d)\n",opretlen,(int32_t)(2*sizeof(fiatoshis) + 2*sizeof(height) + 20 + 2),incr,opretlen/incr);
2743       //if ( ASSETCHAINS_SYMBOL[0] == 0 || strncmp(ASSETCHAINS_SYMBOL,base,strlen(base)) == 0 )
2744       {
2745           type = opretbuf[0];
2746 ***************
2747 *** 215,220 ****
2748 --- 226,233 ----
2749               }
2750               else
2751               {
2752 +                 for (i=0; i<4; i++)
2753 +                     base[i] = opretbuf[opretlen-4+i];
2754                   for (j=0; j<32; j++)
2755                   {
2756                       ((uint8_t *)&txids[n])[j] = opretbuf[len++];
2757 ***************
2758 *** 238,259 ****
2759       return(n);
2760   }
2761   
2762   uint64_t komodo_paxtotal()
2763   {
2764       struct pax_transaction *pax,*pax2,*tmp,*tmp2; char symbol[16],dest[16],*str; int32_t i,ht; int64_t checktoshis; uint64_t seed,total = 0; struct komodo_state *basesp;
2765       if ( komodo_isrealtime(&ht) == 0 )
2766           return(0);
2767       else
2768       {
2769           HASH_ITER(hh,PAX,pax,tmp)
2770           {
2771               if ( pax->type == 'A' || pax->type == 'D' || pax->type == 'X' )
2772                   str = pax->symbol;
2773               else str = pax->source;
2774               basesp = komodo_stateptrget(str);
2775 !             if ( basesp != 0 && pax->didstats == 0 && pax->type == 'I' )
2776               {
2777 !                 if ( (pax2= komodo_paxfind(pax->txid,pax->vout,'D')) != 0 )
2778                   {
2779                       if ( pax2->fiatoshis != 0 )
2780                       {
2781 --- 251,300 ----
2782       return(n);
2783   }
2784   
2785 + int32_t komodo_paxcmp(char *symbol,int32_t kmdheight,uint64_t value,uint64_t checkvalue,uint64_t seed)
2786 + {
2787 +     int32_t ratio;
2788 +     if ( seed == 0 && checkvalue != 0 )
2789 +     {
2790 +         ratio = ((value << 6) / checkvalue);
2791 +         if ( ratio >= 63 && ratio <= 65 )
2792 +             return(0);
2793 +         else
2794 +         {
2795 +             if ( kmdheight >= 86150 )
2796 +                 printf("ht.%d ignore mismatched %s value %lld vs checkvalue %lld -> ratio.%d\n",kmdheight,symbol,(long long)value,(long long)checkvalue,ratio);
2797 +             return(-1);
2798 +         }
2799 +     }
2800 +     else if ( checkvalue != 0 )
2801 +     {
2802 +         ratio = ((value << 10) / checkvalue);
2803 +         if ( ratio >= 1023 && ratio <= 1025 )
2804 +             return(0);
2805 +     }
2806 +     return(value != checkvalue);
2807 + }
2808
2809   uint64_t komodo_paxtotal()
2810   {
2811       struct pax_transaction *pax,*pax2,*tmp,*tmp2; char symbol[16],dest[16],*str; int32_t i,ht; int64_t checktoshis; uint64_t seed,total = 0; struct komodo_state *basesp;
2812 +     if ( KOMODO_PAX == 0 )
2813 +         return(0);
2814       if ( komodo_isrealtime(&ht) == 0 )
2815           return(0);
2816       else
2817       {
2818           HASH_ITER(hh,PAX,pax,tmp)
2819           {
2820 +             if ( pax->marked != 0 )
2821 +                 continue;
2822               if ( pax->type == 'A' || pax->type == 'D' || pax->type == 'X' )
2823                   str = pax->symbol;
2824               else str = pax->source;
2825               basesp = komodo_stateptrget(str);
2826 !             if ( basesp != 0 && pax->didstats == 0 )
2827               {
2828 !                 if ( pax->type == 'I' && (pax2= komodo_paxfind(pax->txid,pax->vout,'D')) != 0 )
2829                   {
2830                       if ( pax2->fiatoshis != 0 )
2831                       {
2832 ***************
2833 *** 267,305 ****
2834                           pax->marked = pax->height;
2835                       }
2836                   }
2837               }
2838           }
2839       }
2840       komodo_stateptr(symbol,dest);
2841       HASH_ITER(hh,PAX,pax,tmp)
2842       {
2843 !         //printf("pax.%s marked.%d %.8f -> %.8f\n",pax->symbol,pax->marked,dstr(pax->komodoshis),dstr(pax->fiatoshis));
2844 !         if ( strcmp(symbol,pax->symbol) == 0 )
2845           {
2846               if ( pax->marked == 0 )
2847               {
2848                   if ( komodo_is_issuer() != 0 )
2849 !                     total += pax->fiatoshis;
2850 !                 else if ( pax->approved != 0 )
2851                   {
2852                       if ( pax->validated != 0 )
2853                           total += pax->komodoshis;
2854                       else
2855                       {
2856                           seed = 0;
2857                           checktoshis = komodo_paxprice(&seed,pax->height,pax->source,(char *)"KMD",(uint64_t)pax->fiatoshis);
2858                           //printf("PAX_fiatdest ht.%d price %s %.8f -> KMD %.8f vs %.8f\n",pax->height,pax->symbol,(double)pax->fiatoshis/COIN,(double)pax->komodoshis/COIN,(double)checktoshis/COIN);
2859                           //printf(" v%d %.8f k.%d ht.%d\n",pax->vout,dstr(pax->komodoshis),pax->height,pax->otherheight);
2860 !                         if ( seed != 0 )
2861                           {
2862 !                             if ( checktoshis >= pax->komodoshis )
2863                               {
2864                                   total += pax->komodoshis;
2865                                   pax->validated = pax->komodoshis;
2866                               } else pax->marked = pax->height;
2867                           }
2868                       }
2869                   }
2870               }
2871           }
2872       }
2873 --- 308,382 ----
2874                           pax->marked = pax->height;
2875                       }
2876                   }
2877 +                 else if ( pax->type == 'W' )
2878 +                 {
2879 +                     //bitcoin_address(coinaddr,addrtype,rmd160,20);
2880 +                     if ( (checktoshis= komodo_paxprice(&seed,pax->height,pax->source,(char *)"KMD",(uint64_t)pax->fiatoshis)) != 0 )
2881 +                     {
2882 +                         if ( komodo_paxcmp(pax->source,pax->height,pax->komodoshis,checktoshis,seed) != 0 )
2883 +                         {
2884 +                             pax->marked = pax->height;
2885 +                             //printf("WITHDRAW.%s mark <- %d %.8f != %.8f\n",pax->source,pax->height,dstr(checktoshis),dstr(pax->komodoshis));
2886 +                         }
2887 +                         else if ( pax->validated == 0 )
2888 +                         {
2889 +                             pax->validated = pax->komodoshis = checktoshis;
2890 +                             //int32_t j; for (j=0; j<32; j++)
2891 +                             //    printf("%02x",((uint8_t *)&pax->txid)[j]);
2892 +                             //if ( strcmp(str,ASSETCHAINS_SYMBOL) == 0 )
2893 +                             //    printf(" v%d %p got WITHDRAW.%s kmd.%d ht.%d %.8f -> %.8f/%.8f\n",pax->vout,pax,pax->source,pax->height,pax->otherheight,dstr(pax->fiatoshis),dstr(pax->komodoshis),dstr(checktoshis));
2894 +                         }
2895 +                     }
2896 +                 }
2897               }
2898           }
2899       }
2900       komodo_stateptr(symbol,dest);
2901       HASH_ITER(hh,PAX,pax,tmp)
2902       {
2903 !         pax->ready = 0;
2904 !         if ( 0 && pax->type == 'A' )
2905 !             printf("%p pax.%s <- %s marked.%d %.8f -> %.8f validated.%d approved.%d\n",pax,pax->symbol,pax->source,pax->marked,dstr(pax->komodoshis),dstr(pax->fiatoshis),pax->validated != 0,pax->approved != 0);
2906 !         if ( pax->marked != 0 )
2907 !             continue;
2908 !         if ( strcmp(symbol,pax->symbol) == 0 || pax->type == 'A' )
2909           {
2910               if ( pax->marked == 0 )
2911               {
2912                   if ( komodo_is_issuer() != 0 )
2913 !                 {
2914 !                     if ( pax->validated != 0 && pax->type == 'D' )
2915 !                     {
2916 !                         total += pax->fiatoshis;
2917 !                         pax->ready = 1;
2918 !                     }
2919 !                 }
2920 !                 else if ( pax->approved != 0 && pax->type == 'A' )
2921                   {
2922                       if ( pax->validated != 0 )
2923 +                     {
2924                           total += pax->komodoshis;
2925 +                         pax->ready = 1;
2926 +                     }
2927                       else
2928                       {
2929                           seed = 0;
2930                           checktoshis = komodo_paxprice(&seed,pax->height,pax->source,(char *)"KMD",(uint64_t)pax->fiatoshis);
2931                           //printf("PAX_fiatdest ht.%d price %s %.8f -> KMD %.8f vs %.8f\n",pax->height,pax->symbol,(double)pax->fiatoshis/COIN,(double)pax->komodoshis/COIN,(double)checktoshis/COIN);
2932                           //printf(" v%d %.8f k.%d ht.%d\n",pax->vout,dstr(pax->komodoshis),pax->height,pax->otherheight);
2933 !                         if ( seed != 0 && checktoshis != 0 )
2934                           {
2935 !                             if ( checktoshis == pax->komodoshis )
2936                               {
2937                                   total += pax->komodoshis;
2938                                   pax->validated = pax->komodoshis;
2939 +                                 pax->ready = 1;
2940                               } else pax->marked = pax->height;
2941                           }
2942                       }
2943                   }
2944 +                 if ( 0 && pax->ready != 0 )
2945 +                     printf("%p (%c) pax.%s marked.%d %.8f -> %.8f validated.%d approved.%d\n",pax,pax->type,pax->symbol,pax->marked,dstr(pax->komodoshis),dstr(pax->fiatoshis),pax->validated != 0,pax->approved != 0);
2946               }
2947           }
2948       }
2949 ***************
2950 *** 307,373 ****
2951       return(total);
2952   }
2953   
2954 ! int32_t komodo_pending_withdraws(char *opretstr)
2955   {
2956 !     struct pax_transaction *pax,*tmp; uint8_t opretbuf[16384]; int32_t ht,len=0; uint64_t total = 0;
2957       if ( komodo_isrealtime(&ht) == 0 || ASSETCHAINS_SYMBOL[0] != 0 )
2958           return(0);
2959       HASH_ITER(hh,PAX,pax,tmp)
2960       {
2961 !         //printf("pax %s marked.%u approved.%u\n",pax->symbol,pax->marked,pax->approved);
2962 !         if ( pax->marked == 0 && strcmp((char *)"KMD",pax->symbol) == 0 && pax->approved == 0 )
2963           {
2964 !             // add 'A' opreturn entry
2965 !             if ( len == 0 )
2966 !                 opretbuf[len++] = 'A';
2967 !             len += komodo_rwapproval(1,&opretbuf[len],pax);
2968 !             //printf("%s.(marked.%u approved.%d) %p\n",pax->source,pax->marked,pax->approved,pax);
2969           }
2970       }
2971 !     if ( len > 0 )
2972 !         init_hexbytes_noT(opretstr,opretbuf,len);
2973 !     else opretstr[0] = 0;
2974 !     fprintf(stderr,"komodo_pending_withdraws len.%d PAXTOTAL %.8f\n",len,dstr(komodo_paxtotal()));
2975       return(len);
2976   }
2977   
2978   int32_t komodo_gateway_deposits(CMutableTransaction *txNew,char *base,int32_t tokomodo)
2979   {
2980       struct pax_transaction *pax,*tmp; char symbol[16],dest[16]; uint8_t *script,opcode,opret[16384],data[16384]; int32_t i,baseid,ht,len=0,opretlen=0,numvouts=1; struct komodo_state *sp; uint64_t available,deposited,issued,withdrawn,approved,redeemed,mask;
2981       sp = komodo_stateptr(symbol,dest);
2982       strcpy(symbol,base);
2983       PENDING_KOMODO_TX = 0;
2984       if ( tokomodo == 0 )
2985       {
2986           opcode = 'I';
2987           if ( komodo_isrealtime(&ht) == 0 )
2988               return(0);
2989 !     } else opcode = 'X';
2990       HASH_ITER(hh,PAX,pax,tmp)
2991       {
2992 -         //printf("pax.%s marked.%d %.8f -> %.8f\n",pax->symbol,pax->marked,dstr(pax->komodoshis),dstr(pax->fiatoshis));
2993 -         if ( strcmp(symbol,"KMD") == 0 && pax->approved == 0 )
2994 -             continue;
2995 -         //else if ( strcmp(symbol,"KMD") != 0 )
2996           {
2997   #ifdef KOMODO_ASSETCHAINS_WAITNOTARIZE
2998 !             struct komodo_state *kmdsp = komodo_stateptrget((char *)"KMD");
2999 !             if ( kmdsp != 0 && kmdsp->NOTARIZED_HEIGHT >= pax->height ) // assumes same chain as notarize
3000                   pax->validated = pax->komodoshis; //kmdsp->NOTARIZED_HEIGHT;
3001   #endif
3002           }
3003 !         if ( pax_fiatstatus(&available,&deposited,&issued,&withdrawn,&approved,&redeemed,symbol) != 0 || available < pax->fiatoshis )
3004           {
3005 !             printf("miner: skip %s %.8f when avail %.8f\n",symbol,dstr(pax->fiatoshis),dstr(available));
3006               continue;
3007           }
3008 !         if ( pax->marked != 0 )
3009               continue;
3010 !         if ( strcmp(pax->symbol,symbol) != 0 || pax->validated == 0 )
3011           {
3012               //printf("pax->symbol.%s != %s or null pax->validated %.8f\n",pax->symbol,symbol,dstr(pax->validated));
3013               continue;
3014           }
3015           if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 )
3016               printf("pax.%s marked.%d %.8f -> %.8f\n",ASSETCHAINS_SYMBOL,pax->marked,dstr(pax->komodoshis),dstr(pax->fiatoshis));
3017           txNew->vout.resize(numvouts+1);
3018 --- 384,518 ----
3019       return(total);
3020   }
3021   
3022 ! static int _paxorder(const void *a,const void *b)
3023   {
3024 ! #define pax_a (*(struct pax_transaction **)a)
3025 ! #define pax_b (*(struct pax_transaction **)b)
3026 !     uint64_t aval,bval;
3027 !     aval = pax_a->fiatoshis + pax_a->komodoshis + pax_a->height;
3028 !     bval = pax_b->fiatoshis + pax_b->komodoshis + pax_b->height;
3029 !       if ( bval > aval )
3030 !               return(-1);
3031 !       else if ( bval < aval )
3032 !               return(1);
3033 !       return(0);
3034 ! #undef pax_a
3035 ! #undef pax_b
3036 ! }
3037
3038 ! int32_t komodo_pending_withdraws(char *opretstr) // todo: enforce deterministic order
3039 ! {
3040 !     struct pax_transaction *pax,*pax2,*tmp,*paxes[64]; uint8_t opretbuf[16384]; int32_t i,n,ht,len=0; uint64_t total = 0;
3041 !     if ( KOMODO_PAX == 0 )
3042 !         return(0);
3043       if ( komodo_isrealtime(&ht) == 0 || ASSETCHAINS_SYMBOL[0] != 0 )
3044           return(0);
3045 +     n = 0;
3046       HASH_ITER(hh,PAX,pax,tmp)
3047       {
3048 !         if ( pax->type == 'W' )
3049           {
3050 !             if ( (pax2= komodo_paxfind(pax->txid,pax->vout,'A')) != 0 )
3051 !             {
3052 !                 if ( pax2->approved != 0 )
3053 !                     pax->approved = pax2->approved;
3054 !             }
3055 !             else if ( (pax2= komodo_paxfind(pax->txid,pax->vout,'X')) != 0 )
3056 !                 pax->approved = pax->height;
3057 !                 //printf("pax %s marked.%u approved.%u validated.%llu\n",pax->symbol,pax->marked,pax->approved,(long long)pax->validated);
3058 !             if ( pax->marked == 0 && strcmp((char *)"KMD",pax->symbol) == 0 && pax->approved == 0 && pax->validated != 0 )
3059 !             {
3060 !                 if ( n < sizeof(paxes)/sizeof(*paxes) )
3061 !                 {
3062 !                     paxes[n++] = pax;
3063 !                     //int32_t j; for (j=0; j<32; j++)
3064 !                     //    printf("%02x",((uint8_t *)&pax->txid)[j]);
3065 !                     //printf(" %s.(kmdht.%d ht.%d marked.%u approved.%d validated %.8f) %.8f\n",pax->source,pax->height,pax->otherheight,pax->marked,pax->approved,dstr(pax->validated),dstr(pax->komodoshis));
3066 !                 }
3067 !             }
3068           }
3069       }
3070 !     opretstr[0] = 0;
3071 !     if ( n > 0 )
3072 !     {
3073 !         opretbuf[len++] = 'A';
3074 !         qsort(paxes,n,sizeof(*paxes),_paxorder);
3075 !         for (i=0; i<n; i++)
3076 !         {
3077 !             if ( len < (sizeof(opretbuf)>>3)*7 )
3078 !                 len += komodo_rwapproval(1,&opretbuf[len],paxes[i]);
3079 !         }
3080 !         if ( len > 0 )
3081 !             init_hexbytes_noT(opretstr,opretbuf,len);
3082 !     }
3083 !     //fprintf(stderr,"komodo_pending_withdraws len.%d PAXTOTAL %.8f\n",len,dstr(komodo_paxtotal()));
3084       return(len);
3085   }
3086   
3087   int32_t komodo_gateway_deposits(CMutableTransaction *txNew,char *base,int32_t tokomodo)
3088   {
3089       struct pax_transaction *pax,*tmp; char symbol[16],dest[16]; uint8_t *script,opcode,opret[16384],data[16384]; int32_t i,baseid,ht,len=0,opretlen=0,numvouts=1; struct komodo_state *sp; uint64_t available,deposited,issued,withdrawn,approved,redeemed,mask;
3090 +     if ( KOMODO_PAX == 0 )
3091 +         return(0);
3092 +     struct komodo_state *kmdsp = komodo_stateptrget((char *)"KMD");
3093       sp = komodo_stateptr(symbol,dest);
3094       strcpy(symbol,base);
3095 +     if ( ASSETCHAINS_SYMBOL[0] != 0 && komodo_baseid(ASSETCHAINS_SYMBOL) < 0 )
3096 +         return(0);
3097       PENDING_KOMODO_TX = 0;
3098       if ( tokomodo == 0 )
3099       {
3100           opcode = 'I';
3101           if ( komodo_isrealtime(&ht) == 0 )
3102               return(0);
3103 !     }
3104 !     else
3105 !     {
3106 !         opcode = 'X';
3107 !         if ( komodo_paxtotal() == 0 )
3108 !             return(0);
3109 !     }
3110       HASH_ITER(hh,PAX,pax,tmp)
3111       {
3112           {
3113   #ifdef KOMODO_ASSETCHAINS_WAITNOTARIZE
3114 !             if ( kmdsp != 0 && (kmdsp->NOTARIZED_HEIGHT >= pax->height || kmdsp->CURRENT_HEIGHT > pax->height+30) ) // assumes same chain as notarize
3115                   pax->validated = pax->komodoshis; //kmdsp->NOTARIZED_HEIGHT;
3116 +             else pax->validated = pax->ready = 0;
3117   #endif
3118           }
3119 !         if ( ASSETCHAINS_SYMBOL[0] != 0 && (pax_fiatstatus(&available,&deposited,&issued,&withdrawn,&approved,&redeemed,symbol) != 0 || available < pax->fiatoshis) )
3120           {
3121 !             if ( strcmp(ASSETCHAINS_SYMBOL,symbol) == 0 )
3122 !                 printf("miner.[%s]: skip %s %.8f when avail %.8f\n",ASSETCHAINS_SYMBOL,symbol,dstr(pax->fiatoshis),dstr(available));
3123               continue;
3124           }
3125 !         /*printf("pax.%s marked.%d %.8f -> %.8f ready.%d validated.%d\n",pax->symbol,pax->marked,dstr(pax->komodoshis),dstr(pax->fiatoshis),pax->ready!=0,pax->validated!=0);
3126 !         if ( pax->marked != 0 || (pax->type != 'D' && pax->type != 'A') || pax->ready == 0 )
3127 !         {
3128 !             printf("reject 2\n");
3129               continue;
3130 !         }*/
3131 !         if ( ASSETCHAINS_SYMBOL[0] != 0 && (strcmp(pax->symbol,symbol) != 0 || pax->validated == 0) )
3132           {
3133               //printf("pax->symbol.%s != %s or null pax->validated %.8f\n",pax->symbol,symbol,dstr(pax->validated));
3134               continue;
3135           }
3136 +         if ( pax->ready == 0 )
3137 +             continue;
3138 +         if ( pax->type == 'A' && ASSETCHAINS_SYMBOL[0] == 0 )
3139 +         {
3140 +             if ( kmdsp != 0 )
3141 +             {
3142 +                 if ( (baseid= komodo_baseid(pax->symbol)) < 0 || ((1LL << baseid) & sp->RTmask) == 0 )
3143 +                 {
3144 +                     printf("not RT for (%s) %llx baseid.%d %llx\n",pax->symbol,(long long)sp->RTmask,baseid,(long long)(1LL<<baseid));
3145 +                     continue;
3146 +                 }
3147 +             } else continue;
3148 +         }
3149
3150 +         //printf("redeem.%d? (%c) %p pax.%s marked.%d %.8f -> %.8f ready.%d validated.%d approved.%d\n",tokomodo,pax->type,pax,pax->symbol,pax->marked,dstr(pax->komodoshis),dstr(pax->fiatoshis),pax->ready!=0,pax->validated!=0,pax->approved!=0);
3151           if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 )
3152               printf("pax.%s marked.%d %.8f -> %.8f\n",ASSETCHAINS_SYMBOL,pax->marked,dstr(pax->komodoshis),dstr(pax->fiatoshis));
3153           txNew->vout.resize(numvouts+1);
3154 ***************
3155 *** 392,398 ****
3156           {
3157               len += komodo_rwapproval(1,&data[len],pax);
3158               PENDING_KOMODO_TX += pax->komodoshis;
3159 !             //printf(" vout.%u DEPOSIT %.8f <- pax.%s pending %.8f | ",pax->vout,(double)txNew->vout[numvouts].nValue/COIN,symbol,dstr(PENDING_KOMODO_TX));
3160           }
3161           if ( numvouts++ >= 64 )
3162               break;
3163 --- 537,543 ----
3164           {
3165               len += komodo_rwapproval(1,&data[len],pax);
3166               PENDING_KOMODO_TX += pax->komodoshis;
3167 !             printf(" vout.%u DEPOSIT %.8f <- pax.%s pending %.8f | ",pax->vout,(double)txNew->vout[numvouts].nValue/COIN,symbol,dstr(PENDING_KOMODO_TX));
3168           }
3169           if ( numvouts++ >= 64 )
3170               break;
3171 ***************
3172 *** 419,424 ****
3173 --- 564,571 ----
3174   int32_t komodo_check_deposit(int32_t height,const CBlock& block) // verify above block is valid pax pricing
3175   {
3176       int32_t i,j,n,num,opretlen,offset=1,errs=0,matched=0,kmdheights[64],otherheights[64]; uint256 hash,txids[64]; char symbol[16],base[16]; uint16_t vouts[64]; int8_t baseids[64]; uint8_t *script,opcode,rmd160s[64*20]; uint64_t available,deposited,issued,withdrawn,approved,redeemed; int64_t values[64],srcvalues[64]; struct pax_transaction *pax;
3177 +     if ( KOMODO_PAX == 0 )
3178 +         return(0);
3179       memset(baseids,0xff,sizeof(baseids));
3180       memset(values,0,sizeof(values));
3181       memset(srcvalues,0,sizeof(srcvalues));
3182 ***************
3183 *** 442,447 ****
3184 --- 589,603 ----
3185       {
3186           strcpy(symbol,ASSETCHAINS_SYMBOL);
3187           opcode = 'I';
3188 +         if ( komodo_baseid(symbol) < 0 )
3189 +         {
3190 +             if ( block.vtx[0].vout.size() != 1 )
3191 +             {
3192 +                 printf("%s has more than one coinbase?\n",symbol);
3193 +                 return(-1);
3194 +             }
3195 +             return(0);
3196 +         }
3197       }
3198       if ( script[offset] == opcode && opretlen < block.vtx[0].vout[n-1].scriptPubKey.size() )
3199       {
3200 ***************
3201 *** 449,455 ****
3202           {
3203               for (i=1; i<n-1; i++)
3204               {
3205 !                 if ( (pax= komodo_paxfinds(txids[i-1],vouts[i-1])) != 0 )
3206                   {
3207                       pax->type = opcode;
3208                       if ( opcode == 'I' && pax_fiatstatus(&available,&deposited,&issued,&withdrawn,&approved,&redeemed,symbol) != 0 || available < pax->fiatoshis )
3209 --- 605,611 ----
3210           {
3211               for (i=1; i<n-1; i++)
3212               {
3213 !                 if ( (pax= komodo_paxfinds(txids[i-1],vouts[i-1])) != 0 ) // finds... make sure right one
3214                   {
3215                       pax->type = opcode;
3216                       if ( opcode == 'I' && pax_fiatstatus(&available,&deposited,&issued,&withdrawn,&approved,&redeemed,symbol) != 0 || available < pax->fiatoshis )
3217 ***************
3218 *** 461,476 ****
3219                       {
3220                           if ( pax->marked != 0 && height >= 80820 )
3221                           {
3222 !                             printf("%c errs.%d i.%d match %.8f vs %.8f pax.%p\n",opcode,errs,i,dstr(opcode == 'I' ? pax->fiatoshis : pax->komodoshis),dstr(block.vtx[0].vout[i].nValue),pax);
3223                               errs++;
3224 !                         } else matched++;
3225                       }
3226                       else
3227                       {
3228                           for (j=0; j<32; j++)
3229                               printf("%02x",((uint8_t *)&txids[i-1])[j]);
3230                           printf(" cant paxfind %c txid\n",opcode);
3231 !                         printf("%c errs.%d i.%d match %.8f vs %.8f pax.%p\n",opcode,errs,i,dstr(opcode == 'I' ? pax->fiatoshis : pax->komodoshis),dstr(block.vtx[0].vout[i].nValue),pax);
3232                       }
3233                   }
3234                   else
3235 --- 617,638 ----
3236                       {
3237                           if ( pax->marked != 0 && height >= 80820 )
3238                           {
3239 !                             printf(">>>>>>>>>>> %c errs.%d i.%d match %.8f vs %.8f pax.%p\n",opcode,errs,i,dstr(opcode == 'I' ? pax->fiatoshis : pax->komodoshis),dstr(block.vtx[0].vout[i].nValue),pax);
3240                               errs++;
3241 !                         }
3242 !                         else
3243 !                         {
3244 !                             if ( opcode == 'X' )
3245 !                                 printf("check deposit validates %s %.8f -> %.8f\n",CURRENCIES[baseids[i]],dstr(srcvalues[i]),dstr(values[i]));
3246 !                             matched++;
3247 !                         }
3248                       }
3249                       else
3250                       {
3251                           for (j=0; j<32; j++)
3252                               printf("%02x",((uint8_t *)&txids[i-1])[j]);
3253                           printf(" cant paxfind %c txid\n",opcode);
3254 !                         printf(">>>>>>>>>>> %c errs.%d i.%d match %.8f vs %.8f pax.%p\n",opcode,errs,i,dstr(opcode == 'I' ? pax->fiatoshis : pax->komodoshis),dstr(block.vtx[0].vout[i].nValue),pax);
3255                       }
3256                   }
3257                   else
3258 ***************
3259 *** 478,491 ****
3260                       hash = block.GetHash();
3261                       for (j=0; j<32; j++)
3262                           printf("%02x",((uint8_t *)&hash)[j]);
3263 !                     printf(" ht.%d blockhash X couldnt find vout.[%d]\n",height,i);
3264                   }
3265               }
3266 !             if ( matched != num )
3267               {
3268                   printf("WOULD REJECT %s: ht.%d (%c) matched.%d vs num.%d\n",symbol,height,opcode,matched,num);
3269                   // can easily happen depending on order of loading
3270 !                 if ( height > 100000 ) //&& opcode == 'X' )
3271                   {
3272                       printf("REJECT: ht.%d (%c) matched.%d vs num.%d\n",height,opcode,matched,num);
3273                       return(-1);
3274 --- 640,653 ----
3275                       hash = block.GetHash();
3276                       for (j=0; j<32; j++)
3277                           printf("%02x",((uint8_t *)&hash)[j]);
3278 !                     printf(" kht.%d ht.%d %.8f %.8f blockhash couldnt find vout.[%d]\n",kmdheights[i-1],otherheights[i-1],dstr(values[i-1]),dstr(srcvalues[i]),i);
3279                   }
3280               }
3281 !             if ( height <= chainActive.Tip()->nHeight && matched != num )
3282               {
3283                   printf("WOULD REJECT %s: ht.%d (%c) matched.%d vs num.%d\n",symbol,height,opcode,matched,num);
3284                   // can easily happen depending on order of loading
3285 !                 if ( height > 200000 )
3286                   {
3287                       printf("REJECT: ht.%d (%c) matched.%d vs num.%d\n",height,opcode,matched,num);
3288                       return(-1);
3289 ***************
3290 *** 497,530 ****
3291       return(0);
3292   }
3293   
3294 - int32_t komodo_paxcmp(char *symbol,int32_t kmdheight,uint64_t value,uint64_t checkvalue,uint64_t seed)
3295 - {
3296 -     int32_t ratio;
3297 -     if ( seed == 0 && checkvalue != 0 )
3298 -     {
3299 -         ratio = ((value << 6) / checkvalue);
3300 -         if ( ratio >= 63 && ratio <= 65 )
3301 -             return(0);
3302 -         else
3303 -         {
3304 -             if ( kmdheight >= 86150 )
3305 -                 printf("ht.%d ignore mismatched %s value %lld vs checkvalue %lld -> ratio.%d\n",kmdheight,symbol,(long long)value,(long long)checkvalue,ratio);
3306 -             return(-1);
3307 -         }
3308 -     }
3309 -     else if ( checkvalue != 0 )
3310 -     {
3311 -         ratio = ((value << 10) / checkvalue);
3312 -         if ( ratio >= 1023 && ratio <= 1025 )
3313 -             return(0);
3314 -     }
3315 -     return(value != checkvalue);
3316 - }
3317
3318   const char *komodo_opreturn(int32_t height,uint64_t value,uint8_t *opretbuf,int32_t opretlen,uint256 txid,uint16_t vout,char *source)
3319   {
3320       uint8_t rmd160[20],rmd160s[64*20],addrtype,shortflag,pubkey33[33]; int32_t didstats,i,j,n,len,tokomodo,kmdheight,otherheights[64],kmdheights[64]; int8_t baseids[64]; char base[4],coinaddr[64],destaddr[64]; uint256 txids[64]; uint16_t vouts[64]; uint64_t convtoshis,seed; int64_t fiatoshis,komodoshis,checktoshis,values[64],srcvalues[64]; struct pax_transaction *pax,*pax2; struct komodo_state *basesp; double diff;
3321       const char *typestr = "unknown";
3322       memset(baseids,0xff,sizeof(baseids));
3323       memset(values,0,sizeof(values));
3324       memset(srcvalues,0,sizeof(srcvalues));
3325 --- 659,675 ----
3326       return(0);
3327   }
3328   
3329   const char *komodo_opreturn(int32_t height,uint64_t value,uint8_t *opretbuf,int32_t opretlen,uint256 txid,uint16_t vout,char *source)
3330   {
3331       uint8_t rmd160[20],rmd160s[64*20],addrtype,shortflag,pubkey33[33]; int32_t didstats,i,j,n,len,tokomodo,kmdheight,otherheights[64],kmdheights[64]; int8_t baseids[64]; char base[4],coinaddr[64],destaddr[64]; uint256 txids[64]; uint16_t vouts[64]; uint64_t convtoshis,seed; int64_t fiatoshis,komodoshis,checktoshis,values[64],srcvalues[64]; struct pax_transaction *pax,*pax2; struct komodo_state *basesp; double diff;
3332       const char *typestr = "unknown";
3333 +     if ( KOMODO_PAX == 0 )
3334 +         return("nopax");
3335 +     if ( ASSETCHAINS_SYMBOL[0] != 0 && komodo_baseid(ASSETCHAINS_SYMBOL) < 0 )
3336 +     {
3337 +         //printf("komodo_opreturn skip %s\n",ASSETCHAINS_SYMBOL);
3338 +         return("assetchain");
3339 +     }
3340       memset(baseids,0xff,sizeof(baseids));
3341       memset(values,0,sizeof(values));
3342       memset(srcvalues,0,sizeof(srcvalues));
3343 ***************
3344 *** 546,552 ****
3345               if ( kmdheight <= height )
3346               {
3347                   didstats = 0;
3348 !                 if ( strcmp(base,ASSETCHAINS_SYMBOL) == 0 )
3349                   {
3350                       printf("(%s) (%s) kmdheight.%d vs height.%d check %.8f vs %.8f tokomodo.%d %d seed.%llx\n",ASSETCHAINS_SYMBOL,base,kmdheight,height,dstr(checktoshis),dstr(value),komodo_is_issuer(),strncmp(ASSETCHAINS_SYMBOL,base,strlen(base)) == 0,(long long)seed);
3351                       for (i=0; i<32; i++)
3352 --- 691,697 ----
3353               if ( kmdheight <= height )
3354               {
3355                   didstats = 0;
3356 !                 if ( 0 && strcmp(base,ASSETCHAINS_SYMBOL) == 0 )
3357                   {
3358                       printf("(%s) (%s) kmdheight.%d vs height.%d check %.8f vs %.8f tokomodo.%d %d seed.%llx\n",ASSETCHAINS_SYMBOL,base,kmdheight,height,dstr(checktoshis),dstr(value),komodo_is_issuer(),strncmp(ASSETCHAINS_SYMBOL,base,strlen(base)) == 0,(long long)seed);
3359                       for (i=0; i<32; i++)
3360 ***************
3361 *** 592,598 ****
3362                               pax2->fiatoshis = pax->fiatoshis;
3363                               pax2->komodoshis = pax->komodoshis;
3364                               pax->marked = pax2->marked = pax->height;
3365 !                             pax->otherheight = height;
3366                               if ( pax2->didstats == 0 )
3367                               {
3368                                   if ( (basesp= komodo_stateptrget(base)) != 0 )
3369 --- 737,743 ----
3370                               pax2->fiatoshis = pax->fiatoshis;
3371                               pax2->komodoshis = pax->komodoshis;
3372                               pax->marked = pax2->marked = pax->height;
3373 !                             pax2->height = pax->height = height;
3374                               if ( pax2->didstats == 0 )
3375                               {
3376                                   if ( (basesp= komodo_stateptrget(base)) != 0 )
3377 ***************
3378 *** 632,638 ****
3379                       {
3380                           pax->type = opretbuf[0];
3381                           strcpy(pax->source,(char *)&opretbuf[opretlen-4]);
3382 !                         if ( (pax2= komodo_paxfind(txids[i],vouts[i],'D')) != 0 )
3383                           {
3384                               // realtime path?
3385                               pax->fiatoshis = pax2->fiatoshis;
3386 --- 777,783 ----
3387                       {
3388                           pax->type = opretbuf[0];
3389                           strcpy(pax->source,(char *)&opretbuf[opretlen-4]);
3390 !                         if ( (pax2= komodo_paxfind(txids[i],vouts[i],'D')) != 0 && pax2->fiatoshis != 0 && pax2->komodoshis != 0 )
3391                           {
3392                               // realtime path?
3393                               pax->fiatoshis = pax2->fiatoshis;
3394 ***************
3395 *** 651,665 ****
3396                                   }
3397                               }
3398                           }
3399 -                         komodo_paxmark(pax->height,txids[i],vouts[i],'D',height);
3400                       }
3401                   }
3402               } else printf("opreturn none issued?\n");
3403           }
3404 -         if ( strcmp(source,ASSETCHAINS_SYMBOL) == 0 )
3405 -             printf("source.%s opreturn[I] matches %s\n",source,(char *)&opretbuf[opretlen-4]);
3406       }
3407 !     else if ( opretbuf[0] == 'W' && opretlen >= 38 )
3408       {
3409           tokomodo = 1;
3410           iguana_rwnum(0,&opretbuf[34],sizeof(kmdheight),&kmdheight);
3411 --- 796,811 ----
3412                                   }
3413                               }
3414                           }
3415                       }
3416 +                     if ( (pax= komodo_paxmark(height,txids[i],vouts[i],'I',height)) != 0 )
3417 +                         komodo_paxdelete(pax);
3418 +                     if ( (pax= komodo_paxmark(height,txids[i],vouts[i],'D',height)) != 0 )
3419 +                         komodo_paxdelete(pax);
3420                   }
3421               } else printf("opreturn none issued?\n");
3422           }
3423       }
3424 !     else if ( opretbuf[0] == 'W' )//&& opretlen >= 38 )
3425       {
3426           tokomodo = 1;
3427           iguana_rwnum(0,&opretbuf[34],sizeof(kmdheight),&kmdheight);
3428 ***************
3429 *** 668,676 ****
3430           bitcoin_address(coinaddr,addrtype,rmd160,20);
3431           checktoshis = PAX_fiatdest(&seed,tokomodo,destaddr,pubkey33,coinaddr,kmdheight,base,value);
3432           typestr = "withdraw";
3433 !         //printf("%s.height.%d vs height.%d check %.8f/%.8f vs %.8f tokomodo.%d %d seed.%llx -> (%s)\n",ASSETCHAINS_SYMBOL,kmdheight,height,dstr(checktoshis),dstr(komodoshis),dstr(value),komodo_is_issuer(),strncmp(ASSETCHAINS_SYMBOL,base,strlen(base)) == 0,(long long)seed,coinaddr);
3434           didstats = 0;
3435 !         if ( komodo_paxcmp(base,kmdheight,komodoshis,checktoshis,seed) == 0 )
3436           {
3437               if ( value != 0 && ((pax= komodo_paxfind(txid,vout,'W')) == 0 || pax->didstats == 0) )
3438               {
3439 --- 814,823 ----
3440           bitcoin_address(coinaddr,addrtype,rmd160,20);
3441           checktoshis = PAX_fiatdest(&seed,tokomodo,destaddr,pubkey33,coinaddr,kmdheight,base,value);
3442           typestr = "withdraw";
3443 !         if ( 0 && strcmp(base,"RUB") == 0 )
3444 !             printf("RUB WITHDRAW %s.height.%d vs height.%d check %.8f/%.8f vs %.8f tokomodo.%d %d seed.%llx -> (%s) len.%d\n",ASSETCHAINS_SYMBOL,kmdheight,height,dstr(checktoshis),dstr(komodoshis),dstr(value),komodo_is_issuer(),strncmp(ASSETCHAINS_SYMBOL,base,strlen(base)) == 0,(long long)seed,coinaddr,opretlen);
3445           didstats = 0;
3446 !         //if ( komodo_paxcmp(base,kmdheight,komodoshis,checktoshis,seed) == 0 )
3447           {
3448               if ( value != 0 && ((pax= komodo_paxfind(txid,vout,'W')) == 0 || pax->didstats == 0) )
3449               {
3450 ***************
3451 *** 679,697 ****
3452                       basesp->withdrawn += value;
3453                       didstats = 1;
3454                       if ( strcmp(base,ASSETCHAINS_SYMBOL) == 0 )
3455 !                         printf("########### %p withdrawn %s += %.8f\n",basesp,base,dstr(value));
3456                   }
3457 !                 //printf("notarize %s %.8f -> %.8f kmd.%d other.%d\n",ASSETCHAINS_SYMBOL,dstr(value),dstr(komodoshis),kmdheight,height);
3458               }
3459 !             komodo_gateway_deposit(coinaddr,komodoshis,(char *)"KMD",value,rmd160,txid,vout,'W',kmdheight,height,source,0);
3460               if ( (pax= komodo_paxfind(txid,vout,'W')) != 0 )
3461               {
3462 -                 if ( didstats != 0 )
3463 -                     pax->didstats = 1;
3464                   pax->type = opretbuf[0];
3465 !                 pax->validated = komodoshis;
3466               }
3467 !         }
3468       }
3469       else if ( tokomodo != 0 && opretbuf[0] == 'A' )
3470       {
3471 --- 826,848 ----
3472                       basesp->withdrawn += value;
3473                       didstats = 1;
3474                       if ( strcmp(base,ASSETCHAINS_SYMBOL) == 0 )
3475 !                         printf("########### %p withdrawn %s += %.8f check %.8f\n",basesp,base,dstr(value),dstr(checktoshis));
3476                   }
3477 !                 if ( 0 && strcmp(base,"RUB") == 0 && (pax == 0 || pax->approved == 0) )
3478 !                     printf("notarize %s %.8f -> %.8f kmd.%d other.%d\n",ASSETCHAINS_SYMBOL,dstr(value),dstr(komodoshis),kmdheight,height);
3479               }
3480 !             komodo_gateway_deposit(coinaddr,0,(char *)"KMD",value,rmd160,txid,vout,'W',kmdheight,height,source,0);
3481               if ( (pax= komodo_paxfind(txid,vout,'W')) != 0 )
3482               {
3483                   pax->type = opretbuf[0];
3484 !                 strcpy(pax->source,base);
3485 !                 strcpy(pax->symbol,"KMD");
3486 !                 pax->height = kmdheight;
3487 !                 pax->otherheight = height;
3488 !                 pax->komodoshis = komodoshis;
3489               }
3490 !         } // else printf("withdraw %s paxcmp ht.%d %d error value %.8f -> %.8f vs %.8f\n",base,kmdheight,height,dstr(value),dstr(komodoshis),dstr(checktoshis));
3491 !         // need to allocate pax
3492       }
3493       else if ( tokomodo != 0 && opretbuf[0] == 'A' )
3494       {
3495 ***************
3496 *** 700,756 ****
3497           {
3498               for (i=0; i<opretlen; i++)
3499                   printf("%02x",opretbuf[i]);
3500 !             printf(" opret[%c] else path tokomodo.%d ht.%d before %.8f\n",opretbuf[0],tokomodo,height,dstr(komodo_paxtotal()));
3501           }
3502           if ( (n= komodo_issued_opreturn(base,txids,vouts,values,srcvalues,kmdheights,otherheights,baseids,rmd160s,opretbuf,opretlen,1)) > 0 )
3503           {
3504               for (i=0; i<n; i++)
3505               {
3506                   if ( baseids[i] < 0 )
3507 -                     continue;
3508 -                 didstats = 0;
3509 -                 seed = 0;
3510 -                 checktoshis = komodo_paxprice(&seed,kmdheights[i],CURRENCIES[baseids[i]],(char *)"KMD",(uint64_t)srcvalues[i]);
3511 -                 /*printf("PAX_fiatdest ht.%d price %s %.8f -> KMD %.8f vs %.8f\n",kmdheights[i],CURRENCIES[baseids[i]],(double)srcvalues[i]/COIN,(double)values[i]/COIN,(double)checktoshis/COIN);
3512 -                 for (j=0; j<32; j++)
3513 -                     printf("%02x",((uint8_t *)&txids[i])[j]);
3514 -                 printf(" v%d %.8f k.%d ht.%d base.%d\n",vouts[i],dstr(values[i]),kmdheights[i],otherheights[i],baseids[i]);*/
3515 -                 if ( (pax= komodo_paxfind(txids[i],vouts[i],'A')) == 0 )
3516                   {
3517 !                     bitcoin_address(coinaddr,60,&rmd160s[i*20],20);
3518 !                     komodo_gateway_deposit(coinaddr,values[i],CURRENCIES[baseids[i]],srcvalues[i],&rmd160s[i*20],txids[i],vouts[i],'A',kmdheights[i],otherheights[i],CURRENCIES[baseids[i]],kmdheights[i]);
3519 !                     komodo_paxmark(height,txids[i],vouts[i],'W',height);
3520 !                     komodo_paxmark(height,txids[i],vouts[i],'A',height);
3521 !                     if ( srcvalues[i] != 0 && (basesp= komodo_stateptrget(CURRENCIES[baseids[i]])) != 0 )
3522                       {
3523 !                         basesp->approved += srcvalues[i];
3524 !                         didstats = 1;
3525 !                         if ( strcmp(CURRENCIES[baseids[i]],ASSETCHAINS_SYMBOL) == 0 )
3526 !                             printf("########### %p approved %s += %.8f\n",basesp,CURRENCIES[baseids[i]],dstr(srcvalues[i]));
3527                       }
3528 !                     //printf(" i.%d (%s) <- %.8f ADDFLAG APPROVED\n",i,coinaddr,dstr(values[i]));
3529                   }
3530 !                 else if ( pax->didstats == 0 && srcvalues[i] != 0 )
3531 !                 {
3532 !                     if ( (basesp= komodo_stateptrget(CURRENCIES[baseids[i]])) != 0 )
3533                       {
3534 !                         basesp->approved += srcvalues[i];
3535 !                         didstats = 1;
3536 !                         if ( strcmp(CURRENCIES[baseids[i]],ASSETCHAINS_SYMBOL) == 0 )
3537 !                             printf("########### %p approved %s += %.8f\n",basesp,CURRENCIES[baseids[i]],dstr(srcvalues[i]));
3538                       }
3539 -                 } //else printf(" i.%d of n.%d pax.%p baseids[] %d\n",i,n,pax,baseids[i]);
3540 -                 if ( (pax= komodo_paxfind(txids[i],vouts[i],'A')) != 0 )
3541 -                 {
3542 -                     pax->type = opretbuf[0];
3543 -                     pax->approved = kmdheights[i];
3544 -                     if ( didstats != 0 )
3545 -                         pax->didstats = 1;
3546 -                     if ( strcmp(CURRENCIES[baseids[i]],ASSETCHAINS_SYMBOL) == 0 )
3547 -                         printf(" i.%d approved.%d <<<<<<<<<<<<< APPROVED %p\n",i,kmdheights[i],pax);
3548                   }
3549               }
3550 !         }
3551           //printf("extra.[%d] after %.8f\n",n,dstr(komodo_paxtotal()));
3552       }
3553       else if ( opretbuf[0] == 'X' )
3554 --- 851,928 ----
3555           {
3556               for (i=0; i<opretlen; i++)
3557                   printf("%02x",opretbuf[i]);
3558 !             printf(" opret[%c] else path tokomodo.%d ht.%d before %.8f opretlen.%d\n",opretbuf[0],tokomodo,height,dstr(komodo_paxtotal()),opretlen);
3559           }
3560           if ( (n= komodo_issued_opreturn(base,txids,vouts,values,srcvalues,kmdheights,otherheights,baseids,rmd160s,opretbuf,opretlen,1)) > 0 )
3561           {
3562               for (i=0; i<n; i++)
3563               {
3564 +                 //for (j=0; j<32; j++)
3565 +                 //    printf("%02x",((uint8_t *)&txids[i])[j]);
3566 +                 //printf(" v%d %.8f %.8f k.%d ht.%d base.%d\n",vouts[i],dstr(values[i]),dstr(srcvalues[i]),kmdheights[i],otherheights[i],baseids[i]);
3567                   if ( baseids[i] < 0 )
3568                   {
3569 !                     for (i=0; i<opretlen; i++)
3570 !                         printf("%02x",opretbuf[i]);
3571 !                     printf(" opret[%c] else path tokomodo.%d ht.%d before %.8f opretlen.%d\n",opretbuf[0],tokomodo,height,dstr(komodo_paxtotal()),opretlen);
3572 !                     //printf("baseids[%d] %d\n",i,baseids[i]);
3573 !                     if ( (pax= komodo_paxfind(txids[i],vouts[i],'W')) != 0 || (pax= komodo_paxfind(txids[i],vouts[i],'X')) != 0 )
3574                       {
3575 !                         baseids[i] = komodo_baseid(pax->symbol);
3576 !                         printf("override neg1 with (%s)\n",pax->symbol);
3577                       }
3578 !                     if ( baseids[i] < 0 )
3579 !                         continue;
3580                   }
3581 !                 didstats = 0;
3582 !                 seed = 0;
3583 !                 checktoshis = komodo_paxprice(&seed,kmdheights[i],CURRENCIES[baseids[i]],(char *)"KMD",(uint64_t)values[i]);
3584 !                 //printf("PAX_fiatdest ht.%d price %s %.8f -> KMD %.8f vs %.8f\n",kmdheights[i],CURRENCIES[baseids[i]],(double)values[i]/COIN,(double)srcvalues[i]/COIN,(double)checktoshis/COIN);
3585 !                 if ( srcvalues[i] == checktoshis )
3586 !                 {
3587 !                     if ( (pax= komodo_paxfind(txids[i],vouts[i],'A')) == 0 )
3588 !                     {
3589 !                         bitcoin_address(coinaddr,60,&rmd160s[i*20],20);
3590 !                         komodo_gateway_deposit(coinaddr,srcvalues[i],CURRENCIES[baseids[i]],values[i],&rmd160s[i*20],txids[i],vouts[i],'A',kmdheights[i],otherheights[i],CURRENCIES[baseids[i]],kmdheights[i]);
3591 !                         if ( (pax= komodo_paxfind(txids[i],vouts[i],'A')) == 0 )
3592 !                             printf("unexpected null pax for approve\n");
3593 !                         else pax->validated = checktoshis;
3594 !                         if ( (pax2= komodo_paxfind(txids[i],vouts[i],'W')) != 0 )
3595 !                             pax2->approved = kmdheights[i];
3596 !                         komodo_paxmark(height,txids[i],vouts[i],'W',height);
3597 !                         //komodo_paxmark(height,txids[i],vouts[i],'A',height);
3598 !                         if ( values[i] != 0 && (basesp= komodo_stateptrget(CURRENCIES[baseids[i]])) != 0 )
3599 !                         {
3600 !                             basesp->approved += values[i];
3601 !                             didstats = 1;
3602 !                             if ( strcmp(CURRENCIES[baseids[i]],ASSETCHAINS_SYMBOL) == 0 )
3603 !                                 printf("pax.%p ########### %p approved %s += %.8f -> %.8f/%.8f kht.%d %d\n",pax,basesp,CURRENCIES[baseids[i]],dstr(values[i]),dstr(srcvalues[i]),dstr(checktoshis),kmdheights[i],otherheights[i]);
3604 !                         }
3605 !                         //printf(" i.%d (%s) <- %.8f ADDFLAG APPROVED\n",i,coinaddr,dstr(values[i]));
3606 !                     }
3607 !                     else if ( pax->didstats == 0 && srcvalues[i] != 0 )
3608                       {
3609 !                         if ( (basesp= komodo_stateptrget(CURRENCIES[baseids[i]])) != 0 )
3610 !                         {
3611 !                             basesp->approved += values[i];
3612 !                             didstats = 1;
3613 !                             if ( strcmp(CURRENCIES[baseids[i]],ASSETCHAINS_SYMBOL) == 0 )
3614 !                                 printf("pax.%p ########### %p approved %s += %.8f -> %.8f/%.8f\n",pax,basesp,CURRENCIES[baseids[i]],dstr(values[i]),dstr(srcvalues[i]),dstr(checktoshis));
3615 !                         }
3616 !                     } //else printf(" i.%d of n.%d pax.%p baseids[] %d\n",i,n,pax,baseids[i]);
3617 !                     if ( (pax= komodo_paxfind(txids[i],vouts[i],'A')) != 0 )
3618 !                     {
3619 !                         pax->type = opretbuf[0];
3620 !                         pax->approved = kmdheights[i];
3621 !                         pax->validated = checktoshis;
3622 !                         if ( didstats != 0 )
3623 !                             pax->didstats = 1;
3624 !                         //if ( strcmp(CURRENCIES[baseids[i]],ASSETCHAINS_SYMBOL) == 0 )
3625 !                         //printf(" i.%d approved.%d <<<<<<<<<<<<< APPROVED %p\n",i,kmdheights[i],pax);
3626                       }
3627                   }
3628               }
3629 !         } else printf("n.%d from opreturns\n",n);
3630           //printf("extra.[%d] after %.8f\n",n,dstr(komodo_paxtotal()));
3631       }
3632       else if ( opretbuf[0] == 'X' )
3633 ***************
3634 *** 770,783 ****
3635                   if ( (pax= komodo_paxfind(txids[i],vouts[i],'X')) != 0 )
3636                   {
3637                       pax->type = opretbuf[0];
3638 !                     if ( baseids[i] >= 0 && srcvalues[i] != 0 && (basesp= komodo_stateptrget(CURRENCIES[baseids[i]])) != 0 )
3639                       {
3640 !                         basesp->redeemed += srcvalues[i];
3641                           pax->didstats = 1;
3642 !                         if ( strcmp(CURRENCIES[baseids[i]],ASSETCHAINS_SYMBOL) == 0 )
3643 !                             printf("########### %p redeemed %s += %.8f\n",basesp,CURRENCIES[baseids[i]],dstr(srcvalues[i]));
3644                       }
3645                   }
3646               }
3647           } //else printf("komodo_issued_opreturn returned %d\n",n);
3648       }
3649 --- 942,964 ----
3650                   if ( (pax= komodo_paxfind(txids[i],vouts[i],'X')) != 0 )
3651                   {
3652                       pax->type = opretbuf[0];
3653 !                     if ( height < 121842 ) // fields got switched around due to legacy issues and approves
3654 !                         value = srcvalues[i];
3655 !                     else value = values[i];
3656 !                     if ( baseids[i] >= 0 && value != 0 && (basesp= komodo_stateptrget(CURRENCIES[baseids[i]])) != 0 )
3657                       {
3658 !                         basesp->redeemed += value;
3659                           pax->didstats = 1;
3660 !                         //if ( strcmp(CURRENCIES[baseids[i]],ASSETCHAINS_SYMBOL) == 0 )
3661 !                             printf("ht.%d %.8f ########### %p redeemed %s += %.8f %.8f kht.%d ht.%d\n",height,dstr(value),basesp,CURRENCIES[baseids[i]],dstr(value),dstr(srcvalues[i]),kmdheights[i],otherheights[i]);
3662                       }
3663                   }
3664 +                 if ( (pax= komodo_paxmark(height,txids[i],vouts[i],'W',height)) != 0 )
3665 +                     komodo_paxdelete(pax);
3666 +                 if ( (pax= komodo_paxmark(height,txids[i],vouts[i],'A',height)) != 0 )
3667 +                     komodo_paxdelete(pax);
3668 +                 if ( (pax= komodo_paxmark(height,txids[i],vouts[i],'X',height)) != 0 )
3669 +                     komodo_paxdelete(pax);
3670               }
3671           } //else printf("komodo_issued_opreturn returned %d\n",n);
3672       }
3673 ***************
3674 *** 788,802 ****
3675   {
3676       static long lastpos[34]; static char userpass[33][1024];
3677       FILE *fp; int32_t baseid,isrealtime,refid,blocks,longest; struct komodo_state *sp,*refsp; char *retstr,fname[512],*base,symbol[16],dest[16]; uint32_t buf[3]; cJSON *infoobj,*result; uint64_t RTmask = 0;
3678       while ( KOMODO_INITDONE == 0 )
3679       {
3680 !         fprintf(stderr,"PASSPORT iteration waiting for KOMODO_INITDONE\n");
3681           sleep(3);
3682       }
3683       refsp = komodo_stateptr(symbol,dest);
3684       if ( ASSETCHAINS_SYMBOL[0] == 0 )
3685           refid = 33;
3686 !     else refid = komodo_baseid(ASSETCHAINS_SYMBOL)+1; // illegal base -> baseid.-1 -> 0
3687       //printf("PASSPORT %s refid.%d\n",ASSETCHAINS_SYMBOL,refid);
3688       for (baseid=32; baseid>=0; baseid--)
3689       {
3690 --- 969,997 ----
3691   {
3692       static long lastpos[34]; static char userpass[33][1024];
3693       FILE *fp; int32_t baseid,isrealtime,refid,blocks,longest; struct komodo_state *sp,*refsp; char *retstr,fname[512],*base,symbol[16],dest[16]; uint32_t buf[3]; cJSON *infoobj,*result; uint64_t RTmask = 0;
3694 +     //printf("PASSPORT.(%s)\n",ASSETCHAINS_SYMBOL);
3695       while ( KOMODO_INITDONE == 0 )
3696       {
3697 !         fprintf(stderr,"[%s] PASSPORT iteration waiting for KOMODO_INITDONE\n",ASSETCHAINS_SYMBOL);
3698           sleep(3);
3699       }
3700       refsp = komodo_stateptr(symbol,dest);
3701       if ( ASSETCHAINS_SYMBOL[0] == 0 )
3702           refid = 33;
3703 !     else
3704 !     {
3705 !         refid = komodo_baseid(ASSETCHAINS_SYMBOL)+1; // illegal base -> baseid.-1 -> 0
3706 !         if ( refid == 0 )
3707 !         {
3708 !             KOMODO_PASSPORT_INITDONE = 1;
3709 !             return;
3710 !         }
3711 !     }
3712 !     if ( KOMODO_PAX == 0 )
3713 !     {
3714 !         KOMODO_PASSPORT_INITDONE = 1;
3715 !         return;
3716 !     }
3717       //printf("PASSPORT %s refid.%d\n",ASSETCHAINS_SYMBOL,refid);
3718       for (baseid=32; baseid>=0; baseid--)
3719       {
3720 ***************
3721 *** 807,813 ****
3722           {
3723               komodo_statefname(fname,baseid<32?base:(char *)"",(char *)"komodostate");
3724               komodo_nameset(symbol,dest,base);
3725 !             if ( (fp= fopen(fname,"rb")) != 0 && (sp= komodo_stateptrget(symbol)) != 0 )
3726               {
3727                   fseek(fp,0,SEEK_END);
3728                   if ( ftell(fp) > lastpos[baseid] )
3729 --- 1002,1009 ----
3730           {
3731               komodo_statefname(fname,baseid<32?base:(char *)"",(char *)"komodostate");
3732               komodo_nameset(symbol,dest,base);
3733 !             sp = komodo_stateptrget(symbol);
3734 !             if ( (fp= fopen(fname,"rb")) != 0 && sp != 0 )
3735               {
3736                   fseek(fp,0,SEEK_END);
3737                   if ( ftell(fp) > lastpos[baseid] )
3738 ***************
3739 *** 822,840 ****
3740                           printf("from.(%s) lastpos[%s] %ld\n",ASSETCHAINS_SYMBOL,CURRENCIES[baseid],lastpos[baseid]);
3741                   } //else fprintf(stderr,"%s.%ld ",CURRENCIES[baseid],ftell(fp));
3742                   fclose(fp);
3743 !             }
3744               komodo_statefname(fname,baseid<32?base:(char *)"",(char *)"realtime");
3745               if ( (fp= fopen(fname,"rb")) != 0 )
3746               {
3747                   if ( fread(buf,1,sizeof(buf),fp) == sizeof(buf) )
3748                   {
3749                       sp->CURRENT_HEIGHT = buf[0];
3750 !                     if ( buf[0] != 0 && buf[0] == buf[1] && buf[2] > time(NULL)-60 )
3751                       {
3752                           isrealtime = 1;
3753                           RTmask |= (1LL << baseid);
3754                           memcpy(refsp->RTbufs[baseid+1],buf,sizeof(refsp->RTbufs[baseid+1]));
3755 !                     } //else fprintf(stderr,"%s not RT\n",base);
3756                   } //else fprintf(stderr,"%s size error RT\n",base);
3757                   fclose(fp);
3758               } //else fprintf(stderr,"%s open error RT\n",base);
3759 --- 1018,1036 ----
3760                           printf("from.(%s) lastpos[%s] %ld\n",ASSETCHAINS_SYMBOL,CURRENCIES[baseid],lastpos[baseid]);
3761                   } //else fprintf(stderr,"%s.%ld ",CURRENCIES[baseid],ftell(fp));
3762                   fclose(fp);
3763 !             } else printf("error.(%s) %p\n",fname,sp);
3764               komodo_statefname(fname,baseid<32?base:(char *)"",(char *)"realtime");
3765               if ( (fp= fopen(fname,"rb")) != 0 )
3766               {
3767                   if ( fread(buf,1,sizeof(buf),fp) == sizeof(buf) )
3768                   {
3769                       sp->CURRENT_HEIGHT = buf[0];
3770 !                     if ( buf[0] != 0 && buf[0] >= buf[1] && buf[2] > time(NULL)-300 )
3771                       {
3772                           isrealtime = 1;
3773                           RTmask |= (1LL << baseid);
3774                           memcpy(refsp->RTbufs[baseid+1],buf,sizeof(refsp->RTbufs[baseid+1]));
3775 !                     } else fprintf(stderr,"[%s]: %s not RT %u %u %d\n",ASSETCHAINS_SYMBOL,base,buf[0],buf[1],(int32_t)(time(NULL)-buf[2]));
3776                   } //else fprintf(stderr,"%s size error RT\n",base);
3777                   fclose(fp);
3778               } //else fprintf(stderr,"%s open error RT\n",base);
3779 ***************
3780 *** 849,855 ****
3781                   if ( buf[0] != 0 && buf[0] == buf[1] )
3782                   {
3783                       buf[2] = (uint32_t)time(NULL);
3784 !                     RTmask |= (1LL << baseid) | 1;
3785                       memcpy(refsp->RTbufs[baseid+1],buf,sizeof(refsp->RTbufs[baseid+1]));
3786                       if ( refid != 0 )
3787                           memcpy(refsp->RTbufs[0],buf,sizeof(refsp->RTbufs[0]));
3788 --- 1045,1051 ----
3789                   if ( buf[0] != 0 && buf[0] == buf[1] )
3790                   {
3791                       buf[2] = (uint32_t)time(NULL);
3792 !                     RTmask |= (1LL << baseid);
3793                       memcpy(refsp->RTbufs[baseid+1],buf,sizeof(refsp->RTbufs[baseid+1]));
3794                       if ( refid != 0 )
3795                           memcpy(refsp->RTbufs[0],buf,sizeof(refsp->RTbufs[0]));
3796 ***************
3797 *** 865,869 ****
3798 --- 1061,1066 ----
3799       komodo_paxtotal();
3800       refsp->RTmask = RTmask;
3801       KOMODO_PASSPORT_INITDONE = 1;
3802 +     //printf("done PASSPORT %s refid.%d\n",ASSETCHAINS_SYMBOL,refid);
3803   }
3804   
3805 diff -crB ./src/komodo_globals.h ../../komodo-jl777/src/komodo_globals.h
3806 *** ./src/komodo_globals.h      2017-01-03 10:40:50.231330177 +0000
3807 --- ../../komodo-jl777/src/komodo_globals.h     2017-01-03 09:49:08.856506348 +0000
3808 ***************
3809 *** 36,42 ****
3810   
3811   int COINBASE_MATURITY = 100;
3812   
3813 ! int32_t IS_KOMODO_NOTARY,KOMODO_REWIND,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,ASSETCHAINS_SEED,KOMODO_ON_DEMAND,KOMODO_EXTERNAL_NOTARIES,KOMODO_PASSPORT_INITDONE;
3814   std::string NOTARY_PUBKEY,ASSETCHAINS_NOTARIES;
3815   uint8_t NOTARY_PUBKEY33[33];
3816   
3817 --- 36,42 ----
3818   
3819   int COINBASE_MATURITY = 100;
3820   
3821 ! int32_t IS_KOMODO_NOTARY,KOMODO_REWIND,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,ASSETCHAINS_SEED,KOMODO_ON_DEMAND,KOMODO_EXTERNAL_NOTARIES,KOMODO_PASSPORT_INITDONE,KOMODO_PAX;
3822   std::string NOTARY_PUBKEY,ASSETCHAINS_NOTARIES;
3823   uint8_t NOTARY_PUBKEY33[33];
3824   
3825 diff -crB ./src/komodo.h ../../komodo-jl777/src/komodo.h
3826 *** ./src/komodo.h      2017-01-03 10:40:50.231330177 +0000
3827 --- ../../komodo-jl777/src/komodo.h     2017-01-03 09:49:08.856506348 +0000
3828 ***************
3829 *** 23,29 ****
3830   // a. automate notarization fee payouts
3831   // b. automated distribution of test REVS snapshot
3832   
3833 ! //#define KOMODO_ASSETCHAINS_WAITNOTARIZE
3834   #define KOMODO_PAXMAX (10000 * COIN)
3835   
3836   #include <stdint.h>
3837 --- 23,29 ----
3838   // a. automate notarization fee payouts
3839   // b. automated distribution of test REVS snapshot
3840   
3841 ! #define KOMODO_ASSETCHAINS_WAITNOTARIZE
3842   #define KOMODO_PAXMAX (10000 * COIN)
3843   
3844   #include <stdint.h>
3845 ***************
3846 *** 194,200 ****
3847 --- 194,203 ----
3848       static FILE *fp; static int32_t errs;
3849       struct komodo_state *sp; char fname[512],symbol[16],dest[16]; int32_t ht,func; uint8_t num,pubkeys[64][33];
3850       if ( (sp= komodo_stateptr(symbol,dest)) == 0 )
3851 +     {
3852 +         KOMODO_INITDONE = (uint32_t)time(NULL);
3853           return;
3854 +     }
3855       if ( fp == 0 )
3856       {
3857           komodo_statefname(fname,ASSETCHAINS_SYMBOL,(char *)"komodostate");
3858 ***************
3859 *** 281,287 ****
3860                   errs++;
3861               //komodo_eventadd_utxo(sp,symbol,height,notaryid,txhash,voutmask,numvouts);
3862           }
3863 - //#ifdef KOMODO_PAX
3864           else if ( pvals != 0 && numpvals > 0 )
3865           {
3866               int32_t i,nonz = 0;
3867 --- 284,289 ----
3868 ***************
3869 *** 301,307 ****
3870               }
3871               //printf("save pvals height.%d numpvals.%d\n",height,numpvals);
3872           }
3873 - //#endif
3874           else if ( height != 0 )
3875           {
3876               //printf("ht.%d func N ht.%d errs.%d\n",height,NOTARIZED_HEIGHT,errs);
3877 --- 303,308 ----
3878 diff -crB ./src/komodo_interest.h ../../komodo-jl777/src/komodo_interest.h
3879 *** ./src/komodo_interest.h     2017-01-03 10:40:50.231330177 +0000
3880 --- ../../komodo-jl777/src/komodo_interest.h    2017-01-03 09:49:08.856506348 +0000
3881 ***************
3882 *** 21,29 ****
3883       uint64_t total; int32_t ind,incr = 100000;
3884       if ( height >= maxheight )
3885       {
3886 !         interests = (uint64_t *)realloc(interests,(maxheight + incr) * sizeof(*interests) * 2);
3887 !         memset(&interests[maxheight << 1],0,incr * sizeof(*interests) * 2);
3888 !         maxheight += incr;
3889       }
3890       ind = (height << 1);
3891       if ( paidinterest < 0 ) // request
3892 --- 21,37 ----
3893       uint64_t total; int32_t ind,incr = 100000;
3894       if ( height >= maxheight )
3895       {
3896 !         if ( interests == 0 )
3897 !         {
3898 !             maxheight = height + incr;
3899 !             interests = (uint64_t *)calloc(maxheight,sizeof(*interests) * 2);
3900 !         }
3901 !         else
3902 !         {
3903 !             interests = (uint64_t *)realloc(interests,(maxheight + incr) * sizeof(*interests) * 2);
3904 !             memset(&interests[maxheight << 1],0,incr * sizeof(*interests) * 2);
3905 !             maxheight += incr;
3906 !         }
3907       }
3908       ind = (height << 1);
3909       if ( paidinterest < 0 ) // request
3910 diff -crB ./src/komodo_pax.h ../../komodo-jl777/src/komodo_pax.h
3911 *** ./src/komodo_pax.h  2017-01-03 10:40:50.231330177 +0000
3912 --- ../../komodo-jl777/src/komodo_pax.h 2017-01-03 09:49:08.856506348 +0000
3913 ***************
3914 *** 429,434 ****
3915 --- 429,435 ----
3916           height -= 10;
3917       if ( (baseid= komodo_baseid(base)) >= 0 && (relid= komodo_baseid(rel)) >= 0 )
3918       {
3919 +         portable_mutex_lock(&komodo_mutex);
3920           for (i=NUM_PRICES-1; i>=0; i--)
3921           {
3922               ptr = &PVALS[36 * i];
3923 ***************
3924 *** 439,450 ****
3925                       *kmdbtcp = ptr[MAX_CURRENCIES + 1] / 539;
3926                       *btcusdp = ptr[MAX_CURRENCIES + 2] / 539;
3927                   }
3928                   if ( kmdbtc != 0 && btcusd != 0 )
3929                       return(komodo_paxcalc(&ptr[1],baseid,relid,basevolume,kmdbtc,btcusd));
3930                   else return(0);
3931               }
3932           }
3933 !     } else printf("paxprice invalid base.%s %d, rel.%s %d\n",base,baseid,rel,relid);
3934       return(0);
3935   }
3936   
3937 --- 440,453 ----
3938                       *kmdbtcp = ptr[MAX_CURRENCIES + 1] / 539;
3939                       *btcusdp = ptr[MAX_CURRENCIES + 2] / 539;
3940                   }
3941 +                 portable_mutex_unlock(&komodo_mutex);
3942                   if ( kmdbtc != 0 && btcusd != 0 )
3943                       return(komodo_paxcalc(&ptr[1],baseid,relid,basevolume,kmdbtc,btcusd));
3944                   else return(0);
3945               }
3946           }
3947 !         portable_mutex_unlock(&komodo_mutex);
3948 !     } //else printf("paxprice invalid base.%s %d, rel.%s %d\n",base,baseid,rel,relid);
3949       return(0);
3950   }
3951   
3952 ***************
3953 *** 473,479 ****
3954       }
3955       kmdbtc = komodo_paxcorrelation(kmdbtcs,numvotes,*seedp) * 539;
3956       btcusd = komodo_paxcorrelation(btcusds,numvotes,*seedp) * 539;
3957 -     //printf("kmdbtc %llu btcusd %llu\n",(long long)kmdbtc,(long long)btcusd);
3958       for (i=nonz=0; i<numvotes; i++)
3959       {
3960           if ( (votes[numvotes-1-i]= _komodo_paxprice(0,0,height-i,base,rel,100000,kmdbtc,btcusd)) == 0 )
3961 --- 476,481 ----
3962 ***************
3963 *** 481,487 ****
3964 --- 483,493 ----
3965           else nonz++;
3966       }
3967       if ( nonz <= (numvotes >> 1) )
3968 +     {
3969 +         //printf("kmdbtc %llu btcusd %llu\n",(long long)kmdbtc,(long long)btcusd);
3970 +         //printf("komodo_paxprice nonz.%d of numvotes.%d\n",nonz,numvotes);
3971           return(0);
3972 +     }
3973       return(komodo_paxcorrelation(votes,numvotes,*seedp) * basevolume / 100000);
3974   }
3975   
3976 ***************
3977 *** 527,533 ****
3978       if ( fiatoshis < 0 )
3979           shortflag = 1, fiatoshis = -fiatoshis;
3980       komodoshis = komodo_paxprice(seedp,height,base,(char *)"KMD",(uint64_t)fiatoshis);
3981 !     //printf("PAX_fiatdest ht.%d price %s %.8f -> KMD %.8f seed.%llx\n",height,base,(double)fiatoshis/COIN,(double)komodoshis/COIN,(long long)*seedp);
3982       if ( bitcoin_addr2rmd160(&addrtype,rmd160,coinaddr) == 20 )
3983       {
3984           PAX_pubkey(1,pubkey33,&addrtype,rmd160,base,&shortflag,tokomodo != 0 ? &komodoshis : &fiatoshis);
3985 --- 533,540 ----
3986       if ( fiatoshis < 0 )
3987           shortflag = 1, fiatoshis = -fiatoshis;
3988       komodoshis = komodo_paxprice(seedp,height,base,(char *)"KMD",(uint64_t)fiatoshis);
3989 !     if ( 0 && strcmp(base,"RUB") == 0 )
3990 !         printf("PAX_fiatdest ht.%d price %s %.8f -> KMD %.8f seed.%llx\n",height,base,(double)fiatoshis/COIN,(double)komodoshis/COIN,(long long)*seedp);
3991       if ( bitcoin_addr2rmd160(&addrtype,rmd160,coinaddr) == 20 )
3992       {
3993           PAX_pubkey(1,pubkey33,&addrtype,rmd160,base,&shortflag,tokomodo != 0 ? &komodoshis : &fiatoshis);
3994 diff -crB ./src/komodo_structs.h ../../komodo-jl777/src/komodo_structs.h
3995 *** ./src/komodo_structs.h      2017-01-03 10:40:50.231330177 +0000
3996 --- ../../komodo-jl777/src/komodo_structs.h     2017-01-03 09:49:08.856506348 +0000
3997 ***************
3998 *** 57,63 ****
3999       UT_hash_handle hh;
4000       uint256 txid;
4001       uint64_t komodoshis,fiatoshis,validated;
4002 !     int32_t marked,height,otherheight,approved,didstats;
4003       uint16_t vout;
4004       char symbol[16],source[16],coinaddr[64]; uint8_t rmd160[20],type,buf[35];
4005   };
4006 --- 57,63 ----
4007       UT_hash_handle hh;
4008       uint256 txid;
4009       uint64_t komodoshis,fiatoshis,validated;
4010 !     int32_t marked,height,otherheight,approved,didstats,ready;
4011       uint16_t vout;
4012       char symbol[16],source[16],coinaddr[64]; uint8_t rmd160[20],type,buf[35];
4013   };
4014 diff -crB ./src/komodo_utils.h ../../komodo-jl777/src/komodo_utils.h
4015 *** ./src/komodo_utils.h        2017-01-03 10:40:50.235330381 +0000
4016 --- ../../komodo-jl777/src/komodo_utils.h       2017-01-03 09:49:08.856506348 +0000
4017 ***************
4018 *** 1448,1454 ****
4019 --- 1448,1457 ----
4020       IS_KOMODO_NOTARY = GetBoolArg("-notary", false);
4021       NOTARY_PUBKEY = GetArg("-pubkey", "");
4022       if ( strlen(NOTARY_PUBKEY.c_str()) == 66 )
4023 +     {
4024           USE_EXTERNAL_PUBKEY = 1;
4025 +         KOMODO_PAX = 1;
4026 +     } else KOMODO_PAX = GetArg("-pax",0);
4027       name = GetArg("-ac_name","");
4028       if ( (KOMODO_REWIND= GetArg("-rewind",0)) != 0 )
4029           ;
4030 diff -crB ./src/main.cpp ../../komodo-jl777/src/main.cpp
4031 *** ./src/main.cpp      2017-01-03 10:40:50.255331392 +0000
4032 --- ../../komodo-jl777/src/main.cpp     2017-01-03 09:49:08.864506767 +0000
4033 ***************
4034 *** 26,31 ****
4035 --- 26,32 ----
4036   #include "util.h"
4037   #include "utilmoneystr.h"
4038   #include "validationinterface.h"
4039 + #include "wallet/asyncrpcoperation_sendmany.h"
4040   
4041   #include <sstream>
4042   
4043 ***************
4044 *** 70,76 ****
4045   bool fAlerts = DEFAULT_ALERTS;
4046   
4047   /** Fees smaller than this (in satoshi) are considered zero fee (for relaying and mining) */
4048 ! CFeeRate minRelayTxFee = CFeeRate(5000);
4049   
4050   CTxMemPool mempool(::minRelayTxFee);
4051   
4052 --- 71,77 ----
4053   bool fAlerts = DEFAULT_ALERTS;
4054   
4055   /** Fees smaller than this (in satoshi) are considered zero fee (for relaying and mining) */
4056 ! CFeeRate minRelayTxFee = CFeeRate(DEFAULT_MIN_RELAY_TX_FEE);
4057   
4058   CTxMemPool mempool(::minRelayTxFee);
4059   
4060 ***************
4061 *** 550,556 ****
4062   
4063   // Komodo globals
4064   
4065 - #define KOMODO_PAX
4066   #define KOMODO_ZCASH
4067   #include "komodo.h"
4068   
4069 --- 551,556 ----
4070 ***************
4071 *** 871,878 ****
4072           return false;
4073       } else {
4074           // Ensure that zk-SNARKs verify
4075           BOOST_FOREACH(const JSDescription &joinsplit, tx.vjoinsplit) {
4076 !             if (!joinsplit.Verify(*pzcashParams, tx.joinSplitPubKey)) {
4077                   return state.DoS(100, error("CheckTransaction(): joinsplit does not verify"),
4078                                       REJECT_INVALID, "bad-txns-joinsplit-verification-failed");
4079               }
4080 --- 871,879 ----
4081           return false;
4082       } else {
4083           // Ensure that zk-SNARKs verify
4084 +         auto verifier = libzcash::ProofVerifier::Strict();
4085           BOOST_FOREACH(const JSDescription &joinsplit, tx.vjoinsplit) {
4086 !             if (!joinsplit.Verify(*pzcashParams, verifier, tx.joinSplitPubKey)) {
4087                   return state.DoS(100, error("CheckTransaction(): joinsplit does not verify"),
4088                                       REJECT_INVALID, "bad-txns-joinsplit-verification-failed");
4089               }
4090 ***************
4091 *** 1211,1222 ****
4092           CTxMemPoolEntry entry(tx, nFees, GetTime(), dPriority, chainActive.Height(), mempool.HasNoInputsOf(tx));
4093           unsigned int nSize = entry.GetTxSize();
4094   
4095 !         // Don't accept it if it can't get into a block
4096 !         CAmount txMinFee = GetMinRelayFee(tx, nSize, true);
4097 !         if (fLimitFree && nFees < txMinFee)
4098 !             return state.DoS(0, error("AcceptToMemoryPool: not enough fees %s, %d < %d",
4099 !                                       hash.ToString(), nFees, txMinFee),
4100 !                              REJECT_INSUFFICIENTFEE, "insufficient fee");
4101   
4102           // Require that free transactions have sufficient priority to be mined in the next block.
4103           if (GetBoolArg("-relaypriority", false) && nFees < ::minRelayTxFee.GetFee(nSize) && !AllowFree(view.GetPriority(tx, chainActive.Height() + 1))) {
4104 --- 1212,1228 ----
4105           CTxMemPoolEntry entry(tx, nFees, GetTime(), dPriority, chainActive.Height(), mempool.HasNoInputsOf(tx));
4106           unsigned int nSize = entry.GetTxSize();
4107   
4108 !         // Accept a tx if it contains joinsplits and has at least the default fee specified by z_sendmany.
4109 !         if (tx.vjoinsplit.size() > 0 && nFees >= ASYNC_RPC_OPERATION_DEFAULT_MINERS_FEE) {
4110 !             // In future we will we have more accurate and dynamic computation of fees for tx with joinsplits.
4111 !         } else {
4112 !             // Don't accept it if it can't get into a block
4113 !             CAmount txMinFee = GetMinRelayFee(tx, nSize, true);
4114 !             if (fLimitFree && nFees < txMinFee)
4115 !                 return state.DoS(0, error("AcceptToMemoryPool: not enough fees %s, %d < %d",
4116 !                                         hash.ToString(), nFees, txMinFee),
4117 !                                 REJECT_INSUFFICIENTFEE, "insufficient fee");
4118 !         }
4119   
4120           // Require that free transactions have sufficient priority to be mined in the next block.
4121           if (GetBoolArg("-relaypriority", false) && nFees < ::minRelayTxFee.GetFee(nSize) && !AllowFree(view.GetPriority(tx, chainActive.Height() + 1))) {
4122 ***************
4123 *** 1566,1572 ****
4124       }
4125   
4126       // We define a condition where we should warn the user about as a fork of at least 7 blocks
4127 !     // with a tip within 72 blocks (+/- 12 hours if no one mines it) of ours
4128       // We use 7 blocks rather arbitrarily as it represents just under 10% of sustained network
4129       // hash rate operating on the fork.
4130       // or a chain that is entirely longer than ours and invalid (note that this should be detected by both)
4131 --- 1572,1578 ----
4132       }
4133   
4134       // We define a condition where we should warn the user about as a fork of at least 7 blocks
4135 !     // with a tip within 72 blocks (+/- 3 hours if no one mines it) of ours
4136       // We use 7 blocks rather arbitrarily as it represents just under 10% of sustained network
4137       // hash rate operating on the fork.
4138       // or a chain that is entirely longer than ours and invalid (note that this should be detected by both)
4139 ***************
4140 *** 3213,3219 ****
4141   
4142       // Enforce block.nVersion=2 rule that the coinbase starts with serialized block height
4143       // if 750 of the last 1,000 blocks are version 2 or greater (51/100 if testnet):
4144 !     if (block.nVersion >= 2)
4145       {
4146           CScript expect = CScript() << nHeight;
4147           if (block.vtx[0].vin[0].scriptSig.size() < expect.size() ||
4148 --- 3219,3228 ----
4149   
4150       // Enforce block.nVersion=2 rule that the coinbase starts with serialized block height
4151       // if 750 of the last 1,000 blocks are version 2 or greater (51/100 if testnet):
4152 !     // Since MIN_BLOCK_VERSION = 4 all blocks with nHeight > 0 should satisfy this.
4153 !     // This rule is not applied to the genesis block, which didn't include the height
4154 !     // in the coinbase.
4155 !     if (nHeight > 0)
4156       {
4157           CScript expect = CScript() << nHeight;
4158           if (block.vtx[0].vin[0].scriptSig.size() < expect.size() ||
4159 diff -crB ./src/main.h ../../komodo-jl777/src/main.h
4160 *** ./src/main.h        2017-01-03 10:40:50.255331392 +0000
4161 --- ../../komodo-jl777/src/main.h       2017-01-03 09:49:08.864506767 +0000
4162 ***************
4163 *** 48,57 ****
4164   struct CNodeStateStats;
4165   
4166   /** Default for -blockmaxsize and -blockminsize, which control the range of sizes the mining code will create **/
4167 ! static const unsigned int DEFAULT_BLOCK_MAX_SIZE = 750000;
4168   static const unsigned int DEFAULT_BLOCK_MIN_SIZE = 0;
4169   /** Default for -blockprioritysize, maximum space for zero/low-fee transactions **/
4170 ! static const unsigned int DEFAULT_BLOCK_PRIORITY_SIZE = 50000;
4171   /** Default for accepting alerts from the P2P network. */
4172   static const bool DEFAULT_ALERTS = true;
4173   /** Minimum alert priority for enabling safe mode. */
4174 --- 48,57 ----
4175   struct CNodeStateStats;
4176   
4177   /** Default for -blockmaxsize and -blockminsize, which control the range of sizes the mining code will create **/
4178 ! static const unsigned int DEFAULT_BLOCK_MAX_SIZE = MAX_BLOCK_SIZE;
4179   static const unsigned int DEFAULT_BLOCK_MIN_SIZE = 0;
4180   /** Default for -blockprioritysize, maximum space for zero/low-fee transactions **/
4181 ! static const unsigned int DEFAULT_BLOCK_PRIORITY_SIZE = DEFAULT_BLOCK_MAX_SIZE / 2;
4182   /** Default for accepting alerts from the P2P network. */
4183   static const bool DEFAULT_ALERTS = true;
4184   /** Minimum alert priority for enabling safe mode. */
4185 ***************
4186 *** 60,65 ****
4187 --- 60,67 ----
4188   static const unsigned int MAX_P2SH_SIGOPS = 15;
4189   /** The maximum number of sigops we're willing to relay/mine in a single tx */
4190   static const unsigned int MAX_STANDARD_TX_SIGOPS = MAX_BLOCK_SIGOPS/5;
4191 + /** Default for -minrelaytxfee, minimum relay fee for transactions */
4192 + static const unsigned int DEFAULT_MIN_RELAY_TX_FEE = 1000;
4193   /** Default for -maxorphantx, maximum number of orphan transactions kept in memory */
4194   static const unsigned int DEFAULT_MAX_ORPHAN_TRANSACTIONS = 100;
4195   /** The maximum size of a blk?????.dat file (since 0.8) */
4196 ***************
4197 *** 91,96 ****
4198 --- 93,102 ----
4199   /** Maximum length of reject messages. */
4200   static const unsigned int MAX_REJECT_MESSAGE_LENGTH = 111;
4201   
4202 + // Sanity check the magic numbers when we change them
4203 + BOOST_STATIC_ASSERT(DEFAULT_BLOCK_MAX_SIZE <= MAX_BLOCK_SIZE);
4204 + BOOST_STATIC_ASSERT(DEFAULT_BLOCK_PRIORITY_SIZE <= DEFAULT_BLOCK_MAX_SIZE);
4205
4206   #define equihash_parameters_acceptable(N, K) \
4207       ((CBlockHeader::HEADER_SIZE + equihash_solution_size(N, K))*MAX_HEADERS_RESULTS < \
4208        MAX_PROTOCOL_MESSAGE_LENGTH-1000)
4209 diff -crB ./src/Makefile.am ../../komodo-jl777/src/Makefile.am
4210 *** ./src/Makefile.am   2017-01-03 10:40:50.211329166 +0000
4211 --- ../../komodo-jl777/src/Makefile.am  2017-01-03 09:49:08.856506348 +0000
4212 ***************
4213 *** 232,237 ****
4214 --- 232,239 ----
4215   # when wallet enabled
4216   libbitcoin_wallet_a_CPPFLAGS = $(BITCOIN_INCLUDES)
4217   libbitcoin_wallet_a_SOURCES = \
4218 +   utiltest.cpp \
4219 +   utiltest.h \
4220     zcbenchmarks.cpp \
4221     zcbenchmarks.h \
4222     wallet/asyncrpcoperation_sendmany.cpp \
4223 ***************
4224 *** 516,525 ****
4225         @test -f $(PROTOC)
4226         $(AM_V_GEN) $(PROTOC) --cpp_out=$(@D) --proto_path=$(abspath $(<D) $<)
4227   
4228 ! if ENABLE_TESTS
4229 ! include Makefile.test.include
4230 ! include Makefile.gtest.include
4231 ! endif
4232   
4233   if ENABLE_QT
4234   include Makefile.qt.include
4235 --- 518,527 ----
4236         @test -f $(PROTOC)
4237         $(AM_V_GEN) $(PROTOC) --cpp_out=$(@D) --proto_path=$(abspath $(<D) $<)
4238   
4239 ! #if ENABLE_TESTS
4240 ! #include Makefile.test.include
4241 ! #include Makefile.gtest.include
4242 ! #endif
4243   
4244   if ENABLE_QT
4245   include Makefile.qt.include
4246 diff -crB ./src/Makefile.gtest.include ../../komodo-jl777/src/Makefile.gtest.include
4247 *** ./src/Makefile.gtest.include        2017-01-03 10:40:50.211329166 +0000
4248 --- ../../komodo-jl777/src/Makefile.gtest.include       2017-01-03 09:49:08.856506348 +0000
4249 ***************
4250 *** 5,11 ****
4251   komodo_gtest_SOURCES = \
4252         gtest/main.cpp \
4253         gtest/utils.cpp \
4254 -       gtest/test_checkblock.cpp \
4255         gtest/test_checktransaction.cpp \
4256         gtest/json_test_vectors.cpp \
4257           gtest/json_test_vectors.h \
4258 --- 5,10 ----
4259 ***************
4260 *** 18,23 ****
4261 --- 17,23 ----
4262         gtest/test_keystore.cpp \
4263         gtest/test_noteencryption.cpp \
4264         gtest/test_merkletree.cpp \
4265 +       gtest/test_metrics.cpp \
4266         gtest/test_pow.cpp \
4267         gtest/test_random.cpp \
4268         gtest/test_rpc.cpp \
4269 ***************
4270 *** 26,32 ****
4271 --- 26,36 ----
4272         gtest/test_txid.cpp \
4273         gtest/test_libzcash_utils.cpp \
4274         gtest/test_proofs.cpp \
4275 +       gtest/test_checkblock.cpp
4276 + if ENABLE_WALLET
4277 + zcash_gtest_SOURCES += \
4278         wallet/gtest/test_wallet.cpp
4279 + endif
4280   
4281   komodo_gtest_CPPFLAGS = -DMULTICORE -fopenmp -DBINARY_OUTPUT -DCURVE_ALT_BN128 -DSTATIC
4282   
4283 diff -crB ./src/Makefile.test.include ../../komodo-jl777/src/Makefile.test.include
4284 *** ./src/Makefile.test.include 2017-01-03 10:40:50.211329166 +0000
4285 --- ../../komodo-jl777/src/Makefile.test.include        2017-01-03 09:49:08.856506348 +0000
4286 ***************
4287 *** 31,36 ****
4288 --- 31,37 ----
4289     test/data/merkle_serialization.json \
4290     test/data/merkle_witness_serialization.json \
4291     test/data/merkle_path.json \
4292 +   test/data/merkle_commitments.json \
4293     test/data/g1_compressed.json \
4294     test/data/g2_compressed.json
4295   
4296 diff -crB ./src/metrics.cpp ../../komodo-jl777/src/metrics.cpp
4297 *** ./src/metrics.cpp   2017-01-03 10:40:50.255331392 +0000
4298 --- ../../komodo-jl777/src/metrics.cpp  2017-01-03 09:49:08.864506767 +0000
4299 ***************
4300 *** 5,13 ****
4301 --- 5,15 ----
4302   #include "metrics.h"
4303   
4304   #include "chainparams.h"
4305 + #include "main.h"
4306   #include "ui_interface.h"
4307   #include "util.h"
4308   #include "utiltime.h"
4309 + #include "utilmoneystr.h"
4310   
4311   #include <boost/thread.hpp>
4312   #include <boost/thread/synchronized_value.hpp>
4313 ***************
4314 *** 15,29 ****
4315 --- 17,65 ----
4316   #include <sys/ioctl.h>
4317   #include <unistd.h>
4318   
4319 + CCriticalSection cs_metrics;
4320
4321 + boost::synchronized_value<int64_t> nNodeStartTime;
4322   AtomicCounter transactionsValidated;
4323   AtomicCounter ehSolverRuns;
4324   AtomicCounter solutionTargetChecks;
4325   AtomicCounter minedBlocks;
4326   
4327 + boost::synchronized_value<std::list<uint256>> trackedBlocks;
4328
4329   boost::synchronized_value<std::list<std::string>> messageBox;
4330   boost::synchronized_value<std::string> initMessage;
4331   bool loaded = false;
4332   
4333 + extern int64_t GetNetworkHashPS(int lookup, int height);
4334
4335 + void TrackMinedBlock(uint256 hash)
4336 + {
4337 +     LOCK(cs_metrics);
4338 +     minedBlocks.increment();
4339 +     trackedBlocks->push_back(hash);
4340 + }
4341
4342 + void MarkStartTime()
4343 + {
4344 +     *nNodeStartTime = GetTime();
4345 + }
4346
4347 + int64_t GetUptime()
4348 + {
4349 +     return GetTime() - *nNodeStartTime;
4350 + }
4351
4352 + double GetLocalSolPS_INTERNAL(int64_t uptime)
4353 + {
4354 +     return uptime > 0 ? (double)solutionTargetChecks.get() / uptime : 0;
4355 + }
4356
4357 + double GetLocalSolPS()
4358 + {
4359 +     return GetLocalSolPS_INTERNAL(GetUptime());
4360 + }
4361
4362   static bool metrics_ThreadSafeMessageBox(const std::string& message,
4363                                         const std::string& caption,
4364                                         unsigned int style)
4365 ***************
4366 *** 64,71 ****
4367       uiInterface.InitMessage.connect(metrics_InitMessage);
4368   }
4369   
4370 ! void printMiningStatus(bool mining)
4371   {
4372       if (mining) {
4373           int nThreads = GetArg("-genproclimit", 1);
4374           if (nThreads < 0) {
4375 --- 100,122 ----
4376       uiInterface.InitMessage.connect(metrics_InitMessage);
4377   }
4378   
4379 ! int printNetworkStats()
4380 ! {
4381 !     LOCK2(cs_main, cs_vNodes);
4382
4383 !     std::cout << "           " << _("Block height") << " | " << chainActive.Height() << std::endl;
4384 !     std::cout << "  " << _("Network solution rate") << " | " << GetNetworkHashPS(120, -1) << " Sol/s" << std::endl;
4385 !     std::cout << "            " << _("Connections") << " | " << vNodes.size() << std::endl;
4386 !     std::cout << std::endl;
4387
4388 !     return 4;
4389 ! }
4390
4391 ! int printMiningStatus(bool mining)
4392   {
4393 +     // Number of lines that are always displayed
4394 +     int lines = 1;
4395
4396       if (mining) {
4397           int nThreads = GetArg("-genproclimit", 1);
4398           if (nThreads < 0) {
4399 ***************
4400 *** 75,95 ****
4401               else
4402                   nThreads = boost::thread::hardware_concurrency();
4403           }
4404 !         std::cout << strprintf(_("You are running %d mining threads."), nThreads) << std::endl;
4405       } else {
4406           std::cout << _("You are currently not mining.") << std::endl;
4407           std::cout << _("To enable mining, add 'gen=1' to your zcash.conf and restart.") << std::endl;
4408       }
4409       std::cout << std::endl;
4410   }
4411   
4412 ! int printMetrics(size_t cols, int64_t nStart, bool mining)
4413   {
4414       // Number of lines that are always displayed
4415       int lines = 3;
4416   
4417       // Calculate uptime
4418 !     int64_t uptime = GetTime() - nStart;
4419       int days = uptime / (24 * 60 * 60);
4420       int hours = (uptime - (days * 24 * 60 * 60)) / (60 * 60);
4421       int minutes = (uptime - (((days * 24) + hours) * 60 * 60)) / 60;
4422 --- 126,151 ----
4423               else
4424                   nThreads = boost::thread::hardware_concurrency();
4425           }
4426 !         std::cout << strprintf(_("You are mining with the %s solver on %d threads."),
4427 !                                GetArg("-equihashsolver", "default"), nThreads) << std::endl;
4428 !         lines++;
4429       } else {
4430           std::cout << _("You are currently not mining.") << std::endl;
4431           std::cout << _("To enable mining, add 'gen=1' to your zcash.conf and restart.") << std::endl;
4432 +         lines += 2;
4433       }
4434       std::cout << std::endl;
4435
4436 +     return lines;
4437   }
4438   
4439 ! int printMetrics(size_t cols, bool mining)
4440   {
4441       // Number of lines that are always displayed
4442       int lines = 3;
4443   
4444       // Calculate uptime
4445 !     int64_t uptime = GetUptime();
4446       int days = uptime / (24 * 60 * 60);
4447       int hours = (uptime - (days * 24 * 60 * 60)) / (60 * 60);
4448       int minutes = (uptime - (((days * 24) + hours) * 60 * 60)) / 60;
4449 ***************
4450 *** 110,128 ****
4451       std::cout << strDuration << std::endl;
4452       lines += (strDuration.size() / cols);
4453   
4454 !     std::cout << "- " << strprintf(_("You have validated %d transactions!"), transactionsValidated.get()) << std::endl;
4455   
4456 !     if (mining) {
4457 !         double solps = uptime > 0 ? (double)solutionTargetChecks.get() / uptime : 0;
4458           std::string strSolps = strprintf("%.4f Sol/s", solps);
4459           std::cout << "- " << strprintf(_("You have contributed %s on average to the network solution rate."), strSolps) << std::endl;
4460           std::cout << "- " << strprintf(_("You have completed %d Equihash solver runs."), ehSolverRuns.get()) << std::endl;
4461           lines += 2;
4462   
4463 !         int mined = minedBlocks.get();
4464           if (mined > 0) {
4465               std::cout << "- " << strprintf(_("You have mined %d blocks!"), mined) << std::endl;
4466 !             lines++;
4467           }
4468       }
4469       std::cout << std::endl;
4470 --- 166,233 ----
4471       std::cout << strDuration << std::endl;
4472       lines += (strDuration.size() / cols);
4473   
4474 !     int validatedCount = transactionsValidated.get();
4475 !     if (validatedCount > 1) {
4476 !       std::cout << "- " << strprintf(_("You have validated %d transactions!"), validatedCount) << std::endl;
4477 !     } else if (validatedCount == 1) {
4478 !       std::cout << "- " << _("You have validated a transaction!") << std::endl;
4479 !     } else {
4480 !       std::cout << "- " << _("You have validated no transactions.") << std::endl;
4481 !     }
4482   
4483 !     if (mining && loaded) {
4484 !         double solps = GetLocalSolPS_INTERNAL(uptime);
4485           std::string strSolps = strprintf("%.4f Sol/s", solps);
4486           std::cout << "- " << strprintf(_("You have contributed %s on average to the network solution rate."), strSolps) << std::endl;
4487           std::cout << "- " << strprintf(_("You have completed %d Equihash solver runs."), ehSolverRuns.get()) << std::endl;
4488           lines += 2;
4489   
4490 !         int mined = 0;
4491 !         int orphaned = 0;
4492 !         CAmount immature {0};
4493 !         CAmount mature {0};
4494 !         {
4495 !             LOCK2(cs_main, cs_metrics);
4496 !             boost::strict_lock_ptr<std::list<uint256>> u = trackedBlocks.synchronize();
4497 !             auto consensusParams = Params().GetConsensus();
4498 !             auto tipHeight = chainActive.Height();
4499
4500 !             // Update orphans and calculate subsidies
4501 !             std::list<uint256>::iterator it = u->begin();
4502 !             while (it != u->end()) {
4503 !                 auto hash = *it;
4504 !                 if (mapBlockIndex.count(hash) > 0 &&
4505 !                         chainActive.Contains(mapBlockIndex[hash])) {
4506 !                     int height = mapBlockIndex[hash]->nHeight;
4507 !                     CAmount subsidy = GetBlockSubsidy(height, consensusParams);
4508 !                     if ((height > 0) && (height <= consensusParams.GetLastFoundersRewardBlockHeight())) {
4509 !                         subsidy -= subsidy/5;
4510 !                     }
4511 !                     if (std::max(0, COINBASE_MATURITY - (tipHeight - height)) > 0) {
4512 !                         immature += subsidy;
4513 !                     } else {
4514 !                         mature += subsidy;
4515 !                     }
4516 !                     it++;
4517 !                 } else {
4518 !                     it = u->erase(it);
4519 !                 }
4520 !             }
4521
4522 !             mined = minedBlocks.get();
4523 !             orphaned = mined - u->size();
4524 !         }
4525
4526           if (mined > 0) {
4527 +             std::string units = Params().CurrencyUnits();
4528               std::cout << "- " << strprintf(_("You have mined %d blocks!"), mined) << std::endl;
4529 !             std::cout << "  "
4530 !                       << strprintf(_("Orphaned: %d blocks, Immature: %u %s, Mature: %u %s"),
4531 !                                      orphaned,
4532 !                                      FormatMoney(immature), units,
4533 !                                      FormatMoney(mature), units)
4534 !                       << std::endl;
4535 !             lines += 2;
4536           }
4537       }
4538       std::cout << std::endl;
4539 ***************
4540 *** 171,194 ****
4541       // Make this thread recognisable as the metrics screen thread
4542       RenameThread("zcash-metrics-screen");
4543   
4544 !     // Clear screen
4545 !     std::cout << "\e[2J";
4546
4547 !     // Print art
4548 !     std::cout << METRICS_ART << std::endl;
4549 !     std::cout << std::endl;
4550
4551 !     // Thank you text
4552 !     std::cout << _("Thank you for running a Zcash node!") << std::endl;
4553 !     std::cout << _("You're helping to strengthen the network and contributing to a social good :)") << std::endl;
4554 !     std::cout << std::endl;
4555
4556 !     // Miner status
4557 !     bool mining = GetBoolArg("-gen", false);
4558 !     printMiningStatus(mining);
4559
4560 !     // Count uptime
4561 !     int64_t nStart = GetTime();
4562   
4563       while (true) {
4564           // Number of lines that are always displayed
4565 --- 276,299 ----
4566       // Make this thread recognisable as the metrics screen thread
4567       RenameThread("zcash-metrics-screen");
4568   
4569 !     // Determine whether we should render a persistent UI or rolling metrics
4570 !     bool isTTY = isatty(STDOUT_FILENO);
4571 !     bool isScreen = GetBoolArg("-metricsui", isTTY);
4572 !     int64_t nRefresh = GetArg("-metricsrefreshtime", isTTY ? 1 : 600);
4573
4574 !     if (isScreen) {
4575 !         // Clear screen
4576 !         std::cout << "\e[2J";
4577
4578 !         // Print art
4579 !         std::cout << METRICS_ART << std::endl;
4580 !         std::cout << std::endl;
4581
4582 !         // Thank you text
4583 !         std::cout << _("Thank you for running a Zcash node!") << std::endl;
4584 !         std::cout << _("You're helping to strengthen the network and contributing to a social good :)") << std::endl;
4585 !         std::cout << std::endl;
4586 !     }
4587   
4588       while (true) {
4589           // Number of lines that are always displayed
4590 ***************
4591 *** 196,202 ****
4592           int cols = 80;
4593   
4594           // Get current window size
4595 !         if (isatty(STDOUT_FILENO)) {
4596               struct winsize w;
4597               w.ws_col = 0;
4598               if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) != -1 && w.ws_col != 0) {
4599 --- 301,307 ----
4600           int cols = 80;
4601   
4602           // Get current window size
4603 !         if (isTTY) {
4604               struct winsize w;
4605               w.ws_col = 0;
4606               if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) != -1 && w.ws_col != 0) {
4607 ***************
4608 *** 204,223 ****
4609               }
4610           }
4611   
4612 !         // Erase below current position
4613 !         std::cout << "\e[J";
4614   
4615 !         lines += printMetrics(cols, nStart, mining);
4616           lines += printMessageBox(cols);
4617           lines += printInitMessage();
4618   
4619 !         // Explain how to exit
4620 !         std::cout << "[" << _("Press Ctrl+C to exit") << "] [" << _("Set 'showmetrics=0' to hide") << "]" << std::endl;;
4621   
4622 !         boost::this_thread::interruption_point();
4623 !         MilliSleep(1000);
4624   
4625 !         // Return to the top of the updating section
4626 !         std::cout << "\e[" << lines << "A";
4627       }
4628   }
4629 --- 309,347 ----
4630               }
4631           }
4632   
4633 !         if (isScreen) {
4634 !             // Erase below current position
4635 !             std::cout << "\e[J";
4636 !         }
4637
4638 !         // Miner status
4639 !         bool mining = GetBoolArg("-gen", false);
4640   
4641 !         if (loaded) {
4642 !             lines += printNetworkStats();
4643 !         }
4644 !         lines += printMiningStatus(mining);
4645 !         lines += printMetrics(cols, mining);
4646           lines += printMessageBox(cols);
4647           lines += printInitMessage();
4648   
4649 !         if (isScreen) {
4650 !             // Explain how to exit
4651 !             std::cout << "[" << _("Press Ctrl+C to exit") << "] [" << _("Set 'showmetrics=0' to hide") << "]" << std::endl;
4652 !         } else {
4653 !             // Print delineator
4654 !             std::cout << "----------------------------------------" << std::endl;
4655 !         }
4656   
4657 !         int64_t nWaitEnd = GetTime() + nRefresh;
4658 !         while (GetTime() < nWaitEnd) {
4659 !             boost::this_thread::interruption_point();
4660 !             MilliSleep(200);
4661 !         }
4662   
4663 !         if (isScreen) {
4664 !             // Return to the top of the updating section
4665 !             std::cout << "\e[" << lines << "A";
4666 !         }
4667       }
4668   }
4669 diff -crB ./src/metrics.h ../../komodo-jl777/src/metrics.h
4670 *** ./src/metrics.h     2017-01-03 10:40:50.255331392 +0000
4671 --- ../../komodo-jl777/src/metrics.h    2017-01-03 09:49:08.864506767 +0000
4672 ***************
4673 *** 2,12 ****
4674   // Distributed under the MIT software license, see the accompanying
4675   // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4676   
4677   #include <atomic>
4678   #include <string>
4679   
4680   struct AtomicCounter {
4681 !     std::atomic<int> value;
4682   
4683       AtomicCounter() : value {0} { }
4684   
4685 --- 2,14 ----
4686   // Distributed under the MIT software license, see the accompanying
4687   // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4688   
4689 + #include "uint256.h"
4690
4691   #include <atomic>
4692   #include <string>
4693   
4694   struct AtomicCounter {
4695 !     std::atomic<uint64_t> value;
4696   
4697       AtomicCounter() : value {0} { }
4698   
4699 ***************
4700 *** 26,32 ****
4701   extern AtomicCounter transactionsValidated;
4702   extern AtomicCounter ehSolverRuns;
4703   extern AtomicCounter solutionTargetChecks;
4704 ! extern AtomicCounter minedBlocks;
4705   
4706   void ConnectMetricsScreen();
4707   void ThreadShowMetricsScreen();
4708 --- 28,38 ----
4709   extern AtomicCounter transactionsValidated;
4710   extern AtomicCounter ehSolverRuns;
4711   extern AtomicCounter solutionTargetChecks;
4712
4713 ! void TrackMinedBlock(uint256 hash);
4714
4715 ! void MarkStartTime();
4716 ! double GetLocalSolPS();
4717   
4718   void ConnectMetricsScreen();
4719   void ThreadShowMetricsScreen();
4720 diff -crB ./src/miner.cpp ../../komodo-jl777/src/miner.cpp
4721 *** ./src/miner.cpp     2017-01-03 10:40:50.255331392 +0000
4722 --- ../../komodo-jl777/src/miner.cpp    2017-01-03 09:49:08.864506767 +0000
4723 ***************
4724 *** 99,105 ****
4725   }
4726   
4727   #define ASSETCHAINS_MINHEIGHT 100
4728 ! #define ROUNDROBIN_DELAY 58
4729   extern int32_t ASSETCHAINS_SEED,IS_KOMODO_NOTARY,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,ASSETCHAIN_INIT,KOMODO_INITDONE,KOMODO_ON_DEMAND,KOMODO_INITDONE;
4730   extern char ASSETCHAINS_SYMBOL[16];
4731   extern std::string NOTARY_PUBKEY;
4732 --- 99,106 ----
4733   }
4734   
4735   #define ASSETCHAINS_MINHEIGHT 100
4736 ! #define KOMODO_ELECTION_GAP 2000
4737 ! #define ROUNDROBIN_DELAY 55
4738   extern int32_t ASSETCHAINS_SEED,IS_KOMODO_NOTARY,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,ASSETCHAIN_INIT,KOMODO_INITDONE,KOMODO_ON_DEMAND,KOMODO_INITDONE;
4739   extern char ASSETCHAINS_SYMBOL[16];
4740   extern std::string NOTARY_PUBKEY;
4741 ***************
4742 *** 109,114 ****
4743 --- 110,116 ----
4744   int32_t komodo_is_special(int32_t height,uint8_t pubkey33[33]);
4745   int32_t komodo_pax_opreturn(uint8_t *opret,int32_t maxsize);
4746   uint64_t komodo_paxtotal();
4747 + int32_t komodo_baseid(char *origbase);
4748   int32_t komodo_is_issuer();
4749   int32_t komodo_gateway_deposits(CMutableTransaction *txNew,char *symbol,int32_t tokomodo);
4750   int32_t komodo_isrealtime(int32_t *kmdheightp);
4751 ***************
4752 *** 121,137 ****
4753       if(!pblocktemplate.get())
4754           return NULL;
4755       CBlock *pblock = &pblocktemplate->block; // pointer for convenience
4756 !     if ( ASSETCHAINS_SYMBOL[0] != 0 && chainActive.Tip()->nHeight > ASSETCHAINS_MINHEIGHT )
4757       {
4758           isrealtime = komodo_isrealtime(&kmdheight);
4759 !         while ( KOMODO_ON_DEMAND == 0 )
4760           {
4761               deposits = komodo_paxtotal();
4762 !             if ( KOMODO_INITDONE == 0 || (isrealtime= komodo_isrealtime(&kmdheight)) == 0 )
4763               {
4764                   //fprintf(stderr,"INITDONE.%d RT.%d deposits %.8f ht.%d\n",KOMODO_INITDONE,isrealtime,(double)deposits/COIN,kmdheight);
4765               }
4766 !             else if ( deposits != 0 )
4767               {
4768                   fprintf(stderr,"start CreateNewBlock %s initdone.%d deposit %.8f mempool.%d RT.%u KOMODO_ON_DEMAND.%d\n",ASSETCHAINS_SYMBOL,KOMODO_INITDONE,(double)komodo_paxtotal()/COIN,(int32_t)mempool.GetTotalTxSize(),isrealtime,KOMODO_ON_DEMAND);
4769                   break;
4770 --- 123,140 ----
4771       if(!pblocktemplate.get())
4772           return NULL;
4773       CBlock *pblock = &pblocktemplate->block; // pointer for convenience
4774 !     if ( ASSETCHAINS_SYMBOL[0] != 0 && chainActive.Tip()->nHeight >= ASSETCHAINS_MINHEIGHT )
4775       {
4776           isrealtime = komodo_isrealtime(&kmdheight);
4777 !         deposits = komodo_paxtotal();
4778 !         while ( KOMODO_ON_DEMAND == 0 && deposits == 0 && (int32_t)mempool.GetTotalTxSize() == 0 )
4779           {
4780               deposits = komodo_paxtotal();
4781 !             if ( KOMODO_INITDONE == 0 || (komodo_baseid(ASSETCHAINS_SYMBOL) >= 0 && (isrealtime= komodo_isrealtime(&kmdheight)) == 0) )
4782               {
4783                   //fprintf(stderr,"INITDONE.%d RT.%d deposits %.8f ht.%d\n",KOMODO_INITDONE,isrealtime,(double)deposits/COIN,kmdheight);
4784               }
4785 !             else if ( deposits != 0 || (int32_t)mempool.GetTotalTxSize() > 0 )
4786               {
4787                   fprintf(stderr,"start CreateNewBlock %s initdone.%d deposit %.8f mempool.%d RT.%u KOMODO_ON_DEMAND.%d\n",ASSETCHAINS_SYMBOL,KOMODO_INITDONE,(double)komodo_paxtotal()/COIN,(int32_t)mempool.GetTotalTxSize(),isrealtime,KOMODO_ON_DEMAND);
4788                   break;
4789 ***************
4790 *** 242,247 ****
4791 --- 245,252 ----
4792   
4793                   dPriority += (double)nValueIn * nConf;
4794               }
4795 +             nTotalIn += tx.GetJoinSplitValueIn();
4796
4797               if (fMissingInputs) continue;
4798   
4799               // Priority is sum(valuein * age) / modified_txsize
4800 ***************
4801 *** 419,425 ****
4802           if ( !TestBlockValidity(state, *pblock, pindexPrev, false, false))
4803           {
4804               fprintf(stderr,"testblockvalidity failed\n");
4805 !             //throw std::runtime_error("CreateNewBlock(): TestBlockValidity failed");
4806           }
4807       }
4808   
4809 --- 424,430 ----
4810           if ( !TestBlockValidity(state, *pblock, pindexPrev, false, false))
4811           {
4812               fprintf(stderr,"testblockvalidity failed\n");
4813 !             throw std::runtime_error("CreateNewBlock(): TestBlockValidity failed");
4814           }
4815       }
4816   
4817 ***************
4818 *** 473,479 ****
4819           script[34] = OP_CHECKSIG;
4820           //scriptPubKey = CScript() << ToByteVector(pubkey) << OP_CHECKSIG;
4821       }
4822 !     if ( 0 && ASSETCHAINS_SYMBOL[0] == 0 )
4823       {
4824           for (i=0; i<65; i++)
4825               fprintf(stderr,"%d ",komodo_minerid(chainActive.Tip()->nHeight-i));
4826 --- 478,484 ----
4827           script[34] = OP_CHECKSIG;
4828           //scriptPubKey = CScript() << ToByteVector(pubkey) << OP_CHECKSIG;
4829       }
4830 !     if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 )
4831       {
4832           for (i=0; i<65; i++)
4833               fprintf(stderr,"%d ",komodo_minerid(chainActive.Tip()->nHeight-i));
4834 ***************
4835 *** 509,515 ****
4836       if (!ProcessNewBlock(chainActive.Tip()->nHeight+1,state, NULL, pblock, true, NULL))
4837           return error("KomodoMiner: ProcessNewBlock, block not accepted");
4838   
4839 !     minedBlocks.increment();
4840   
4841       return true;
4842   }
4843 --- 514,520 ----
4844       if (!ProcessNewBlock(chainActive.Tip()->nHeight+1,state, NULL, pblock, true, NULL))
4845           return error("KomodoMiner: ProcessNewBlock, block not accepted");
4846   
4847 !     TrackMinedBlock(pblock->GetHash());
4848   
4849       return true;
4850   }
4851 ***************
4852 *** 614,627 ****
4853               arith_uint256 hashTarget = arith_uint256().SetCompact(pblock->nBits);
4854               if ( ASSETCHAINS_SYMBOL[0] == 0 && komodo_is_special(pindexPrev->nHeight+1,NOTARY_PUBKEY33) > 0 )
4855               {
4856 !                 hashTarget = arith_uint256().SetCompact(KOMODO_MINDIFF_NBITS);
4857 !                 fprintf(stderr,"I am the chosen one for %s ht.%d\n",ASSETCHAINS_SYMBOL,pindexPrev->nHeight+1);
4858               } else Mining_start = 0;
4859               while (true)
4860               {
4861 !                 if ( ASSETCHAINS_SYMBOL[0] != 0 && pblock->vtx[0].vout.size() == 1 && Mining_height > ASSETCHAINS_MINHEIGHT )
4862                   {
4863 !                     //fprintf(stderr,"skip generating %s on-demand block, no tx avail\n",ASSETCHAINS_SYMBOL);
4864                       sleep(10);
4865                       break;
4866                   }
4867 --- 619,635 ----
4868               arith_uint256 hashTarget = arith_uint256().SetCompact(pblock->nBits);
4869               if ( ASSETCHAINS_SYMBOL[0] == 0 && komodo_is_special(pindexPrev->nHeight+1,NOTARY_PUBKEY33) > 0 )
4870               {
4871 !                 if ( (Mining_height % KOMODO_ELECTION_GAP) > 64 || (Mining_height % KOMODO_ELECTION_GAP) == 0 )
4872 !                 {
4873 !                     hashTarget = arith_uint256().SetCompact(KOMODO_MINDIFF_NBITS);
4874 !                     fprintf(stderr,"I am the chosen one for %s ht.%d\n",ASSETCHAINS_SYMBOL,pindexPrev->nHeight+1);
4875 !                 } else Mining_start = 0;
4876               } else Mining_start = 0;
4877               while (true)
4878               {
4879 !                 if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 && pblock->vtx[0].vout.size() == 1 && Mining_height > ASSETCHAINS_MINHEIGHT )
4880                   {
4881 !                     fprintf(stderr,"skip generating %s on-demand block, no tx avail\n",ASSETCHAINS_SYMBOL);
4882                       sleep(10);
4883                       break;
4884                   }
4885 ***************
4886 *** 784,794 ****
4887 --- 792,804 ----
4888       }
4889       catch (const boost::thread_interrupted&)
4890       {
4891 +         c.disconnect();
4892           LogPrintf("KomodoMiner terminated\n");
4893           throw;
4894       }
4895       catch (const std::runtime_error &e)
4896       {
4897 +         c.disconnect();
4898           LogPrintf("KomodoMiner runtime error: %s\n", e.what());
4899           return;
4900       }
4901 diff -crB ./src/pow.cpp ../../komodo-jl777/src/pow.cpp
4902 *** ./src/pow.cpp       2017-01-03 10:40:50.259331594 +0000
4903 --- ../../komodo-jl777/src/pow.cpp      2017-01-03 09:49:08.864506767 +0000
4904 ***************
4905 *** 113,119 ****
4906   bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned int nBits, const Consensus::Params& params)
4907   {
4908       extern int32_t KOMODO_REWIND;
4909 !     bool fNegative,fOverflow; int32_t i,nonz=0,special,special2,notaryid=-1,flag = 0;
4910       arith_uint256 bnTarget;
4911   
4912       bnTarget.SetCompact(nBits, &fNegative, &fOverflow);
4913 --- 113,119 ----
4914   bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned int nBits, const Consensus::Params& params)
4915   {
4916       extern int32_t KOMODO_REWIND;
4917 !     bool fNegative,fOverflow; int32_t i,nonz=0,special=0,special2=0,notaryid=-1,flag = 0;
4918       arith_uint256 bnTarget;
4919   
4920       bnTarget.SetCompact(nBits, &fNegative, &fOverflow);
4921 ***************
4922 *** 130,144 ****
4923           if ( nonz == 0 )
4924               return(true); // will come back via different path with pubkey set
4925           special2 = komodo_is_special(height,pubkey33);
4926 !         if ( notaryid >= 0 && ((height >= 64000 && height <= 90065) || (height % KOMODO_ELECTION_GAP) > 64) )
4927           {
4928 -             //if ( special2 == -2 )
4929 -             //    printf("height.%d special2.%d special.%d\n",height,special2,special);
4930               if ( (height >= 64000 && height <= 90065) || (height % KOMODO_ELECTION_GAP) == 0 || (height < 80000 && (special != 0 || special2 > 0)) || (height >= 80000 && special2 > 0) )
4931               {
4932                   bnTarget.SetCompact(KOMODO_MINDIFF_NBITS,&fNegative,&fOverflow);
4933                   flag = 1;
4934               }
4935           }
4936       }
4937       if (fNegative || bnTarget == 0 || fOverflow || bnTarget > UintToArith256(params.powLimit))
4938 --- 130,153 ----
4939           if ( nonz == 0 )
4940               return(true); // will come back via different path with pubkey set
4941           special2 = komodo_is_special(height,pubkey33);
4942 !         /*if ( notaryid >= 0 && ((height >= 64000 && height <= 90065) || (height % KOMODO_ELECTION_GAP) > 64) )
4943           {
4944               if ( (height >= 64000 && height <= 90065) || (height % KOMODO_ELECTION_GAP) == 0 || (height < 80000 && (special != 0 || special2 > 0)) || (height >= 80000 && special2 > 0) )
4945               {
4946                   bnTarget.SetCompact(KOMODO_MINDIFF_NBITS,&fNegative,&fOverflow);
4947                   flag = 1;
4948               }
4949 +         }*/
4950 +         if ( notaryid >= 0 )
4951 +         {
4952 +             if ( height > 10000 && height < 80000 && (special != 0 || special2 > 0) )
4953 +                 flag = 1;
4954 +             else if ( height >= 80000 && height < 108000 && special2 > 0 )
4955 +                 flag = 1;
4956 +             else if ( height >= 108000 && special2 > 0 )
4957 +                 flag = ((height % KOMODO_ELECTION_GAP) > 64 || (height % KOMODO_ELECTION_GAP) == 0);
4958 +             if ( flag != 0 )
4959 +                 bnTarget.SetCompact(KOMODO_MINDIFF_NBITS,&fNegative,&fOverflow);
4960           }
4961       }
4962       if (fNegative || bnTarget == 0 || fOverflow || bnTarget > UintToArith256(params.powLimit))
4963 ***************
4964 *** 146,160 ****
4965       // Check proof of work matches claimed amount
4966       if ( UintToArith256(hash) > bnTarget )
4967       {
4968 !         int32_t i;
4969 !         for (i=31; i>=0; i--)
4970 !             printf("%02x",((uint8_t *)&hash)[i]);
4971 !         printf(" hash vs ");
4972 !         for (i=31; i>=0; i--)
4973 !             printf("%02x",((uint8_t *)&bnTarget)[i]);
4974 !         printf(" ht.%d REWIND.%d special.%d notaryid.%d ht.%d mod.%d error\n",height,KOMODO_REWIND,special,notaryid,height,(height % 35));
4975 !         if ( height <= KOMODO_REWIND )
4976 !             return error("CheckProofOfWork(): hash doesn't match nBits");
4977       }
4978       return true;
4979   }
4980 --- 155,171 ----
4981       // Check proof of work matches claimed amount
4982       if ( UintToArith256(hash) > bnTarget )
4983       {
4984 !         {
4985 !             int32_t i;
4986 !             for (i=31; i>=0; i--)
4987 !                 printf("%02x",((uint8_t *)&hash)[i]);
4988 !             printf(" hash vs ");
4989 !             for (i=31; i>=0; i--)
4990 !                 printf("%02x",((uint8_t *)&bnTarget)[i]);
4991 !             printf(" ht.%d REWIND.%d special.%d notaryid.%d ht.%d mod.%d error\n",height,KOMODO_REWIND,special,notaryid,height,(height % 35));
4992 !             if ( height < 90000 || (height > 110000 && KOMODO_REWIND == 0) )
4993 !                 return error("CheckProofOfWork(): hash doesn't match nBits");
4994 !         }
4995       }
4996       return true;
4997   }
4998 diff -crB ./src/primitives/block.h ../../komodo-jl777/src/primitives/block.h
4999 *** ./src/primitives/block.h    2017-01-03 10:40:50.259331594 +0000
5000 --- ../../komodo-jl777/src/primitives/block.h   2017-01-03 09:49:08.864506767 +0000
5001 ***************
5002 *** 200,205 ****
5003 --- 200,209 ----
5004       {
5005           return vHave.empty();
5006       }
5007
5008 +     friend bool operator==(const CBlockLocator& a, const CBlockLocator& b) {
5009 +         return (a.vHave == b.vHave);
5010 +     }
5011   };
5012   
5013   #endif // BITCOIN_PRIMITIVES_BLOCK_H
5014 diff -crB ./src/primitives/transaction.cpp ../../komodo-jl777/src/primitives/transaction.cpp
5015 *** ./src/primitives/transaction.cpp    2017-01-03 10:40:50.259331594 +0000
5016 --- ../../komodo-jl777/src/primitives/transaction.cpp   2017-01-03 09:49:08.864506767 +0000
5017 ***************
5018 *** 62,67 ****
5019 --- 62,70 ----
5020       // Randomize the order of the inputs and outputs
5021       inputMap = {0, 1};
5022       outputMap = {0, 1};
5023
5024 +     assert(gen);
5025
5026       MappedShuffle(inputs.begin(), inputMap.begin(), ZC_NUM_JS_INPUTS, gen);
5027       MappedShuffle(outputs.begin(), outputMap.begin(), ZC_NUM_JS_OUTPUTS, gen);
5028   
5029 ***************
5030 *** 72,81 ****
5031 --- 75,86 ----
5032   
5033   bool JSDescription::Verify(
5034       ZCJoinSplit& params,
5035 +     libzcash::ProofVerifier& verifier,
5036       const uint256& pubKeyHash
5037   ) const {
5038       return params.verify(
5039           proof,
5040 +         verifier,
5041           pubKeyHash,
5042           randomSeed,
5043           macs,
5044 diff -crB ./src/primitives/transaction.h ../../komodo-jl777/src/primitives/transaction.h
5045 *** ./src/primitives/transaction.h      2017-01-03 10:40:50.259331594 +0000
5046 --- ../../komodo-jl777/src/primitives/transaction.h     2017-01-03 09:49:08.864506767 +0000
5047 ***************
5048 *** 101,107 ****
5049       );
5050   
5051       // Verifies that the JoinSplit proof is correct.
5052 !     bool Verify(ZCJoinSplit& params, const uint256& pubKeyHash) const;
5053   
5054       // Returns the calculated h_sig
5055       uint256 h_sig(ZCJoinSplit& params, const uint256& pubKeyHash) const;
5056 --- 101,111 ----
5057       );
5058   
5059       // Verifies that the JoinSplit proof is correct.
5060 !     bool Verify(
5061 !         ZCJoinSplit& params,
5062 !         libzcash::ProofVerifier& verifier,
5063 !         const uint256& pubKeyHash
5064 !     ) const;
5065   
5066       // Returns the calculated h_sig
5067       uint256 h_sig(ZCJoinSplit& params, const uint256& pubKeyHash) const;
5068 diff -crB ./src/random.cpp ../../komodo-jl777/src/random.cpp
5069 *** ./src/random.cpp    2017-01-03 10:40:50.339335643 +0000
5070 --- ../../komodo-jl777/src/random.cpp   2017-01-03 09:49:08.864506767 +0000
5071 ***************
5072 *** 137,139 ****
5073 --- 137,144 ----
5074           insecure_rand_Rw = tmp;
5075       }
5076   }
5077
5078 + int GenIdentity(int n)
5079 + {
5080 +     return n-1;
5081 + }
5082 diff -crB ./src/random.h ../../komodo-jl777/src/random.h
5083 *** ./src/random.h      2017-01-03 10:40:50.339335643 +0000
5084 --- ../../komodo-jl777/src/random.h     2017-01-03 09:49:08.864506767 +0000
5085 ***************
5086 *** 26,31 ****
5087 --- 26,36 ----
5088   uint256 GetRandHash();
5089   
5090   /**
5091 +  * Identity function for MappedShuffle, so that elements retain their original order.
5092 +  */
5093 +  int GenIdentity(int n);
5094
5095 + /**
5096    * Rearranges the elements in the range [first,first+len) randomly, assuming
5097    * that gen is a uniform random number generator. Follows the same algorithm as
5098    * std::shuffle in C++11 (a Durstenfeld shuffle).
5099 diff -crB ./src/rpcclient.cpp ../../komodo-jl777/src/rpcclient.cpp
5100 *** ./src/rpcclient.cpp 2017-01-03 10:40:50.343335845 +0000
5101 --- ../../komodo-jl777/src/rpcclient.cpp        2017-01-03 09:49:08.864506767 +0000
5102 ***************
5103 *** 103,108 ****
5104 --- 103,109 ----
5105       { "z_gettotalbalance", 0},
5106       { "z_sendmany", 1},
5107       { "z_sendmany", 2},
5108 +     { "z_sendmany", 3},
5109       { "z_getoperationstatus", 0},
5110       { "z_getoperationresult", 0},
5111       { "z_importkey", 1 },
5112 diff -crB ./src/rpcmining.cpp ../../komodo-jl777/src/rpcmining.cpp
5113 *** ./src/rpcmining.cpp 2017-01-03 10:40:50.343335845 +0000
5114 --- ../../komodo-jl777/src/rpcmining.cpp        2017-01-03 09:49:08.864506767 +0000
5115 ***************
5116 *** 37,43 ****
5117    * or over the difficulty averaging window if 'lookup' is nonpositive.
5118    * If 'height' is nonnegative, compute the estimate at the time when a given block was found.
5119    */
5120 ! Value GetNetworkHashPS(int lookup, int height) {
5121       CBlockIndex *pb = chainActive.Tip();
5122   
5123       if (height >= 0 && height < chainActive.Height())
5124 --- 37,43 ----
5125    * or over the difficulty averaging window if 'lookup' is nonpositive.
5126    * If 'height' is nonnegative, compute the estimate at the time when a given block was found.
5127    */
5128 ! int64_t GetNetworkHashPS(int lookup, int height) {
5129       CBlockIndex *pb = chainActive.Tip();
5130   
5131       if (height >= 0 && height < chainActive.Height())
5132 ***************
5133 *** 74,92 ****
5134       return (int64_t)(workDiff.getdouble() / timeDiff);
5135   }
5136   
5137   Value getnetworkhashps(const Array& params, bool fHelp)
5138   {
5139       if (fHelp || params.size() > 2)
5140           throw runtime_error(
5141               "getnetworkhashps ( blocks height )\n"
5142 !             "\nReturns the estimated network hashes per second based on the last n blocks.\n"
5143               "Pass in [blocks] to override # of blocks, -1 specifies over difficulty averaging window.\n"
5144               "Pass in [height] to estimate the network speed at the time when a certain block was found.\n"
5145               "\nArguments:\n"
5146               "1. blocks     (numeric, optional, default=120) The number of blocks, or -1 for blocks over difficulty averaging window.\n"
5147               "2. height     (numeric, optional, default=-1) To estimate at the time of the given height.\n"
5148               "\nResult:\n"
5149 !             "x             (numeric) Hashes per second estimated\n"
5150               "\nExamples:\n"
5151               + HelpExampleCli("getnetworkhashps", "")
5152               + HelpExampleRpc("getnetworkhashps", "")
5153 --- 74,133 ----
5154       return (int64_t)(workDiff.getdouble() / timeDiff);
5155   }
5156   
5157 + Value getlocalsolps(const Array& params, bool fHelp)
5158 + {
5159 +     if (fHelp)
5160 +         throw runtime_error(
5161 +             "getlocalsolps\n"
5162 +             "\nReturns the average local solutions per second since this node was started.\n"
5163 +             "This is the same information shown on the metrics screen (if enabled).\n"
5164 +             "\nResult:\n"
5165 +             "xxx.xxxxx     (numeric) Solutions per second average\n"
5166 +             "\nExamples:\n"
5167 +             + HelpExampleCli("getlocalsolps", "")
5168 +             + HelpExampleRpc("getlocalsolps", "")
5169 +        );
5170
5171 +     LOCK(cs_main);
5172 +     return GetLocalSolPS();
5173 + }
5174
5175 + Value getnetworksolps(const Array& params, bool fHelp)
5176 + {
5177 +     if (fHelp || params.size() > 2)
5178 +         throw runtime_error(
5179 +             "getnetworksolps ( blocks height )\n"
5180 +             "\nReturns the estimated network solutions per second based on the last n blocks.\n"
5181 +             "Pass in [blocks] to override # of blocks, -1 specifies over difficulty averaging window.\n"
5182 +             "Pass in [height] to estimate the network speed at the time when a certain block was found.\n"
5183 +             "\nArguments:\n"
5184 +             "1. blocks     (numeric, optional, default=120) The number of blocks, or -1 for blocks over difficulty averaging window.\n"
5185 +             "2. height     (numeric, optional, default=-1) To estimate at the time of the given height.\n"
5186 +             "\nResult:\n"
5187 +             "x             (numeric) Solutions per second estimated\n"
5188 +             "\nExamples:\n"
5189 +             + HelpExampleCli("getnetworksolps", "")
5190 +             + HelpExampleRpc("getnetworksolps", "")
5191 +        );
5192
5193 +     LOCK(cs_main);
5194 +     return GetNetworkHashPS(params.size() > 0 ? params[0].get_int() : 120, params.size() > 1 ? params[1].get_int() : -1);
5195 + }
5196
5197   Value getnetworkhashps(const Array& params, bool fHelp)
5198   {
5199       if (fHelp || params.size() > 2)
5200           throw runtime_error(
5201               "getnetworkhashps ( blocks height )\n"
5202 !             "\nDEPRECATED - left for backwards-compatibility. Use getnetworksolps instead.\n"
5203 !             "\nReturns the estimated network solutions per second based on the last n blocks.\n"
5204               "Pass in [blocks] to override # of blocks, -1 specifies over difficulty averaging window.\n"
5205               "Pass in [height] to estimate the network speed at the time when a certain block was found.\n"
5206               "\nArguments:\n"
5207               "1. blocks     (numeric, optional, default=120) The number of blocks, or -1 for blocks over difficulty averaging window.\n"
5208               "2. height     (numeric, optional, default=-1) To estimate at the time of the given height.\n"
5209               "\nResult:\n"
5210 !             "x             (numeric) Solutions per second estimated\n"
5211               "\nExamples:\n"
5212               + HelpExampleCli("getnetworkhashps", "")
5213               + HelpExampleRpc("getnetworkhashps", "")
5214 ***************
5215 *** 209,215 ****
5216           CValidationState state;
5217           if (!ProcessNewBlock(chainActive.Tip()->nHeight+1,state, NULL, pblock, true, NULL))
5218               throw JSONRPCError(RPC_INTERNAL_ERROR, "ProcessNewBlock, block not accepted");
5219 -         minedBlocks.increment();
5220           ++nHeight;
5221           blockHashes.push_back(pblock->GetHash().GetHex());
5222       }
5223 --- 250,255 ----
5224 ***************
5225 *** 280,285 ****
5226 --- 320,327 ----
5227               "  \"errors\": \"...\"          (string) Current errors\n"
5228               "  \"generate\": true|false     (boolean) If the generation is on or off (see getgenerate or setgenerate calls)\n"
5229               "  \"genproclimit\": n          (numeric) The processor limit for generation. -1 if no generation. (see getgenerate or setgenerate calls)\n"
5230 +             "  \"localsolps\": xxx.xxxxx    (numeric) The average local solution rate in Sol/s since this node was started\n"
5231 +             "  \"networksolps\": x          (numeric) The estimated network solution rate in Sol/s\n"
5232               "  \"pooledtx\": n              (numeric) The size of the mem pool\n"
5233               "  \"testnet\": true|false      (boolean) If using testnet or not\n"
5234               "  \"chain\": \"xxxx\",         (string) current network name as defined in BIP70 (main, test, regtest)\n"
5235 ***************
5236 *** 299,305 ****
5237       obj.push_back(Pair("difficulty",       (double)GetNetworkDifficulty()));
5238       obj.push_back(Pair("errors",           GetWarnings("statusbar")));
5239       obj.push_back(Pair("genproclimit",     (int)GetArg("-genproclimit", -1)));
5240 !     obj.push_back(Pair("networkhashps",    getnetworkhashps(params, false)));
5241       obj.push_back(Pair("pooledtx",         (uint64_t)mempool.size()));
5242       obj.push_back(Pair("testnet",          Params().TestnetToBeDeprecatedFieldRPC()));
5243       obj.push_back(Pair("chain",            Params().NetworkIDString()));
5244 --- 341,349 ----
5245       obj.push_back(Pair("difficulty",       (double)GetNetworkDifficulty()));
5246       obj.push_back(Pair("errors",           GetWarnings("statusbar")));
5247       obj.push_back(Pair("genproclimit",     (int)GetArg("-genproclimit", -1)));
5248 !     obj.push_back(Pair("localsolps"  ,     getlocalsolps(params, false)));
5249 !     obj.push_back(Pair("networksolps",     getnetworksolps(params, false)));
5250 !     obj.push_back(Pair("networkhashps",    getnetworksolps(params, false)));
5251       obj.push_back(Pair("pooledtx",         (uint64_t)mempool.size()));
5252       obj.push_back(Pair("testnet",          Params().TestnetToBeDeprecatedFieldRPC()));
5253       obj.push_back(Pair("chain",            Params().NetworkIDString()));
5254 ***************
5255 *** 483,492 ****
5256           throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid mode");
5257   
5258       if (vNodes.empty())
5259 !         throw JSONRPCError(RPC_CLIENT_NOT_CONNECTED, "Bitcoin is not connected!");
5260   
5261       if (IsInitialBlockDownload())
5262 !         throw JSONRPCError(RPC_CLIENT_IN_INITIAL_DOWNLOAD, "Bitcoin is downloading blocks...");
5263   
5264       static unsigned int nTransactionsUpdatedLast;
5265   
5266 --- 527,536 ----
5267           throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid mode");
5268   
5269       if (vNodes.empty())
5270 !         throw JSONRPCError(RPC_CLIENT_NOT_CONNECTED, "Zcash is not connected!");
5271   
5272       if (IsInitialBlockDownload())
5273 !         throw JSONRPCError(RPC_CLIENT_IN_INITIAL_DOWNLOAD, "Zcash is downloading blocks...");
5274   
5275       static unsigned int nTransactionsUpdatedLast;
5276   
5277 diff -crB ./src/rpcmisc.cpp ../../komodo-jl777/src/rpcmisc.cpp
5278 *** ./src/rpcmisc.cpp   2017-01-03 10:40:50.343335845 +0000
5279 --- ../../komodo-jl777/src/rpcmisc.cpp  2017-01-03 09:49:08.864506767 +0000
5280 ***************
5281 *** 23,28 ****
5282 --- 23,30 ----
5283   #include "json/json_spirit_utils.h"
5284   #include "json/json_spirit_value.h"
5285   
5286 + #include "zcash/Address.hpp"
5287
5288   using namespace json_spirit;
5289   using namespace std;
5290   
5291 ***************
5292 *** 236,241 ****
5293 --- 238,306 ----
5294       return ret;
5295   }
5296   
5297
5298 + Value z_validateaddress(const Array& params, bool fHelp)
5299 + {
5300 +     if (fHelp || params.size() != 1)
5301 +         throw runtime_error(
5302 +             "z_validateaddress \"zaddr\"\n"
5303 +             "\nReturn information about the given z address.\n"
5304 +             "\nArguments:\n"
5305 +             "1. \"zaddr\"     (string, required) The z address to validate\n"
5306 +             "\nResult:\n"
5307 +             "{\n"
5308 +             "  \"isvalid\" : true|false,      (boolean) If the address is valid or not. If not, this is the only property returned.\n"
5309 +             "  \"address\" : \"zaddr\",         (string) The z address validated\n"
5310 +             "  \"ismine\" : true|false,       (boolean) If the address is yours or not\n"
5311 +             "  \"payingkey\" : \"hex\",         (string) The hex value of the paying key, a_pk\n"
5312 +             "  \"transmissionkey\" : \"hex\",   (string) The hex value of the transmission key, pk_enc\n"
5313
5314 +             "}\n"
5315 +             "\nExamples:\n"
5316 +             + HelpExampleCli("validateaddress", "\"zcWsmqT4X2V4jgxbgiCzyrAfRT1vi1F4sn7M5Pkh66izzw8Uk7LBGAH3DtcSMJeUb2pi3W4SQF8LMKkU2cUuVP68yAGcomL\"")
5317 +         );
5318
5319
5320 + #ifdef ENABLE_WALLET
5321 +     LOCK2(cs_main, pwalletMain->cs_wallet);
5322 + #else
5323 +     LOCK(cs_main);
5324 + #endif
5325
5326 +     bool isValid = false;
5327 +     bool isMine = false;
5328 +     std::string payingKey, transmissionKey;
5329
5330 +     string strAddress = params[0].get_str();
5331 +     try {
5332 +         CZCPaymentAddress address(strAddress);
5333 +         libzcash::PaymentAddress addr = address.Get();
5334
5335 + #ifdef ENABLE_WALLET
5336 +         isMine = pwalletMain->HaveSpendingKey(addr);
5337 + #endif
5338 +         payingKey = addr.a_pk.GetHex();
5339 +         transmissionKey = addr.pk_enc.GetHex();
5340 +         isValid = true;
5341 +     } catch (std::runtime_error e) {
5342 +         // address is invalid, nop here as isValid is false.
5343 +     }
5344
5345 +     Object ret;
5346 +     ret.push_back(Pair("isvalid", isValid));
5347 +     if (isValid)
5348 +     {
5349 +         ret.push_back(Pair("address", strAddress));
5350 +         ret.push_back(Pair("payingkey", payingKey));
5351 +         ret.push_back(Pair("transmissionkey", transmissionKey));
5352 + #ifdef ENABLE_WALLET
5353 +         ret.push_back(Pair("ismine", isMine));
5354 + #endif
5355 +     }
5356 +     return ret;
5357 + }
5358
5359
5360   /**
5361    * Used by addmultisigaddress / createmultisig:
5362    */
5363 diff -crB ./src/rpcprotocol.cpp ../../komodo-jl777/src/rpcprotocol.cpp
5364 *** ./src/rpcprotocol.cpp       2017-01-03 10:40:50.343335845 +0000
5365 --- ../../komodo-jl777/src/rpcprotocol.cpp      2017-01-03 09:49:08.864506767 +0000
5366 ***************
5367 *** 33,39 ****
5368   
5369   /**
5370    * HTTP protocol
5371 !  * 
5372    * This ain't Apache.  We're just using HTTP header for the length field
5373    * and to be compatible with other JSON-RPC implementations.
5374    */
5375 --- 33,39 ----
5376   
5377   /**
5378    * HTTP protocol
5379 !  *
5380    * This ain't Apache.  We're just using HTTP header for the length field
5381    * and to be compatible with other JSON-RPC implementations.
5382    */
5383 ***************
5384 *** 42,48 ****
5385   {
5386       ostringstream s;
5387       s << "POST / HTTP/1.1\r\n"
5388 !       << "User-Agent: bitcoin-json-rpc/" << FormatFullVersion() << "\r\n"
5389         << "Host: 127.0.0.1\r\n"
5390         << "Content-Type: application/json\r\n"
5391         << "Content-Length: " << strMsg.size() << "\r\n"
5392 --- 42,48 ----
5393   {
5394       ostringstream s;
5395       s << "POST / HTTP/1.1\r\n"
5396 !       << "User-Agent: zcash-json-rpc/" << FormatFullVersion() << "\r\n"
5397         << "Host: 127.0.0.1\r\n"
5398         << "Content-Type: application/json\r\n"
5399         << "Content-Length: " << strMsg.size() << "\r\n"
5400 ***************
5401 *** 77,83 ****
5402       if (nStatus == HTTP_UNAUTHORIZED)
5403           return strprintf("HTTP/1.0 401 Authorization Required\r\n"
5404               "Date: %s\r\n"
5405 !             "Server: bitcoin-json-rpc/%s\r\n"
5406               "WWW-Authenticate: Basic realm=\"jsonrpc\"\r\n"
5407               "Content-Type: text/html\r\n"
5408               "Content-Length: 296\r\n"
5409 --- 77,83 ----
5410       if (nStatus == HTTP_UNAUTHORIZED)
5411           return strprintf("HTTP/1.0 401 Authorization Required\r\n"
5412               "Date: %s\r\n"
5413 !             "Server: zcash-json-rpc/%s\r\n"
5414               "WWW-Authenticate: Basic realm=\"jsonrpc\"\r\n"
5415               "Content-Type: text/html\r\n"
5416               "Content-Length: 296\r\n"
5417 ***************
5418 *** 104,110 ****
5419               "Connection: %s\r\n"
5420               "Content-Length: %u\r\n"
5421               "Content-Type: %s\r\n"
5422 !             "Server: bitcoin-json-rpc/%s\r\n"
5423               "\r\n",
5424           nStatus,
5425           httpStatusDescription(nStatus),
5426 --- 104,110 ----
5427               "Connection: %s\r\n"
5428               "Content-Length: %u\r\n"
5429               "Content-Type: %s\r\n"
5430 !             "Server: zcash-json-rpc/%s\r\n"
5431               "\r\n",
5432           nStatus,
5433           httpStatusDescription(nStatus),
5434 ***************
5435 *** 248,254 ****
5436    * JSON-RPC protocol.  Bitcoin speaks version 1.0 for maximum compatibility,
5437    * but uses JSON-RPC 1.1/2.0 standards for parts of the 1.0 standard that were
5438    * unspecified (HTTP errors and contents of 'error').
5439 !  * 
5440    * 1.0 spec: http://json-rpc.org/wiki/specification
5441    * 1.2 spec: http://jsonrpc.org/historical/json-rpc-over-http.html
5442    * http://www.codeproject.com/KB/recipes/JSON_Spirit.aspx
5443 --- 248,254 ----
5444    * JSON-RPC protocol.  Bitcoin speaks version 1.0 for maximum compatibility,
5445    * but uses JSON-RPC 1.1/2.0 standards for parts of the 1.0 standard that were
5446    * unspecified (HTTP errors and contents of 'error').
5447 !  *
5448    * 1.0 spec: http://json-rpc.org/wiki/specification
5449    * 1.2 spec: http://jsonrpc.org/historical/json-rpc-over-http.html
5450    * http://www.codeproject.com/KB/recipes/JSON_Spirit.aspx
5451 diff -crB ./src/rpcserver.cpp ../../komodo-jl777/src/rpcserver.cpp
5452 *** ./src/rpcserver.cpp 2017-01-03 10:40:50.343335845 +0000
5453 --- ../../komodo-jl777/src/rpcserver.cpp        2017-01-03 09:49:08.864506767 +0000
5454 ***************
5455 *** 309,314 ****
5456 --- 309,316 ----
5457       /* Mining */
5458       { "mining",             "getblocktemplate",       &getblocktemplate,       true  },
5459       { "mining",             "getmininginfo",          &getmininginfo,          true  },
5460 +     { "mining",             "getlocalsolps",          &getlocalsolps,          true  },
5461 +     { "mining",             "getnetworksolps",        &getnetworksolps,        true  },
5462       { "mining",             "getnetworkhashps",       &getnetworkhashps,       true  },
5463       { "mining",             "prioritisetransaction",  &prioritisetransaction,  true  },
5464       { "mining",             "submitblock",            &submitblock,            true  },
5465 ***************
5466 *** 335,340 ****
5467 --- 337,343 ----
5468       { "util",               "verifymessage",          &verifymessage,          true  },
5469       { "util",               "estimatefee",            &estimatefee,            true  },
5470       { "util",               "estimatepriority",       &estimatepriority,       true  },
5471 +     { "util",               "z_validateaddress",      &z_validateaddress,      true  }, /* uses wallet if enabled */
5472   
5473       /* Not shown in help */
5474       { "hidden",             "invalidateblock",        &invalidateblock,        true  },
5475 ***************
5476 *** 1034,1042 ****
5477 --- 1037,1051 ----
5478           // Read HTTP message headers and body
5479           ReadHTTPMessage(conn->stream(), mapHeaders, strRequest, nProto, MAX_SIZE);
5480   
5481 +         // TODO #1856: Re-enable support for persistent connections.
5482 +         // We have disabled support for HTTP Keep-Alive until resolution of #1680, upstream rpc deadlock.
5483 +         // Close connection immediately.
5484 +         fRun = false;
5485 +         /*
5486           // HTTP Keep-Alive is false; close connection immediately
5487           if ((mapHeaders["connection"] == "close") || (!GetBoolArg("-rpckeepalive", true)))
5488               fRun = false;
5489 +         */
5490   
5491           // Process via JSON-RPC API
5492           if (strURI == "/") {
5493 diff -crB ./src/rpcserver.h ../../komodo-jl777/src/rpcserver.h
5494 *** ./src/rpcserver.h   2017-01-03 10:40:50.343335845 +0000
5495 --- ../../komodo-jl777/src/rpcserver.h  2017-01-03 09:49:08.864506767 +0000
5496 ***************
5497 *** 169,174 ****
5498 --- 169,176 ----
5499   extern json_spirit::Value getgenerate(const json_spirit::Array& params, bool fHelp); // in rpcmining.cpp
5500   extern json_spirit::Value setgenerate(const json_spirit::Array& params, bool fHelp);
5501   extern json_spirit::Value generate(const json_spirit::Array& params, bool fHelp);
5502 + extern json_spirit::Value getlocalsolps(const json_spirit::Array& params, bool fHelp);
5503 + extern json_spirit::Value getnetworksolps(const json_spirit::Array& params, bool fHelp);
5504   extern json_spirit::Value getnetworkhashps(const json_spirit::Array& params, bool fHelp);
5505   extern json_spirit::Value getmininginfo(const json_spirit::Array& params, bool fHelp);
5506   extern json_spirit::Value prioritisetransaction(const json_spirit::Array& params, bool fHelp);
5507 ***************
5508 *** 270,275 ****
5509 --- 272,278 ----
5510   extern json_spirit::Value z_getoperationstatus(const json_spirit::Array& params, bool fHelp); // in rpcwallet.cpp
5511   extern json_spirit::Value z_getoperationresult(const json_spirit::Array& params, bool fHelp); // in rpcwallet.cpp
5512   extern json_spirit::Value z_listoperationids(const json_spirit::Array& params, bool fHelp); // in rpcwallet.cpp
5513 + extern json_spirit::Value z_validateaddress(const json_spirit::Array& params, bool fHelp); // in rpcmisc.cpp
5514   
5515   
5516   // in rest.cpp
5517 diff -crB ./src/test/coins_tests.cpp ../../komodo-jl777/src/test/coins_tests.cpp
5518 *** ./src/test/coins_tests.cpp  2017-01-03 10:40:50.375337465 +0000
5519 --- ../../komodo-jl777/src/test/coins_tests.cpp 2017-01-03 09:49:08.868506976 +0000
5520 ***************
5521 *** 166,171 ****
5522 --- 166,414 ----
5523   
5524   BOOST_FIXTURE_TEST_SUITE(coins_tests, BasicTestingSetup)
5525   
5526 + BOOST_AUTO_TEST_CASE(nullifier_regression_test)
5527 + {
5528 +     // Correct behavior:
5529 +     {
5530 +         CCoinsViewTest base;
5531 +         CCoinsViewCacheTest cache1(&base);
5532
5533 +         // Insert a nullifier into the base.
5534 +         uint256 nf = GetRandHash();
5535 +         cache1.SetNullifier(nf, true);
5536 +         cache1.Flush(); // Flush to base.
5537
5538 +         // Remove the nullifier from cache
5539 +         cache1.SetNullifier(nf, false);
5540
5541 +         // The nullifier now should be `false`.
5542 +         BOOST_CHECK(!cache1.GetNullifier(nf));
5543 +     }
5544
5545 +     // Also correct behavior:
5546 +     {
5547 +         CCoinsViewTest base;
5548 +         CCoinsViewCacheTest cache1(&base);
5549
5550 +         // Insert a nullifier into the base.
5551 +         uint256 nf = GetRandHash();
5552 +         cache1.SetNullifier(nf, true);
5553 +         cache1.Flush(); // Flush to base.
5554
5555 +         // Remove the nullifier from cache
5556 +         cache1.SetNullifier(nf, false);
5557 +         cache1.Flush(); // Flush to base.
5558
5559 +         // The nullifier now should be `false`.
5560 +         BOOST_CHECK(!cache1.GetNullifier(nf));
5561 +     }
5562
5563 +     // Works because we bring it from the parent cache:
5564 +     {
5565 +         CCoinsViewTest base;
5566 +         CCoinsViewCacheTest cache1(&base);
5567
5568 +         // Insert a nullifier into the base.
5569 +         uint256 nf = GetRandHash();
5570 +         cache1.SetNullifier(nf, true);
5571 +         cache1.Flush(); // Empties cache.
5572
5573 +         // Create cache on top.
5574 +         {
5575 +             // Remove the nullifier.
5576 +             CCoinsViewCacheTest cache2(&cache1);
5577 +             BOOST_CHECK(cache2.GetNullifier(nf));
5578 +             cache2.SetNullifier(nf, false);
5579 +             cache2.Flush(); // Empties cache, flushes to cache1.
5580 +         }
5581
5582 +         // The nullifier now should be `false`.
5583 +         BOOST_CHECK(!cache1.GetNullifier(nf));
5584 +     }
5585
5586 +     // Was broken:
5587 +     {
5588 +         CCoinsViewTest base;
5589 +         CCoinsViewCacheTest cache1(&base);
5590
5591 +         // Insert a nullifier into the base.
5592 +         uint256 nf = GetRandHash();
5593 +         cache1.SetNullifier(nf, true);
5594 +         cache1.Flush(); // Empties cache.
5595
5596 +         // Create cache on top.
5597 +         {
5598 +             // Remove the nullifier.
5599 +             CCoinsViewCacheTest cache2(&cache1);
5600 +             cache2.SetNullifier(nf, false);
5601 +             cache2.Flush(); // Empties cache, flushes to cache1.
5602 +         }
5603
5604 +         // The nullifier now should be `false`.
5605 +         BOOST_CHECK(!cache1.GetNullifier(nf));
5606 +     }
5607 + }
5608
5609 + BOOST_AUTO_TEST_CASE(anchor_pop_regression_test)
5610 + {
5611 +     // Correct behavior:
5612 +     {
5613 +         CCoinsViewTest base;
5614 +         CCoinsViewCacheTest cache1(&base);
5615
5616 +         // Create dummy anchor/commitment
5617 +         ZCIncrementalMerkleTree tree;
5618 +         uint256 cm = GetRandHash();
5619 +         tree.append(cm);
5620
5621 +         // Add the anchor
5622 +         cache1.PushAnchor(tree);
5623 +         cache1.Flush();
5624
5625 +         // Remove the anchor
5626 +         cache1.PopAnchor(ZCIncrementalMerkleTree::empty_root());
5627 +         cache1.Flush();
5628
5629 +         // Add the anchor back
5630 +         cache1.PushAnchor(tree);
5631 +         cache1.Flush();
5632
5633 +         // The base contains the anchor, of course!
5634 +         {
5635 +             ZCIncrementalMerkleTree checktree;
5636 +             BOOST_CHECK(cache1.GetAnchorAt(tree.root(), checktree));
5637 +             BOOST_CHECK(checktree.root() == tree.root());
5638 +         }
5639 +     }
5640
5641 +     // Previously incorrect behavior
5642 +     {
5643 +         CCoinsViewTest base;
5644 +         CCoinsViewCacheTest cache1(&base);
5645
5646 +         // Create dummy anchor/commitment
5647 +         ZCIncrementalMerkleTree tree;
5648 +         uint256 cm = GetRandHash();
5649 +         tree.append(cm);
5650
5651 +         // Add the anchor and flush to disk
5652 +         cache1.PushAnchor(tree);
5653 +         cache1.Flush();
5654
5655 +         // Remove the anchor, but don't flush yet!
5656 +         cache1.PopAnchor(ZCIncrementalMerkleTree::empty_root());
5657
5658 +         {
5659 +             CCoinsViewCacheTest cache2(&cache1); // Build cache on top
5660 +             cache2.PushAnchor(tree); // Put the same anchor back!
5661 +             cache2.Flush(); // Flush to cache1
5662 +         }
5663
5664 +         // cache2's flush kinda worked, i.e. cache1 thinks the
5665 +         // tree is there, but it didn't bring down the correct
5666 +         // treestate...
5667 +         {
5668 +             ZCIncrementalMerkleTree checktree;
5669 +             BOOST_CHECK(cache1.GetAnchorAt(tree.root(), checktree));
5670 +             BOOST_CHECK(checktree.root() == tree.root()); // Oh, shucks.
5671 +         }
5672
5673 +         // Flushing cache won't help either, just makes the inconsistency
5674 +         // permanent.
5675 +         cache1.Flush();
5676 +         {
5677 +             ZCIncrementalMerkleTree checktree;
5678 +             BOOST_CHECK(cache1.GetAnchorAt(tree.root(), checktree));
5679 +             BOOST_CHECK(checktree.root() == tree.root()); // Oh, shucks.
5680 +         }
5681 +     }
5682 + }
5683
5684 + BOOST_AUTO_TEST_CASE(anchor_regression_test)
5685 + {
5686 +     // Correct behavior:
5687 +     {
5688 +         CCoinsViewTest base;
5689 +         CCoinsViewCacheTest cache1(&base);
5690
5691 +         // Insert anchor into base.
5692 +         ZCIncrementalMerkleTree tree;
5693 +         uint256 cm = GetRandHash();
5694 +         tree.append(cm);
5695 +         cache1.PushAnchor(tree);
5696 +         cache1.Flush();
5697
5698 +         cache1.PopAnchor(ZCIncrementalMerkleTree::empty_root());
5699 +         BOOST_CHECK(cache1.GetBestAnchor() == ZCIncrementalMerkleTree::empty_root());
5700 +         BOOST_CHECK(!cache1.GetAnchorAt(tree.root(), tree));
5701 +     }
5702
5703 +     // Also correct behavior:
5704 +     {
5705 +         CCoinsViewTest base;
5706 +         CCoinsViewCacheTest cache1(&base);
5707
5708 +         // Insert anchor into base.
5709 +         ZCIncrementalMerkleTree tree;
5710 +         uint256 cm = GetRandHash();
5711 +         tree.append(cm);
5712 +         cache1.PushAnchor(tree);
5713 +         cache1.Flush();
5714
5715 +         cache1.PopAnchor(ZCIncrementalMerkleTree::empty_root());
5716 +         cache1.Flush();
5717 +         BOOST_CHECK(cache1.GetBestAnchor() == ZCIncrementalMerkleTree::empty_root());
5718 +         BOOST_CHECK(!cache1.GetAnchorAt(tree.root(), tree));
5719 +     }
5720
5721 +     // Works because we bring the anchor in from parent cache.
5722 +     {
5723 +         CCoinsViewTest base;
5724 +         CCoinsViewCacheTest cache1(&base);
5725
5726 +         // Insert anchor into base.
5727 +         ZCIncrementalMerkleTree tree;
5728 +         uint256 cm = GetRandHash();
5729 +         tree.append(cm);
5730 +         cache1.PushAnchor(tree);
5731 +         cache1.Flush();
5732
5733 +         {
5734 +             // Pop anchor.
5735 +             CCoinsViewCacheTest cache2(&cache1);
5736 +             BOOST_CHECK(cache2.GetAnchorAt(tree.root(), tree));
5737 +             cache2.PopAnchor(ZCIncrementalMerkleTree::empty_root());
5738 +             cache2.Flush();
5739 +         }
5740
5741 +         BOOST_CHECK(cache1.GetBestAnchor() == ZCIncrementalMerkleTree::empty_root());
5742 +         BOOST_CHECK(!cache1.GetAnchorAt(tree.root(), tree));
5743 +     }
5744
5745 +     // Was broken:
5746 +     {
5747 +         CCoinsViewTest base;
5748 +         CCoinsViewCacheTest cache1(&base);
5749
5750 +         // Insert anchor into base.
5751 +         ZCIncrementalMerkleTree tree;
5752 +         uint256 cm = GetRandHash();
5753 +         tree.append(cm);
5754 +         cache1.PushAnchor(tree);
5755 +         cache1.Flush();
5756
5757 +         {
5758 +             // Pop anchor.
5759 +             CCoinsViewCacheTest cache2(&cache1);
5760 +             cache2.PopAnchor(ZCIncrementalMerkleTree::empty_root());
5761 +             cache2.Flush();
5762 +         }
5763
5764 +         BOOST_CHECK(cache1.GetBestAnchor() == ZCIncrementalMerkleTree::empty_root());
5765 +         BOOST_CHECK(!cache1.GetAnchorAt(tree.root(), tree));
5766 +     }
5767 + }
5768
5769   BOOST_AUTO_TEST_CASE(nullifiers_test)
5770   {
5771       CCoinsViewTest base;
5772 Only in ../../komodo-jl777/src/test/data: merkle_commitments.json
5773 diff -crB ./src/test/data/merkle_path.json ../../komodo-jl777/src/test/data/merkle_path.json
5774 *** ./src/test/data/merkle_path.json    2017-01-03 10:40:50.395338477 +0000
5775 --- ../../komodo-jl777/src/test/data/merkle_path.json   2017-01-03 09:49:08.872507185 +0000
5776 ***************
5777 *** 1,123 ****
5778   [
5779 !     "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101010001010001000001000100010100010000010100000001000101010101000000000100010101010001010100000101000101000100000001010001000001000101000000010000000101000001010001000100010101010000010100000100010101000101010100000101010101010001010101010001010000010001000100000001010000010101000001000101010001000100000100000100000001010100000000000001010001000001000001010000000100000100000000010101000101010001000101010101010100010101010100000101010100010001000000000101000000000001010001010101000100010000010101000101000000fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
5780 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000100000000000100010001000001010101000000000000000101010001010000000001000000010101010001010001010101010001010001000001000000010000010001000000010101000001000100010100010101010100000001000100000001010001010001000000000100010101000000000100000100010001010101010001000100000001010001010001000100010101010100010000010101010000010001010100000101010100010100000001010101010101000101000001010001000000000100000001010001010101000101000100000001010100010100010101000100010001010001010101010000000001000001000000010000000001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
5781 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000100000000000100010001000001010101000000000000000101010001010000000001000000010101010001010001010101010001010001000001000000010000010001000000010101000001000100010100010101010100000001000100000001010001010001000000000100010101000000000100000100010001010101010001000100000001010001010001000100010101010100010000010101010000010001010100000101010100010100000001010101010101000101000001010001000000000100000001010001010101000101000100000001010100010100010101000100010001010001010101010000000001000001000000010000000001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
5782 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
5783 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
5784 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
5785 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000001000101000101010100000000000001000000000001000100000000010000010001000100010000000100010101010000000000010001010001000001010001010100000001000001010101010100000001010000000000000000000101000000010100000000000001010100010001010100010101000000010000010001010000000001000100000101000100010100000001000001000001000100010000000001000001010000010101000100010000000001010100010101010000010001000000010000000100010100010100010100010100000101010001010101010000010000000100000001000101010000010001000001010000000001fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
5786 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000001000101000101010100000000000001000000000001000100000000010000010001000100010000000100010101010000000000010001010001000001010001010100000001000001010101010100000001010000000000000000000101000000010100000000000001010100010001010100010101000000010000010001010000000001000100000101000100010100000001000001000001000100010000000001000001010000010101000100010000000001010100010101010000010001000000010000000100010100010100010100010100000101010001010101010000010000000100000001000101010000010001000001010000000001fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
5787 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000001000101000101010100000000000001000000000001000100000000010000010001000100010000000100010101010000000000010001010001000001010001010100000001000001010101010100000001010000000000000000000101000000010100000000000001010100010001010100010101000000010000010001010000000001000100000101000100010100000001000001000001000100010000000001000001010000010101000100010000000001010100010101010000010001000000010000000100010100010100010100010100000101010001010101010000010000000100000001000101010000010001000001010000000001fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
5788 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000001000101000101010100000000000001000000000001000100000000010000010001000100010000000100010101010000000000010001010001000001010001010100000001000001010101010100000001010000000000000000000101000000010100000000000001010100010001010100010101000000010000010001010000000001000100000101000100010100000001000001000001000100010000000001000001010000010101000100010000000001010100010101010000010001000000010000000100010100010100010100010100000101010001010101010000010000000100000001000101010000010001000001010000000001fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
5789 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010000010000010100010101000100010000000001010100000001000100010000010100000000010100000000010000010100000001000100010000000000010001000100000101000101000101010101000001000100000101000000000101000101000101000101000001010101010001010000000101000001000101010000010001010001000000000001000001000100000000010001010100000101000000010001010000000100010000000001000001010001000001000100010001010000010101010001010101010000000100010100010001000000000001000000010101000001010001000001000001010100000101010000010101fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
5790 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010000010000010100010101000100010000000001010100000001000100010000010100000000010100000000010000010100000001000100010000000000010001000100000101000101000101010101000001000100000101000000000101000101000101000101000001010101010001010000000101000001000101010000010001010001000000000001000001000100000000010001010100000101000000010001010000000100010000000001000001010001000001000100010001010000010101010001010101010000000100010100010001000000000001000000010101000001010001000001000001010100000101010000010101fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
5791 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010000010000010100010101000100010000000001010100000001000100010000010100000000010100000000010000010100000001000100010000000000010001000100000101000101000101010101000001000100000101000000000101000101000101000101000001010101010001010000000101000001000101010000010001010001000000000001000001000100000000010001010100000101000000010001010000000100010000000001000001010001000001000100010001010000010101010001010101010000000100010100010001000000000001000000010101000001010001000001000001010100000101010000010101fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
5792 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010000010000010100010101000100010000000001010100000001000100010000010100000000010100000000010000010100000001000100010000000000010001000100000101000101000101010101000001000100000101000000000101000101000101000101000001010101010001010000000101000001000101010000010001010001000000000001000001000100000000010001010100000101000000010001010000000100010000000001000001010001000001000100010001010000010101010001010101010000000100010100010001000000000001000000010101000001010001000001000001010100000101010000010101fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
5793 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101010001010001000001000100010100010000010100000001000101010101000000000100010101010001010100000101000101000100000001010001000001000101000000010000000101000001010001000100010101010000010100000100010101000101010100000101010101010001010101010001010000010001000100000001010000010101000001000101010001000100000100000100000001010100000000000001010001000001000001010000000100000100000000010101000101010001000101010101010100010101010100000101010100010001000000000101000000000001010001010101000100010000010101000101000000fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
5794 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100010101010001010000010001000000010100000001010100000000010001000000000101010101000001000100010100010000010001010001010101010000010101000101010100010001000000010100000001010100010001000000000100000101010001000000000100010100000001010000010001000000000000010101000000010101010001000101010101010100010100000000010100010101000101000100010101000000010101000000010101000001000001000101010000000101010000000000000001010101010001010001010100010000000001010100000101000000000101010001010100000101000101010000010000000100fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
5795 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100010101010001010000010001000000010100000001010100000000010001000000000101010101000001000100010100010000010001010001010101010000010101000101010100010001000000010100000001010100010001000000000100000101010001000000000100010100000001010000010001000000000000010101000000010101010001000101010101010100010100000000010100010101000101000100010101000000010101000000010101000001000001000101010000000101010000000000000001010101010001010001010100010000000001010100000101000000000101010001010100000101000101010000010000000100fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
5796 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100010101010001010000010001000000010100000001010100000000010001000000000101010101000001000100010100010000010001010001010101010000010101000101010100010001000000010100000001010100010001000000000100000101010001000000000100010100000001010000010001000000000000010101000000010101010001000101010101010100010100000000010100010101000101000100010101000000010101000000010101000001000001000101010000000101010000000000000001010101010001010001010100010000000001010100000101000000000101010001010100000101000101010000010000000100fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
5797 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100010101010001010000010001000000010100000001010100000000010001000000000101010101000001000100010100010000010001010001010101010000010101000101010100010001000000010100000001010100010001000000000100000101010001000000000100010100000001010000010001000000000000010101000000010101010001000101010101010100010100000000010100010101000101000100010101000000010101000000010101000001000001000101010000000101010000000000000001010101010001010001010100010000000001010100000101000000000101010001010100000101000101010000010000000100fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
5798 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000100000000000100010001000001010101000000000000000101010001010000000001000000010101010001010001010101010001010001000001000000010000010001000000010101000001000100010100010101010100000001000100000001010001010001000000000100010101000000000100000100010001010101010001000100000001010001010001000100010101010100010000010101010000010001010100000101010100010100000001010101010101000101000001010001000000000100000001010001010101000101000100000001010100010100010101000100010001010001010101010000000001000001000000010000000001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
5799 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000100000000000100010001000001010101000000000000000101010001010000000001000000010101010001010001010101010001010001000001000000010000010001000000010101000001000100010100010101010100000001000100000001010001010001000000000100010101000000000100000100010001010101010001000100000001010001010001000100010101010100010000010101010000010001010100000101010100010100000001010101010101000101000001010001000000000100000001010001010101000101000100000001010100010100010101000100010001010001010101010000000001000001000000010000000001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010001",
5800 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
5801 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
5802 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
5803 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
5804 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
5805 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010001",
5806 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010100",
5807 !       "04fd000101010001000100000000010100010000000100000000000100010000010001010000010001010101000000010001010000010101010100010100010101000100000100010101000101000101010100000000010101000101010000010001000000000101010000010001010000000000010001000100000001000100010101010100000001010101010101010100000001000000000000000001000000000000000001000101000001000001010000010000000101000101000000010100000100000001010101000001010101000001000000010101000001000100000100010100010101000000010001000000000100000100000000010100000100000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
5808 !       "04fd000101010001000100000000010100010000000100000000000100010000010001010000010001010101000000010001010000010101010100010100010101000100000100010101000101000101010100000000010101000101010000010001000000000101010000010001010000000000010001000100000001000100010101010100000001010101010101010100000001000000000000000001000000000000000001000101000001000001010000010000000101000101000000010100000100000001010101000001010101000001000000010101000001000100000100010100010101000000010001000000000100000100000000010100000100000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
5809 !       "04fd000101010001000100000000010100010000000100000000000100010000010001010000010001010101000000010001010000010101010100010100010101000100000100010101000101000101010100000000010101000101010000010001000000000101010000010001010000000000010001000100000001000100010101010100000001010101010101010100000001000000000000000001000000000000000001000101000001000001010000010000000101000101000000010100000100000001010101000001010101000001000000010101000001000100000100010100010101000000010001000000000100000100000000010100000100000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
5810 !       "04fd000101010001000100000000010100010000000100000000000100010000010001010000010001010101000000010001010000010101010100010100010101000100000100010101000101000101010100000000010101000101010000010001000000000101010000010001010000000000010001000100000001000100010101010100000001010101010101010100000001000000000000000001000000000000000001000101000001000001010000010000000101000101000000010100000100000001010101000001010101000001000000010101000001000100000100010100010101000000010001000000000100000100000000010100000100000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
5811 !       "04fd000101010001000100000000010100010000000100000000000100010000010001010000010001010101000000010001010000010101010100010100010101000100000100010101000101000101010100000000010101000101010000010001000000000101010000010001010000000000010001000100000001000100010101010100000001010101010101010100000001000000000000000001000000000000000001000101000001000001010000010000000101000101000000010100000100000001010101000001010101000001000000010101000001000100000100010100010101000000010001000000000100000100000000010100000100000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
5812 !       "04fd000101010001000100000000010100010000000100000000000100010000010001010000010001010101000000010001010000010101010100010100010101000100000100010101000101000101010100000000010101000101010000010001000000000101010000010001010000000000010001000100000001000100010101010100000001010101010101010100000001000000000000000001000000000000000001000101000001000001010000010000000101000101000000010100000100000001010101000001010101000001000000010101000001000100000100010100010101000000010001000000000100000100000000010100000100000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010001",
5813 !       "04fd000101010001000100000000010100010000000100000000000100010000010001010000010001010101000000010001010000010101010100010100010101000100000100010101000101000101010100000000010101000101010000010001000000000101010000010001010000000000010001000100000001000100010101010100000001010101010101010100000001000000000000000001000000000000000001000101000001000001010000010000000101000101000000010100000100000001010101000001010101000001000000010101000001000100000100010100010101000000010001000000000100000100000000010100000100000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010100",
5814 !       "04fd000101010001000100000000010100010000000100000000000100010000010001010000010001010101000000010001010000010101010100010100010101000100000100010101000101000101010100000000010101000101010000010001000000000101010000010001010000000000010001000100000001000100010101010100000001010101010101010100000001000000000000000001000000000000000001000101000001000001010000010000000101000101000000010100000100000001010101000001010101000001000000010101000001000100000100010100010101000000010001000000000100000100000000010100000100000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010101",
5815 !       "04fd000101000101010001010100010100010001010101010100000101010000010101000001010001000100000000010101000101000101010001010001000101010001010001010000000100000101010000000000000101000001010001010101000001010000000000000101010101010001010101010000000000010000010000000000000001000101000001010100010100000001010001000000010000000000010101000101010000000001000000000100000000010101000101000001000000000100000000010100000001010101000100010101000001010001010101010001000000000000010001000000010101000100010000010000000001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
5816 !       "04fd000101000101010001010100010100010001010101010100000101010000010101000001010001000100000000010101000101000101010001010001000101010001010001010000000100000101010000000000000101000001010001010101000001010000000000000101010101010001010101010000000000010000010000000000000001000101000001010100010100000001010001000000010000000000010101000101010000000001000000000100000000010101000101000001000000000100000000010100000001010101000100010101000001010001010101010001000000000000010001000000010101000100010000010000000001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
5817 !       "04fd000101000101010001010100010100010001010101010100000101010000010101000001010001000100000000010101000101000101010001010001000101010001010001010000000100000101010000000000000101000001010001010101000001010000000000000101010101010001010101010000000000010000010000000000000001000101000001010100010100000001010001000000010000000000010101000101010000000001000000000100000000010101000101000001000000000100000000010100000001010101000100010101000001010001010101010001000000000000010001000000010101000100010000010000000001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
5818 !       "04fd000101000101010001010100010100010001010101010100000101010000010101000001010001000100000000010101000101000101010001010001000101010001010001010000000100000101010000000000000101000001010001010101000001010000000000000101010101010001010101010000000000010000010000000000000001000101000001010100010100000001010001000000010000000000010101000101010000000001000000000100000000010101000101000001000000000100000000010100000001010101000100010101000001010001010101010001000000000000010001000000010101000100010000010000000001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
5819 !       "04fd000101000101010001010100010100010001010101010100000101010000010101000001010001000100000000010101000101000101010001010001000101010001010001010000000100000101010000000000000101000001010001010101000001010000000000000101010101010001010101010000000000010000010000000000000001000101000001010100010100000001010001000000010000000000010101000101010000000001000000000100000000010101000101000001000000000100000000010100000001010101000100010101000001010001010101010001000000000000010001000000010101000100010000010000000001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
5820 !       "04fd000101000101010001010100010100010001010101010100000101010000010101000001010001000100000000010101000101000101010001010001000101010001010001010000000100000101010000000000000101000001010001010101000001010000000000000101010101010001010101010000000000010000010000000000000001000101000001010100010100000001010001000000010000000000010101000101010000000001000000000100000000010101000101000001000000000100000000010100000001010101000100010101000001010001010101010001000000000000010001000000010101000100010000010000000001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010001",
5821 !       "04fd000101000101010001010100010100010001010101010100000101010000010101000001010001000100000000010101000101000101010001010001000101010001010001010000000100000101010000000000000101000001010001010101000001010000000000000101010101010001010101010000000000010000010000000000000001000101000001010100010100000001010001000000010000000000010101000101010000000001000000000100000000010101000101000001000000000100000000010100000001010101000100010101000001010001010101010001000000000000010001000000010101000100010000010000000001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010100",
5822 !       "04fd000101000101010001010100010100010001010101010100000101010000010101000001010001000100000000010101000101000101010001010001000101010001010001010000000100000101010000000000000101000001010001010101000001010000000000000101010101010001010101010000000000010000010000000000000001000101000001010100010100000001010001000000010000000000010101000101010000000001000000000100000000010101000101000001000000000100000000010100000001010101000100010101000001010001010101010001000000000000010001000000010101000100010000010000000001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010101",
5823 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101010001010001000001000100010100010000010100000001000101010101000000000100010101010001010100000101000101000100000001010001000001000101000000010000000101000001010001000100010101010000010100000100010101000101010100000101010101010001010101010001010000010001000100000001010000010101000001000101010001000100000100000100000001010100000000000001010001000001000001010000000100000100000000010101000101010001000101010101010100010101010100000101010100010001000000000101000000000001010001010101000100010000010101000101000000fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000000",
5824 !       "04fd000100010100000101010000000000010101000000010001010100000001000100010000010101000101010000000101010001010101000000010000010000000100000101010101000100010001010001010001010101010001000000000001010000010000000001010000000000010001010001010000000100010101000101000001010001010101010100010100000101010000010101010000000000010001000000010100000101010101000100010100000001000101000001000101000101010000000100010100000100000101010000000100010000000100010001000101010001000000000001010001010100000000000100010100000000000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
5825 !       "04fd000100010100000101010000000000010101000000010001010100000001000100010000010101000101010000000101010001010101000000010000010000000100000101010101000100010001010001010001010101010001000000000001010000010000000001010000000000010001010001010000000100010101000101000001010001010101010100010100000101010000010101010000000000010001000000010100000101010101000100010100000001000101000001000101000101010000000100010100000100000101010000000100010000000100010001000101010001000000000001010001010100000000000100010100000000000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
5826 !       "04fd000100010100000101010000000000010101000000010001010100000001000100010000010101000101010000000101010001010101000000010000010000000100000101010101000100010001010001010001010101010001000000000001010000010000000001010000000000010001010001010000000100010101000101000001010001010101010100010100000101010000010101010000000000010001000000010100000101010101000100010100000001000101000001000101000101010000000100010100000100000101010000000100010000000100010001000101010001000000000001010001010100000000000100010100000000000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
5827 !       "04fd000100010100000101010000000000010101000000010001010100000001000100010000010101000101010000000101010001010101000000010000010000000100000101010101000100010001010001010001010101010001000000000001010000010000000001010000000000010001010001010000000100010101000101000001010001010101010100010100000101010000010101010000000000010001000000010100000101010101000100010100000001000101000001000101000101010000000100010100000100000101010000000100010000000100010001000101010001000000000001010001010100000000000100010100000000000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
5828 !       "04fd000100010100000101010000000000010101000000010001010100000001000100010000010101000101010000000101010001010101000000010000010000000100000101010101000100010001010001010001010101010001000000000001010000010000000001010000000000010001010001010000000100010101000101000001010001010101010100010100000101010000010101010000000000010001000000010100000101010101000100010100000001000101000001000101000101010000000100010100000100000101010000000100010000000100010001000101010001000000000001010001010100000000000100010100000000000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
5829 !       "04fd000100010100000101010000000000010101000000010001010100000001000100010000010101000101010000000101010001010101000000010000010000000100000101010101000100010001010001010001010101010001000000000001010000010000000001010000000000010001010001010000000100010101000101000001010001010101010100010100000101010000010101010000000000010001000000010100000101010101000100010100000001000101000001000101000101010000000100010100000100000101010000000100010000000100010001000101010001000000000001010001010100000000000100010100000000000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010001",
5830 !       "04fd000100010100000101010000000000010101000000010001010100000001000100010000010101000101010000000101010001010101000000010000010000000100000101010101000100010001010001010001010101010001000000000001010000010000000001010000000000010001010001010000000100010101000101000001010001010101010100010100000101010000010101010000000000010001000000010100000101010101000100010100000001000101000001000101000101010000000100010100000100000101010000000100010000000100010001000101010001000000000001010001010100000000000100010100000000000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010100",
5831 !       "04fd000100010100000101010000000000010101000000010001010100000001000100010000010101000101010000000101010001010101000000010000010000000100000101010101000100010001010001010001010101010001000000000001010000010000000001010000000000010001010001010000000100010101000101000001010001010101010100010100000101010000010101010000000000010001000000010100000101010101000100010100000001000101000001000101000101010000000100010100000100000101010000000100010000000100010001000101010001000000000001010001010100000000000100010100000000000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010101",
5832 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000100000000000100010001000001010101000000000000000101010001010000000001000000010101010001010001010101010001010001000001000000010000010001000000010101000001000100010100010101010100000001000100000001010001010001000000000100010101000000000100000100010001010101010001000100000001010001010001000100010101010100010000010101010000010001010100000101010100010100000001010101010101000101000001010001000000000100000001010001010101000101000100000001010100010100010101000100010001010001010101010000000001000001000000010000000001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000000",
5833 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000100000000000100010001000001010101000000000000000101010001010000000001000000010101010001010001010101010001010001000001000000010000010001000000010101000001000100010100010101010100000001000100000001010001010001000000000100010101000000000100000100010001010101010001000100000001010001010001000100010101010100010000010101010000010001010100000101010100010100000001010101010101000101000001010001000000000100000001010001010101000101000100000001010100010100010101000100010001010001010101010000000001000001000000010000000001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000001",
5834 !       "04fd000101010100010100000001010000010101010101000100010101010100010101010101000001010001000101010001010000000100000101000101000101000100010001000100000001010100000101010001000000000000010000010101000000010000000001010001000000010100010000000000010100000000000000010000000000000001010100010100010100010101010100010001010000000001000101010000000001010001000000010000000001010000010101010001000100010001010101000000010100000101010100010000000001000101010001010001000000010000010101000000000000000101010000010101010100000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
5835 !       "04fd000101010100010100000001010000010101010101000100010101010100010101010101000001010001000101010001010000000100000101000101000101000100010001000100000001010100000101010001000000000000010000010101000000010000000001010001000000010100010000000000010100000000000000010000000000000001010100010100010100010101010100010001010000000001000101010000000001010001000000010000000001010000010101010001000100010001010101000000010100000101010100010000000001000101010001010001000000010000010101000000000000000101010000010101010100000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
5836 !       "04fd000101010100010100000001010000010101010101000100010101010100010101010101000001010001000101010001010000000100000101000101000101000100010001000100000001010100000101010001000000000000010000010101000000010000000001010001000000010100010000000000010100000000000000010000000000000001010100010100010100010101010100010001010000000001000101010000000001010001000000010000000001010000010101010001000100010001010101000000010100000101010100010000000001000101010001010001000000010000010101000000000000000101010000010101010100000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
5837 !       "04fd000101010100010100000001010000010101010101000100010101010100010101010101000001010001000101010001010000000100000101000101000101000100010001000100000001010100000101010001000000000000010000010101000000010000000001010001000000010100010000000000010100000000000000010000000000000001010100010100010100010101010100010001010000000001000101010000000001010001000000010000000001010000010101010001000100010001010101000000010100000101010100010000000001000101010001010001000000010000010101000000000000000101010000010101010100000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
5838 !       "04fd000101010100010100000001010000010101010101000100010101010100010101010101000001010001000101010001010000000100000101000101000101000100010001000100000001010100000101010001000000000000010000010101000000010000000001010001000000010100010000000000010100000000000000010000000000000001010100010100010100010101010100010001010000000001000101010000000001010001000000010000000001010000010101010001000100010001010101000000010100000101010100010000000001000101010001010001000000010000010101000000000000000101010000010101010100000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
5839 !       "04fd000101010100010100000001010000010101010101000100010101010100010101010101000001010001000101010001010000000100000101000101000101000100010001000100000001010100000101010001000000000000010000010101000000010000000001010001000000010100010000000000010100000000000000010000000000000001010100010100010100010101010100010001010000000001000101010000000001010001000000010000000001010000010101010001000100010001010101000000010100000101010100010000000001000101010001010001000000010000010101000000000000000101010000010101010100000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010001",
5840 !       "04fd000101010100010100000001010000010101010101000100010101010100010101010101000001010001000101010001010000000100000101000101000101000100010001000100000001010100000101010001000000000000010000010101000000010000000001010001000000010100010000000000010100000000000000010000000000000001010100010100010100010101010100010001010000000001000101010000000001010001000000010000000001010000010101010001000100010001010101000000010100000101010100010000000001000101010001010001000000010000010101000000000000000101010000010101010100000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010100",
5841 !       "04fd000101010100010100000001010000010101010101000100010101010100010101010101000001010001000101010001010000000100000101000101000101000100010001000100000001010100000101010001000000000000010000010101000000010000000001010001000000010100010000000000010100000000000000010000000000000001010100010100010100010101010100010001010000000001000101010000000001010001000000010000000001010000010101010001000100010001010101000000010100000101010100010000000001000101010001010001000000010000010101000000000000000101010000010101010100000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010101",
5842 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000000",
5843 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000001",
5844 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000100",
5845 !       "04fd000100010000010100000001010100010101010000010000010001010100000000010100010001000100010001010001000000000000010000000001000000000100000101000000000001010101000100000000010101000101000001000001000000010101010100000100010000010101010101010001000100000101010001010001000000010001000000010000010000010100010001010001000101010101010000000100010100000100000101010000010001010100000100000100000101000001000101010100000000000000000000010000000101010000010001010000000101000001010001010001010000010000010101000101000000000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
5846 !       "04fd000100010000010100000001010100010101010000010000010001010100000000010100010001000100010001010001000000000000010000000001000000000100000101000000000001010101000100000000010101000101000001000001000000010101010100000100010000010101010101010001000100000101010001010001000000010001000000010000010000010100010001010001000101010101010000000100010100000100000101010000010001010100000100000100000101000001000101010100000000000000000000010000000101010000010001010000000101000001010001010001010000010000010101000101000000000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
5847 !       "04fd000100010000010100000001010100010101010000010000010001010100000000010100010001000100010001010001000000000000010000000001000000000100000101000000000001010101000100000000010101000101000001000001000000010101010100000100010000010101010101010001000100000101010001010001000000010001000000010000010000010100010001010001000101010101010000000100010100000100000101010000010001010100000100000100000101000001000101010100000000000000000000010000000101010000010001010000000101000001010001010001010000010000010101000101000000000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
5848 !       "04fd000100010000010100000001010100010101010000010000010001010100000000010100010001000100010001010001000000000000010000000001000000000100000101000000000001010101000100000000010101000101000001000001000000010101010100000100010000010101010101010001000100000101010001010001000000010001000000010000010000010100010001010001000101010101010000000100010100000100000101010000010001010100000100000100000101000001000101010100000000000000000000010000000101010000010001010000000101000001010001010001010000010000010101000101000000000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
5849 !       "04fd000100010000010100000001010100010101010000010000010001010100000000010100010001000100010001010001000000000000010000000001000000000100000101000000000001010101000100000000010101000101000001000001000000010101010100000100010000010101010101010001000100000101010001010001000000010001000000010000010000010100010001010001000101010101010000000100010100000100000101010000010001010100000100000100000101000001000101010100000000000000000000010000000101010000010001010000000101000001010001010001010000010000010101000101000000000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
5850 !       "04fd000100010000010100000001010100010101010000010000010001010100000000010100010001000100010001010001000000000000010000000001000000000100000101000000000001010101000100000000010101000101000001000001000000010101010100000100010000010101010101010001000100000101010001010001000000010001000000010000010000010100010001010001000101010101010000000100010100000100000101010000010001010100000100000100000101000001000101010100000000000000000000010000000101010000010001010000000101000001010001010001010000010000010101000101000000000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010001",
5851 !       "04fd000100010000010100000001010100010101010000010000010001010100000000010100010001000100010001010001000000000000010000000001000000000100000101000000000001010101000100000000010101000101000001000001000000010101010100000100010000010101010101010001000100000101010001010001000000010001000000010000010000010100010001010001000101010101010000000100010100000100000101010000010001010100000100000100000101000001000101010100000000000000000000010000000101010000010001010000000101000001010001010001010000010000010101000101000000000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010100",
5852 !       "04fd000100010000010100000001010100010101010000010000010001010100000000010100010001000100010001010001000000000000010000000001000000000100000101000000000001010101000100000000010101000101000001000001000000010101010100000100010000010101010101010001000100000101010001010001000000010001000000010000010000010100010001010001000101010101010000000100010100000100000101010000010001010100000100000100000101000001000101010100000000000000000000010000000101010000010001010000000101000001010001010001010000010000010101000101000000000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010101",
5853 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000100000001000101000101010100000000000001000000000001000100000000010000010001000100010000000100010101010000000000010001010001000001010001010100000001000001010101010100000001010000000000000000000101000000010100000000000001010100010001010100010101000000010000010001010000000001000100000101000100010100000001000001000001000100010000000001000001010000010101000100010000000001010100010101010000010001000000010000000100010100010100010100010100000101010001010101010000010000000100000001000101010000010001000001010000000001fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000000",
5854 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000100000001000101000101010100000000000001000000000001000100000000010000010001000100010000000100010101010000000000010001010001000001010001010100000001000001010101010100000001010000000000000000000101000000010100000000000001010100010001010100010101000000010000010001010000000001000100000101000100010100000001000001000001000100010000000001000001010000010101000100010000000001010100010101010000010001000000010000000100010100010100010100010100000101010001010101010000010000000100000001000101010000010001000001010000000001fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000001",
5855 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000100000001000101000101010100000000000001000000000001000100000000010000010001000100010000000100010101010000000000010001010001000001010001010100000001000001010101010100000001010000000000000000000101000000010100000000000001010100010001010100010101000000010000010001010000000001000100000101000100010100000001000001000001000100010000000001000001010000010101000100010000000001010100010101010000010001000000010000000100010100010100010100010100000101010001010101010000010000000100000001000101010000010001000001010000000001fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000100",
5856 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000100000001000101000101010100000000000001000000000001000100000000010000010001000100010000000100010101010000000000010001010001000001010001010100000001000001010101010100000001010000000000000000000101000000010100000000000001010100010001010100010101000000010000010001010000000001000100000101000100010100000001000001000001000100010000000001000001010000010101000100010000000001010100010101010000010001000000010000000100010100010100010100010100000101010001010101010000010000000100000001000101010000010001000001010000000001fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000101",
5857 !       "04fd000100010000000001010001010001000000000100000001010100010001000000010101010000010000000000010101010000010101000101010101000101010001000100000001000000000001010101000100000100000101000000010101000100010000000101010101000000000100000000010000000101010000010100000001000000010001000000000000010000010100010101010101000001000100000000010100000101010100010000000000010101010100000001000001000100010001000000010001000000010001010100000101010101010000000001000100000001000100000000000000010100010001000101000001000001010100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
5858 !       "04fd000100010000000001010001010001000000000100000001010100010001000000010101010000010000000000010101010000010101000101010101000101010001000100000001000000000001010101000100000100000101000000010101000100010000000101010101000000000100000000010000000101010000010100000001000000010001000000000000010000010100010101010101000001000100000000010100000101010100010000000000010101010100000001000001000100010001000000010001000000010001010100000101010101010000000001000100000001000100000000000000010100010001000101000001000001010100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
5859 !       "04fd000100010000000001010001010001000000000100000001010100010001000000010101010000010000000000010101010000010101000101010101000101010001000100000001000000000001010101000100000100000101000000010101000100010000000101010101000000000100000000010000000101010000010100000001000000010001000000000000010000010100010101010101000001000100000000010100000101010100010000000000010101010100000001000001000100010001000000010001000000010001010100000101010101010000000001000100000001000100000000000000010100010001000101000001000001010100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
5860 !       "04fd000100010000000001010001010001000000000100000001010100010001000000010101010000010000000000010101010000010101000101010101000101010001000100000001000000000001010101000100000100000101000000010101000100010000000101010101000000000100000000010000000101010000010100000001000000010001000000000000010000010100010101010101000001000100000000010100000101010100010000000000010101010100000001000001000100010001000000010001000000010001010100000101010101010000000001000100000001000100000000000000010100010001000101000001000001010100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
5861 !       "04fd000100010000000001010001010001000000000100000001010100010001000000010101010000010000000000010101010000010101000101010101000101010001000100000001000000000001010101000100000100000101000000010101000100010000000101010101000000000100000000010000000101010000010100000001000000010001000000000000010000010100010101010101000001000100000000010100000101010100010000000000010101010100000001000001000100010001000000010001000000010001010100000101010101010000000001000100000001000100000000000000010100010001000101000001000001010100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
5862 !       "04fd000100010000000001010001010001000000000100000001010100010001000000010101010000010000000000010101010000010101000101010101000101010001000100000001000000000001010101000100000100000101000000010101000100010000000101010101000000000100000000010000000101010000010100000001000000010001000000000000010000010100010101010101000001000100000000010100000101010100010000000000010101010100000001000001000100010001000000010001000000010001010100000101010101010000000001000100000001000100000000000000010100010001000101000001000001010100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010001",
5863 !       "04fd000100010000000001010001010001000000000100000001010100010001000000010101010000010000000000010101010000010101000101010101000101010001000100000001000000000001010101000100000100000101000000010101000100010000000101010101000000000100000000010000000101010000010100000001000000010001000000000000010000010100010101010101000001000100000000010100000101010100010000000000010101010100000001000001000100010001000000010001000000010001010100000101010101010000000001000100000001000100000000000000010100010001000101000001000001010100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010100",
5864 !       "04fd000100010000000001010001010001000000000100000001010100010001000000010101010000010000000000010101010000010101000101010101000101010001000100000001000000000001010101000100000100000101000000010101000100010000000101010101000000000100000000010000000101010000010100000001000000010001000000000000010000010100010101010101000001000100000000010100000101010100010000000000010101010100000001000001000100010001000000010001000000010001010100000101010101010000000001000100000001000100000000000000010100010001000101000001000001010100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010101",
5865 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010000010000010100010101000100010000000001010100000001000100010000010100000000010100000000010000010100000001000100010000000000010001000100000101000101000101010101000001000100000101000000000101000101000101000101000001010101010001010000000101000001000101010000010001010001000000000001000001000100000000010001010100000101000000010001010000000100010000000001000001010001000001000100010001010000010101010001010101010000000100010100010001000000000001000000010101000001010001000001000001010100000101010000010101fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000000",
5866 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010000010000010100010101000100010000000001010100000001000100010000010100000000010100000000010000010100000001000100010000000000010001000100000101000101000101010101000001000100000101000000000101000101000101000101000001010101010001010000000101000001000101010000010001010001000000000001000001000100000000010001010100000101000000010001010000000100010000000001000001010001000001000100010001010000010101010001010101010000000100010100010001000000000001000000010101000001010001000001000001010100000101010000010101fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000001",
5867 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010000010000010100010101000100010000000001010100000001000100010000010100000000010100000000010000010100000001000100010000000000010001000100000101000101000101010101000001000100000101000000000101000101000101000101000001010101010001010000000101000001000101010000010001010001000000000001000001000100000000010001010100000101000000010001010000000100010000000001000001010001000001000100010001010000010101010001010101010000000100010100010001000000000001000000010101000001010001000001000001010100000101010000010101fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000100",
5868 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010000010000010100010101000100010000000001010100000001000100010000010100000000010100000000010000010100000001000100010000000000010001000100000101000101000101010101000001000100000101000000000101000101000101000101000001010101010001010000000101000001000101010000010001010001000000000001000001000100000000010001010100000101000000010001010000000100010000000001000001010001000001000100010001010000010101010001010101010000000100010100010001000000000001000000010101000001010001000001000001010100000101010000010101fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000101",
5869 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101010001010001000001000100010100010000010100000001000101010101000000000100010101010001010100000101000101000100000001010001000001000101000000010000000101000001010001000100010101010000010100000100010101000101010100000101010101010001010101010001010000010001000100000001010000010101000001000101010001000100000100000100000001010100000000000001010001000001000001010000000100000100000000010101000101010001000101010101010100010101010100000101010100010001000000000101000000000001010001010101000100010000010101000101000000fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401010000",
5870 !       "04fd000101000000000101000100000101010000010000000101010000010100010101010000000101010001010101000101000100000001010000000001010000010001010001000100010000010001000001010000010000010100010101000101010001010101000000010100010000000100000001000000010101000101010101000101000000000001000000000001010100010000010100000101010101000101000100010001000000000000000001000001010101010100000001000100000101000001010101010001010100000001000000010100000101000101010101000001000001000101010100010001010100010000010100010001010001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
5871 !       "04fd000101000000000101000100000101010000010000000101010000010100010101010000000101010001010101000101000100000001010000000001010000010001010001000100010000010001000001010000010000010100010101000101010001010101000000010100010000000100000001000000010101000101010101000101000000000001000000000001010100010000010100000101010101000101000100010001000000000000000001000001010101010100000001000100000101000001010101010001010100000001000000010100000101000101010101000001000001000101010100010001010100010000010100010001010001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
5872 !       "04fd000101000000000101000100000101010000010000000101010000010100010101010000000101010001010101000101000100000001010000000001010000010001010001000100010000010001000001010000010000010100010101000101010001010101000000010100010000000100000001000000010101000101010101000101000000000001000000000001010100010000010100000101010101000101000100010001000000000000000001000001010101010100000001000100000101000001010101010001010100000001000000010100000101000101010101000001000001000101010100010001010100010000010100010001010001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
5873 !       "04fd000101000000000101000100000101010000010000000101010000010100010101010000000101010001010101000101000100000001010000000001010000010001010001000100010000010001000001010000010000010100010101000101010001010101000000010100010000000100000001000000010101000101010101000101000000000001000000000001010100010000010100000101010101000101000100010001000000000000000001000001010101010100000001000100000101000001010101010001010100000001000000010100000101000101010101000001000001000101010100010001010100010000010100010001010001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
5874 !       "04fd000101000000000101000100000101010000010000000101010000010100010101010000000101010001010101000101000100000001010000000001010000010001010001000100010000010001000001010000010000010100010101000101010001010101000000010100010000000100000001000000010101000101010101000101000000000001000000000001010100010000010100000101010101000101000100010001000000000000000001000001010101010100000001000100000101000001010101010001010100000001000000010100000101000101010101000001000001000101010100010001010100010000010100010001010001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
5875 !       "04fd000101000000000101000100000101010000010000000101010000010100010101010000000101010001010101000101000100000001010000000001010000010001010001000100010000010001000001010000010000010100010101000101010001010101000000010100010000000100000001000000010101000101010101000101000000000001000000000001010100010000010100000101010101000101000100010001000000000000000001000001010101010100000001000100000101000001010101010001010100000001000000010100000101000101010101000001000001000101010100010001010100010000010100010001010001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010001",
5876 !       "04fd000101000000000101000100000101010000010000000101010000010100010101010000000101010001010101000101000100000001010000000001010000010001010001000100010000010001000001010000010000010100010101000101010001010101000000010100010000000100000001000000010101000101010101000101000000000001000000000001010100010000010100000101010101000101000100010001000000000000000001000001010101010100000001000100000101000001010101010001010100000001000000010100000101000101010101000001000001000101010100010001010100010000010100010001010001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010100",
5877 !       "04fd000101000000000101000100000101010000010000000101010000010100010101010000000101010001010101000101000100000001010000000001010000010001010001000100010000010001000001010000010000010100010101000101010001010101000000010100010000000100000001000000010101000101010101000101000000000001000000000001010100010000010100000101010101000101000100010001000000000000000001000001010101010100000001000100000101000001010101010001010100000001000000010100000101000101010101000001000001000101010100010001010100010000010100010001010001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010101",
5878 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000100010101010001010000010001000000010100000001010100000000010001000000000101010101000001000100010100010000010001010001010101010000010101000101010100010001000000010100000001010100010001000000000100000101010001000000000100010100000001010000010001000000000000010101000000010101010001000101010101010100010100000000010100010101000101000100010101000000010101000000010101000001000001000101010000000101010000000000000001010101010001010001010100010000000001010100000101000000000101010001010100000101000101010000010000000100fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000000",
5879 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000100010101010001010000010001000000010100000001010100000000010001000000000101010101000001000100010100010000010001010001010101010000010101000101010100010001000000010100000001010100010001000000000100000101010001000000000100010100000001010000010001000000000000010101000000010101010001000101010101010100010100000000010100010101000101000100010101000000010101000000010101000001000001000101010000000101010000000000000001010101010001010001010100010000000001010100000101000000000101010001010100000101000101010000010000000100fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000001",
5880 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000100010101010001010000010001000000010100000001010100000000010001000000000101010101000001000100010100010000010001010001010101010000010101000101010100010001000000010100000001010100010001000000000100000101010001000000000100010100000001010000010001000000000000010101000000010101010001000101010101010100010100000000010100010101000101000100010101000000010101000000010101000001000001000101010000000101010000000000000001010101010001010001010100010000000001010100000101000000000101010001010100000101000101010000010000000100fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000100",
5881 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000100010101010001010000010001000000010100000001010100000000010001000000000101010101000001000100010100010000010001010001010101010000010101000101010100010001000000010100000001010100010001000000000100000101010001000000000100010100000001010000010001000000000000010101000000010101010001000101010101010100010100000000010100010101000101000100010101000000010101000000010101000001000001000101010000000101010000000000000001010101010001010001010100010000000001010100000101000000000101010001010100000101000101010000010000000100fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000101",
5882 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000100000000000100010001000001010101000000000000000101010001010000000001000000010101010001010001010101010001010001000001000000010000010001000000010101000001000100010100010101010100000001000100000001010001010001000000000100010101000000000100000100010001010101010001000100000001010001010001000100010101010100010000010101010000010001010100000101010100010100000001010101010101000101000001010001000000000100000001010001010101000101000100000001010100010100010101000100010001010001010101010000000001000001000000010000000001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401010000",
5883 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000100000000000100010001000001010101000000000000000101010001010000000001000000010101010001010001010101010001010001000001000000010000010001000000010101000001000100010100010101010100000001000100000001010001010001000000000100010101000000000100000100010001010101010001000100000001010001010001000100010101010100010000010101010000010001010100000101010100010100000001010101010101000101000001010001000000000100000001010001010101000101000100000001010100010100010101000100010001010001010101010000000001000001000000010000000001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401010001",
5884 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
5885 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
5886 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
5887 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
5888 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
5889 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010001",
5890 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010100",
5891 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010101",
5892 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000000",
5893 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000001",
5894 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000100",
5895 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000101",
5896 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401010000",
5897 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401010001",
5898 !       "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401010100"
5899
5900   ]
5901 --- 1,122 ----
5902   [
5903 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101010001010001000001000100010100010000010100000001000101010101000000000100010101010001010100000101000101000100000001010001000001000101000000010000000101000001010001000100010101010000010100000100010101000101010100000101010101010001010101010001010000010001000100000001010000010101000001000101010001000100000100000100000001010100000000000001010001000001000001010000000100000100000000010101000101010001000101010101010100010101010100000101010100010001000000000101000000000001010001010101000100010000010101000101000000fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
5904 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000100000100010000010101010000010001000001000001000100000001010101010001000001000100000001000001000100010100010101000100000001000000010001000100000001000001010000010001000001010101010101010100000100000101010000000101000100010100000100000101010001000100010101000000010001000001010000010001000101010101000001010101000001010101000001000100000101000101010000000000010001010000010101010000010000000100010000010101000000000001000001000001010001010101010001010001000101010001000000000101000000000100010100000000010000000000fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
5905 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000100000100010000010101010000010001000001000001000100000001010101010001000001000100000001000001000100010100010101000100000001000000010001000100000001000001010000010001000001010101010101010100000100000101010000000101000100010100000100000101010001000100010101000000010001000001010000010001000101010101000001010101000001010101000001000100000101000101010000000000010001010000010101010000010000000100010000010101000000000001000001000001010001010101010001010001000101010001000000000101000000000100010100000000010000000000fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
5906 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
5907 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
5908 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
5909 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010000000000010100000001000100000100010100010000010001010000000101010101010101010100000000000000010101010100010001000101000001000001010001000101010100000000010000010001010001010101010100010001000100010001010001000100010101000000000000010001000100000100000000000001000100000101000100000101010101010000010100000001010100000001000000010100010100010000010100010100000001010001000100010000000101010000010101010000010101000100010000010001010101000001010101000100000001010000010101000001010101000100000001000100010000fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
5910 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010000000000010100000001000100000100010100010000010001010000000101010101010101010100000000000000010101010100010001000101000001000001010001000101010100000000010000010001010001010101010100010001000100010001010001000100010101000000000000010001000100000100000000000001000100000101000100000101010101010000010100000001010100000001000000010100010100010000010100010100000001010001000100010000000101010000010101010000010101000100010000010001010101000001010101000100000001010000010101000001010101000100000001000100010000fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
5911 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010000000000010100000001000100000100010100010000010001010000000101010101010101010100000000000000010101010100010001000101000001000001010001000101010100000000010000010001010001010101010100010001000100010001010001000100010101000000000000010001000100000100000000000001000100000101000100000101010101010000010100000001010100000001000000010100010100010000010100010100000001010001000100010000000101010000010101010000010101000100010000010001010101000001010101000100000001010000010101000001010101000100000001000100010000fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
5912 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010000000000010100000001000100000100010100010000010001010000000101010101010101010100000000000000010101010100010001000101000001000001010001000101010100000000010000010001010001010101010100010001000100010001010001000100010101000000000000010001000100000100000000000001000100000101000100000101010101010000010100000001010100000001000000010100010100010000010100010100000001010001000100010000000101010000010101010000010101000100010000010001010101000001010101000100000001010000010101000001010101000100000001000100010000fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
5913 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101000001000100010101010100000001000101000001000001010100000001010100010001000001000101000001010100010001010000010000010100010101010001000000000001010101000101010001010000010001010101010101000001000001010101000101010100010001000000010001010100010000010001010101010001000000000000000101000101000101000101010001010000010101000101010100010100000001010001000000000101010000010000010101000000010100010101000101000001000001000001000000000100000000000001000001000100000100000000010100000100010000010101010000010001010101fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
5914 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101000001000100010101010100000001000101000001000001010100000001010100010001000001000101000001010100010001010000010000010100010101010001000000000001010101000101010001010000010001010101010101000001000001010101000101010100010001000000010001010100010000010001010101010001000000000000000101000101000101000101010001010000010101000101010100010100000001010001000000000101010000010000010101000000010100010101000101000001000001000001000000000100000000000001000001000100000100000000010100000100010000010101010000010001010101fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
5915 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101000001000100010101010100000001000101000001000001010100000001010100010001000001000101000001010100010001010000010000010100010101010001000000000001010101000101010001010000010001010101010101000001000001010101000101010100010001000000010001010100010000010001010101010001000000000000000101000101000101000101010001010000010101000101010100010100000001010001000000000101010000010000010101000000010100010101000101000001000001000001000000000100000000000001000001000100000100000000010100000100010000010101010000010001010101fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
5916 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101000001000100010101010100000001000101000001000001010100000001010100010001000001000101000001010100010001010000010000010100010101010001000000000001010101000101010001010000010001010101010101000001000001010101000101010100010001000000010001010100010000010001010101010001000000000000000101000101000101000101010001010000010101000101010100010100000001010001000000000101010000010000010101000000010100010101000101000001000001000001000000000100000000000001000001000100000100000000010100000100010000010101010000010001010101fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
5917 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101010001010001000001000100010100010000010100000001000101010101000000000100010101010001010100000101000101000100000001010001000001000101000000010000000101000001010001000100010101010000010100000100010101000101010100000101010101010001010101010001010000010001000100000001010000010101000001000101010001000100000100000100000001010100000000000001010001000001000001010000000100000100000000010101000101010001000101010101010100010101010100000101010100010001000000000101000000000001010001010101000100010000010101000101000000fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
5918 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000100010100010000010001000001010100000000010100010000000001000000010100010101010101000000010001010000000100000001000001010101000101000101000001010000010101000000010001000100000101000100000100010100010101010101010001010000010001010100010100000101000001010001000101000000000100010000000000000000000001010000000000010000000001010000000000010000000001010101010100010101010001000101010000010000000000010000010100000100010100010001010100000101000001000001000101000101010001000000000100010000000100000000010001010100fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
5919 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000100010100010000010001000001010100000000010100010000000001000000010100010101010101000000010001010000000100000001000001010101000101000101000001010000010101000000010001000100000101000100000100010100010101010101010001010000010001010100010100000101000001010001000101000000000100010000000000000000000001010000000000010000000001010000000000010000000001010101010100010101010001000101010000010000000000010000010100000100010100010001010100000101000001000001000101000101010001000000000100010000000100000000010001010100fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
5920 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000100010100010000010001000001010100000000010100010000000001000000010100010101010101000000010001010000000100000001000001010101000101000101000001010000010101000000010001000100000101000100000100010100010101010101010001010000010001010100010100000101000001010001000101000000000100010000000000000000000001010000000000010000000001010000000000010000000001010101010100010101010001000101010000010000000000010000010100000100010100010001010100000101000001000001000101000101010001000000000100010000000100000000010001010100fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
5921 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000100010100010000010001000001010100000000010100010000000001000000010100010101010101000000010001010000000100000001000001010101000101000101000001010000010101000000010001000100000101000100000100010100010101010101010001010000010001010100010100000101000001010001000101000000000100010000000000000000000001010000000000010000000001010000000000010000000001010101010100010101010001000101010000010000000000010000010100000100010100010001010100000101000001000001000101000101010001000000000100010000000100000000010001010100fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
5922 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101010001010001000101000100000101000000010101000100010101010001000101000000000000010100000000010001010100000000010001010101010100010101010101010101010001000001000000010100000101010100010001010000010000010001010001010101000101000101010000010000010100000100000001010101000100010000000101010000000100000000000000000101010101010100000100010100000101000001000101000101000101010000010100010101010000010101010101010000010100000101000001010001000101010101000101010001010101000101010001000000010100000100010001010000010001fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
5923 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101010001010001000101000100000101000000010101000100010101010001000101000000000000010100000000010001010100000000010001010101010100010101010101010101010001000001000000010100000101010100010001010000010000010001010001010101000101000101010000010000010100000100000001010101000100010000000101010000000100000000000000000101010101010100000100010100000101000001000101000101000101010000010100010101010000010101010101010000010100000101000001010001000101010101000101010001010101000101010001000000010100000100010001010000010001fd0001010101010101010100010101010100000000010100010100000000000000010100010101000100000100010000010100000100010000000001000000010001000101010000000000010000010000000000010000010100000001010101000000000001000000000100000100000101010101010101010101000100010101000101010000010101000100000100000000010000010000000101000000010101010000010101010100010101000100000000000001010100000101010101000001000001000101010001010101000000010100010100010100010000010100010001010101010001010100000001000101010101010001000000010000000001010400010001",
5924 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
5925 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
5926 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
5927 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
5928 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
5929 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001010101010101010100010101010100000000010100010100000000000000010100010101000100000100010000010100000100010000000001000000010001000101010000000000010000010000000000010000010100000001010101000000000001000000000100000100000101010101010101010101000100010101000101010000010101000100000100000000010000010000000101000000010101010000010101010100010101000100000000000001010100000101010101000001000001000101010001010101000000010100010100010100010000010100010001010101010001010100000001000101010101010001000000010000000001010400010001",
5930 !       "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001000100010000000001010000000000000100010100010000000001010000000000010100000000010101000000000101010000010000000101000001000000010101000000000101010101000101000000010001000001000100000100010101000001010001000000000101000001000100000001000101000101010101010101000001010100000100010001010101010101000100010100010100010101010101000100000001000101000000010001010000010100000001000001000001010001000001000000010000010000010001000100010000000100000000010001010001010000010001000001000001010000010100010000000100010100010400010100",
5931 !       "04fd000101000001000101000001000001010101010100010101000001000000010000010101010001000000010000000001010101000001010101010000000100000001010101000100010000000000010000000001010101000000010101010000000101000001010001000001000000010001010000010101010101010000000100010000010101000000010101000000010001010001010101010101000000000101010100000000010100000000000000010000000101010100010000010001000101010101000000010000010001010100000001010101010001000100010000010100010100010100000001000101000001010100000101010101000000010000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
5932 !       "04fd000101000001000101000001000001010101010100010101000001000000010000010101010001000000010000000001010101000001010101010000000100000001010101000100010000000000010000000001010101000000010101010000000101000001010001000001000000010001010000010101010101010000000100010000010101000000010101000000010001010001010101010101000000000101010100000000010100000000000000010000000101010100010000010001000101010101000000010000010001010100000001010101010001000100010000010100010100010100000001000101000001010100000101010101000000010000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
5933 !       "04fd000101000001000101000001000001010101010100010101000001000000010000010101010001000000010000000001010101000001010101010000000100000001010101000100010000000000010000000001010101000000010101010000000101000001010001000001000000010001010000010101010101010000000100010000010101000000010101000000010001010001010101010101000000000101010100000000010100000000000000010000000101010100010000010001000101010101000000010000010001010100000001010101010001000100010000010100010100010100000001000101000001010100000101010101000000010000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
5934 !       "04fd000101000001000101000001000001010101010100010101000001000000010000010101010001000000010000000001010101000001010101010000000100000001010101000100010000000000010000000001010101000000010101010000000101000001010001000001000000010001010000010101010101010000000100010000010101000000010101000000010001010001010101010101000000000101010100000000010100000000000000010000000101010100010000010001000101010101000000010000010001010100000001010101010001000100010000010100010100010100000001000101000001010100000101010101000000010000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
5935 !       "04fd000101000001000101000001000001010101010100010101000001000000010000010101010001000000010000000001010101000001010101010000000100000001010101000100010000000000010000000001010101000000010101010000000101000001010001000001000000010001010000010101010101010000000100010000010101000000010101000000010001010001010101010101000000000101010100000000010100000000000000010000000101010100010000010001000101010101000000010000010001010100000001010101010001000100010000010100010100010100000001000101000001010100000101010101000000010000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
5936 !       "04fd000101000001000101000001000001010101010100010101000001000000010000010101010001000000010000000001010101000001010101010000000100000001010101000100010000000000010000000001010101000000010101010000000101000001010001000001000000010001010000010101010101010000000100010000010101000000010101000000010001010001010101010101000000000101010100000000010100000000000000010000000101010100010000010001000101010101000000010000010001010100000001010101010001000100010000010100010100010100000001000101000001010100000101010101000000010000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001010101010101010100010101010100000000010100010100000000000000010100010101000100000100010000010100000100010000000001000000010001000101010000000000010000010000000000010000010100000001010101000000000001000000000100000100000101010101010101010101000100010101000101010000010101000100000100000000010000010000000101000000010101010000010101010100010101000100000000000001010100000101010101000001000001000101010001010101000000010100010100010100010000010100010001010101010001010100000001000101010101010001000000010000000001010400010001",
5937 !       "04fd000101000001000101000001000001010101010100010101000001000000010000010101010001000000010000000001010101000001010101010000000100000001010101000100010000000000010000000001010101000000010101010000000101000001010001000001000000010001010000010101010101010000000100010000010101000000010101000000010001010001010101010101000000000101010100000000010100000000000000010000000101010100010000010001000101010101000000010000010001010100000001010101010001000100010000010100010100010100000001000101000001010100000101010101000000010000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001000100010000000001010000000000000100010100010000000001010000000000010100000000010101000000000101010000010000000101000001000000010101000000000101010101000101000000010001000001000100000100010101000001010001000000000101000001000100000001000101000101010101010101000001010100000100010001010101010101000100010100010100010101010101000100000001000101000000010001010000010100000001000001000001010001000001000000010000010000010001000100010000000100000000010001010001010000010001000001000001010000010100010000000100010100010400010100",
5938 !       "04fd000101000001000101000001000001010101010100010101000001000000010000010101010001000000010000000001010101000001010101010000000100000001010101000100010000000000010000000001010101000000010101010000000101000001010001000001000000010001010000010101010101010000000100010000010101000000010101000000010001010001010101010101000000000101010100000000010100000000000000010000000101010100010000010001000101010101000000010000010001010100000001010101010001000100010000010100010100010100000001000101000001010100000101010101000000010000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001010000000100010100000001000101000101000001010001000001010101010001010000000100000001000001000000000101010001000101010100000100000100000000010001000101000101010000000101000000000000010100010000000100000101000000000000010001010001000001000100000101000100000001000100000101000101010101000001000001000100000101000100000101000100000001000101010101000001000100000001000000010001010101000101000001000000010000010001010001010100000000000000010000010000010000010100000001010000000000000001010101000001010101000101000000010400010101",
5939 !       "04fd000100010001000100000101010000010101010001000001000101010001010101000000000000010100010101000001010001010000000001000001010000000101000001000101000100000000000001010001010001000100000001010101000100010101000000000100000101000001010100000101010101010101010101000101010101010000010001010000010001010100000001000101010001010001000001010001010001000101010100010100010100000001010000000000010100010101010000000100010101010100000001000001000101010001000101010000000000010001010000000101000100000100010100000100000001010001fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
5940 !       "04fd000100010001000100000101010000010101010001000001000101010001010101000000000000010100010101000001010001010000000001000001010000000101000001000101000100000000000001010001010001000100000001010101000100010101000000000100000101000001010100000101010101010101010101000101010101010000010001010000010001010100000001000101010001010001000001010001010001000101010100010100010100000001010000000000010100010101010000000100010101010100000001000001000101010001000101010000000000010001010000000101000100000100010100000100000001010001fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
5941 !       "04fd000100010001000100000101010000010101010001000001000101010001010101000000000000010100010101000001010001010000000001000001010000000101000001000101000100000000000001010001010001000100000001010101000100010101000000000100000101000001010100000101010101010101010101000101010101010000010001010000010001010100000001000101010001010001000001010001010001000101010100010100010100000001010000000000010100010101010000000100010101010100000001000001000101010001000101010000000000010001010000000101000100000100010100000100000001010001fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
5942 !       "04fd000100010001000100000101010000010101010001000001000101010001010101000000000000010100010101000001010001010000000001000001010000000101000001000101000100000000000001010001010001000100000001010101000100010101000000000100000101000001010100000101010101010101010101000101010101010000010001010000010001010100000001000101010001010001000001010001010001000101010100010100010100000001010000000000010100010101010000000100010101010100000001000001000101010001000101010000000000010001010000000101000100000100010100000100000001010001fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
5943 !       "04fd000100010001000100000101010000010101010001000001000101010001010101000000000000010100010101000001010001010000000001000001010000000101000001000101000100000000000001010001010001000100000001010101000100010101000000000100000101000001010100000101010101010101010101000101010101010000010001010000010001010100000001000101010001010001000001010001010001000101010100010100010100000001010000000000010100010101010000000100010101010100000001000001000101010001000101010000000000010001010000000101000100000100010100000100000001010001fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
5944 !       "04fd000100010001000100000101010000010101010001000001000101010001010101000000000000010100010101000001010001010000000001000001010000000101000001000101000100000000000001010001010001000100000001010101000100010101000000000100000101000001010100000101010101010101010101000101010101010000010001010000010001010100000001000101010001010001000001010001010001000101010100010100010100000001010000000000010100010101010000000100010101010100000001000001000101010001000101010000000000010001010000000101000100000100010100000100000001010001fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001010101010101010100010101010100000000010100010100000000000000010100010101000100000100010000010100000100010000000001000000010001000101010000000000010000010000000000010000010100000001010101000000000001000000000100000100000101010101010101010101000100010101000101010000010101000100000100000000010000010000000101000000010101010000010101010100010101000100000000000001010100000101010101000001000001000101010001010101000000010100010100010100010000010100010001010101010001010100000001000101010101010001000000010000000001010400010001",
5945 !       "04fd000100010001000100000101010000010101010001000001000101010001010101000000000000010100010101000001010001010000000001000001010000000101000001000101000100000000000001010001010001000100000001010101000100010101000000000100000101000001010100000101010101010101010101000101010101010000010001010000010001010100000001000101010001010001000001010001010001000101010100010100010100000001010000000000010100010101010000000100010101010100000001000001000101010001000101010000000000010001010000000101000100000100010100000100000001010001fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001000100010000000001010000000000000100010100010000000001010000000000010100000000010101000000000101010000010000000101000001000000010101000000000101010101000101000000010001000001000100000100010101000001010001000000000101000001000100000001000101000101010101010101000001010100000100010001010101010101000100010100010100010101010101000100000001000101000000010001010000010100000001000001000001010001000001000000010000010000010001000100010000000100000000010001010001010000010001000001000001010000010100010000000100010100010400010100",
5946 !       "04fd000100010001000100000101010000010101010001000001000101010001010101000000000000010100010101000001010001010000000001000001010000000101000001000101000100000000000001010001010001000100000001010101000100010101000000000100000101000001010100000101010101010101010101000101010101010000010001010000010001010100000001000101010001010001000001010001010001000101010100010100010100000001010000000000010100010101010000000100010101010100000001000001000101010001000101010000000000010001010000000101000100000100010100000100000001010001fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001010000000100010100000001000101000101000001010001000001010101010001010000000100000001000001000000000101010001000101010100000100000100000000010001000101000101010000000101000000000000010100010000000100000101000000000000010001010001000001000100000101000100000001000100000101000101010101000001000001000100000101000100000101000100000001000101010101000001000100000001000000010001010101000101000001000000010000010001010001010100000000000000010000010000010000010100000001010000000000000001010101000001010101000101000000010400010101",
5947 !       "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101010001010001000001000100010100010000010100000001000101010101000000000100010101010001010100000101000101000100000001010001000001000101000000010000000101000001010001000100010101010000010100000100010101000101010100000101010101010001010101010001010000010001000100000001010000010101000001000101010001000100000100000100000001010100000000000001010001000001000001010000000100000100000000010101000101010001000101010101010100010101010100000101010100010001000000000101000000000001010001010101000100010000010101000101000000fd0001010100010100000000000001010101000101010100010100000100000100010000000000000000000001010000000101000100010001010100000101010100010100000000000000010100000101000100000101000001000000010000000100000001000101000101000000010100010000000000010000010100010101010001000101010001010101010001000000000000000001010100000101000100000001000101000100010100010001010101000100010101010000010001010100010000010101010001010001010101010000000001010101000100000001000001000101010100010101010101000100010101010100000000000001000101010401000000",
5948 !       "04fd000101000100010100010000010001010100010101010000000001010000000100000001010001010000000000000101000101000000000000000101010001000101010101000100010000010101000100010001010101000000000000000101000100010001010001000101010100000000000101010001010100000101010100010100010101000000000001010000010100000000010001010101000001010000000100000101010101000101010000000100000100000101010100010000010000010101010001000001010000010100010001000101010001000000010000000000000000010101010101010100010100000101010000000000000001010000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
5949 !       "04fd000101000100010100010000010001010100010101010000000001010000000100000001010001010000000000000101000101000000000000000101010001000101010101000100010000010101000100010001010101000000000000000101000100010001010001000101010100000000000101010001010100000101010100010100010101000000000001010000010100000000010001010101000001010000000100000101010101000101010000000100000100000101010100010000010000010101010001000001010000010100010001000101010001000000010000000000000000010101010101010100010100000101010000000000000001010000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
5950 !       "04fd000101000100010100010000010001010100010101010000000001010000000100000001010001010000000000000101000101000000000000000101010001000101010101000100010000010101000100010001010101000000000000000101000100010001010001000101010100000000000101010001010100000101010100010100010101000000000001010000010100000000010001010101000001010000000100000101010101000101010000000100000100000101010100010000010000010101010001000001010000010100010001000101010001000000010000000000000000010101010101010100010100000101010000000000000001010000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
5951 !       "04fd000101000100010100010000010001010100010101010000000001010000000100000001010001010000000000000101000101000000000000000101010001000101010101000100010000010101000100010001010101000000000000000101000100010001010001000101010100000000000101010001010100000101010100010100010101000000000001010000010100000000010001010101000001010000000100000101010101000101010000000100000100000101010100010000010000010101010001000001010000010100010001000101010001000000010000000000000000010101010101010100010100000101010000000000000001010000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
5952 !       "04fd000101000100010100010000010001010100010101010000000001010000000100000001010001010000000000000101000101000000000000000101010001000101010101000100010000010101000100010001010101000000000000000101000100010001010001000101010100000000000101010001010100000101010100010100010101000000000001010000010100000000010001010101000001010000000100000101010101000101010000000100000100000101010100010000010000010101010001000001010000010100010001000101010001000000010000000000000000010101010101010100010100000101010000000000000001010000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
5953 !       "04fd000101000100010100010000010001010100010101010000000001010000000100000001010001010000000000000101000101000000000000000101010001000101010101000100010000010101000100010001010101000000000000000101000100010001010001000101010100000000000101010001010100000101010100010100010101000000000001010000010100000000010001010101000001010000000100000101010101000101010000000100000100000101010100010000010000010101010001000001010000010100010001000101010001000000010000000000000000010101010101010100010100000101010000000000000001010000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001010101010101010100010101010100000000010100010100000000000000010100010101000100000100010000010100000100010000000001000000010001000101010000000000010000010000000000010000010100000001010101000000000001000000000100000100000101010101010101010101000100010101000101010000010101000100000100000000010000010000000101000000010101010000010101010100010101000100000000000001010100000101010101000001000001000101010001010101000000010100010100010100010000010100010001010101010001010100000001000101010101010001000000010000000001010400010001",
5954 !       "04fd000101000100010100010000010001010100010101010000000001010000000100000001010001010000000000000101000101000000000000000101010001000101010101000100010000010101000100010001010101000000000000000101000100010001010001000101010100000000000101010001010100000101010100010100010101000000000001010000010100000000010001010101000001010000000100000101010101000101010000000100000100000101010100010000010000010101010001000001010000010100010001000101010001000000010000000000000000010101010101010100010100000101010000000000000001010000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001000100010000000001010000000000000100010100010000000001010000000000010100000000010101000000000101010000010000000101000001000000010101000000000101010101000101000000010001000001000100000100010101000001010001000000000101000001000100000001000101000101010101010101000001010100000100010001010101010101000100010100010100010101010101000100000001000101000000010001010000010100000001000001000001010001000001000000010000010000010001000100010000000100000000010001010001010000010001000001000001010000010100010000000100010100010400010100",
5955 !       "04fd000101000100010100010000010001010100010101010000000001010000000100000001010001010000000000000101000101000000000000000101010001000101010101000100010000010101000100010001010101000000000000000101000100010001010001000101010100000000000101010001010100000101010100010100010101000000000001010000010100000000010001010101000001010000000100000101010101000101010000000100000100000101010100010000010000010101010001000001010000010100010001000101010001000000010000000000000000010101010101010100010100000101010000000000000001010000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001010000000100010100000001000101000101000001010001000001010101010001010000000100000001000001000000000101010001000101010100000100000100000000010001000101000101010000000101000000000000010100010000000100000101000000000000010001010001000001000100000101000100000001000100000101000101010101000001000001000100000101000100000101000100000001000101010101000001000100000001000000010001010101000101000001000000010000010001010001010100000000000000010000010000010000010100000001010000000000000001010101000001010101000101000000010400010101",
5956 !       "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000100010101000100000100000000010100010100010000010001010101010100010100010100000000010100000001010101010101000001000001010001010101010000010000000001010101010001000101000000000001010000000001010000010001000100010101000101000100000100010101010000000100000100000100010100000100000001000001000001000101000100000101000101000101000101010000000000000100000100000100000101010000010000000001000001000001000001010101000000010100000101000101010001000101010100000100000001000100010100000101000001010000000100000101010000000001fd0001010100010100000000000001010101000101010100010100000100000100010000000000000000000001010000000101000100010001010100000101010100010100000000000000010100000101000100000101000001000000010000000100000001000101000101000000010100010000000000010000010100010101010001000101010001010101010001000000000000000001010100000101000100000001000101000100010100010001010101000100010101010000010001010100010000010101010001010001010101010000000001010101000100000001000001000101010100010101010101000100010101010100000000000001000101010401000000",
5957 !       "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000100010101000100000100000000010100010100010000010001010101010100010100010100000000010100000001010101010101000001000001010001010101010000010000000001010101010001000101000000000001010000000001010000010001000100010101000101000100000100010101010000000100000100000100010100000100000001000001000001000101000100000101000101000101000101010000000000000100000100000100000101010000010000000001000001000001000001010101000000010100000101000101010001000101010100000100000001000100010100000101000001010000000100000101010000000001fd0001000101010000000001010101010101010101000101010001000100010101010101000100000000000101010100000101010001000101010001000100000000010100000001000101010100010001000000010101000000000000000001010101000000010100010001010000000001000101010000000100010101000000000000000101010100000101010100010001010100010001000001000101000101010100010101000000000100010001010101010100010000000101000101010001010000010000010101000101010000000001010000000100010001000100000000000101000000010100000101000101010000010001010000010001000001010401000001",
5958 !       "04fd000100010000010101000101000001000001000000000101010101000100000001000001000100010000000100010100000100000100000000010101000000010100010000010101000100000001000100010100000101000100010101010101000001010001000100010100010000000101000101000100000101010001010101010101010000010100010000000000010100010101000000000001000100000000000001010000000000010000000101010001000100000101010100010001000100010100000100000101000101010000000101010000000100010001000101000101010100010000000001010100010000000101000101010101010100000101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
5959 !       "04fd000100010000010101000101000001000001000000000101010101000100000001000001000100010000000100010100000100000100000000010101000000010100010000010101000100000001000100010100000101000100010101010101000001010001000100010100010000000101000101000100000101010001010101010101010000010100010000000000010100010101000000000001000100000000000001010000000000010000000101010001000100000101010100010001000100010100000100000101000101010000000101010000000100010001000101000101010100010000000001010100010000000101000101010101010100000101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
5960 !       "04fd000100010000010101000101000001000001000000000101010101000100000001000001000100010000000100010100000100000100000000010101000000010100010000010101000100000001000100010100000101000100010101010101000001010001000100010100010000000101000101000100000101010001010101010101010000010100010000000000010100010101000000000001000100000000000001010000000000010000000101010001000100000101010100010001000100010100000100000101000101010000000101010000000100010001000101000101010100010000000001010100010000000101000101010101010100000101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
5961 !       "04fd000100010000010101000101000001000001000000000101010101000100000001000001000100010000000100010100000100000100000000010101000000010100010000010101000100000001000100010100000101000100010101010101000001010001000100010100010000000101000101000100000101010001010101010101010000010100010000000000010100010101000000000001000100000000000001010000000000010000000101010001000100000101010100010001000100010100000100000101000101010000000101010000000100010001000101000101010100010000000001010100010000000101000101010101010100000101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
5962 !       "04fd000100010000010101000101000001000001000000000101010101000100000001000001000100010000000100010100000100000100000000010101000000010100010000010101000100000001000100010100000101000100010101010101000001010001000100010100010000000101000101000100000101010001010101010101010000010100010000000000010100010101000000000001000100000000000001010000000000010000000101010001000100000101010100010001000100010100000100000101000101010000000101010000000100010001000101000101010100010000000001010100010000000101000101010101010100000101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
5963 !       "04fd000100010000010101000101000001000001000000000101010101000100000001000001000100010000000100010100000100000100000000010101000000010100010000010101000100000001000100010100000101000100010101010101000001010001000100010100010000000101000101000100000101010001010101010101010000010100010000000000010100010101000000000001000100000000000001010000000000010000000101010001000100000101010100010001000100010100000100000101000101010000000101010000000100010001000101000101010100010000000001010100010000000101000101010101010100000101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001010101010101010100010101010100000000010100010100000000000000010100010101000100000100010000010100000100010000000001000000010001000101010000000000010000010000000000010000010100000001010101000000000001000000000100000100000101010101010101010101000100010101000101010000010101000100000100000000010000010000000101000000010101010000010101010100010101000100000000000001010100000101010101000001000001000101010001010101000000010100010100010100010000010100010001010101010001010100000001000101010101010001000000010000000001010400010001",
5964 !       "04fd000100010000010101000101000001000001000000000101010101000100000001000001000100010000000100010100000100000100000000010101000000010100010000010101000100000001000100010100000101000100010101010101000001010001000100010100010000000101000101000100000101010001010101010101010000010100010000000000010100010101000000000001000100000000000001010000000000010000000101010001000100000101010100010001000100010100000100000101000101010000000101010000000100010001000101000101010100010000000001010100010000000101000101010101010100000101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001000100010000000001010000000000000100010100010000000001010000000000010100000000010101000000000101010000010000000101000001000000010101000000000101010101000101000000010001000001000100000100010101000001010001000000000101000001000100000001000101000101010101010101000001010100000100010001010101010101000100010100010100010101010101000100000001000101000000010001010000010100000001000001000001010001000001000000010000010000010001000100010000000100000000010001010001010000010001000001000001010000010100010000000100010100010400010100",
5965 !       "04fd000100010000010101000101000001000001000000000101010101000100000001000001000100010000000100010100000100000100000000010101000000010100010000010101000100000001000100010100000101000100010101010101000001010001000100010100010000000101000101000100000101010001010101010101010000010100010000000000010100010101000000000001000100000000000001010000000000010000000101010001000100000101010100010001000100010100000100000101000101010000000101010000000100010001000101000101010100010000000001010100010000000101000101010101010100000101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001010000000100010100000001000101000101000001010001000001010101010001010000000100000001000001000000000101010001000101010100000100000100000000010001000101000101010000000101000000000000010100010000000100000101000000000000010001010001000001000100000101000100000001000100000101000101010101000001000001000100000101000100000101000100000001000101010101000001000100000001000000010001010101000101000001000000010000010001010001010100000000000000010000010000010000010100000001010000000000000001010101000001010101000101000000010400010101",
5966 !       "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000100000000010101010000000001000001000101000001010001000101010100010101000101010000000101000100010001000001010000000000000001000101000101000001000101010101010000000000010101000001000100000101010000010101010101000000000001010001010101010001000100010100010100000000010101000100010100000101000100010000010101010001000001000101010100010000010101010101000100010100010001000000000100010000010000000000010001010001000100000001000001010101010000010101000101000100000000000101010101010000010101000100010001000100000000fd0001010100010100000000000001010101000101010100010100000100000100010000000000000000000001010000000101000100010001010100000101010100010100000000000000010100000101000100000101000001000000010000000100000001000101000101000000010100010000000000010000010100010101010001000101010001010101010001000000000000000001010100000101000100000001000101000100010100010001010101000100010101010000010001010100010000010101010001010001010101010000000001010101000100000001000001000101010100010101010101000100010101010100000000000001000101010401000000",
5967 !       "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000100000000010101010000000001000001000101000001010001000101010100010101000101010000000101000100010001000001010000000000000001000101000101000001000101010101010000000000010101000001000100000101010000010101010101000000000001010001010101010001000100010100010100000000010101000100010100000101000100010000010101010001000001000101010100010000010101010101000100010100010001000000000100010000010000000000010001010001000100000001000001010101010000010101000101000100000000000101010101010000010101000100010001000100000000fd0001000101010000000001010101010101010101000101010001000100010101010101000100000000000101010100000101010001000101010001000100000000010100000001000101010100010001000000010101000000000000000001010101000000010100010001010000000001000101010000000100010101000000000000000101010100000101010100010001010100010001000001000101000101010100010101000000000100010001010101010100010000000101000101010001010000010000010101000101010000000001010000000100010001000100000000000101000000010100000101000101010000010001010000010001000001010401000001",
5968 !       "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101010101010101000000000101000001000000000101000100010001010101000000010101000101010101000100010001010101000000010000000001000000000100000101000000000001010001010000000101010000010001010001010000010100000001000000000101010001000001000001010000000100010100000000000001010000010100010100000001010000010100010000000100010100000100000001000100010000010101000101010100000000000000010100000001000000000100000001000000000001010001000100010101010101000000000001000101010001000001010001000100010100010001000001000000000001fd0001000000000001000001010100010000010001010000000101010001000100010100010101000001010000000101010100000100000100010001000100010001000100010001000100010101010100000100000101000000010101000000000101010100000000000000000101010000010101010001000100010000000101000001000001010100010001010101000001000000000001000000000001000101000000010101000001000001010001010001010100000000010100000101000100010000000100000100000100010000010001000000000101000100000101000101000100010000010100010001010001010101000100010101000100000001010401000100",
5969 !       "04fd000101000100010101010000010001010100000001010000010101000101000001000100000001010100010000000101010101000001010101010101010101000101010100010000000000000001000001000101010000000100010001010100000100010101000000000001010001010101000100010100000001010000000100010001000101010100010000000001010000010100010000010000000100010001000001010100010101000000000100000101000001000101000101000101000100010000000101010000000001000101010000010101010001000101010000010100010001010101000001000100000100010001000101010101000100010101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
5970 !       "04fd000101000100010101010000010001010100000001010000010101000101000001000100000001010100010000000101010101000001010101010101010101000101010100010000000000000001000001000101010000000100010001010100000100010101000000000001010001010101000100010100000001010000000100010001000101010100010000000001010000010100010000010000000100010001000001010100010101000000000100000101000001000101000101000101000100010000000101010000000001000101010000010101010001000101010000010100010001010101000001000100000100010001000101010101000100010101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
5971 !       "04fd000101000100010101010000010001010100000001010000010101000101000001000100000001010100010000000101010101000001010101010101010101000101010100010000000000000001000001000101010000000100010001010100000100010101000000000001010001010101000100010100000001010000000100010001000101010100010000000001010000010100010000010000000100010001000001010100010101000000000100000101000001000101000101000101000100010000000101010000000001000101010000010101010001000101010000010100010001010101000001000100000100010001000101010101000100010101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
5972 !       "04fd000101000100010101010000010001010100000001010000010101000101000001000100000001010100010000000101010101000001010101010101010101000101010100010000000000000001000001000101010000000100010001010100000100010101000000000001010001010101000100010100000001010000000100010001000101010100010000000001010000010100010000010000000100010001000001010100010101000000000100000101000001000101000101000101000100010000000101010000000001000101010000010101010001000101010000010100010001010101000001000100000100010001000101010101000100010101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
5973 !       "04fd000101000100010101010000010001010100000001010000010101000101000001000100000001010100010000000101010101000001010101010101010101000101010100010000000000000001000001000101010000000100010001010100000100010101000000000001010001010101000100010100000001010000000100010001000101010100010000000001010000010100010000010000000100010001000001010100010101000000000100000101000001000101000101000101000100010000000101010000000001000101010000010101010001000101010000010100010001010101000001000100000100010001000101010101000100010101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
5974 !       "04fd000101000100010101010000010001010100000001010000010101000101000001000100000001010100010000000101010101000001010101010101010101000101010100010000000000000001000001000101010000000100010001010100000100010101000000000001010001010101000100010100000001010000000100010001000101010100010000000001010000010100010000010000000100010001000001010100010101000000000100000101000001000101000101000101000100010000000101010000000001000101010000010101010001000101010000010100010001010101000001000100000100010001000101010101000100010101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001010101010101010100010101010100000000010100010100000000000000010100010101000100000100010000010100000100010000000001000000010001000101010000000000010000010000000000010000010100000001010101000000000001000000000100000100000101010101010101010101000100010101000101010000010101000100000100000000010000010000000101000000010101010000010101010100010101000100000000000001010100000101010101000001000001000101010001010101000000010100010100010100010000010100010001010101010001010100000001000101010101010001000000010000000001010400010001",
5975 !       "04fd000101000100010101010000010001010100000001010000010101000101000001000100000001010100010000000101010101000001010101010101010101000101010100010000000000000001000001000101010000000100010001010100000100010101000000000001010001010101000100010100000001010000000100010001000101010100010000000001010000010100010000010000000100010001000001010100010101000000000100000101000001000101000101000101000100010000000101010000000001000101010000010101010001000101010000010100010001010101000001000100000100010001000101010101000100010101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001000100010000000001010000000000000100010100010000000001010000000000010100000000010101000000000101010000010000000101000001000000010101000000000101010101000101000000010001000001000100000100010101000001010001000000000101000001000100000001000101000101010101010101000001010100000100010001010101010101000100010100010100010101010101000100000001000101000000010001010000010100000001000001000001010001000001000000010000010000010001000100010000000100000000010001010001010000010001000001000001010000010100010000000100010100010400010100",
5976 !       "04fd000101000100010101010000010001010100000001010000010101000101000001000100000001010100010000000101010101000001010101010101010101000101010100010000000000000001000001000101010000000100010001010100000100010101000000000001010001010101000100010100000001010000000100010001000101010100010000000001010000010100010000010000000100010001000001010100010101000000000100000101000001000101000101000101000100010000000101010000000001000101010000010101010001000101010000010100010001010101000001000100000100010001000101010101000100010101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001010000000100010100000001000101000101000001010001000001010101010001010000000100000001000001000000000101010001000101010100000100000100000000010001000101000101010000000101000000000000010100010000000100000101000000000000010001010001000001000100000101000100000001000100000101000101010101000001000001000100000101000100000101000100000001000101010101000001000100000001000000010001010101000101000001000000010000010001010001010100000000000000010000010000010000010100000001010000000000000001010101000001010101000101000000010400010101",
5977 !       "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100000100010000000001000101000100010001010100010001000101010000010100010101010101010001000101010100000100000000010101010000010101010100010000000000010100000100010101010000010100010100000101010001000000000001010000010000000001010100000000000000010100000000010100000100000000010001010000010101010101010001000100010001010100000101010000000101000101010100000101010100010101000100000001000000010100000101000001000100010000000001010101000001010100010001000000010100000001000001010001000100010000010101010101000101000000fd000101000100000000010101010000000001000001000101000001010001000101010100010101000101010000000101000100010001000001010000000000000001000101000101000001000101010101010000000000010101000001000100000101010000010101010101000000000001010001010101010001000100010100010100000000010101000100010100000101000100010000010101010001000001000101010100010000010101010101000100010100010001000000000100010000010000000000010001010001000100000001000001010101010000010101000101000100000000000101010101010000010101000100010001000100000000fd0001010100010100000000000001010101000101010100010100000100000100010000000000000000000001010000000101000100010001010100000101010100010100000000000000010100000101000100000101000001000000010000000100000001000101000101000000010100010000000000010000010100010101010001000101010001010101010001000000000000000001010100000101000100000001000101000100010100010001010101000100010101010000010001010100010000010101010001010001010101010000000001010101000100000001000001000101010100010101010101000100010101010100000000000001000101010401000000",
5978 !       "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100000100010000000001000101000100010001010100010001000101010000010100010101010101010001000101010100000100000000010101010000010101010100010000000000010100000100010101010000010100010100000101010001000000000001010000010000000001010100000000000000010100000000010100000100000000010001010000010101010101010001000100010001010100000101010000000101000101010100000101010100010101000100000001000000010100000101000001000100010000000001010101000001010100010001000000010100000001000001010001000100010000010101010101000101000000fd000101000100000000010101010000000001000001000101000001010001000101010100010101000101010000000101000100010001000001010000000000000001000101000101000001000101010101010000000000010101000001000100000101010000010101010101000000000001010001010101010001000100010100010100000000010101000100010100000101000100010000010101010001000001000101010100010000010101010101000100010100010001000000000100010000010000000000010001010001000100000001000001010101010000010101000101000100000000000101010101010000010101000100010001000100000000fd0001000101010000000001010101010101010101000101010001000100010101010101000100000000000101010100000101010001000101010001000100000000010100000001000101010100010001000000010101000000000000000001010101000000010100010001010000000001000101010000000100010101000000000000000101010100000101010100010001010100010001000001000101000101010100010101000000000100010001010101010100010000000101000101010001010000010000010101000101010000000001010000000100010001000100000000000101000000010100000101000101010000010001010000010001000001010401000001",
5979 !       "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100000100010000000001000101000100010001010100010001000101010000010100010101010101010001000101010100000100000000010101010000010101010100010000000000010100000100010101010000010100010100000101010001000000000001010000010000000001010100000000000000010100000000010100000100000000010001010000010101010101010001000100010001010100000101010000000101000101010100000101010100010101000100000001000000010100000101000001000100010000000001010101000001010100010001000000010100000001000001010001000100010000010101010101000101000000fd000101010101010101000000000101000001000000000101000100010001010101000000010101000101010101000100010001010101000000010000000001000000000100000101000000000001010001010000000101010000010001010001010000010100000001000000000101010001000001000001010000000100010100000000000001010000010100010100000001010000010100010000000100010100000100000001000100010000010101000101010100000000000000010100000001000000000100000001000000000001010001000100010101010101000000000001000101010001000001010001000100010100010001000001000000000001fd0001000000000001000001010100010000010001010000000101010001000100010100010101000001010000000101010100000100000100010001000100010001000100010001000100010101010100000100000101000000010101000000000101010100000000000000000101010000010101010001000100010000000101000001000001010100010001010101000001000000000001000000000001000101000000010101000001000001010001010001010100000000010100000101000100010000000100000100000100010000010001000000000101000100000101000101000100010000010100010001010001010101000100010101000100000001010401000100",
5980 !       "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100000100010000000001000101000100010001010100010001000101010000010100010101010101010001000101010100000100000000010101010000010101010100010000000000010100000100010101010000010100010100000101010001000000000001010000010000000001010100000000000000010100000000010100000100000000010001010000010101010101010001000100010001010100000101010000000101000101010100000101010100010101000100000001000000010100000101000001000100010000000001010101000001010100010001000000010100000001000001010001000100010000010101010101000101000000fd000101010101010101000000000101000001000000000101000100010001010101000000010101000101010101000100010001010101000000010000000001000000000100000101000000000001010001010000000101010000010001010001010000010100000001000000000101010001000001000001010000000100010100000000000001010000010100010100000001010000010100010000000100010100000100000001000100010000010101000101010100000000000000010100000001000000000100000001000000000001010001000100010101010101000000000001000101010001000001010001000100010100010001000001000000000001fd0001010000000100010101000001000001000100010000010000010101000101000000010100010000010001000000000100000101010000000101010101010101000000000101000101000000010001010001010000010100000000000001010100010001000100000001000100000100000000010100000101010001010101010100000001010000010101010000010101010000000101010001000101000100010101000001000100000101010000010100000101010100000101000000000001000001010001010101010101000001010100000001010100000100010101010001010000010001010000000000010001000101010100000001000001010001010401000101",
5981 !       "04fd000100000101010001000000010100000101010000000101000101000000010001010000000000010000000001010101000001010000010101000000000000000001010001000101010101010000000001000100000001010001000000010001000001000101000000000101000101000101000101010000000100000000010100010000000101010000010001010001010000010001010101010100000000010001010000010100000100010001010100010001000000000101010101000001000101010000010101000101000101000101000001000101000001010000010101000100000000000100000001010101010100010001000100000000000001010001fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
5982 !       "04fd000100000101010001000000010100000101010000000101000101000000010001010000000000010000000001010101000001010000010101000000000000000001010001000101010101010000000001000100000001010001000000010001000001000101000000000101000101000101000101010000000100000000010100010000000101010000010001010001010000010001010101010100000000010001010000010100000100010001010100010001000000000101010101000001000101010000010101000101000101000101000001000101000001010000010101000100000000000100000001010101010100010001000100000000000001010001fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
5983 !       "04fd000100000101010001000000010100000101010000000101000101000000010001010000000000010000000001010101000001010000010101000000000000000001010001000101010101010000000001000100000001010001000000010001000001000101000000000101000101000101000101010000000100000000010100010000000101010000010001010001010000010001010101010100000000010001010000010100000100010001010100010001000000000101010101000001000101010000010101000101000101000101000001000101000001010000010101000100000000000100000001010101010100010001000100000000000001010001fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
5984 !       "04fd000100000101010001000000010100000101010000000101000101000000010001010000000000010000000001010101000001010000010101000000000000000001010001000101010101010000000001000100000001010001000000010001000001000101000000000101000101000101000101010000000100000000010100010000000101010000010001010001010000010001010101010100000000010001010000010100000100010001010100010001000000000101010101000001000101010000010101000101000101000101000001000101000001010000010101000100000000000100000001010101010100010001000100000000000001010001fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
5985 !       "04fd000100000101010001000000010100000101010000000101000101000000010001010000000000010000000001010101000001010000010101000000000000000001010001000101010101010000000001000100000001010001000000010001000001000101000000000101000101000101000101010000000100000000010100010000000101010000010001010001010000010001010101010100000000010001010000010100000100010001010100010001000000000101010101000001000101010000010101000101000101000101000001000101000001010000010101000100000000000100000001010101010100010001000100000000000001010001fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
5986 !       "04fd000100000101010001000000010100000101010000000101000101000000010001010000000000010000000001010101000001010000010101000000000000000001010001000101010101010000000001000100000001010001000000010001000001000101000000000101000101000101000101010000000100000000010100010000000101010000010001010001010000010001010101010100000000010001010000010100000100010001010100010001000000000101010101000001000101010000010101000101000101000101000001000101000001010000010101000100000000000100000001010101010100010001000100000000000001010001fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001010101010101010100010101010100000000010100010100000000000000010100010101000100000100010000010100000100010000000001000000010001000101010000000000010000010000000000010000010100000001010101000000000001000000000100000100000101010101010101010101000100010101000101010000010101000100000100000000010000010000000101000000010101010000010101010100010101000100000000000001010100000101010101000001000001000101010001010101000000010100010100010100010000010100010001010101010001010100000001000101010101010001000000010000000001010400010001",
5987 !       "04fd000100000101010001000000010100000101010000000101000101000000010001010000000000010000000001010101000001010000010101000000000000000001010001000101010101010000000001000100000001010001000000010001000001000101000000000101000101000101000101010000000100000000010100010000000101010000010001010001010000010001010101010100000000010001010000010100000100010001010100010001000000000101010101000001000101010000010101000101000101000101000001000101000001010000010101000100000000000100000001010101010100010001000100000000000001010001fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001000100010000000001010000000000000100010100010000000001010000000000010100000000010101000000000101010000010000000101000001000000010101000000000101010101000101000000010001000001000100000100010101000001010001000000000101000001000100000001000101000101010101010101000001010100000100010001010101010101000100010100010100010101010101000100000001000101000000010001010000010100000001000001000001010001000001000000010000010000010001000100010000000100000000010001010001010000010001000001000001010000010100010000000100010100010400010100",
5988 !       "04fd000100000101010001000000010100000101010000000101000101000000010001010000000000010000000001010101000001010000010101000000000000000001010001000101010101010000000001000100000001010001000000010001000001000101000000000101000101000101000101010000000100000000010100010000000101010000010001010001010000010001010101010100000000010001010000010100000100010001010100010001000000000101010101000001000101010000010101000101000101000101000001000101000001010000010101000100000000000100000001010101010100010001000100000000000001010001fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001010000000100010100000001000101000101000001010001000001010101010001010000000100000001000001000000000101010001000101010100000100000100000000010001000101000101010000000101000000000000010100010000000100000101000000000000010001010001000001000100000101000100000001000100000101000101010101000001000001000100000101000100000101000100000001000101010101000001000100000001000000010001010101000101000001000000010000010001010001010100000000000000010000010000010000010100000001010000000000000001010101000001010101000101000000010400010101",
5989 !       "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101000100000101010000000101000101000101010001010000000001010101010001010101000001010000000101010000000000000001010100000001010101000000010101010101010001010000000001010100010000010101010001000000010100010000010000000101000101010000000101000100000000000000010000010100010000010101010001000101010100010101010100000101000000000000010001010001010100010101010101010000010101010001010101010000000000010001010100000100010101000101010100010001000000010001000001010000010001010001000000000101000100010100010100010100010000fd000101000100000000010101010000000001000001000101000001010001000101010100010101000101010000000101000100010001000001010000000000000001000101000101000001000101010101010000000000010101000001000100000101010000010101010101000000000001010001010101010001000100010100010100000000010101000100010100000101000100010000010101010001000001000101010100010000010101010101000100010100010001000000000100010000010000000000010001010001000100000001000001010101010000010101000101000100000000000101010101010000010101000100010001000100000000fd0001010100010100000000000001010101000101010100010100000100000100010000000000000000000001010000000101000100010001010100000101010100010100000000000000010100000101000100000101000001000000010000000100000001000101000101000000010100010000000000010000010100010101010001000101010001010101010001000000000000000001010100000101000100000001000101000100010100010001010101000100010101010000010001010100010000010101010001010001010101010000000001010101000100000001000001000101010100010101010101000100010101010100000000000001000101010401000000",
5990 !       "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101000100000101010000000101000101000101010001010000000001010101010001010101000001010000000101010000000000000001010100000001010101000000010101010101010001010000000001010100010000010101010001000000010100010000010000000101000101010000000101000100000000000000010000010100010000010101010001000101010100010101010100000101000000000000010001010001010100010101010101010000010101010001010101010000000000010001010100000100010101000101010100010001000000010001000001010000010001010001000000000101000100010100010100010100010000fd000101000100000000010101010000000001000001000101000001010001000101010100010101000101010000000101000100010001000001010000000000000001000101000101000001000101010101010000000000010101000001000100000101010000010101010101000000000001010001010101010001000100010100010100000000010101000100010100000101000100010000010101010001000001000101010100010000010101010101000100010100010001000000000100010000010000000000010001010001000100000001000001010101010000010101000101000100000000000101010101010000010101000100010001000100000000fd0001000101010000000001010101010101010101000101010001000100010101010101000100000000000101010100000101010001000101010001000100000000010100000001000101010100010001000000010101000000000000000001010101000000010100010001010000000001000101010000000100010101000000000000000101010100000101010100010001010100010001000001000101000101010100010101000000000100010001010101010100010000000101000101010001010000010000010101000101010000000001010000000100010001000100000000000101000000010100000101000101010000010001010000010001000001010401000001",
5991 !       "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101000100000101010000000101000101000101010001010000000001010101010001010101000001010000000101010000000000000001010100000001010101000000010101010101010001010000000001010100010000010101010001000000010100010000010000000101000101010000000101000100000000000000010000010100010000010101010001000101010100010101010100000101000000000000010001010001010100010101010101010000010101010001010101010000000000010001010100000100010101000101010100010001000000010001000001010000010001010001000000000101000100010100010100010100010000fd000101010101010101000000000101000001000000000101000100010001010101000000010101000101010101000100010001010101000000010000000001000000000100000101000000000001010001010000000101010000010001010001010000010100000001000000000101010001000001000001010000000100010100000000000001010000010100010100000001010000010100010000000100010100000100000001000100010000010101000101010100000000000000010100000001000000000100000001000000000001010001000100010101010101000000000001000101010001000001010001000100010100010001000001000000000001fd0001000000000001000001010100010000010001010000000101010001000100010100010101000001010000000101010100000100000100010001000100010001000100010001000100010101010100000100000101000000010101000000000101010100000000000000000101010000010101010001000100010000000101000001000001010100010001010101000001000000000001000000000001000101000000010101000001000001010001010001010100000000010100000101000100010000000100000100000100010000010001000000000101000100000101000101000100010000010100010001010001010101000100010101000100000001010401000100",
5992 !       "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101000100000101010000000101000101000101010001010000000001010101010001010101000001010000000101010000000000000001010100000001010101000000010101010101010001010000000001010100010000010101010001000000010100010000010000000101000101010000000101000100000000000000010000010100010000010101010001000101010100010101010100000101000000000000010001010001010100010101010101010000010101010001010101010000000000010001010100000100010101000101010100010001000000010001000001010000010001010001000000000101000100010100010100010100010000fd000101010101010101000000000101000001000000000101000100010001010101000000010101000101010101000100010001010101000000010000000001000000000100000101000000000001010001010000000101010000010001010001010000010100000001000000000101010001000001000001010000000100010100000000000001010000010100010100000001010000010100010000000100010100000100000001000100010000010101000101010100000000000000010100000001000000000100000001000000000001010001000100010101010101000000000001000101010001000001010001000100010100010001000001000000000001fd0001010000000100010101000001000001000100010000010000010101000101000000010100010000010001000000000100000101010000000101010101010101000000000101000101000000010001010001010000010100000000000001010100010001000100000001000100000100000000010100000101010001010101010100000001010000010101010000010101010000000101010001000101000100010101000001000100000101010000010100000101010100000101000000000001000001010001010101010101000001010100000001010100000100010101010001010000010001010000000000010001000101010100000001000001010001010401000101",
5993 !       "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010100010100000001000001000101000000010001000000010001010000000100010000000101010100000101010101000000000000000001000100000001010000010100000101000000000000000000010101000100000000010000010000000101000000010101010001000001000000000001010001000101010001000000000001000001000100010101010101000001000101000100000101000100000100010001010100010101000100010101000001000100000100000100010001010000000101010000010100000101000100000100000000010000000101010000010101010100000101010000000001010101000101000000010000010001fd000101010001010001000001000100010100010000010100000001000101010101000000000100010101010001010100000101000101000100000001010001000001000101000000010000000101000001010001000100010101010000010100000100010101000101010100000101010101010001010101010001010000010001000100000001010000010101000001000101010001000100000100000100000001010100000000000001010001000001000001010000000100000100000000010101000101010001000101010101010100010101010100000101010100010001000000000101000000000001010001010101000100010000010101000101000000fd0001000000010100000001000000000000000100000100010100000101010101010101010000010000000000010000000100000101000000010101000000000000000100010001000000000100000100000101010000000101000000010100010001000001010000010001000101010001010100010000010100000101010100000101000001000000000101010100010101010100010000000001000100000000010000000001010100010000010101000001000001000000000100010101000000000100000100000001010101000100010100000001010001000101000000010100010000010000010001000100010101010100000001010001010100010000010401010000",
5994 !       "04fd000100000101010000010001000101000101000101010100010101010000010000000001000100000100000101010101010100000000000100010101000001010100000101000000000101000000000100010101010000000100010001000001000001010100010100010101000001000001010001010001010000000001010101010001010100000100010101010100010001000000000101000001000000000001000001000101010001010001010100010101010001000101010100010001000000000000000001010001010101000001000100000001010001000101000100000101010100010001000100010101000000010001000101000000000101000000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
5995 !       "04fd000100000101010000010001000101000101000101010100010101010000010000000001000100000100000101010101010100000000000100010101000001010100000101000000000101000000000100010101010000000100010001000001000001010100010100010101000001000001010001010001010000000001010101010001010100000100010101010100010001000000000101000001000000000001000001000101010001010001010100010101010001000101010100010001000000000000000001010001010101000001000100000001010001000101000100000101010100010001000100010101000000010001000101000000000101000000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
5996 !       "04fd000100000101010000010001000101000101000101010100010101010000010000000001000100000100000101010101010100000000000100010101000001010100000101000000000101000000000100010101010000000100010001000001000001010100010100010101000001000001010001010001010000000001010101010001010100000100010101010100010001000000000101000001000000000001000001000101010001010001010100010101010001000101010100010001000000000000000001010001010101000001000100000001010001000101000100000101010100010001000100010101000000010001000101000000000101000000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
5997 !       "04fd000100000101010000010001000101000101000101010100010101010000010000000001000100000100000101010101010100000000000100010101000001010100000101000000000101000000000100010101010000000100010001000001000001010100010100010101000001000001010001010001010000000001010101010001010100000100010101010100010001000000000101000001000000000001000001000101010001010001010100010101010001000101010100010001000000000000000001010001010101000001000100000001010001000101000100000101010100010001000100010101000000010001000101000000000101000000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
5998 !       "04fd000100000101010000010001000101000101000101010100010101010000010000000001000100000100000101010101010100000000000100010101000001010100000101000000000101000000000100010101010000000100010001000001000001010100010100010101000001000001010001010001010000000001010101010001010100000100010101010100010001000000000101000001000000000001000001000101010001010001010100010101010001000101010100010001000000000000000001010001010101000001000100000001010001000101000100000101010100010001000100010101000000010001000101000000000101000000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
5999 !       "04fd000100000101010000010001000101000101000101010100010101010000010000000001000100000100000101010101010100000000000100010101000001010100000101000000000101000000000100010101010000000100010001000001000001010100010100010101000001000001010001010001010000000001010101010001010100000100010101010100010001000000000101000001000000000001000001000101010001010001010100010101010001000101010100010001000000000000000001010001010101000001000100000001010001000101000100000101010100010001000100010101000000010001000101000000000101000000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001010101010101010100010101010100000000010100010100000000000000010100010101000100000100010000010100000100010000000001000000010001000101010000000000010000010000000000010000010100000001010101000000000001000000000100000100000101010101010101010101000100010101000101010000010101000100000100000000010000010000000101000000010101010000010101010100010101000100000000000001010100000101010101000001000001000101010001010101000000010100010100010100010000010100010001010101010001010100000001000101010101010001000000010000000001010400010001",
6000 !       "04fd000100000101010000010001000101000101000101010100010101010000010000000001000100000100000101010101010100000000000100010101000001010100000101000000000101000000000100010101010000000100010001000001000001010100010100010101000001000001010001010001010000000001010101010001010100000100010101010100010001000000000101000001000000000001000001000101010001010001010100010101010001000101010100010001000000000000000001010001010101000001000100000001010001000101000100000101010100010001000100010101000000010001000101000000000101000000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001000100010000000001010000000000000100010100010000000001010000000000010100000000010101000000000101010000010000000101000001000000010101000000000101010101000101000000010001000001000100000100010101000001010001000000000101000001000100000001000101000101010101010101000001010100000100010001010101010101000100010100010100010101010101000100000001000101000000010001010000010100000001000001000001010001000001000000010000010000010001000100010000000100000000010001010001010000010001000001000001010000010100010000000100010100010400010100",
6001 !       "04fd000100000101010000010001000101000101000101010100010101010000010000000001000100000100000101010101010100000000000100010101000001010100000101000000000101000000000100010101010000000100010001000001000001010100010100010101000001000001010001010001010000000001010101010001010100000100010101010100010001000000000101000001000000000001000001000101010001010001010100010101010001000101010100010001000000000000000001010001010101000001000100000001010001000101000100000101010100010001000100010101000000010001000101000000000101000000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001010000000100010100000001000101000101000001010001000001010101010001010000000100000001000001000000000101010001000101010100000100000100000000010001000101000101010000000101000000000000010100010000000100000101000000000000010001010001000001000100000101000100000001000100000101000101010101000001000001000100000101000100000101000100000001000101010101000001000100000001000000010001010101000101000001000000010000010001010001010100000000000000010000010000010000010100000001010000000000000001010101000001010101000101000000010400010101",
6002 !       "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100010101000101000100000001000100000100010100000100010000000001000100010000000000010100000101000100010001000101010100010101000000010000000001010100010001010000010001000101000001010101010001000000000000000000000000000100000101010100000100000101000000000001000001010100000001000001000000000101010100010100010000010100010001010100000000000000010101000101000001000101000001000101000000000001000100010101000001010101010100000101010000010101010000010000000101010001010100010101000001010001010001000100000001000100010000fd000101000100000000010101010000000001000001000101000001010001000101010100010101000101010000000101000100010001000001010000000000000001000101000101000001000101010101010000000000010101000001000100000101010000010101010101000000000001010001010101010001000100010100010100000000010101000100010100000101000100010000010101010001000001000101010100010000010101010101000100010100010001000000000100010000010000000000010001010001000100000001000001010101010000010101000101000100000000000101010101010000010101000100010001000100000000fd0001010100010100000000000001010101000101010100010100000100000100010000000000000000000001010000000101000100010001010100000101010100010100000000000000010100000101000100000101000001000000010000000100000001000101000101000000010100010000000000010000010100010101010001000101010001010101010001000000000000000001010100000101000100000001000101000100010100010001010101000100010101010000010001010100010000010101010001010001010101010000000001010101000100000001000001000101010100010101010101000100010101010100000000000001000101010401000000",
6003 !       "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100010101000101000100000001000100000100010100000100010000000001000100010000000000010100000101000100010001000101010100010101000000010000000001010100010001010000010001000101000001010101010001000000000000000000000000000100000101010100000100000101000000000001000001010100000001000001000000000101010100010100010000010100010001010100000000000000010101000101000001000101000001000101000000000001000100010101000001010101010100000101010000010101010000010000000101010001010100010101000001010001010001000100000001000100010000fd000101000100000000010101010000000001000001000101000001010001000101010100010101000101010000000101000100010001000001010000000000000001000101000101000001000101010101010000000000010101000001000100000101010000010101010101000000000001010001010101010001000100010100010100000000010101000100010100000101000100010000010101010001000001000101010100010000010101010101000100010100010001000000000100010000010000000000010001010001000100000001000001010101010000010101000101000100000000000101010101010000010101000100010001000100000000fd0001000101010000000001010101010101010101000101010001000100010101010101000100000000000101010100000101010001000101010001000100000000010100000001000101010100010001000000010101000000000000000001010101000000010100010001010000000001000101010000000100010101000000000000000101010100000101010100010001010100010001000001000101000101010100010101000000000100010001010101010100010000000101000101010001010000010000010101000101010000000001010000000100010001000100000000000101000000010100000101000101010000010001010000010001000001010401000001",
6004 !       "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100010101000101000100000001000100000100010100000100010000000001000100010000000000010100000101000100010001000101010100010101000000010000000001010100010001010000010001000101000001010101010001000000000000000000000000000100000101010100000100000101000000000001000001010100000001000001000000000101010100010100010000010100010001010100000000000000010101000101000001000101000001000101000000000001000100010101000001010101010100000101010000010101010000010000000101010001010100010101000001010001010001000100000001000100010000fd000101010101010101000000000101000001000000000101000100010001010101000000010101000101010101000100010001010101000000010000000001000000000100000101000000000001010001010000000101010000010001010001010000010100000001000000000101010001000001000001010000000100010100000000000001010000010100010100000001010000010100010000000100010100000100000001000100010000010101000101010100000000000000010100000001000000000100000001000000000001010001000100010101010101000000000001000101010001000001010001000100010100010001000001000000000001fd0001000000000001000001010100010000010001010000000101010001000100010100010101000001010000000101010100000100000100010001000100010001000100010001000100010101010100000100000101000000010101000000000101010100000000000000000101010000010101010001000100010000000101000001000001010100010001010101000001000000000001000000000001000101000000010101000001000001010001010001010100000000010100000101000100010000000100000100000100010000010001000000000101000100000101000101000100010000010100010001010001010101000100010101000100000001010401000100",
6005 !       "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100010101000101000100000001000100000100010100000100010000000001000100010000000000010100000101000100010001000101010100010101000000010000000001010100010001010000010001000101000001010101010001000000000000000000000000000100000101010100000100000101000000000001000001010100000001000001000000000101010100010100010000010100010001010100000000000000010101000101000001000101000001000101000000000001000100010101000001010101010100000101010000010101010000010000000101010001010100010101000001010001010001000100000001000100010000fd000101010101010101000000000101000001000000000101000100010001010101000000010101000101010101000100010001010101000000010000000001000000000100000101000000000001010001010000000101010000010001010001010000010100000001000000000101010001000001000001010000000100010100000000000001010000010100010100000001010000010100010000000100010100000100000001000100010000010101000101010100000000000000010100000001000000000100000001000000000001010001000100010101010101000000000001000101010001000001010001000100010100010001000001000000000001fd0001010000000100010101000001000001000100010000010000010101000101000000010100010000010001000000000100000101010000000101010101010101000000000101000101000000010001010001010000010100000000000001010100010001000100000001000100000100000000010100000101010001010101010100000001010000010101010000010101010000000101010001000101000100010101000001000100000101010000010100000101010100000101000000000001000001010001010101010101000001010100000001010100000100010101010001010000010001010000000000010001000101010100000001000001010001010401000101",
6006 !       "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010100010100000001000001000101000000010001000000010001010000000100010000000101010100000101010101000000000000000001000100000001010000010100000101000000000000000000010101000100000000010000010000000101000000010101010001000001000000000001010001000101010001000000000001000001000100010101010101000001000101000100000101000100000100010001010100010101000100010101000001000100000100000100010001010000000101010000010100000101000100000100000000010000000101010000010101010100000101010000000001010101000101000000010000010001fd000100000001010000000000000001010000000001010101000100000001010100000100010000000000000001010100010100010001000100010000000101000001010001000001010000010001000100010000000101010100010101000101000001000000010001010101010100000001000101000000010100000100000000000000000000000100010101010001010100010000010000000000010100000000000001010000000100000101000001000101010100000101000000000000000000000101000101000100010001000000000100000001000000000000000001000100000001010001000100000101010100000101010101000100000100010100fd0001000000010100000001000000000000000100000100010100000101010101010101010000010000000000010000000100000101000000010101000000000000000100010001000000000100000100000101010000000101000000010100010001000001010000010001000101010001010100010000010100000101010100000101000001000000000101010100010101010100010000000001000100000000010000000001010100010000010101000001000001000000000100010101000000000100000100000001010101000100010100000001010001000101000000010100010000010000010001000100010101010100000001010001010100010000010401010000",
6007 !       "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010100010100000001000001000101000000010001000000010001010000000100010000000101010100000101010101000000000000000001000100000001010000010100000101000000000000000000010101000100000000010000010000000101000000010101010001000001000000000001010001000101010001000000000001000001000100010101010101000001000101000100000101000100000100010001010100010101000100010101000001000100000100000100010001010000000101010000010100000101000100000100000000010000000101010000010101010100000101010000000001010101000101000000010000010001fd000100000001010000000000000001010000000001010101000100000001010100000100010000000000000001010100010100010001000100010000000101000001010001000001010000010001000100010000000101010100010101000101000001000000010001010101010100000001000101000000010100000100000000000000000000000100010101010001010100010000010000000000010100000000000001010000000100000101000001000101010100000101000000000000000000000101000101000100010001000000000100000001000000000000000001000100000001010001000100000101010100000101010101000100000100010100fd0001010001010101010000000101010101010001010001010000000000010100000000000001010101010000000100010100000001000100000000000100000100000000000101000001000000010101010001010000010101010000000101010101000101010100000001010000010001000101010000000101010101010101010101000101000000000101000101010001010101010101000101000100000101000001010100000001010001010100010101000001000001010000010000010101000101010101000001010100000101000101010001000101010100000100000100000100000000000000000101000100000000000100000100000001000001000401010001",
6008 !       "04fd000100010000000100010100000001010000010001000100010100010000000100000100000100000100010100000101010001000000010000010101000000010100010001010001000100000000000000010001010000000001010101000000000000010001010000000000010101010000000001000000000100000001000100010101010000010101010000010000000000000000010100010100010101000001000101000001000001000100000100010000010101000101000100000100000101010100000000010001000100000100010000000000010001000000010100010001010001000100000001010100000101000001000000010100010001010101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
6009 !       "04fd000100010000000100010100000001010000010001000100010100010000000100000100000100000100010100000101010001000000010000010101000000010100010001010001000100000000000000010001010000000001010101000000000000010001010000000000010101010000000001000000000100000001000100010101010000010101010000010000000000000000010100010100010101000001000101000001000001000100000100010000010101000101000100000100000101010100000000010001000100000100010000000000010001000000010100010001010001000100000001010100000101000001000000010100010001010101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
6010 !       "04fd000100010000000100010100000001010000010001000100010100010000000100000100000100000100010100000101010001000000010000010101000000010100010001010001000100000000000000010001010000000001010101000000000000010001010000000000010101010000000001000000000100000001000100010101010000010101010000010000000000000000010100010100010101000001000101000001000001000100000100010000010101000101000100000100000101010100000000010001000100000100010000000000010001000000010100010001010001000100000001010100000101000001000000010100010001010101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
6011 !       "04fd000100010000000100010100000001010000010001000100010100010000000100000100000100000100010100000101010001000000010000010101000000010100010001010001000100000000000000010001010000000001010101000000000000010001010000000000010101010000000001000000000100000001000100010101010000010101010000010000000000000000010100010100010101000001000101000001000001000100000100010000010101000101000100000100000101010100000000010001000100000100010000000000010001000000010100010001010001000100000001010100000101000001000000010100010001010101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
6012 !       "04fd000100010000000100010100000001010000010001000100010100010000000100000100000100000100010100000101010001000000010000010101000000010100010001010001000100000000000000010001010000000001010101000000000000010001010000000000010101010000000001000000000100000001000100010101010000010101010000010000000000000000010100010100010101000001000101000001000001000100000100010000010101000101000100000100000101010100000000010001000100000100010000000000010001000000010100010001010001000100000001010100000101000001000000010100010001010101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
6013 !       "04fd000100010000000100010100000001010000010001000100010100010000000100000100000100000100010100000101010001000000010000010101000000010100010001010001000100000000000000010001010000000001010101000000000000010001010000000000010101010000000001000000000100000001000100010101010000010101010000010000000000000000010100010100010101000001000101000001000001000100000100010000010101000101000100000100000101010100000000010001000100000100010000000000010001000000010100010001010001000100000001010100000101000001000000010100010001010101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001010101010101010100010101010100000000010100010100000000000000010100010101000100000100010000010100000100010000000001000000010001000101010000000000010000010000000000010000010100000001010101000000000001000000000100000100000101010101010101010101000100010101000101010000010101000100000100000000010000010000000101000000010101010000010101010100010101000100000000000001010100000101010101000001000001000101010001010101000000010100010100010100010000010100010001010101010001010100000001000101010101010001000000010000000001010400010001",
6014 !       "04fd000100010000000100010100000001010000010001000100010100010000000100000100000100000100010100000101010001000000010000010101000000010100010001010001000100000000000000010001010000000001010101000000000000010001010000000000010101010000000001000000000100000001000100010101010000010101010000010000000000000000010100010100010101000001000101000001000001000100000100010000010101000101000100000100000101010100000000010001000100000100010000000000010001000000010100010001010001000100000001010100000101000001000000010100010001010101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001000100010000000001010000000000000100010100010000000001010000000000010100000000010101000000000101010000010000000101000001000000010101000000000101010101000101000000010001000001000100000100010101000001010001000000000101000001000100000001000101000101010101010101000001010100000100010001010101010101000100010100010100010101010101000100000001000101000000010001010000010100000001000001000001010001000001000000010000010000010001000100010000000100000000010001010001010000010001000001000001010000010100010000000100010100010400010100",
6015 !       "04fd000100010000000100010100000001010000010001000100010100010000000100000100000100000100010100000101010001000000010000010101000000010100010001010001000100000000000000010001010000000001010101000000000000010001010000000000010101010000000001000000000100000001000100010101010000010101010000010000000000000000010100010100010101000001000101000001000001000100000100010000010101000101000100000100000101010100000000010001000100000100010000000000010001000000010100010001010001000100000001010100000101000001000000010100010001010101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001010000000100010100000001000101000101000001010001000001010101010001010000000100000001000001000000000101010001000101010100000100000100000000010001000101000101010000000101000000000000010100010000000100000101000000000000010001010001000001000100000101000100000001000100000101000101010101000001000001000100000101000100000101000100000001000101010101000001000100000001000000010001010101000101000001000000010000010001010001010100000000000000010000010000010000010100000001010000000000000001010101000001010101000101000000010400010101",
6016 !       "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100000101000000000001000100000100000000000001000101010001010001010100010101010100010100000100010001000101000101010100010100000000000000010101010001010000000001000001000100000101010000000001000000010100000101010101000000000100010101010101010000010000000000010101010100010101010000000001000000010001010101000100010100010000000100010001000001000000000101010100010101010000010101010000010001010101000101010101000100010101010001010101000100010001000001000000010000000000000101010101010100010100000100000001000000000001fd000101000100000000010101010000000001000001000101000001010001000101010100010101000101010000000101000100010001000001010000000000000001000101000101000001000101010101010000000000010101000001000100000101010000010101010101000000000001010001010101010001000100010100010100000000010101000100010100000101000100010000010101010001000001000101010100010000010101010101000100010100010001000000000100010000010000000000010001010001000100000001000001010101010000010101000101000100000000000101010101010000010101000100010001000100000000fd0001010100010100000000000001010101000101010100010100000100000100010000000000000000000001010000000101000100010001010100000101010100010100000000000000010100000101000100000101000001000000010000000100000001000101000101000000010100010000000000010000010100010101010001000101010001010101010001000000000000000001010100000101000100000001000101000100010100010001010101000100010101010000010001010100010000010101010001010001010101010000000001010101000100000001000001000101010100010101010101000100010101010100000000000001000101010401000000",
6017 !       "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100000101000000000001000100000100000000000001000101010001010001010100010101010100010100000100010001000101000101010100010100000000000000010101010001010000000001000001000100000101010000000001000000010100000101010101000000000100010101010101010000010000000000010101010100010101010000000001000000010001010101000100010100010000000100010001000001000000000101010100010101010000010101010000010001010101000101010101000100010101010001010101000100010001000001000000010000000000000101010101010100010100000100000001000000000001fd000101000100000000010101010000000001000001000101000001010001000101010100010101000101010000000101000100010001000001010000000000000001000101000101000001000101010101010000000000010101000001000100000101010000010101010101000000000001010001010101010001000100010100010100000000010101000100010100000101000100010000010101010001000001000101010100010000010101010101000100010100010001000000000100010000010000000000010001010001000100000001000001010101010000010101000101000100000000000101010101010000010101000100010001000100000000fd0001000101010000000001010101010101010101000101010001000100010101010101000100000000000101010100000101010001000101010001000100000000010100000001000101010100010001000000010101000000000000000001010101000000010100010001010000000001000101010000000100010101000000000000000101010100000101010100010001010100010001000001000101000101010100010101000000000100010001010101010100010000000101000101010001010000010000010101000101010000000001010000000100010001000100000000000101000000010100000101000101010000010001010000010001000001010401000001",
6018 !       "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100000101000000000001000100000100000000000001000101010001010001010100010101010100010100000100010001000101000101010100010100000000000000010101010001010000000001000001000100000101010000000001000000010100000101010101000000000100010101010101010000010000000000010101010100010101010000000001000000010001010101000100010100010000000100010001000001000000000101010100010101010000010101010000010001010101000101010101000100010101010001010101000100010001000001000000010000000000000101010101010100010100000100000001000000000001fd000101010101010101000000000101000001000000000101000100010001010101000000010101000101010101000100010001010101000000010000000001000000000100000101000000000001010001010000000101010000010001010001010000010100000001000000000101010001000001000001010000000100010100000000000001010000010100010100000001010000010100010000000100010100000100000001000100010000010101000101010100000000000000010100000001000000000100000001000000000001010001000100010101010101000000000001000101010001000001010001000100010100010001000001000000000001fd0001000000000001000001010100010000010001010000000101010001000100010100010101000001010000000101010100000100000100010001000100010001000100010001000100010101010100000100000101000000010101000000000101010100000000000000000101010000010101010001000100010000000101000001000001010100010001010101000001000000000001000000000001000101000000010101000001000001010001010001010100000000010100000101000100010000000100000100000100010000010001000000000101000100000101000101000100010000010100010001010001010101000100010101000100000001010401000100",
6019 !       "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100000101000000000001000100000100000000000001000101010001010001010100010101010100010100000100010001000101000101010100010100000000000000010101010001010000000001000001000100000101010000000001000000010100000101010101000000000100010101010101010000010000000000010101010100010101010000000001000000010001010101000100010100010000000100010001000001000000000101010100010101010000010101010000010001010101000101010101000100010101010001010101000100010001000001000000010000000000000101010101010100010100000100000001000000000001fd000101010101010101000000000101000001000000000101000100010001010101000000010101000101010101000100010001010101000000010000000001000000000100000101000000000001010001010000000101010000010001010001010000010100000001000000000101010001000001000001010000000100010100000000000001010000010100010100000001010000010100010000000100010100000100000001000100010000010101000101010100000000000000010100000001000000000100000001000000000001010001000100010101010101000000000001000101010001000001010001000100010100010001000001000000000001fd0001010000000100010101000001000001000100010000010000010101000101000000010100010000010001000000000100000101010000000101010101010101000000000101000101000000010001010001010000010100000000000001010100010001000100000001000100000100000000010100000101010001010101010100000001010000010101010000010101010000000101010001000101000100010101000001000100000101010000010100000101010100000101000000000001000001010001010101010101000001010100000001010100000100010101010001010000010001010000000000010001000101010100000001000001010001010401000101",
6020 !       "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010100010100000001000001000101000000010001000000010001010000000100010000000101010100000101010101000000000000000001000100000001010000010100000101000000000000000000010101000100000000010000010000000101000000010101010001000001000000000001010001000101010001000000000001000001000100010101010101000001000101000100000101000100000100010001010100010101000100010101000001000100000100000100010001010000000101010000010100000101000100000100000000010000000101010000010101010100000101010000000001010101000101000000010000010001fd000100000100010101010001010101000100010000010001010001010100010100000101000000010101000001000001000100010100010000010001000000010001000001010000010101000100010000010100000101000001010100010100010100010100000101010100000000010100010101010001010000000000000000010001010001000101010100000101010101010001010100000100010000010001010100000100000100000101000100010000010100000001000100010000000101000000000001010001010101010101010001000101010100010000000001010101000101000001000001010101000000010001000000000101010001010101fd0001000000010100000001000000000000000100000100010100000101010101010101010000010000000000010000000100000101000000010101000000000000000100010001000000000100000100000101010000000101000000010100010001000001010000010001000101010001010100010000010100000101010100000101000001000000000101010100010101010100010000000001000100000000010000000001010100010000010101000001000001000000000100010101000000000100000100000001010101000100010100000001010001000101000000010100010000010000010001000100010101010100000001010001010100010000010401010000",
6021 !       "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010100010100000001000001000101000000010001000000010001010000000100010000000101010100000101010101000000000000000001000100000001010000010100000101000000000000000000010101000100000000010000010000000101000000010101010001000001000000000001010001000101010001000000000001000001000100010101010101000001000101000100000101000100000100010001010100010101000100010101000001000100000100000100010001010000000101010000010100000101000100000100000000010000000101010000010101010100000101010000000001010101000101000000010000010001fd000100000100010101010001010101000100010000010001010001010100010100000101000000010101000001000001000100010100010000010001000000010001000001010000010101000100010000010100000101000001010100010100010100010100000101010100000000010100010101010001010000000000000000010001010001000101010100000101010101010001010100000100010000010001010100000100000100000101000100010000010100000001000100010000000101000000000001010001010101010101010001000101010100010000000001010101000101000001000001010101000000010001000000000101010001010101fd0001010001010101010000000101010101010001010001010000000000010100000000000001010101010000000100010100000001000100000000000100000100000000000101000001000000010101010001010000010101010000000101010101000101010100000001010000010001000101010000000101010101010101010101000101000000000101000101010001010101010101000101000100000101000001010100000001010001010100010101000001000001010000010000010101000101010101000001010100000101000101010001000101010100000100000100000100000000000000000101000100000000000100000100000001000001000401010001",
6022 !       "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010100010100000001000001000101000000010001000000010001010000000100010000000101010100000101010101000000000000000001000100000001010000010100000101000000000000000000010101000100000000010000010000000101000000010101010001000001000000000001010001000101010001000000000001000001000100010101010101000001000101000100000101000100000100010001010100010101000100010101000001000100000100000100010001010000000101010000010100000101000100000100000000010000000101010000010101010100000101010000000001010101000101000000010000010001fd000101010100010000010001010101010101000000010001010001000100010100010000000100010000000001010000010100010001010000010100000101000001010000010101000001000001000000000100010000010101010100010000010001000100000001010101010000010101010100010100010001000100010000010001000001000100010100010100000101000000000000000100000000010000000001000000010000000100000101000101000101000001000001010000010000000101010100010000010101010101000100000101010100000000010001000100010100010100000001000001000000010100000000000100010000010101fd0001010000000001000001010000010000000000010100010000010101000001010101010000010001010000010101000000010100010001010001010101000000000100000001010001010000000000010001010101000100010101000001010101000100000100000000000101010000010100010101000000010000010000010000000000000000010100000000010001000000010001010100010000010001010000000100000001010100000001010101000100010101010001010100010101000000010101010101010001000001010100000001010001010100010000000000000100010001010000010000000000000101000100010000000100000000000401010100"
6023   ]
6024 diff -crB ./src/test/data/merkle_roots.json ../../komodo-jl777/src/test/data/merkle_roots.json
6025 *** ./src/test/data/merkle_roots.json   2017-01-03 10:40:50.395338477 +0000
6026 --- ../../komodo-jl777/src/test/data/merkle_roots.json  2017-01-03 09:49:08.872507185 +0000
6027 ***************
6028 *** 1,18 ****
6029   [
6030 !       "26ee6e3f8c28892382264d72789c9c65a8577549fe35d3d6df86e0f07cc80057",
6031 !       "0e54a14ab674813f2a558b18df630ae095f2cb775d0bc37677073acb1f8f3443",
6032 !       "d06e16c2e6ee0b28d8f07c76a17976fea549ce2dd1debae260dc3215d265fddb",
6033 !       "52dc4b76365472537ff15cb18a71be54c91d207f5d62fb89bd74af9010ac0e01",
6034 !       "8dd27a2340e34015cd9b00a2ddc011dcdab03d38a49497490d631f71ce9c495e",
6035 !       "0cb8ae3ff2483ea7124237b62d0ac4388477b41e83d3811c6e0dd6fec0b365e6",
6036 !       "a67c1f145456880502a3d020d538fecf0515bd285edd6e3fcae26eb53c1f56d3",
6037 !       "7fb0adeb50e1084359414071486d89ead9c9a3700c64c9892f510f87af6ec27f",
6038 !       "45cd6f71215eabb2c25206471e9293bed2bc924ce5bbc16a8f728ec1e310886f",
6039 !       "01d1f338c2abee217962120611dafe0a0e9de76c18de77cbb1e3a6d3261e887c",
6040 !       "2700b09aa19ce460d509fc3bccfbc80f8381d156a4a52a7f3d4e8b852b5c10ea",
6041 !       "ac96cc858674f67d6c6119f933080cd69c10950409722468d2ac7b81e2cc2bba",
6042 !       "f4930affd93232b6051fe3a5f744a357201bff4363312d1115762a595261f030",
6043 !       "50b48f5226a69a62206f365ac5347c723b43faf9691c04b872225d5c08876eed",
6044 !       "a867397884b157b1db4dd03dc2fd6c40c4650e70b61441d4325e0b18d5280fb6",
6045 !       "52c8456d3538eed3b73778c596c1993ac6d6c337ae5e338391ce6cae58296dec"
6046   ]
6047 --- 1,18 ----
6048   [
6049 !       "95bf71d8e803b8601c14b5949d0f92690181154ef9d82eb3e24852266823317a",
6050 !       "73f18d3f9cd11010aa01d4f444039e566f14ef282109df9649b2eb75e7a53ed1",
6051 !       "dcde8a273c9672bee1a894d7f7f4abb81078f52b498e095f2a87d0aec5addf25",
6052 !       "4677d481ec6d1e97969afbc530958d1cbb4f1c047af6fdad4687cd10830e02bd",
6053 !       "74cd9d82de30c4222a06d420b75522ae1273729c1d8419446adf1184df61dc69",
6054 !       "2ff57f5468c6afdad30ec0fb6c2cb67289f12584e2c20c4e0065f66748697d77",
6055 !       "27e4ce010670801911c5765a003b15f75cde31d7378bd36540f593c8a44b3011",
6056 !       "62231ef2ec8c4da461072871ab7bc9de10253fcb40e164ddbad05b47e0b7fb69",
6057 !       "733a4ce688fdf07efb9e9f5a4b2dafff87cfe198fbe1dff71e028ef4cdee1f1b",
6058 !       "df39ed31924facdd69a93db07311d45fceac7a4987c091648044f37e6ecbb0d2",
6059 !       "87795c069bdb55281c666b9cb872d13174334ce135c12823541e9536489a9107",
6060 !       "438c80f532903b283230446514e400c329b29483db4fe9e279fdfc79e8f4347d",
6061 !       "08afb2813eda17e94aba1ab28ec191d4af99283cd4f1c5a04c0c2bc221bc3119",
6062 !       "a8b3ab3284f3288f7caa21bd2b69789a159ab4188b0908825b34723305c1228c",
6063 !       "db9b289e620de7dca2ae8fdac96808752e32e7a2c6d97ce0755dcebaa03123ab",
6064 !       "0bf622cb9f901b7532433ea2e7c1b7632f5935899b62dcf897a71551997dc8cc"
6065   ]
6066 diff -crB ./src/test/data/merkle_serialization.json ../../komodo-jl777/src/test/data/merkle_serialization.json
6067 *** ./src/test/data/merkle_serialization.json   2017-01-03 10:40:50.399338679 +0000
6068 --- ../../komodo-jl777/src/test/data/merkle_serialization.json  2017-01-03 09:49:08.872507185 +0000
6069 ***************
6070 *** 1,18 ****
6071   [
6072 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6073 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6074 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6075 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6076 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6077 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6078 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6079 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e302018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6080 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443",
6081 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443",
6082 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30003018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443",
6083 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e303018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443",
6084 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443",
6085 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3030001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443",
6086 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30003018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443",
6087 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e303018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443"
6088 ! ]
6089 \ No newline at end of file
6090 --- 1,18 ----
6091   [
6092 !       "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0000",
6093 !       "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c94300",
6094 !       "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f38618",
6095 !       "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f38618",
6096 !       "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f",
6097 !       "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f",
6098 !       "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f",
6099 !       "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f",
6100 !       "0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806",
6101 !       "0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806",
6102 !       "018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806",
6103 !       "018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806",
6104 !       "01be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200030001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806",
6105 !       "01be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9030001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806",
6106 !       "01c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000301e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806",
6107 !       "01c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e0184c834e7cb38d6f08d82f5cf4839b8920185174b11c7af771fd38dd02b206a200301e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806"
6108 ! ]
6109 diff -crB ./src/test/data/merkle_witness_serialization.json ../../komodo-jl777/src/test/data/merkle_witness_serialization.json
6110 *** ./src/test/data/merkle_witness_serialization.json   2017-01-03 10:40:50.399338679 +0000
6111 --- ../../komodo-jl777/src/test/data/merkle_witness_serialization.json  2017-01-03 09:49:08.872507185 +0000
6112 ***************
6113 *** 1,138 ****
6114   [
6115 !       "0000000155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6116 !       "0000000255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6117 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6118 !       "0000000255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6119 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6120 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6121 !       "0000000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00",
6122 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00",
6123 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00",
6124 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6125 !       "0000000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6126 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6127 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6128 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6129 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6130 !       "0000000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6131 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6132 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6133 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6134 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6135 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6136 !       "0000000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6137 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6138 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6139 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6140 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6141 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6142 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6143 !       "0000000455b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00",
6144 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00",
6145 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300028695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00",
6146 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00",
6147 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00",
6148 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00",
6149 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00",
6150 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6151 !       "0000000455b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6152 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6153 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300028695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6154 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6155 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6156 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6157 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6158 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6159 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e302018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6160 !       "0000000455b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6161 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6162 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300028695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6163 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6164 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6165 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6166 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6167 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6168 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e302018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6169 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6170 !       "0000000455b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6171 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6172 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300028695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6173 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6174 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6175 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6176 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6177 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6178 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e302018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6179 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6180 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6181 !       "0000000455b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6182 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6183 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300028695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6184 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6185 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6186 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6187 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6188 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6189 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e302018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6190 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00",
6191 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00",
6192 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30003018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6193 !       "0000000455b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6194 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6195 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300028695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6196 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6197 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6198 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6199 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6200 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6201 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e302018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6202 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6203 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6204 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30003018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6205 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e303018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6206 !       "0000000455b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6207 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6208 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300028695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6209 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6210 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6211 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6212 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6213 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6214 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e302018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6215 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6216 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6217 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30003018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6218 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e303018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6219 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6220 !       "0000000455b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6221 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6222 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300028695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6223 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6224 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6225 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6226 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6227 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6228 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e302018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6229 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6230 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6231 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30003018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6232 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e303018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6233 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6234 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3030001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6235 !       "0000000555b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c5564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300",
6236 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000455b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c5564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300",
6237 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300038695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c5564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300",
6238 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c5564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300",
6239 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d02dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c5564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300",
6240 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d5564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300",
6241 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c028695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d5564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300",
6242 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e35564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300",
6243 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e302018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300",
6244 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00",
6245 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443028695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00",
6246 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30003018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00",
6247 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e303018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944301dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00",
6248 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00",
6249 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3030001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00",
6250 !       "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30003018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300"
6251 ! ]
6252 \ No newline at end of file
6253 --- 1,138 ----
6254   [
6255 !       "0000000162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00",
6256 !       "0000000262fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c94300",
6257 !       "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c94300",
6258 !       "0000000262fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430101836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0000",
6259 !       "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430101836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0000",
6260 !       "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c94300000101836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0000",
6261 !       "0000000362fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae00",
6262 !       "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000268eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae00",
6263 !       "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430001a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae00",
6264 !       "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae400",
6265 !       "0000000362fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae0101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430000",
6266 !       "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000268eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae0101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430000",
6267 !       "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430001a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae0101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430000",
6268 !       "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae40101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430000",
6269 !       "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f38618000101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430000",
6270 !       "0000000362fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae0101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc00",
6271 !       "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000268eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae0101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc00",
6272 !       "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430001a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae0101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc00",
6273 !       "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae40101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc00",
6274 !       "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f38618000101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc00",
6275 !       "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc00",
6276 !       "0000000362fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae01018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000101aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af2",
6277 !       "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000268eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae01018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000101aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af2",
6278 !       "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430001a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae01018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000101aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af2",
6279 !       "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000101aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af2",
6280 !       "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180001018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000101aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af2",
6281 !       "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc01018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10000",
6282 !       "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0001018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10000",
6283 !       "0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd00",
6284 !       "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd00",
6285 !       "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd00",
6286 !       "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd00",
6287 !       "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd00",
6288 !       "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad1047400",
6289 !       "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad1047400",
6290 !       "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d00",
6291 !       "0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
6292 !       "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
6293 !       "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
6294 !       "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
6295 !       "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
6296 !       "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad10474010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
6297 !       "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad10474010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
6298 !       "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
6299 !       "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f00010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
6300 !       "0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
6301 !       "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
6302 !       "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
6303 !       "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
6304 !       "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
6305 !       "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad10474010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
6306 !       "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad10474010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
6307 !       "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
6308 !       "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f00010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
6309 !       "0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80601d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
6310 !       "0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6311 !       "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6312 !       "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6313 !       "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6314 !       "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6315 !       "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad1047401018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6316 !       "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad1047401018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6317 !       "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6318 !       "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0001018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6319 !       "0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80601d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81701018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0000",
6320 !       "0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a8060001018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0000",
6321 !       "0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6322 !       "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6323 !       "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6324 !       "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6325 !       "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6326 !       "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad1047401018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6327 !       "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad1047401018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6328 !       "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6329 !       "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0001018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6330 !       "0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80602d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e755000",
6331 !       "0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80601a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e755000",
6332 !       "018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a8060104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba300",
6333 !       "0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6334 !       "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6335 !       "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6336 !       "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6337 !       "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6338 !       "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad104740101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6339 !       "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad104740101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6340 !       "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6341 !       "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f000101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6342 !       "0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80602d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e75500101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a09120000",
6343 !       "0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80601a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e75500101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a09120000",
6344 !       "018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a8060104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a09120000",
6345 !       "018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806000101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a09120000",
6346 !       "0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6347 !       "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6348 !       "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6349 !       "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6350 !       "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6351 !       "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad104740101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6352 !       "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad104740101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6353 !       "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6354 !       "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f000101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6355 !       "0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80602d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e75500101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e900",
6356 !       "0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80601a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e75500101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e900",
6357 !       "018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a8060104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e900",
6358 !       "018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806000101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e900",
6359 !       "01be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200030001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e900",
6360 !       "0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6361 !       "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6362 !       "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6363 !       "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6364 !       "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6365 !       "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad104740101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6366 !       "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad104740101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6367 !       "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6368 !       "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f000101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6369 !       "0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80602d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e75500101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000101e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a7",
6370 !       "0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80601a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e75500101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000101e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a7",
6371 !       "018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a8060104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000101e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a7",
6372 !       "018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806000101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000101e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a7",
6373 !       "01be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200030001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e90101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e0000",
6374 !       "01be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9030001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806000101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e0000",
6375 !       "0000000562fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
6376 !       "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000468eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
6377 !       "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430003a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
6378 !       "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180392498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
6379 !       "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861802112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
6380 !       "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0368c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad10474458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
6381 !       "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f02050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad10474458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
6382 !       "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0250c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
6383 !       "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
6384 !       "0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80603d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e7550305205dbbecab7b01ec2538467c2fe41f7845eb45487bcf2f7d7bd52207f644100",
6385 !       "0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80602a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e7550305205dbbecab7b01ec2538467c2fe41f7845eb45487bcf2f7d7bd52207f644100",
6386 !       "018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a8060204e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba3305205dbbecab7b01ec2538467c2fe41f7845eb45487bcf2f7d7bd52207f644100",
6387 !       "018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80601305205dbbecab7b01ec2538467c2fe41f7845eb45487bcf2f7d7bd52207f644100",
6388 !       "01be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200030001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806021880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e92f7a96ecc725694533a999db6786f6016bcfdca5c9353151837faf43d93c50ef00",
6389 !       "01be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9030001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806012f7a96ecc725694533a999db6786f6016bcfdca5c9353151837faf43d93c50ef00",
6390 !       "01c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000301e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a8060184c834e7cb38d6f08d82f5cf4839b8920185174b11c7af771fd38dd02b206a2000"
6391 ! ]
6392 diff -crB ./src/test/rpc_wallet_tests.cpp ../../komodo-jl777/src/test/rpc_wallet_tests.cpp
6393 *** ./src/test/rpc_wallet_tests.cpp     2017-01-03 10:40:50.419339691 +0000
6394 --- ../../komodo-jl777/src/test/rpc_wallet_tests.cpp    2017-01-03 09:49:08.872507185 +0000
6395 ***************
6396 *** 295,307 ****
6397       BOOST_CHECK_THROW(CallRPC("z_listreceivedbyaddress tnRZ8bPq2pff3xBWhTJhNkVUkm2uhzksDeW5PvEa7aFKGT9Qi3YgTALZfjaY4jU3HLVKBtHdSXxoPoLA3naMPcHBcY88FcF 1"), runtime_error);
6398   }
6399   
6400   /*
6401    * This test covers RPC command z_exportwallet
6402    */
6403   BOOST_AUTO_TEST_CASE(rpc_wallet_z_exportwallet)
6404   {
6405       LOCK2(cs_main, pwalletMain->cs_wallet);
6406 !     
6407       // wallet should be empty
6408       std::set<libzcash::PaymentAddress> addrs;
6409       pwalletMain->GetPaymentAddresses(addrs);
6410 --- 295,353 ----
6411       BOOST_CHECK_THROW(CallRPC("z_listreceivedbyaddress tnRZ8bPq2pff3xBWhTJhNkVUkm2uhzksDeW5PvEa7aFKGT9Qi3YgTALZfjaY4jU3HLVKBtHdSXxoPoLA3naMPcHBcY88FcF 1"), runtime_error);
6412   }
6413   
6414 + /**
6415 +  * This test covers RPC command z_validateaddress
6416 +  */
6417 + BOOST_AUTO_TEST_CASE(rpc_wallet_z_validateaddress)
6418 + {
6419 +     SelectParams(CBaseChainParams::MAIN);
6420
6421 +     LOCK2(cs_main, pwalletMain->cs_wallet);
6422
6423 +     Value retValue;
6424
6425 +     // Check number of args
6426 +     BOOST_CHECK_THROW(CallRPC("z_validateaddress"), runtime_error);
6427 +     BOOST_CHECK_THROW(CallRPC("z_validateaddress toomany args"), runtime_error);
6428
6429 +     // Wallet should be empty
6430 +     std::set<libzcash::PaymentAddress> addrs;
6431 +     pwalletMain->GetPaymentAddresses(addrs);
6432 +     BOOST_CHECK(addrs.size()==0);
6433
6434 +     // This address is not valid, it belongs to another network
6435 +     BOOST_CHECK_NO_THROW(retValue = CallRPC("z_validateaddress ztaaga95QAPyp1kSQ1hD2kguCpzyMHjxWZqaYDEkzbvo7uYQYAw2S8X4Kx98AvhhofMtQL8PAXKHuZsmhRcanavKRKmdCzk"));
6436 +     Object resultObj = retValue.get_obj();
6437 +     bool b = find_value(resultObj, "isvalid").get_bool();
6438 +     BOOST_CHECK_EQUAL(b, false);
6439
6440 +     // This address is valid, but the spending key is not in this wallet
6441 +     BOOST_CHECK_NO_THROW(retValue = CallRPC("z_validateaddress zcfA19SDAKRYHLoRDoShcoz4nPohqWxuHcqg8WAxsiB2jFrrs6k7oSvst3UZvMYqpMNSRBkxBsnyjjngX5L55FxMzLKach8"));
6442 +     resultObj = retValue.get_obj();
6443 +     b = find_value(resultObj, "isvalid").get_bool();
6444 +     BOOST_CHECK_EQUAL(b, true);
6445 +     b = find_value(resultObj, "ismine").get_bool();
6446 +     BOOST_CHECK_EQUAL(b, false);
6447
6448 +     // Let's import a spending key to the wallet and validate its payment address
6449 +     BOOST_CHECK_NO_THROW(CallRPC("z_importkey SKxoWv77WGwFnUJitQKNEcD636bL4X5Gd6wWmgaA4Q9x8jZBPJXT"));
6450 +     BOOST_CHECK_NO_THROW(retValue = CallRPC("z_validateaddress zcWsmqT4X2V4jgxbgiCzyrAfRT1vi1F4sn7M5Pkh66izzw8Uk7LBGAH3DtcSMJeUb2pi3W4SQF8LMKkU2cUuVP68yAGcomL"));
6451 +     resultObj = retValue.get_obj();
6452 +     b = find_value(resultObj, "isvalid").get_bool();
6453 +     BOOST_CHECK_EQUAL(b, true);
6454 +     b = find_value(resultObj, "ismine").get_bool();
6455 +     BOOST_CHECK_EQUAL(b, true);
6456 +     BOOST_CHECK_EQUAL(find_value(resultObj, "payingkey").get_str(), "f5bb3c888ccc9831e3f6ba06e7528e26a312eec3acc1823be8918b6a3a5e20ad");
6457 +     BOOST_CHECK_EQUAL(find_value(resultObj, "transmissionkey").get_str(), "7a58c7132446564e6b810cf895c20537b3528357dc00150a8e201f491efa9c1a");
6458 + }
6459
6460   /*
6461    * This test covers RPC command z_exportwallet
6462    */
6463   BOOST_AUTO_TEST_CASE(rpc_wallet_z_exportwallet)
6464   {
6465       LOCK2(cs_main, pwalletMain->cs_wallet);
6466
6467       // wallet should be empty
6468       std::set<libzcash::PaymentAddress> addrs;
6469       pwalletMain->GetPaymentAddresses(addrs);
6470 ***************
6471 *** 774,780 ****
6472   
6473       BOOST_CHECK_THROW(CallRPC("z_sendmany"), runtime_error);
6474       BOOST_CHECK_THROW(CallRPC("z_sendmany toofewargs"), runtime_error);
6475 !     BOOST_CHECK_THROW(CallRPC("z_sendmany too many args here"), runtime_error);
6476   
6477       // bad from address
6478       BOOST_CHECK_THROW(CallRPC("z_sendmany "
6479 --- 820,826 ----
6480   
6481       BOOST_CHECK_THROW(CallRPC("z_sendmany"), runtime_error);
6482       BOOST_CHECK_THROW(CallRPC("z_sendmany toofewargs"), runtime_error);
6483 !     BOOST_CHECK_THROW(CallRPC("z_sendmany just too many args here"), runtime_error);
6484   
6485       // bad from address
6486       BOOST_CHECK_THROW(CallRPC("z_sendmany "
6487 ***************
6488 *** 795,800 ****
6489 --- 841,867 ----
6490               " {\"address\":\"tmQP9L3s31cLsghVYf2Jb5MhKj1jRBPoeQn\", \"amount\":12.0} ]"
6491               ), runtime_error);
6492   
6493 +     // invalid fee amount, cannot be negative
6494 +     BOOST_CHECK_THROW(CallRPC("z_sendmany "
6495 +             "tmRr6yJonqGK23UVhrKuyvTpF8qxQQjKigJ "
6496 +             "[{\"address\":\"tmQP9L3s31cLsghVYf2Jb5MhKj1jRBPoeQn\", \"amount\":50.0}] "
6497 +             "1 -0.0001"
6498 +             ), runtime_error);
6499
6500 +     // invalid fee amount, bigger than MAX_MONEY
6501 +     BOOST_CHECK_THROW(CallRPC("z_sendmany "
6502 +             "tmRr6yJonqGK23UVhrKuyvTpF8qxQQjKigJ "
6503 +             "[{\"address\":\"tmQP9L3s31cLsghVYf2Jb5MhKj1jRBPoeQn\", \"amount\":50.0}] "
6504 +             "1 21000001"
6505 +             ), runtime_error);
6506
6507 +     // fee amount is bigger than sum of outputs
6508 +     BOOST_CHECK_THROW(CallRPC("z_sendmany "
6509 +             "tmRr6yJonqGK23UVhrKuyvTpF8qxQQjKigJ "
6510 +             "[{\"address\":\"tmQP9L3s31cLsghVYf2Jb5MhKj1jRBPoeQn\", \"amount\":50.0}] "
6511 +             "1 50.00000001"
6512 +             ), runtime_error);
6513
6514       // memo bigger than allowed length of ZC_MEMO_SIZE
6515       std::vector<char> v (2 * (ZC_MEMO_SIZE+1));     // x2 for hexadecimal string format
6516       std::fill(v.begin(),v.end(), 'A');
6517 diff -crB ./src/test/transaction_tests.cpp ../../komodo-jl777/src/test/transaction_tests.cpp
6518 *** ./src/test/transaction_tests.cpp    2017-01-03 10:40:50.423339894 +0000
6519 --- ../../komodo-jl777/src/test/transaction_tests.cpp   2017-01-03 09:49:08.872507185 +0000
6520 ***************
6521 *** 341,349 ****
6522           libzcash::JSOutput(addr, 50)
6523       };
6524   
6525       {
6526           JSDescription jsdesc(*p, pubKeyHash, rt, inputs, outputs, 0, 0);
6527 !         BOOST_CHECK(jsdesc.Verify(*p, pubKeyHash));
6528   
6529           CDataStream ss(SER_DISK, CLIENT_VERSION);
6530           ss << jsdesc;
6531 --- 341,351 ----
6532           libzcash::JSOutput(addr, 50)
6533       };
6534   
6535 +     auto verifier = libzcash::ProofVerifier::Strict();
6536
6537       {
6538           JSDescription jsdesc(*p, pubKeyHash, rt, inputs, outputs, 0, 0);
6539 !         BOOST_CHECK(jsdesc.Verify(*p, verifier, pubKeyHash));
6540   
6541           CDataStream ss(SER_DISK, CLIENT_VERSION);
6542           ss << jsdesc;
6543 ***************
6544 *** 352,358 ****
6545           ss >> jsdesc_deserialized;
6546   
6547           BOOST_CHECK(jsdesc_deserialized == jsdesc);
6548 !         BOOST_CHECK(jsdesc_deserialized.Verify(*p, pubKeyHash));
6549       }
6550   
6551       {
6552 --- 354,360 ----
6553           ss >> jsdesc_deserialized;
6554   
6555           BOOST_CHECK(jsdesc_deserialized == jsdesc);
6556 !         BOOST_CHECK(jsdesc_deserialized.Verify(*p, verifier, pubKeyHash));
6557       }
6558   
6559       {
6560 ***************
6561 *** 365,371 ****
6562           // Ensure that it won't verify if the root is changed.
6563           auto test = JSDescription(*p, pubKeyHash, rt, inputs, outputs, 0, 0);
6564           test.anchor = GetRandHash();
6565 !         BOOST_CHECK(!test.Verify(*p, pubKeyHash));
6566       }
6567   }
6568   
6569 --- 367,373 ----
6570           // Ensure that it won't verify if the root is changed.
6571           auto test = JSDescription(*p, pubKeyHash, rt, inputs, outputs, 0, 0);
6572           test.anchor = GetRandHash();
6573 !         BOOST_CHECK(!test.Verify(*p, verifier, pubKeyHash));
6574       }
6575   }
6576   
6577 diff -crB ./src/util.cpp ../../komodo-jl777/src/util.cpp
6578 *** ./src/util.cpp      2017-01-03 10:40:50.427340097 +0000
6579 --- ../../komodo-jl777/src/util.cpp     2017-01-03 09:49:08.872507185 +0000
6580 ***************
6581 *** 217,222 ****
6582 --- 217,223 ----
6583   
6584           // if not debugging everything and not debugging specific category, LogPrint does nothing.
6585           if (setCategories.count(string("")) == 0 &&
6586 +             setCategories.count(string("1")) == 0 &&
6587               setCategories.count(string(category)) == 0)
6588               return false;
6589       }
6590 ***************
6591 *** 526,532 ****
6592           path /= BaseParams().DataDir();
6593   
6594       fs::create_directories(path);
6595
6596       return path;
6597   }
6598   
6599 --- 527,534 ----
6600           path /= BaseParams().DataDir();
6601   
6602       fs::create_directories(path);
6603 !     //std::string assetpath = path + "/assets";
6604 !     //boost::filesystem::create_directory(assetpath);
6605       return path;
6606   }
6607   
6608 Only in ../../komodo-jl777/src: utiltest.cpp
6609 Only in ../../komodo-jl777/src: utiltest.h
6610 diff -crB ./src/wallet/asyncrpcoperation_sendmany.cpp ../../komodo-jl777/src/wallet/asyncrpcoperation_sendmany.cpp
6611 *** ./src/wallet/asyncrpcoperation_sendmany.cpp 2017-01-03 10:40:50.427340097 +0000
6612 --- ../../komodo-jl777/src/wallet/asyncrpcoperation_sendmany.cpp        2017-01-03 09:49:08.872507185 +0000
6613 ***************
6614 *** 52,60 ****
6615           std::string fromAddress,
6616           std::vector<SendManyRecipient> tOutputs,
6617           std::vector<SendManyRecipient> zOutputs,
6618 !         int minDepth) :
6619 !         fromaddress_(fromAddress), t_outputs_(tOutputs), z_outputs_(zOutputs), mindepth_(minDepth)
6620   {
6621       if (minDepth < 0) {
6622           throw JSONRPCError(RPC_INVALID_PARAMETER, "Minconf cannot be negative");
6623       }
6624 --- 52,63 ----
6625           std::string fromAddress,
6626           std::vector<SendManyRecipient> tOutputs,
6627           std::vector<SendManyRecipient> zOutputs,
6628 !         int minDepth,
6629 !         CAmount fee) :
6630 !         fromaddress_(fromAddress), t_outputs_(tOutputs), z_outputs_(zOutputs), mindepth_(minDepth), fee_(fee)
6631   {
6632 +     assert(fee_ > 0);
6633
6634       if (minDepth < 0) {
6635           throw JSONRPCError(RPC_INVALID_PARAMETER, "Minconf cannot be negative");
6636       }
6637 ***************
6638 *** 149,156 ****
6639       bool isSingleZaddrOutput = (t_outputs_.size()==0 && z_outputs_.size()==1);
6640       bool isMultipleZaddrOutput = (t_outputs_.size()==0 && z_outputs_.size()>=1);
6641       bool isPureTaddrOnlyTx = (isfromtaddr_ && z_outputs_.size() == 0);
6642 !     CAmount minersFee = ASYNC_RPC_OPERATION_DEFAULT_MINERS_FEE;
6643 !     
6644       // When spending coinbase utxos, you can only specify a single zaddr as the change must go somewhere
6645       // and if there are multiple zaddrs, we don't know where to send it.
6646       if (isfromtaddr_) {
6647 --- 152,159 ----
6648       bool isSingleZaddrOutput = (t_outputs_.size()==0 && z_outputs_.size()==1);
6649       bool isMultipleZaddrOutput = (t_outputs_.size()==0 && z_outputs_.size()>=1);
6650       bool isPureTaddrOnlyTx = (isfromtaddr_ && z_outputs_.size() == 0);
6651 !     CAmount minersFee = fee_;
6652
6653       // When spending coinbase utxos, you can only specify a single zaddr as the change must go somewhere
6654       // and if there are multiple zaddrs, we don't know where to send it.
6655       if (isfromtaddr_) {
6656 ***************
6657 *** 202,218 ****
6658       assert(!isfromzaddr_ || t_inputs_total == 0);
6659   
6660       if (isfromtaddr_ && (t_inputs_total < targetAmount)) {
6661 !         throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, strprintf("Insufficient transparent funds, have %ld, need %ld", t_inputs_total, targetAmount));
6662       }
6663       
6664       if (isfromzaddr_ && (z_inputs_total < targetAmount)) {
6665 !         throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, strprintf("Insufficient protected funds, have %ld, need %ld", z_inputs_total, targetAmount));
6666       }
6667   
6668       // If from address is a taddr, select UTXOs to spend
6669       CAmount selectedUTXOAmount = 0;
6670       bool selectedUTXOCoinbase = false;
6671       if (isfromtaddr_) {
6672           std::vector<SendManyInputUTXO> selectedTInputs;
6673           for (SendManyInputUTXO & t : t_inputs_) {
6674               bool b = std::get<3>(t);
6675 --- 205,233 ----
6676       assert(!isfromzaddr_ || t_inputs_total == 0);
6677   
6678       if (isfromtaddr_ && (t_inputs_total < targetAmount)) {
6679 !         throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS,
6680 !             strprintf("Insufficient transparent funds, have %s, need %s",
6681 !             FormatMoney(t_inputs_total), FormatMoney(targetAmount)));
6682       }
6683       
6684       if (isfromzaddr_ && (z_inputs_total < targetAmount)) {
6685 !         throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS,
6686 !             strprintf("Insufficient protected funds, have %s, need %s",
6687 !             FormatMoney(z_inputs_total), FormatMoney(targetAmount)));
6688       }
6689   
6690       // If from address is a taddr, select UTXOs to spend
6691       CAmount selectedUTXOAmount = 0;
6692       bool selectedUTXOCoinbase = false;
6693       if (isfromtaddr_) {
6694 +         // Get dust threshold
6695 +         CKey secret;
6696 +         secret.MakeNewKey(true);
6697 +         CScript scriptPubKey = GetScriptForDestination(secret.GetPubKey().GetID());
6698 +         CTxOut out(CAmount(1), scriptPubKey);
6699 +         CAmount dustThreshold = out.GetDustThreshold(minRelayTxFee);
6700 +         CAmount dustChange = -1;
6701
6702           std::vector<SendManyInputUTXO> selectedTInputs;
6703           for (SendManyInputUTXO & t : t_inputs_) {
6704               bool b = std::get<3>(t);
6705 ***************
6706 *** 222,230 ****
6707               selectedUTXOAmount += std::get<2>(t);
6708               selectedTInputs.push_back(t);
6709               if (selectedUTXOAmount >= targetAmount) {
6710 !                 break;
6711               }
6712           }
6713           t_inputs_ = selectedTInputs;
6714           t_inputs_total = selectedUTXOAmount;
6715   
6716 --- 237,257 ----
6717               selectedUTXOAmount += std::get<2>(t);
6718               selectedTInputs.push_back(t);
6719               if (selectedUTXOAmount >= targetAmount) {
6720 !                 // Select another utxo if there is change less than the dust threshold.
6721 !                 dustChange = selectedUTXOAmount - targetAmount;
6722 !                 if (dustChange == 0 || dustChange >= dustThreshold) {
6723 !                     break;
6724 !                 }
6725               }
6726           }
6727
6728 +         // If there is transparent change, is it valid or is it dust?
6729 +         if (dustChange < dustThreshold && dustChange != 0) {
6730 +             throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS,
6731 +                 strprintf("Insufficient transparent funds, have %s, need %s more to avoid creating invalid change output %s (dust threshold is %s)",
6732 +                 FormatMoney(t_inputs_total), FormatMoney(dustThreshold - dustChange), FormatMoney(dustChange), FormatMoney(dustThreshold)));
6733 +         }
6734
6735           t_inputs_ = selectedTInputs;
6736           t_inputs_total = selectedUTXOAmount;
6737   
6738 ***************
6739 *** 298,304 ****
6740           zOutputsDeque.push_back(o);
6741       }
6742   
6743 !     
6744       /**
6745        * SCENARIO #2
6746        * 
6747 --- 325,346 ----
6748           zOutputsDeque.push_back(o);
6749       }
6750   
6751 !     // When spending notes, take a snapshot of note witnesses and anchors as the treestate will
6752 !     // change upon arrival of new blocks which contain joinsplit transactions.  This is likely
6753 !     // to happen as creating a chained joinsplit transaction can take longer than the block interval.
6754 !     if (z_inputs_.size() > 0) {
6755 !         LOCK2(cs_main, pwalletMain->cs_wallet);
6756 !         for (auto t : z_inputs_) {
6757 !             JSOutPoint jso = std::get<0>(t);
6758 !             std::vector<JSOutPoint> vOutPoints = { jso };
6759 !             uint256 inputAnchor;
6760 !             std::vector<boost::optional<ZCIncrementalWitness>> vInputWitnesses;
6761 !             pwalletMain->GetNoteWitnesses(vOutPoints, vInputWitnesses, inputAnchor);
6762 !             jsopWitnessAnchorMap[ jso.ToString() ] = WitnessAnchorData{ vInputWitnesses[0], inputAnchor };
6763 !         }
6764 !     }
6765
6766
6767       /**
6768        * SCENARIO #2
6769        * 
6770 ***************
6771 *** 321,327 ****
6772               if (selectedUTXOCoinbase) {
6773                   assert(isSingleZaddrOutput);
6774                   throw JSONRPCError(RPC_WALLET_ERROR, strprintf(
6775 !                     "Change %ld not allowed. When protecting coinbase funds, the wallet does not allow any change as there is currently no way to specify a change address in z_sendmany.", change));
6776               } else {
6777                   add_taddr_change_output_to_tx(change);
6778                   LogPrint("zrpc", "%s: transparent change in transaction output (amount=%s)\n",
6779 --- 363,371 ----
6780               if (selectedUTXOCoinbase) {
6781                   assert(isSingleZaddrOutput);
6782                   throw JSONRPCError(RPC_WALLET_ERROR, strprintf(
6783 !                     "Change %s not allowed. When protecting coinbase funds, the wallet does not "
6784 !                     "allow any change as there is currently no way to specify a change address "
6785 !                     "in z_sendmany.", FormatMoney(change)));
6786               } else {
6787                   add_taddr_change_output_to_tx(change);
6788                   LogPrint("zrpc", "%s: transparent change in transaction output (amount=%s)\n",
6789 ***************
6790 *** 496,510 ****
6791                       throw JSONRPCError(RPC_WALLET_ERROR, "Could not find previous JoinSplit anchor");
6792                   }
6793                   
6794                   for (const uint256& commitment : prevJoinSplit.commitments) {
6795                       tree.append(commitment);
6796 !                     previousCommitments.push_back(commitment);                   
6797                   }
6798 !                 ZCIncrementalWitness changeWitness = tree.witness();
6799 !                 jsAnchor = changeWitness.root();
6800 !                 uint256 changeCommitment = prevJoinSplit.commitments[changeOutputIndex];
6801 !                 intermediates.insert(std::make_pair(tree.root(), tree));
6802 !                 witnesses.push_back(changeWitness);
6803   
6804                   // Decrypt the change note's ciphertext to retrieve some data we need
6805                   ZCNoteDecryption decryptor(spendingkey_.viewing_key());
6806 --- 540,562 ----
6807                       throw JSONRPCError(RPC_WALLET_ERROR, "Could not find previous JoinSplit anchor");
6808                   }
6809                   
6810 +                 assert(changeOutputIndex != -1);
6811 +                 boost::optional<ZCIncrementalWitness> changeWitness;
6812 +                 int n = 0;
6813                   for (const uint256& commitment : prevJoinSplit.commitments) {
6814                       tree.append(commitment);
6815 !                     previousCommitments.push_back(commitment);
6816 !                     if (!changeWitness && changeOutputIndex == n++) {
6817 !                         changeWitness = tree.witness();
6818 !                     } else if (changeWitness) {
6819 !                         changeWitness.get().append(commitment);
6820 !                     }
6821                   }
6822 !                 if (changeWitness) {
6823 !                         witnesses.push_back(changeWitness);
6824 !                 }
6825 !                 jsAnchor = tree.root();
6826 !                 intermediates.insert(std::make_pair(tree.root(), tree));    // chained js are interstitial (found in between block boundaries)
6827   
6828                   // Decrypt the change note's ciphertext to retrieve some data we need
6829                   ZCNoteDecryption decryptor(spendingkey_.viewing_key());
6830 ***************
6831 *** 538,543 ****
6832 --- 590,596 ----
6833               //
6834               std::vector<Note> vInputNotes;
6835               std::vector<JSOutPoint> vOutPoints;
6836 +             std::vector<boost::optional<ZCIncrementalWitness>> vInputWitnesses;
6837               uint256 inputAnchor;
6838               int numInputsNeeded = (jsChange>0) ? 1 : 0;
6839               while (numInputsNeeded++ < ZC_NUM_JS_INPUTS && zInputsDeque.size() > 0) {
6840 ***************
6841 *** 547,552 ****
6842 --- 600,613 ----
6843                   CAmount noteFunds = std::get<2>(t);
6844                   zInputsDeque.pop_front();
6845   
6846 +                 WitnessAnchorData wad = jsopWitnessAnchorMap[ jso.ToString() ];
6847 +                 vInputWitnesses.push_back(wad.witness);
6848 +                 if (inputAnchor.IsNull()) {
6849 +                     inputAnchor = wad.anchor;
6850 +                 } else if (inputAnchor != wad.anchor) {
6851 +                     throw JSONRPCError(RPC_WALLET_ERROR, "Selected input notes do not share the same anchor");
6852 +                 }
6853
6854                   vOutPoints.push_back(jso);
6855                   vInputNotes.push_back(note);
6856                   
6857 ***************
6858 *** 563,574 ****
6859                           
6860               // Add history of previous commitments to witness 
6861               if (vInputNotes.size() > 0) {
6862 !                 std::vector<boost::optional<ZCIncrementalWitness>> vInputWitnesses;
6863 !                 {
6864 !                     LOCK(cs_main);
6865 !                     pwalletMain->GetNoteWitnesses(vOutPoints, vInputWitnesses, inputAnchor);
6866 !                 }
6867 !        
6868                   if (vInputWitnesses.size()==0) {
6869                       throw JSONRPCError(RPC_WALLET_ERROR, "Could not find witness for note commitment");
6870                   }
6871 --- 624,630 ----
6872                           
6873               // Add history of previous commitments to witness 
6874               if (vInputNotes.size() > 0) {
6875
6876                   if (vInputWitnesses.size()==0) {
6877                       throw JSONRPCError(RPC_WALLET_ERROR, "Could not find witness for note commitment");
6878                   }
6879 ***************
6880 *** 760,765 ****
6881 --- 816,826 ----
6882           t_inputs_.push_back(utxo);
6883       }
6884   
6885 +     // sort in ascending order, so smaller utxos appear first
6886 +     std::sort(t_inputs_.begin(), t_inputs_.end(), [](SendManyInputUTXO i, SendManyInputUTXO j) -> bool {
6887 +         return ( std::get<2>(i) < std::get<2>(j));
6888 +     });
6889
6890       return t_inputs_.size() > 0;
6891   }
6892   
6893 ***************
6894 *** 894,901 ****
6895               info.vpub_new,
6896               !this->testmode);
6897   
6898 !     if (!(jsdesc.Verify(*pzcashParams, joinSplitPubKey_))) {
6899 !         throw std::runtime_error("error verifying joinsplit");
6900       }
6901   
6902       mtx.vjoinsplit.push_back(jsdesc);
6903 --- 955,965 ----
6904               info.vpub_new,
6905               !this->testmode);
6906   
6907 !     {
6908 !         auto verifier = libzcash::ProofVerifier::Strict();
6909 !         if (!(jsdesc.Verify(*pzcashParams, verifier, joinSplitPubKey_))) {
6910 !             throw std::runtime_error("error verifying joinsplit");
6911 !         }
6912       }
6913   
6914       mtx.vjoinsplit.push_back(jsdesc);
6915 diff -crB ./src/wallet/asyncrpcoperation_sendmany.h ../../komodo-jl777/src/wallet/asyncrpcoperation_sendmany.h
6916 *** ./src/wallet/asyncrpcoperation_sendmany.h   2017-01-03 10:40:50.427340097 +0000
6917 --- ../../komodo-jl777/src/wallet/asyncrpcoperation_sendmany.h  2017-01-03 09:49:08.872507185 +0000
6918 ***************
6919 *** 14,22 ****
6920   #include "json/json_spirit_value.h"
6921   #include "wallet.h"
6922   
6923   #include <tuple>
6924   
6925 ! // TODO: Compute fee based on a heuristic, e.g. (num tx output * dust threshold) + joinsplit bytes * ?
6926   #define ASYNC_RPC_OPERATION_DEFAULT_MINERS_FEE   10000
6927   
6928   using namespace libzcash;
6929 --- 14,23 ----
6930   #include "json/json_spirit_value.h"
6931   #include "wallet.h"
6932   
6933 + #include <unordered_map>
6934   #include <tuple>
6935   
6936 ! // Default transaction fee if caller does not specify one.
6937   #define ASYNC_RPC_OPERATION_DEFAULT_MINERS_FEE   10000
6938   
6939   using namespace libzcash;
6940 ***************
6941 *** 41,49 ****
6942       CAmount vpub_new = 0;
6943   };
6944   
6945   class AsyncRPCOperation_sendmany : public AsyncRPCOperation {
6946   public:
6947 !     AsyncRPCOperation_sendmany(std::string fromAddress, std::vector<SendManyRecipient> tOutputs, std::vector<SendManyRecipient> zOutputs, int minDepth);
6948       virtual ~AsyncRPCOperation_sendmany();
6949       
6950       // We don't want to be copied or moved around
6951 --- 42,56 ----
6952       CAmount vpub_new = 0;
6953   };
6954   
6955 + // A struct to help us track the witness and anchor for a given JSOutPoint
6956 + struct WitnessAnchorData {
6957 +       boost::optional<ZCIncrementalWitness> witness;
6958 +       uint256 anchor;
6959 + };
6960
6961   class AsyncRPCOperation_sendmany : public AsyncRPCOperation {
6962   public:
6963 !     AsyncRPCOperation_sendmany(std::string fromAddress, std::vector<SendManyRecipient> tOutputs, std::vector<SendManyRecipient> zOutputs, int minDepth, CAmount fee = ASYNC_RPC_OPERATION_DEFAULT_MINERS_FEE);
6964       virtual ~AsyncRPCOperation_sendmany();
6965       
6966       // We don't want to be copied or moved around
6967 ***************
6968 *** 59,64 ****
6969 --- 66,72 ----
6970   private:
6971       friend class TEST_FRIEND_AsyncRPCOperation_sendmany;    // class for unit testing
6972   
6973 +     CAmount fee_;
6974       int mindepth_;
6975       std::string fromaddress_;
6976       bool isfromtaddr_;
6977 ***************
6978 *** 70,76 ****
6979       uint256 joinSplitPubKey_;
6980       unsigned char joinSplitPrivKey_[crypto_sign_SECRETKEYBYTES];
6981   
6982 !         
6983       std::vector<SendManyRecipient> t_outputs_;
6984       std::vector<SendManyRecipient> z_outputs_;
6985       std::vector<SendManyInputUTXO> t_inputs_;
6986 --- 78,86 ----
6987       uint256 joinSplitPubKey_;
6988       unsigned char joinSplitPrivKey_[crypto_sign_SECRETKEYBYTES];
6989   
6990 !     // The key is the result string from calling JSOutPoint::ToString()
6991 !     std::unordered_map<std::string, WitnessAnchorData> jsopWitnessAnchorMap;
6992
6993       std::vector<SendManyRecipient> t_outputs_;
6994       std::vector<SendManyRecipient> z_outputs_;
6995       std::vector<SendManyInputUTXO> t_inputs_;
6996 diff -crB ./src/wallet/gtest/test_wallet.cpp ../../komodo-jl777/src/wallet/gtest/test_wallet.cpp
6997 *** ./src/wallet/gtest/test_wallet.cpp  2017-01-03 10:40:50.431340299 +0000
6998 --- ../../komodo-jl777/src/wallet/gtest/test_wallet.cpp 2017-01-03 09:49:08.872507185 +0000
6999 ***************
7000 *** 5,11 ****
7001 --- 5,13 ----
7002   #include "base58.h"
7003   #include "chainparams.h"
7004   #include "main.h"
7005 + #include "primitives/block.h"
7006   #include "random.h"
7007 + #include "utiltest.h"
7008   #include "wallet/wallet.h"
7009   #include "zcash/JoinSplit.hpp"
7010   #include "zcash/Note.hpp"
7011 ***************
7012 *** 29,37 ****
7013   
7014       MOCK_METHOD2(WriteTx, bool(uint256 hash, const CWalletTx& wtx));
7015       MOCK_METHOD1(WriteWitnessCacheSize, bool(int64_t nWitnessCacheSize));
7016   };
7017   
7018 ! template void CWallet::WriteWitnessCache<MockWalletDB>(MockWalletDB& walletdb);
7019   
7020   class TestWallet : public CWallet {
7021   public:
7022 --- 31,41 ----
7023   
7024       MOCK_METHOD2(WriteTx, bool(uint256 hash, const CWalletTx& wtx));
7025       MOCK_METHOD1(WriteWitnessCacheSize, bool(int64_t nWitnessCacheSize));
7026 +     MOCK_METHOD1(WriteBestBlock, bool(const CBlockLocator& loc));
7027   };
7028   
7029 ! template void CWallet::SetBestChainINTERNAL<MockWalletDB>(
7030 !         MockWalletDB& walletdb, const CBlockLocator& loc);
7031   
7032   class TestWallet : public CWallet {
7033   public:
7034 ***************
7035 *** 50,60 ****
7036                                   ZCIncrementalMerkleTree tree) {
7037           CWallet::IncrementNoteWitnesses(pindex, pblock, tree);
7038       }
7039 !     void DecrementNoteWitnesses() {
7040 !         CWallet::DecrementNoteWitnesses();
7041       }
7042 !     void WriteWitnessCache(MockWalletDB& walletdb) {
7043 !         CWallet::WriteWitnessCache(walletdb);
7044       }
7045       bool UpdatedNoteData(const CWalletTx& wtxIn, CWalletTx& wtx) {
7046           return CWallet::UpdatedNoteData(wtxIn, wtx);
7047 --- 54,64 ----
7048                                   ZCIncrementalMerkleTree tree) {
7049           CWallet::IncrementNoteWitnesses(pindex, pblock, tree);
7050       }
7051 !     void DecrementNoteWitnesses(const CBlockIndex* pindex) {
7052 !         CWallet::DecrementNoteWitnesses(pindex);
7053       }
7054 !     void SetBestChain(MockWalletDB& walletdb, const CBlockLocator& loc) {
7055 !         CWallet::SetBestChainINTERNAL(walletdb, loc);
7056       }
7057       bool UpdatedNoteData(const CWalletTx& wtxIn, CWalletTx& wtx) {
7058           return CWallet::UpdatedNoteData(wtxIn, wtx);
7059 ***************
7060 *** 65,183 ****
7061   };
7062   
7063   CWalletTx GetValidReceive(const libzcash::SpendingKey& sk, CAmount value, bool randomInputs) {
7064 !     CMutableTransaction mtx;
7065 !     mtx.nVersion = 2; // Enable JoinSplits
7066 !     mtx.vin.resize(2);
7067 !     if (randomInputs) {
7068 !         mtx.vin[0].prevout.hash = GetRandHash();
7069 !         mtx.vin[1].prevout.hash = GetRandHash();
7070 !     } else {
7071 !         mtx.vin[0].prevout.hash = uint256S("0000000000000000000000000000000000000000000000000000000000000001");
7072 !         mtx.vin[1].prevout.hash = uint256S("0000000000000000000000000000000000000000000000000000000000000002");
7073 !     }
7074 !     mtx.vin[0].prevout.n = 0;
7075 !     mtx.vin[1].prevout.n = 0;
7076
7077 !     // Generate an ephemeral keypair.
7078 !     uint256 joinSplitPubKey;
7079 !     unsigned char joinSplitPrivKey[crypto_sign_SECRETKEYBYTES];
7080 !     crypto_sign_keypair(joinSplitPubKey.begin(), joinSplitPrivKey);
7081 !     mtx.joinSplitPubKey = joinSplitPubKey;
7082
7083 !     boost::array<libzcash::JSInput, 2> inputs = {
7084 !         libzcash::JSInput(), // dummy input
7085 !         libzcash::JSInput() // dummy input
7086 !     };
7087
7088 !     boost::array<libzcash::JSOutput, 2> outputs = {
7089 !         libzcash::JSOutput(sk.address(), value),
7090 !         libzcash::JSOutput(sk.address(), value)
7091 !     };
7092
7093 !     boost::array<libzcash::Note, 2> output_notes;
7094
7095 !     // Prepare JoinSplits
7096 !     uint256 rt;
7097 !     JSDescription jsdesc {*params, mtx.joinSplitPubKey, rt,
7098 !                           inputs, outputs, value, 0, false};
7099 !     mtx.vjoinsplit.push_back(jsdesc);
7100
7101 !     // Empty output script.
7102 !     CScript scriptCode;
7103 !     CTransaction signTx(mtx);
7104 !     uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL);
7105
7106 !     // Add the signature
7107 !     assert(crypto_sign_detached(&mtx.joinSplitSig[0], NULL,
7108 !                          dataToBeSigned.begin(), 32,
7109 !                          joinSplitPrivKey
7110 !                         ) == 0);
7111
7112 !     CTransaction tx {mtx};
7113 !     CWalletTx wtx {NULL, tx};
7114 !     return wtx;
7115   }
7116   
7117   libzcash::Note GetNote(const libzcash::SpendingKey& sk,
7118                          const CTransaction& tx, size_t js, size_t n) {
7119 !     ZCNoteDecryption decryptor {sk.viewing_key()};
7120 !     auto hSig = tx.vjoinsplit[js].h_sig(*params, tx.joinSplitPubKey);
7121 !     auto note_pt = libzcash::NotePlaintext::decrypt(
7122 !         decryptor,
7123 !         tx.vjoinsplit[js].ciphertexts[n],
7124 !         tx.vjoinsplit[js].ephemeralKey,
7125 !         hSig,
7126 !         (unsigned char) n);
7127 !     return note_pt.note(sk.address());
7128   }
7129   
7130   CWalletTx GetValidSpend(const libzcash::SpendingKey& sk,
7131                           const libzcash::Note& note, CAmount value) {
7132 !     CMutableTransaction mtx;
7133 !     mtx.vout.resize(2);
7134 !     mtx.vout[0].nValue = value;
7135 !     mtx.vout[1].nValue = 0;
7136
7137 !     // Generate an ephemeral keypair.
7138 !     uint256 joinSplitPubKey;
7139 !     unsigned char joinSplitPrivKey[crypto_sign_SECRETKEYBYTES];
7140 !     crypto_sign_keypair(joinSplitPubKey.begin(), joinSplitPrivKey);
7141 !     mtx.joinSplitPubKey = joinSplitPubKey;
7142
7143 !     // Fake tree for the unused witness
7144 !     ZCIncrementalMerkleTree tree;
7145
7146 !     boost::array<libzcash::JSInput, 2> inputs = {
7147 !         libzcash::JSInput(tree.witness(), note, sk),
7148 !         libzcash::JSInput() // dummy input
7149 !     };
7150
7151 !     boost::array<libzcash::JSOutput, 2> outputs = {
7152 !         libzcash::JSOutput(), // dummy output
7153 !         libzcash::JSOutput() // dummy output
7154 !     };
7155
7156 !     boost::array<libzcash::Note, 2> output_notes;
7157
7158 !     // Prepare JoinSplits
7159 !     uint256 rt;
7160 !     JSDescription jsdesc {*params, mtx.joinSplitPubKey, rt,
7161 !                           inputs, outputs, 0, value, false};
7162 !     mtx.vjoinsplit.push_back(jsdesc);
7163
7164 !     // Empty output script.
7165 !     CScript scriptCode;
7166 !     CTransaction signTx(mtx);
7167 !     uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL);
7168
7169 !     // Add the signature
7170 !     assert(crypto_sign_detached(&mtx.joinSplitSig[0], NULL,
7171 !                          dataToBeSigned.begin(), 32,
7172 !                          joinSplitPrivKey
7173 !                         ) == 0);
7174 !     CTransaction tx {mtx};
7175 !     CWalletTx wtx {NULL, tx};
7176 !     return wtx;
7177   }
7178   
7179   TEST(wallet_tests, setup_datadir_location_run_as_first_test) {
7180 --- 69,85 ----
7181   };
7182   
7183   CWalletTx GetValidReceive(const libzcash::SpendingKey& sk, CAmount value, bool randomInputs) {
7184 !     return GetValidReceive(*params, sk, value, randomInputs);
7185   }
7186   
7187   libzcash::Note GetNote(const libzcash::SpendingKey& sk,
7188                          const CTransaction& tx, size_t js, size_t n) {
7189 !     return GetNote(*params, sk, tx, js, n);
7190   }
7191   
7192   CWalletTx GetValidSpend(const libzcash::SpendingKey& sk,
7193                           const libzcash::Note& note, CAmount value) {
7194 !     return GetValidSpend(*params, sk, note, value);
7195   }
7196   
7197   TEST(wallet_tests, setup_datadir_location_run_as_first_test) {
7198 ***************
7199 *** 656,662 ****
7200       EXPECT_TRUE((bool) witnesses[1]);
7201   
7202       // Until #1302 is implemented, this should triggger an assertion
7203 !     EXPECT_DEATH(wallet.DecrementNoteWitnesses(),
7204                    "Assertion `nWitnessCacheSize > 0' failed.");
7205   }
7206   
7207 --- 558,564 ----
7208       EXPECT_TRUE((bool) witnesses[1]);
7209   
7210       // Until #1302 is implemented, this should triggger an assertion
7211 !     EXPECT_DEATH(wallet.DecrementNoteWitnesses(&index),
7212                    "Assertion `nWitnessCacheSize > 0' failed.");
7213   }
7214   
7215 ***************
7216 *** 729,735 ****
7217   
7218           // Decrementing should give us the previous anchor
7219           uint256 anchor3;
7220 !         wallet.DecrementNoteWitnesses();
7221           witnesses.clear();
7222           wallet.GetNoteWitnesses(notes, witnesses, anchor3);
7223           EXPECT_FALSE((bool) witnesses[0]);
7224 --- 631,637 ----
7225   
7226           // Decrementing should give us the previous anchor
7227           uint256 anchor3;
7228 !         wallet.DecrementNoteWitnesses(&index2);
7229           witnesses.clear();
7230           wallet.GetNoteWitnesses(notes, witnesses, anchor3);
7231           EXPECT_FALSE((bool) witnesses[0]);
7232 ***************
7233 *** 754,759 ****
7234 --- 656,871 ----
7235       }
7236   }
7237   
7238 + TEST(wallet_tests, CachedWitnessesDecrementFirst) {
7239 +     TestWallet wallet;
7240 +     uint256 anchor2;
7241 +     CBlock block2;
7242 +     CBlockIndex index2(block2);
7243 +     ZCIncrementalMerkleTree tree;
7244
7245 +     auto sk = libzcash::SpendingKey::random();
7246 +     wallet.AddSpendingKey(sk);
7247
7248 +     {
7249 +         // First transaction (case tested in _empty_chain)
7250 +         auto wtx = GetValidReceive(sk, 10, true);
7251 +         auto note = GetNote(sk, wtx, 0, 1);
7252 +         auto nullifier = note.nullifier(sk);
7253
7254 +         mapNoteData_t noteData;
7255 +         JSOutPoint jsoutpt {wtx.GetHash(), 0, 1};
7256 +         CNoteData nd {sk.address(), nullifier};
7257 +         noteData[jsoutpt] = nd;
7258 +         wtx.SetNoteData(noteData);
7259 +         wallet.AddToWallet(wtx, true, NULL);
7260
7261 +         // First block (case tested in _empty_chain)
7262 +         CBlock block1;
7263 +         block1.vtx.push_back(wtx);
7264 +         CBlockIndex index1(block1);
7265 +         index1.nHeight = 1;
7266 +         wallet.IncrementNoteWitnesses(&index1, &block1, tree);
7267 +     }
7268
7269 +     {
7270 +         // Second transaction (case tested in _chain_tip)
7271 +         auto wtx = GetValidReceive(sk, 50, true);
7272 +         auto note = GetNote(sk, wtx, 0, 1);
7273 +         auto nullifier = note.nullifier(sk);
7274
7275 +         mapNoteData_t noteData;
7276 +         JSOutPoint jsoutpt {wtx.GetHash(), 0, 1};
7277 +         CNoteData nd {sk.address(), nullifier};
7278 +         noteData[jsoutpt] = nd;
7279 +         wtx.SetNoteData(noteData);
7280 +         wallet.AddToWallet(wtx, true, NULL);
7281
7282 +         std::vector<JSOutPoint> notes {jsoutpt};
7283 +         std::vector<boost::optional<ZCIncrementalWitness>> witnesses;
7284
7285 +         // Second block (case tested in _chain_tip)
7286 +         block2.vtx.push_back(wtx);
7287 +         index2.nHeight = 2;
7288 +         wallet.IncrementNoteWitnesses(&index2, &block2, tree);
7289 +         // Called to fetch anchor
7290 +         wallet.GetNoteWitnesses(notes, witnesses, anchor2);
7291 +     }
7292
7293 +     {
7294 +         // Third transaction - never mined
7295 +         auto wtx = GetValidReceive(sk, 20, true);
7296 +         auto note = GetNote(sk, wtx, 0, 1);
7297 +         auto nullifier = note.nullifier(sk);
7298
7299 +         mapNoteData_t noteData;
7300 +         JSOutPoint jsoutpt {wtx.GetHash(), 0, 1};
7301 +         CNoteData nd {sk.address(), nullifier};
7302 +         noteData[jsoutpt] = nd;
7303 +         wtx.SetNoteData(noteData);
7304 +         wallet.AddToWallet(wtx, true, NULL);
7305
7306 +         std::vector<JSOutPoint> notes {jsoutpt};
7307 +         std::vector<boost::optional<ZCIncrementalWitness>> witnesses;
7308 +         uint256 anchor3;
7309
7310 +         wallet.GetNoteWitnesses(notes, witnesses, anchor3);
7311 +         EXPECT_FALSE((bool) witnesses[0]);
7312
7313 +         // Decrementing (before the transaction has ever seen an increment)
7314 +         // should give us the previous anchor
7315 +         uint256 anchor4;
7316 +         wallet.DecrementNoteWitnesses(&index2);
7317 +         witnesses.clear();
7318 +         wallet.GetNoteWitnesses(notes, witnesses, anchor4);
7319 +         EXPECT_FALSE((bool) witnesses[0]);
7320 +         // Should not equal second anchor because none of these notes had witnesses
7321 +         EXPECT_NE(anchor2, anchor4);
7322
7323 +         // Re-incrementing with the same block should give the same result
7324 +         uint256 anchor5;
7325 +         wallet.IncrementNoteWitnesses(&index2, &block2, tree);
7326 +         witnesses.clear();
7327 +         wallet.GetNoteWitnesses(notes, witnesses, anchor5);
7328 +         EXPECT_FALSE((bool) witnesses[0]);
7329 +         EXPECT_EQ(anchor3, anchor5);
7330 +     }
7331 + }
7332
7333 + TEST(wallet_tests, CachedWitnessesCleanIndex) {
7334 +     TestWallet wallet;
7335 +     CBlock block1;
7336 +     CBlock block2;
7337 +     CBlock block3;
7338 +     CBlockIndex index1(block1);
7339 +     CBlockIndex index2(block2);
7340 +     CBlockIndex index3(block3);
7341 +     ZCIncrementalMerkleTree tree;
7342
7343 +     auto sk = libzcash::SpendingKey::random();
7344 +     wallet.AddSpendingKey(sk);
7345
7346 +     {
7347 +         // First transaction (case tested in _empty_chain)
7348 +         auto wtx = GetValidReceive(sk, 10, true);
7349 +         auto note = GetNote(sk, wtx, 0, 1);
7350 +         auto nullifier = note.nullifier(sk);
7351
7352 +         mapNoteData_t noteData;
7353 +         JSOutPoint jsoutpt {wtx.GetHash(), 0, 1};
7354 +         CNoteData nd {sk.address(), nullifier};
7355 +         noteData[jsoutpt] = nd;
7356 +         wtx.SetNoteData(noteData);
7357 +         wallet.AddToWallet(wtx, true, NULL);
7358
7359 +         // First block (case tested in _empty_chain)
7360 +         block1.vtx.push_back(wtx);
7361 +         index1.nHeight = 1;
7362 +         wallet.IncrementNoteWitnesses(&index1, &block1, tree);
7363 +     }
7364
7365 +     {
7366 +         // Second transaction (case tested in _chain_tip)
7367 +         auto wtx = GetValidReceive(sk, 50, true);
7368 +         auto note = GetNote(sk, wtx, 0, 1);
7369 +         auto nullifier = note.nullifier(sk);
7370
7371 +         mapNoteData_t noteData;
7372 +         JSOutPoint jsoutpt {wtx.GetHash(), 0, 1};
7373 +         CNoteData nd {sk.address(), nullifier};
7374 +         noteData[jsoutpt] = nd;
7375 +         wtx.SetNoteData(noteData);
7376 +         wallet.AddToWallet(wtx, true, NULL);
7377
7378 +         // Second block (case tested in _chain_tip)
7379 +         block2.vtx.push_back(wtx);
7380 +         index2.nHeight = 2;
7381 +         wallet.IncrementNoteWitnesses(&index2, &block2, tree);
7382 +     }
7383
7384 +     {
7385 +         // Third transaction
7386 +         auto wtx = GetValidReceive(sk, 20, true);
7387 +         auto note = GetNote(sk, wtx, 0, 1);
7388 +         auto nullifier = note.nullifier(sk);
7389
7390 +         mapNoteData_t noteData;
7391 +         JSOutPoint jsoutpt {wtx.GetHash(), 0, 1};
7392 +         CNoteData nd {sk.address(), nullifier};
7393 +         noteData[jsoutpt] = nd;
7394 +         wtx.SetNoteData(noteData);
7395 +         wallet.AddToWallet(wtx, true, NULL);
7396
7397 +         std::vector<JSOutPoint> notes {jsoutpt};
7398 +         std::vector<boost::optional<ZCIncrementalWitness>> witnesses;
7399 +         uint256 anchor3;
7400
7401 +         // Third block
7402 +         block3.vtx.push_back(wtx);
7403 +         index3.nHeight = 3;
7404 +         wallet.IncrementNoteWitnesses(&index3, &block3, tree);
7405 +         wallet.GetNoteWitnesses(notes, witnesses, anchor3);
7406
7407 +         // Now pretend we are reindexing: the chain is cleared, and each block is
7408 +         // used to increment witnesses again.
7409 +         wallet.IncrementNoteWitnesses(&index1, &block1, tree);
7410 +         uint256 anchor3a;
7411 +         witnesses.clear();
7412 +         wallet.GetNoteWitnesses(notes, witnesses, anchor3a);
7413 +         EXPECT_TRUE((bool) witnesses[0]);
7414 +         // Should equal third anchor because witness cache unaffected
7415 +         EXPECT_EQ(anchor3, anchor3a);
7416
7417 +         wallet.IncrementNoteWitnesses(&index2, &block2, tree);
7418 +         uint256 anchor3b;
7419 +         witnesses.clear();
7420 +         wallet.GetNoteWitnesses(notes, witnesses, anchor3b);
7421 +         EXPECT_TRUE((bool) witnesses[0]);
7422 +         EXPECT_EQ(anchor3, anchor3b);
7423
7424 +         // Pretend a reorg happened that was recorded in the block files
7425 +         wallet.DecrementNoteWitnesses(&index2);
7426 +         uint256 anchor3c;
7427 +         witnesses.clear();
7428 +         wallet.GetNoteWitnesses(notes, witnesses, anchor3c);
7429 +         EXPECT_TRUE((bool) witnesses[0]);
7430 +         EXPECT_EQ(anchor3, anchor3c);
7431
7432 +         wallet.IncrementNoteWitnesses(&index2, &block2, tree);
7433 +         uint256 anchor3d;
7434 +         witnesses.clear();
7435 +         wallet.GetNoteWitnesses(notes, witnesses, anchor3d);
7436 +         EXPECT_TRUE((bool) witnesses[0]);
7437 +         EXPECT_EQ(anchor3, anchor3d);
7438
7439 +         wallet.IncrementNoteWitnesses(&index3, &block3, tree);
7440 +         uint256 anchor3e;
7441 +         witnesses.clear();
7442 +         wallet.GetNoteWitnesses(notes, witnesses, anchor3e);
7443 +         EXPECT_TRUE((bool) witnesses[0]);
7444 +         EXPECT_EQ(anchor3, anchor3e);
7445 +     }
7446 + }
7447
7448   TEST(wallet_tests, ClearNoteWitnessCache) {
7449       TestWallet wallet;
7450   
7451 ***************
7452 *** 761,766 ****
7453 --- 873,879 ----
7454       wallet.AddSpendingKey(sk);
7455   
7456       auto wtx = GetValidReceive(sk, 10, true);
7457 +     auto hash = wtx.GetHash();
7458       auto note = GetNote(sk, wtx, 0, 0);
7459       auto nullifier = note.nullifier(sk);
7460   
7461 ***************
7462 *** 774,779 ****
7463 --- 887,894 ----
7464       // Pretend we mined the tx by adding a fake witness
7465       ZCIncrementalMerkleTree tree;
7466       wtx.mapNoteData[jsoutpt].witnesses.push_front(tree.witness());
7467 +     wtx.mapNoteData[jsoutpt].witnessHeight = 1;
7468 +     wallet.nWitnessCacheSize = 1;
7469   
7470       wallet.AddToWallet(wtx, true, NULL);
7471   
7472 ***************
7473 *** 785,790 ****
7474 --- 900,907 ----
7475       wallet.GetNoteWitnesses(notes, witnesses, anchor2);
7476       EXPECT_TRUE((bool) witnesses[0]);
7477       EXPECT_FALSE((bool) witnesses[1]);
7478 +     EXPECT_EQ(1, wallet.mapWallet[hash].mapNoteData[jsoutpt].witnessHeight);
7479 +     EXPECT_EQ(1, wallet.nWitnessCacheSize);
7480   
7481       // After clearing, we should not have a witness for either note
7482       wallet.ClearNoteWitnessCache();
7483 ***************
7484 *** 792,802 ****
7485 --- 909,922 ----
7486       wallet.GetNoteWitnesses(notes, witnesses, anchor2);
7487       EXPECT_FALSE((bool) witnesses[0]);
7488       EXPECT_FALSE((bool) witnesses[1]);
7489 +     EXPECT_EQ(-1, wallet.mapWallet[hash].mapNoteData[jsoutpt].witnessHeight);
7490 +     EXPECT_EQ(0, wallet.nWitnessCacheSize);
7491   }
7492   
7493   TEST(wallet_tests, WriteWitnessCache) {
7494       TestWallet wallet;
7495       MockWalletDB walletdb;
7496 +     CBlockLocator loc;
7497   
7498       auto sk = libzcash::SpendingKey::random();
7499       wallet.AddSpendingKey(sk);
7500 ***************
7501 *** 807,813 ****
7502       // TxnBegin fails
7503       EXPECT_CALL(walletdb, TxnBegin())
7504           .WillOnce(Return(false));
7505 !     wallet.WriteWitnessCache(walletdb);
7506       EXPECT_CALL(walletdb, TxnBegin())
7507           .WillRepeatedly(Return(true));
7508   
7509 --- 927,933 ----
7510       // TxnBegin fails
7511       EXPECT_CALL(walletdb, TxnBegin())
7512           .WillOnce(Return(false));
7513 !     wallet.SetBestChain(walletdb, loc);
7514       EXPECT_CALL(walletdb, TxnBegin())
7515           .WillRepeatedly(Return(true));
7516   
7517 ***************
7518 *** 816,829 ****
7519           .WillOnce(Return(false));
7520       EXPECT_CALL(walletdb, TxnAbort())
7521           .Times(1);
7522 !     wallet.WriteWitnessCache(walletdb);
7523   
7524       // WriteTx throws
7525       EXPECT_CALL(walletdb, WriteTx(wtx.GetHash(), wtx))
7526           .WillOnce(ThrowLogicError());
7527       EXPECT_CALL(walletdb, TxnAbort())
7528           .Times(1);
7529 !     wallet.WriteWitnessCache(walletdb);
7530       EXPECT_CALL(walletdb, WriteTx(wtx.GetHash(), wtx))
7531           .WillRepeatedly(Return(true));
7532   
7533 --- 936,949 ----
7534           .WillOnce(Return(false));
7535       EXPECT_CALL(walletdb, TxnAbort())
7536           .Times(1);
7537 !     wallet.SetBestChain(walletdb, loc);
7538   
7539       // WriteTx throws
7540       EXPECT_CALL(walletdb, WriteTx(wtx.GetHash(), wtx))
7541           .WillOnce(ThrowLogicError());
7542       EXPECT_CALL(walletdb, TxnAbort())
7543           .Times(1);
7544 !     wallet.SetBestChain(walletdb, loc);
7545       EXPECT_CALL(walletdb, WriteTx(wtx.GetHash(), wtx))
7546           .WillRepeatedly(Return(true));
7547   
7548 ***************
7549 *** 832,857 ****
7550           .WillOnce(Return(false));
7551       EXPECT_CALL(walletdb, TxnAbort())
7552           .Times(1);
7553 !     wallet.WriteWitnessCache(walletdb);
7554   
7555       // WriteWitnessCacheSize throws
7556       EXPECT_CALL(walletdb, WriteWitnessCacheSize(0))
7557           .WillOnce(ThrowLogicError());
7558       EXPECT_CALL(walletdb, TxnAbort())
7559           .Times(1);
7560 !     wallet.WriteWitnessCache(walletdb);
7561       EXPECT_CALL(walletdb, WriteWitnessCacheSize(0))
7562           .WillRepeatedly(Return(true));
7563   
7564       // TxCommit fails
7565       EXPECT_CALL(walletdb, TxnCommit())
7566           .WillOnce(Return(false));
7567 !     wallet.WriteWitnessCache(walletdb);
7568       EXPECT_CALL(walletdb, TxnCommit())
7569           .WillRepeatedly(Return(true));
7570   
7571       // Everything succeeds
7572 !     wallet.WriteWitnessCache(walletdb);
7573   }
7574   
7575   TEST(wallet_tests, UpdateNullifierNoteMap) {
7576 --- 952,993 ----
7577           .WillOnce(Return(false));
7578       EXPECT_CALL(walletdb, TxnAbort())
7579           .Times(1);
7580 !     wallet.SetBestChain(walletdb, loc);
7581   
7582       // WriteWitnessCacheSize throws
7583       EXPECT_CALL(walletdb, WriteWitnessCacheSize(0))
7584           .WillOnce(ThrowLogicError());
7585       EXPECT_CALL(walletdb, TxnAbort())
7586           .Times(1);
7587 !     wallet.SetBestChain(walletdb, loc);
7588       EXPECT_CALL(walletdb, WriteWitnessCacheSize(0))
7589           .WillRepeatedly(Return(true));
7590   
7591 +     // WriteBestBlock fails
7592 +     EXPECT_CALL(walletdb, WriteBestBlock(loc))
7593 +         .WillOnce(Return(false));
7594 +     EXPECT_CALL(walletdb, TxnAbort())
7595 +         .Times(1);
7596 +     wallet.SetBestChain(walletdb, loc);
7597
7598 +     // WriteBestBlock throws
7599 +     EXPECT_CALL(walletdb, WriteBestBlock(loc))
7600 +         .WillOnce(ThrowLogicError());
7601 +     EXPECT_CALL(walletdb, TxnAbort())
7602 +         .Times(1);
7603 +     wallet.SetBestChain(walletdb, loc);
7604 +     EXPECT_CALL(walletdb, WriteBestBlock(loc))
7605 +         .WillRepeatedly(Return(true));
7606
7607       // TxCommit fails
7608       EXPECT_CALL(walletdb, TxnCommit())
7609           .WillOnce(Return(false));
7610 !     wallet.SetBestChain(walletdb, loc);
7611       EXPECT_CALL(walletdb, TxnCommit())
7612           .WillRepeatedly(Return(true));
7613   
7614       // Everything succeeds
7615 !     wallet.SetBestChain(walletdb, loc);
7616   }
7617   
7618   TEST(wallet_tests, UpdateNullifierNoteMap) {
7619 ***************
7620 *** 913,918 ****
7621 --- 1049,1055 ----
7622       // Pretend we mined the tx by adding a fake witness
7623       ZCIncrementalMerkleTree tree;
7624       wtx.mapNoteData[jsoutpt].witnesses.push_front(tree.witness());
7625 +     wtx.mapNoteData[jsoutpt].witnessHeight = 100;
7626   
7627       // Now pretend we added the key for the second note, and
7628       // the tx was "added" to the wallet again to update it.
7629 ***************
7630 *** 925,935 ****
7631 --- 1062,1074 ----
7632       // The txs should initially be different
7633       EXPECT_NE(wtx.mapNoteData, wtx2.mapNoteData);
7634       EXPECT_EQ(1, wtx.mapNoteData[jsoutpt].witnesses.size());
7635 +     EXPECT_EQ(100, wtx.mapNoteData[jsoutpt].witnessHeight);
7636   
7637       // After updating, they should be the same
7638       EXPECT_TRUE(wallet.UpdatedNoteData(wtx2, wtx));
7639       EXPECT_EQ(wtx.mapNoteData, wtx2.mapNoteData);
7640       EXPECT_EQ(1, wtx.mapNoteData[jsoutpt].witnesses.size());
7641 +     EXPECT_EQ(100, wtx.mapNoteData[jsoutpt].witnessHeight);
7642       // TODO: The new note should get witnessed (but maybe not here) (#1350)
7643   }
7644   
7645 diff -crB ./src/wallet/rpcwallet.cpp ../../komodo-jl777/src/wallet/rpcwallet.cpp
7646 *** ./src/wallet/rpcwallet.cpp  2017-01-03 10:40:50.431340299 +0000
7647 --- ../../komodo-jl777/src/wallet/rpcwallet.cpp 2017-01-03 09:49:08.876507395 +0000
7648 ***************
7649 *** 2622,2627 ****
7650 --- 2622,2633 ----
7651               sample_times.push_back(benchmark_verify_equihash());
7652           } else if (benchmarktype == "validatelargetx") {
7653               sample_times.push_back(benchmark_large_tx());
7654 +         } else if (benchmarktype == "trydecryptnotes") {
7655 +             int nAddrs = params[2].get_int();
7656 +             sample_times.push_back(benchmark_try_decrypt_notes(nAddrs));
7657 +         } else if (benchmarktype == "incnotewitnesses") {
7658 +             int nTxs = params[2].get_int();
7659 +             sample_times.push_back(benchmark_increment_note_witnesses(nTxs));
7660           } else {
7661               throw JSONRPCError(RPC_TYPE_ERROR, "Invalid benchmarktype");
7662           }
7663 ***************
7664 *** 2849,2855 ****
7665                            vpub_old,
7666                            vpub_new);
7667   
7668 !     assert(jsdesc.Verify(*pzcashParams, joinSplitPubKey));
7669   
7670       mtx.vjoinsplit.push_back(jsdesc);
7671   
7672 --- 2855,2864 ----
7673                            vpub_old,
7674                            vpub_new);
7675   
7676 !     {
7677 !         auto verifier = libzcash::ProofVerifier::Strict();
7678 !         assert(jsdesc.Verify(*pzcashParams, verifier, joinSplitPubKey));
7679 !     }
7680   
7681       mtx.vjoinsplit.push_back(jsdesc);
7682   
7683 ***************
7684 *** 3310,3326 ****
7685       return ret;
7686   }
7687   
7688   Value z_sendmany(const Array& params, bool fHelp)
7689   {
7690       if (!EnsureWalletIsAvailable(fHelp))
7691           return Value::null;
7692   
7693 !     if (fHelp || params.size() < 2 || params.size() > 3)
7694           throw runtime_error(
7695 !             "z_sendmany \"fromaddress\" [{\"address\":... ,\"amount\":...},...] ( minconf )\n"
7696               "\nSend multiple times. Amounts are double-precision floating point numbers."
7697               "\nChange from a taddr flows to a new taddr address, while change from zaddr returns to itself."
7698 !             "\nWhen sending coinbase UTXOs to a zaddr, change is not alllowed. The entire value of the UTXO(s) must be consumed."
7699               + HelpRequiringPassphrase() + "\n"
7700               "\nArguments:\n"
7701               "1. \"fromaddress\"         (string, required) The taddr or zaddr to send the funds from.\n"
7702 --- 3319,3347 ----
7703       return ret;
7704   }
7705   
7706
7707 + // Here we define the maximum number of zaddr outputs that can be included in a transaction.
7708 + // If input notes are small, we might actually require more than one joinsplit per zaddr output.
7709 + // For now though, we assume we use one joinsplit per zaddr output (and the second output note is change).
7710 + // We reduce the result by 1 to ensure there is room for non-joinsplit CTransaction data.
7711 + #define Z_SENDMANY_MAX_ZADDR_OUTPUTS    ((MAX_TX_SIZE / JSDescription().GetSerializeSize(SER_NETWORK, PROTOCOL_VERSION)) - 1)
7712
7713 + // transaction.h comment: spending taddr output requires CTxIn >= 148 bytes and typical taddr txout is 34 bytes
7714 + #define CTXIN_SPEND_DUST_SIZE   148
7715 + #define CTXOUT_REGULAR_SIZE     34
7716
7717   Value z_sendmany(const Array& params, bool fHelp)
7718   {
7719       if (!EnsureWalletIsAvailable(fHelp))
7720           return Value::null;
7721   
7722 !     if (fHelp || params.size() < 2 || params.size() > 4)
7723           throw runtime_error(
7724 !             "z_sendmany \"fromaddress\" [{\"address\":... ,\"amount\":...},...] ( minconf ) ( fee )\n"
7725               "\nSend multiple times. Amounts are double-precision floating point numbers."
7726               "\nChange from a taddr flows to a new taddr address, while change from zaddr returns to itself."
7727 !             "\nWhen sending coinbase UTXOs to a zaddr, change is not allowed. The entire value of the UTXO(s) must be consumed."
7728 !             + strprintf("\nCurrently, the maximum number of zaddr outputs is %d due to transaction size limits.\n", Z_SENDMANY_MAX_ZADDR_OUTPUTS)
7729               + HelpRequiringPassphrase() + "\n"
7730               "\nArguments:\n"
7731               "1. \"fromaddress\"         (string, required) The taddr or zaddr to send the funds from.\n"
7732 ***************
7733 *** 3331,3336 ****
7734 --- 3352,3359 ----
7735               "      \"memo\":memo        (string, optional) If the address is a zaddr, raw data represented in hexadecimal string format\n"
7736               "    }, ... ]\n"
7737               "3. minconf               (numeric, optional, default=1) Only use funds confirmed at least this many times.\n"
7738 +             "4. fee                   (numeric, optional, default="
7739 +             + strprintf("%s", FormatMoney(ASYNC_RPC_OPERATION_DEFAULT_MINERS_FEE)) + ") The fee amount to attach to this transaction.\n"
7740               "\nResult:\n"
7741               "\"operationid\"          (string) An operationid to pass to z_getoperationstatus to get the result of the operation.\n"
7742           );
7743 ***************
7744 *** 3371,3376 ****
7745 --- 3394,3400 ----
7746       // Recipients
7747       std::vector<SendManyRecipient> taddrRecipients;
7748       std::vector<SendManyRecipient> zaddrRecipients;
7749 +     CAmount nTotalOut = 0;
7750   
7751       BOOST_FOREACH(Value& output, outputs)
7752       {
7753 ***************
7754 *** 3426,3431 ****
7755 --- 3450,3481 ----
7756           } else {
7757               taddrRecipients.push_back( SendManyRecipient(address, nAmount, memo) );
7758           }
7759
7760 +         nTotalOut += nAmount;
7761 +     }
7762
7763 +     // Check the number of zaddr outputs does not exceed the limit.
7764 +     if (zaddrRecipients.size() > Z_SENDMANY_MAX_ZADDR_OUTPUTS)  {
7765 +         throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, too many zaddr outputs");
7766 +     }
7767
7768 +     // As a sanity check, estimate and verify that the size of the transaction will be valid.
7769 +     // Depending on the input notes, the actual tx size may turn out to be larger and perhaps invalid.
7770 +     size_t txsize = 0;
7771 +     CMutableTransaction mtx;
7772 +     mtx.nVersion = 2;
7773 +     for (int i = 0; i < zaddrRecipients.size(); i++) {
7774 +         mtx.vjoinsplit.push_back(JSDescription());
7775 +     }
7776 +     CTransaction tx(mtx);
7777 +     txsize += tx.GetSerializeSize(SER_NETWORK, tx.nVersion);
7778 +     if (fromTaddr) {
7779 +         txsize += CTXIN_SPEND_DUST_SIZE;
7780 +         txsize += CTXOUT_REGULAR_SIZE;      // There will probably be taddr change
7781 +     }
7782 +     txsize += CTXOUT_REGULAR_SIZE * taddrRecipients.size();
7783 +     if (txsize > MAX_TX_SIZE) {
7784 +         throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Too many outputs, size of raw transaction would be larger than limit of %d bytes", MAX_TX_SIZE ));
7785       }
7786   
7787       // Minimum confirmations
7788 ***************
7789 *** 3437,3445 ****
7790           throw JSONRPCError(RPC_INVALID_PARAMETER, "Minimum number of confirmations cannot be less than 0");
7791       }
7792   
7793       // Create operation and add to global queue
7794       std::shared_ptr<AsyncRPCQueue> q = getAsyncRPCQueue();
7795 !     std::shared_ptr<AsyncRPCOperation> operation( new AsyncRPCOperation_sendmany(fromaddress, taddrRecipients, zaddrRecipients, nMinDepth) );
7796       q->addOperation(operation);
7797       AsyncRPCOperationId operationId = operation->getId();
7798       return operationId;
7799 --- 3487,3505 ----
7800           throw JSONRPCError(RPC_INVALID_PARAMETER, "Minimum number of confirmations cannot be less than 0");
7801       }
7802   
7803 +     // Fee in Zatoshis, not currency format)
7804 +     CAmount nFee = ASYNC_RPC_OPERATION_DEFAULT_MINERS_FEE;
7805 +     if (params.size() > 3) {
7806 +         nFee = AmountFromValue( params[3] );
7807 +         // Check that the user specified fee is sane.
7808 +         if (nFee > nTotalOut) {
7809 +             throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Fee %s is greater than the sum of outputs %s", FormatMoney(nFee), FormatMoney(nTotalOut)));
7810 +         }
7811 +     }
7812
7813       // Create operation and add to global queue
7814       std::shared_ptr<AsyncRPCQueue> q = getAsyncRPCQueue();
7815 !     std::shared_ptr<AsyncRPCOperation> operation( new AsyncRPCOperation_sendmany(fromaddress, taddrRecipients, zaddrRecipients, nMinDepth, nFee) );
7816       q->addOperation(operation);
7817       AsyncRPCOperationId operationId = operation->getId();
7818       return operationId;
7819 diff -crB ./src/wallet/wallet.cpp ../../komodo-jl777/src/wallet/wallet.cpp
7820 *** ./src/wallet/wallet.cpp     2017-01-03 10:40:50.431340299 +0000
7821 --- ../../komodo-jl777/src/wallet/wallet.cpp    2017-01-03 09:49:08.876507395 +0000
7822 ***************
7823 *** 373,386 ****
7824       if (added) {
7825           IncrementNoteWitnesses(pindex, pblock, tree);
7826       } else {
7827 !         DecrementNoteWitnesses();
7828       }
7829   }
7830   
7831   void CWallet::SetBestChain(const CBlockLocator& loc)
7832   {
7833       CWalletDB walletdb(strWalletFile);
7834 !     walletdb.WriteBestBlock(loc);
7835   }
7836   
7837   bool CWallet::SetMinVersion(enum WalletFeature nVersion, CWalletDB* pwalletdbIn, bool fExplicit)
7838 --- 373,386 ----
7839       if (added) {
7840           IncrementNoteWitnesses(pindex, pblock, tree);
7841       } else {
7842 !         DecrementNoteWitnesses(pindex);
7843       }
7844   }
7845   
7846   void CWallet::SetBestChain(const CBlockLocator& loc)
7847   {
7848       CWalletDB walletdb(strWalletFile);
7849 !     SetBestChainINTERNAL(walletdb, loc);
7850   }
7851   
7852   bool CWallet::SetMinVersion(enum WalletFeature nVersion, CWalletDB* pwalletdbIn, bool fExplicit)
7853 ***************
7854 *** 630,637 ****
7855 --- 630,639 ----
7856       for (std::pair<const uint256, CWalletTx>& wtxItem : mapWallet) {
7857           for (mapNoteData_t::value_type& item : wtxItem.second.mapNoteData) {
7858               item.second.witnesses.clear();
7859 +             item.second.witnessHeight = -1;
7860           }
7861       }
7862 +     nWitnessCacheSize = 0;
7863   }
7864   
7865   void CWallet::IncrementNoteWitnesses(const CBlockIndex* pindex,
7866 ***************
7867 *** 648,654 ****
7868                   // Only increment witnesses that are behind the current height
7869                   if (nd->witnessHeight < pindex->nHeight) {
7870                       // Witnesses being incremented should always be either -1
7871 !                     // (never incremented) or one below pindex
7872                       assert((nd->witnessHeight == -1) ||
7873                              (nd->witnessHeight == pindex->nHeight - 1));
7874                       // Copy the witness for the previous block if we have one
7875 --- 650,656 ----
7876                   // Only increment witnesses that are behind the current height
7877                   if (nd->witnessHeight < pindex->nHeight) {
7878                       // Witnesses being incremented should always be either -1
7879 !                     // (never incremented or decremented) or one below pindex
7880                       assert((nd->witnessHeight == -1) ||
7881                              (nd->witnessHeight == pindex->nHeight - 1));
7882                       // Copy the witness for the previous block if we have one
7883 ***************
7884 *** 739,752 ****
7885               }
7886           }
7887   
7888 !         if (fFileBacked) {
7889 !             CWalletDB walletdb(strWalletFile);
7890 !             WriteWitnessCache(walletdb);
7891 !         }
7892       }
7893   }
7894   
7895 ! void CWallet::DecrementNoteWitnesses()
7896   {
7897       extern int32_t KOMODO_REWIND;
7898       {
7899 --- 741,753 ----
7900               }
7901           }
7902   
7903 !         // For performance reasons, we write out the witness cache in
7904 !         // CWallet::SetBestChain() (which also ensures that overall consistency
7905 !         // of the wallet.dat is maintained).
7906       }
7907   }
7908   
7909 ! void CWallet::DecrementNoteWitnesses(const CBlockIndex* pindex)
7910   {
7911       extern int32_t KOMODO_REWIND;
7912       {
7913 ***************
7914 *** 756,765 ****
7915                   CNoteData* nd = &(item.second);
7916                   // Check the validity of the cache
7917                   assert(nWitnessCacheSize >= nd->witnesses.size());
7918 !                 if (nd->witnesses.size() > 0) {
7919 !                     nd->witnesses.pop_front();
7920                   }
7921 -                 nd->witnessHeight -= 1;
7922               }
7923           }
7924           nWitnessCacheSize -= 1;
7925 --- 757,775 ----
7926                   CNoteData* nd = &(item.second);
7927                   // Check the validity of the cache
7928                   assert(nWitnessCacheSize >= nd->witnesses.size());
7929 !                 // Only increment witnesses that are not above the current height
7930 !                 if (nd->witnessHeight <= pindex->nHeight) {
7931 !                     // Witnesses being decremented should always be either -1
7932 !                     // (never incremented or decremented) or equal to pindex
7933 !                     assert((nd->witnessHeight == -1) ||
7934 !                            (nd->witnessHeight == pindex->nHeight));
7935 !                     if (nd->witnesses.size() > 0) {
7936 !                         nd->witnesses.pop_front();
7937 !                     }
7938 !                     // pindex is the block being removed, so the new witness cache
7939 !                     // height is one below it.
7940 !                     nd->witnessHeight = pindex->nHeight - 1;
7941                   }
7942               }
7943           }
7944           nWitnessCacheSize -= 1;
7945 ***************
7946 *** 770,776 ****
7947                   assert(nWitnessCacheSize >= nd->witnesses.size());
7948               }
7949           }
7950 -         // TODO: If nWitnessCache is zero, we need to regenerate the caches (#1302)
7951           if ( nWitnessCacheSize <= 0 )
7952           {
7953               extern char ASSETCHAINS_SYMBOL[16];
7954 --- 780,785 ----
7955 ***************
7956 *** 778,787 ****
7957           }
7958           if ( KOMODO_REWIND == 0 )
7959               assert(nWitnessCacheSize > 0);
7960 !         if (fFileBacked) {
7961 !             CWalletDB walletdb(strWalletFile);
7962 !             WriteWitnessCache(walletdb);
7963 !         }
7964       }
7965   }
7966   
7967 --- 787,799 ----
7968           }
7969           if ( KOMODO_REWIND == 0 )
7970               assert(nWitnessCacheSize > 0);
7971 !         //if (fFileBacked) {
7972 !         //    CWalletDB walletdb(strWalletFile);
7973 !         //    WriteWitnessCache(walletdb);
7974 !         //}
7975 !         // For performance reasons, we write out the witness cache in
7976 !         // CWallet::SetBestChain() (which also ensures that overall consistency
7977 !         // of the wallet.dat is maintained).
7978       }
7979   }
7980   
7981 ***************
7982 *** 1109,1114 ****
7983 --- 1121,1127 ----
7984               tmp.at(nd.first).witnesses.assign(
7985                   nd.second.witnesses.cbegin(), nd.second.witnesses.cend());
7986           }
7987 +         tmp.at(nd.first).witnessHeight = nd.second.witnessHeight;
7988       }
7989       // Now copy over the updated note data
7990       wtx.mapNoteData = tmp;
7991 diff -crB ./src/wallet/wallet.h ../../komodo-jl777/src/wallet/wallet.h
7992 *** ./src/wallet/wallet.h       2017-01-03 10:40:50.431340299 +0000
7993 --- ../../komodo-jl777/src/wallet/wallet.h      2017-01-03 09:49:08.876507395 +0000
7994 ***************
7995 *** 225,231 ****
7996        */
7997       std::list<ZCIncrementalWitness> witnesses;
7998   
7999 !     /** Block height corresponding to the most current witness. */
8000       int witnessHeight;
8001   
8002       CNoteData() : address(), nullifier(), witnessHeight {-1} { }
8003 --- 225,239 ----
8004        */
8005       std::list<ZCIncrementalWitness> witnesses;
8006   
8007 !     /**
8008 !      * Block height corresponding to the most current witness.
8009 !      *
8010 !      * When we first create a CNoteData in CWallet::FindMyNotes, this is set to
8011 !      * -1 as a placeholder. The next time CWallet::ChainTip is called, we can
8012 !      * determine what height the witness cache for this note is valid for (even
8013 !      * if no witnesses were cached), and so can set the correct value in
8014 !      * CWallet::IncrementNoteWitnesses and CWallet::DecrementNoteWitnesses.
8015 !      */
8016       int witnessHeight;
8017   
8018       CNoteData() : address(), nullifier(), witnessHeight {-1} { }
8019 ***************
8020 *** 620,660 ****
8021       void ClearNoteWitnessCache();
8022   
8023   protected:
8024       void IncrementNoteWitnesses(const CBlockIndex* pindex,
8025                                   const CBlock* pblock,
8026                                   ZCIncrementalMerkleTree& tree);
8027 !     void DecrementNoteWitnesses();
8028   
8029       template <typename WalletDB>
8030 !     void WriteWitnessCache(WalletDB& walletdb) {
8031           if (!walletdb.TxnBegin()) {
8032               // This needs to be done atomically, so don't do it at all
8033 !             LogPrintf("WriteWitnessCache(): Couldn't start atomic write\n");
8034               return;
8035           }
8036           try {
8037               for (std::pair<const uint256, CWalletTx>& wtxItem : mapWallet) {
8038                   if (!walletdb.WriteTx(wtxItem.first, wtxItem.second)) {
8039 !                     LogPrintf("WriteWitnessCache(): Failed to write CWalletTx, aborting atomic write\n");
8040                       walletdb.TxnAbort();
8041                       return;
8042                   }
8043               }
8044               if (!walletdb.WriteWitnessCacheSize(nWitnessCacheSize)) {
8045 !                 LogPrintf("WriteWitnessCache(): Failed to write nWitnessCacheSize, aborting atomic write\n");
8046                   walletdb.TxnAbort();
8047                   return;
8048               }
8049           } catch (const std::exception &exc) {
8050               // Unexpected failure
8051 !             LogPrintf("WriteWitnessCache(): Unexpected error during atomic write:\n");
8052               LogPrintf("%s\n", exc.what());
8053               walletdb.TxnAbort();
8054               return;
8055           }
8056           if (!walletdb.TxnCommit()) {
8057               // Couldn't commit all to db, but in-memory state is fine
8058 !             LogPrintf("WriteWitnessCache(): Couldn't commit atomic write\n");
8059               return;
8060           }
8061       }
8062 --- 628,679 ----
8063       void ClearNoteWitnessCache();
8064   
8065   protected:
8066 +     /**
8067 +      * pindex is the new tip being connected.
8068 +      */
8069       void IncrementNoteWitnesses(const CBlockIndex* pindex,
8070                                   const CBlock* pblock,
8071                                   ZCIncrementalMerkleTree& tree);
8072 !     /**
8073 !      * pindex is the old tip being disconnected.
8074 !      */
8075 !     void DecrementNoteWitnesses(const CBlockIndex* pindex);
8076   
8077       template <typename WalletDB>
8078 !     void SetBestChainINTERNAL(WalletDB& walletdb, const CBlockLocator& loc) {
8079           if (!walletdb.TxnBegin()) {
8080               // This needs to be done atomically, so don't do it at all
8081 !             LogPrintf("SetBestChain(): Couldn't start atomic write\n");
8082               return;
8083           }
8084           try {
8085               for (std::pair<const uint256, CWalletTx>& wtxItem : mapWallet) {
8086                   if (!walletdb.WriteTx(wtxItem.first, wtxItem.second)) {
8087 !                     LogPrintf("SetBestChain(): Failed to write CWalletTx, aborting atomic write\n");
8088                       walletdb.TxnAbort();
8089                       return;
8090                   }
8091               }
8092               if (!walletdb.WriteWitnessCacheSize(nWitnessCacheSize)) {
8093 !                 LogPrintf("SetBestChain(): Failed to write nWitnessCacheSize, aborting atomic write\n");
8094 !                 walletdb.TxnAbort();
8095 !                 return;
8096 !             }
8097 !             if (!walletdb.WriteBestBlock(loc)) {
8098 !                 LogPrintf("SetBestChain(): Failed to write best block, aborting atomic write\n");
8099                   walletdb.TxnAbort();
8100                   return;
8101               }
8102           } catch (const std::exception &exc) {
8103               // Unexpected failure
8104 !             LogPrintf("SetBestChain(): Unexpected error during atomic write:\n");
8105               LogPrintf("%s\n", exc.what());
8106               walletdb.TxnAbort();
8107               return;
8108           }
8109           if (!walletdb.TxnCommit()) {
8110               // Couldn't commit all to db, but in-memory state is fine
8111 !             LogPrintf("SetBestChain(): Couldn't commit atomic write\n");
8112               return;
8113           }
8114       }
8115 ***************
8116 *** 944,949 ****
8117 --- 963,969 ----
8118       CAmount GetCredit(const CTransaction& tx, const isminefilter& filter) const;
8119       CAmount GetChange(const CTransaction& tx) const;
8120       void ChainTip(const CBlockIndex *pindex, const CBlock *pblock, ZCIncrementalMerkleTree tree, bool added);
8121 +     /** Saves witness caches and best block locator to disk. */
8122       void SetBestChain(const CBlockLocator& loc);
8123   
8124       DBErrors LoadWallet(bool& fFirstRunRet);
8125 diff -crB ./src/zcash/GenerateParams.cpp ../../komodo-jl777/src/zcash/GenerateParams.cpp
8126 *** ./src/zcash/GenerateParams.cpp      2017-01-03 10:40:50.435340501 +0000
8127 --- ../../komodo-jl777/src/zcash/GenerateParams.cpp     2017-01-03 09:49:08.876507395 +0000
8128 ***************
8129 *** 9,26 ****
8130           return 1;
8131       }
8132   
8133 !     if(argc != 3) {
8134 !         std::cerr << "Usage: " << argv[0] << " provingKeyFileName verificationKeyFileName" << std::endl;
8135           return 1;
8136       }
8137   
8138       std::string pkFile = argv[1];
8139       std::string vkFile = argv[2];
8140   
8141       auto p = ZCJoinSplit::Generate();
8142   
8143       p->saveProvingKey(pkFile);
8144       p->saveVerifyingKey(vkFile);
8145   
8146       delete p;
8147   
8148 --- 9,28 ----
8149           return 1;
8150       }
8151   
8152 !     if(argc != 4) {
8153 !         std::cerr << "Usage: " << argv[0] << " provingKeyFileName verificationKeyFileName r1csFileName" << std::endl;
8154           return 1;
8155       }
8156   
8157       std::string pkFile = argv[1];
8158       std::string vkFile = argv[2];
8159 +     std::string r1csFile = argv[3];
8160   
8161       auto p = ZCJoinSplit::Generate();
8162   
8163       p->saveProvingKey(pkFile);
8164       p->saveVerifyingKey(vkFile);
8165 +     p->saveR1CS(r1csFile);
8166   
8167       delete p;
8168   
8169 diff -crB ./src/zcash/IncrementalMerkleTree.cpp ../../komodo-jl777/src/zcash/IncrementalMerkleTree.cpp
8170 *** ./src/zcash/IncrementalMerkleTree.cpp       2017-01-03 10:40:50.435340501 +0000
8171 --- ../../komodo-jl777/src/zcash/IncrementalMerkleTree.cpp      2017-01-03 09:49:08.876507395 +0000
8172 ***************
8173 *** 71,76 ****
8174 --- 71,87 ----
8175   }
8176   
8177   template<size_t Depth, typename Hash>
8178 + Hash IncrementalMerkleTree<Depth, Hash>::last() const {
8179 +     if (right) {
8180 +         return *right;
8181 +     } else if (left) {
8182 +         return *left;
8183 +     } else {
8184 +         throw std::runtime_error("tree has no cursor");
8185 +     }
8186 + }
8187
8188 + template<size_t Depth, typename Hash>
8189   void IncrementalMerkleTree<Depth, Hash>::append(Hash obj) {
8190       if (is_complete(Depth)) {
8191           throw std::runtime_error("tree is full");
8192 diff -crB ./src/zcash/IncrementalMerkleTree.hpp ../../komodo-jl777/src/zcash/IncrementalMerkleTree.hpp
8193 *** ./src/zcash/IncrementalMerkleTree.hpp       2017-01-03 10:40:50.435340501 +0000
8194 --- ../../komodo-jl777/src/zcash/IncrementalMerkleTree.hpp      2017-01-03 09:49:08.876507395 +0000
8195 ***************
8196 *** 79,84 ****
8197 --- 79,85 ----
8198       Hash root() const {
8199           return root(Depth, std::deque<Hash>());
8200       }
8201 +     Hash last() const;
8202   
8203       IncrementalWitness<Depth, Hash> witness() const {
8204           return IncrementalWitness<Depth, Hash>(*this);
8205 ***************
8206 *** 138,143 ****
8207 --- 139,150 ----
8208           return tree.path(partial_path());
8209       }
8210   
8211 +     // Return the element being witnessed (should be a note
8212 +     // commitment!)
8213 +     Hash element() const {
8214 +         return tree.last();
8215 +     }
8216
8217       Hash root() const {
8218           return tree.root(Depth, partial_path());
8219       }
8220 diff -crB ./src/zcash/JoinSplit.cpp ../../komodo-jl777/src/zcash/JoinSplit.cpp
8221 *** ./src/zcash/JoinSplit.cpp   2017-01-03 10:40:50.435340501 +0000
8222 --- ../../komodo-jl777/src/zcash/JoinSplit.cpp  2017-01-03 09:49:08.876507395 +0000
8223 ***************
8224 *** 16,21 ****
8225 --- 16,22 ----
8226   #include "libsnark/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_read_gadget.hpp"
8227   
8228   #include "sync.h"
8229 + #include "amount.h"
8230   
8231   using namespace libsnark;
8232   
8233 ***************
8234 *** 24,30 ****
8235   #include "zcash/circuit/gadget.tcc"
8236   
8237   CCriticalSection cs_ParamsIO;
8238 ! CCriticalSection cs_InitializeParams;
8239   
8240   template<typename T>
8241   void saveToFile(std::string path, T& obj) {
8242 --- 25,31 ----
8243   #include "zcash/circuit/gadget.tcc"
8244   
8245   CCriticalSection cs_ParamsIO;
8246 ! CCriticalSection cs_LoadKeys;
8247   
8248   template<typename T>
8249   void saveToFile(std::string path, T& obj) {
8250 ***************
8251 *** 70,91 ****
8252   
8253       boost::optional<r1cs_ppzksnark_proving_key<ppzksnark_ppT>> pk;
8254       boost::optional<r1cs_ppzksnark_verification_key<ppzksnark_ppT>> vk;
8255       boost::optional<std::string> pkPath;
8256   
8257       JoinSplitCircuit() {}
8258       ~JoinSplitCircuit() {}
8259   
8260 -     static void initialize() {
8261 -         LOCK(cs_InitializeParams);
8262
8263 -         ppzksnark_ppT::init_public_params();
8264 -     }
8265
8266       void setProvingKeyPath(std::string path) {
8267           pkPath = path;
8268       }
8269   
8270       void loadProvingKey() {
8271           if (!pk) {
8272               if (!pkPath) {
8273                   throw std::runtime_error("proving key path unknown");
8274 --- 71,89 ----
8275   
8276       boost::optional<r1cs_ppzksnark_proving_key<ppzksnark_ppT>> pk;
8277       boost::optional<r1cs_ppzksnark_verification_key<ppzksnark_ppT>> vk;
8278 +     boost::optional<r1cs_ppzksnark_processed_verification_key<ppzksnark_ppT>> vk_precomp;
8279       boost::optional<std::string> pkPath;
8280   
8281       JoinSplitCircuit() {}
8282       ~JoinSplitCircuit() {}
8283   
8284       void setProvingKeyPath(std::string path) {
8285           pkPath = path;
8286       }
8287   
8288       void loadProvingKey() {
8289 +         LOCK(cs_LoadKeys);
8290
8291           if (!pk) {
8292               if (!pkPath) {
8293                   throw std::runtime_error("proving key path unknown");
8294 ***************
8295 *** 102,108 ****
8296 --- 100,113 ----
8297           }
8298       }
8299       void loadVerifyingKey(std::string path) {
8300 +         LOCK(cs_LoadKeys);
8301
8302           loadFromFile(path, vk);
8303
8304 +         processVerifyingKey();
8305 +     }
8306 +     void processVerifyingKey() {
8307 +         vk_precomp = r1cs_ppzksnark_verifier_process_vk(*vk);
8308       }
8309       void saveVerifyingKey(std::string path) {
8310           if (vk) {
8311 ***************
8312 *** 111,132 ****
8313               throw std::runtime_error("cannot save verifying key; key doesn't exist");
8314           }
8315       }
8316   
8317 !     void generate() {
8318           protoboard<FieldT> pb;
8319   
8320           joinsplit_gadget<FieldT, NumInputs, NumOutputs> g(pb);
8321           g.generate_r1cs_constraints();
8322   
8323 !         const r1cs_constraint_system<FieldT> constraint_system = pb.get_constraint_system();
8324           r1cs_ppzksnark_keypair<ppzksnark_ppT> keypair = r1cs_ppzksnark_generator<ppzksnark_ppT>(constraint_system);
8325   
8326           pk = keypair.pk;
8327           vk = keypair.vk;
8328       }
8329   
8330       bool verify(
8331           const ZCProof& proof,
8332           const uint256& pubKeyHash,
8333           const uint256& randomSeed,
8334           const boost::array<uint256, NumInputs>& macs,
8335 --- 116,150 ----
8336               throw std::runtime_error("cannot save verifying key; key doesn't exist");
8337           }
8338       }
8339 +     void saveR1CS(std::string path) {
8340 +         auto r1cs = generate_r1cs();
8341   
8342 !         saveToFile(path, r1cs);
8343 !     }
8344
8345 !     r1cs_constraint_system<FieldT> generate_r1cs() {
8346           protoboard<FieldT> pb;
8347   
8348           joinsplit_gadget<FieldT, NumInputs, NumOutputs> g(pb);
8349           g.generate_r1cs_constraints();
8350   
8351 !         return pb.get_constraint_system();
8352 !     }
8353
8354 !     void generate() {
8355 !         LOCK(cs_LoadKeys);
8356
8357 !         const r1cs_constraint_system<FieldT> constraint_system = generate_r1cs();
8358           r1cs_ppzksnark_keypair<ppzksnark_ppT> keypair = r1cs_ppzksnark_generator<ppzksnark_ppT>(constraint_system);
8359   
8360           pk = keypair.pk;
8361           vk = keypair.vk;
8362 +         processVerifyingKey();
8363       }
8364   
8365       bool verify(
8366           const ZCProof& proof,
8367 +         ProofVerifier& verifier,
8368           const uint256& pubKeyHash,
8369           const uint256& randomSeed,
8370           const boost::array<uint256, NumInputs>& macs,
8371 ***************
8372 *** 136,142 ****
8373           uint64_t vpub_new,
8374           const uint256& rt
8375       ) {
8376 !         if (!vk) {
8377               throw std::runtime_error("JoinSplit verifying key not loaded");
8378           }
8379   
8380 --- 154,160 ----
8381           uint64_t vpub_new,
8382           const uint256& rt
8383       ) {
8384 !         if (!vk || !vk_precomp) {
8385               throw std::runtime_error("JoinSplit verifying key not loaded");
8386           }
8387   
8388 ***************
8389 *** 155,161 ****
8390                   vpub_new
8391               );
8392   
8393 !             return r1cs_ppzksnark_verifier_strong_IC<ppzksnark_ppT>(*vk, witness, r1cs_proof);
8394           } catch (...) {
8395               return false;
8396           }
8397 --- 173,184 ----
8398                   vpub_new
8399               );
8400   
8401 !             return verifier.check(
8402 !                 *vk,
8403 !                 *vk_precomp,
8404 !                 witness,
8405 !                 r1cs_proof
8406 !             );
8407           } catch (...) {
8408               return false;
8409           }
8410 ***************
8411 *** 181,188 ****
8412               throw std::runtime_error("JoinSplit proving key not loaded");
8413           }
8414   
8415 !         // Compute nullifiers of inputs
8416           for (size_t i = 0; i < NumInputs; i++) {
8417               out_nullifiers[i] = inputs[i].nullifier();
8418           }
8419   
8420 --- 204,254 ----
8421               throw std::runtime_error("JoinSplit proving key not loaded");
8422           }
8423   
8424 !         if (vpub_old > MAX_MONEY) {
8425 !             throw std::invalid_argument("nonsensical vpub_old value");
8426 !         }
8427
8428 !         if (vpub_new > MAX_MONEY) {
8429 !             throw std::invalid_argument("nonsensical vpub_new value");
8430 !         }
8431
8432 !         uint64_t lhs_value = vpub_old;
8433 !         uint64_t rhs_value = vpub_new;
8434
8435           for (size_t i = 0; i < NumInputs; i++) {
8436 +             // Sanity checks of input
8437 +             {
8438 +                 // If note has nonzero value
8439 +                 if (inputs[i].note.value != 0) {
8440 +                     // The witness root must equal the input root.
8441 +                     if (inputs[i].witness.root() != rt) {
8442 +                         throw std::invalid_argument("joinsplit not anchored to the correct root");
8443 +                     }
8444
8445 +                     // The tree must witness the correct element
8446 +                     if (inputs[i].note.cm() != inputs[i].witness.element()) {
8447 +                         throw std::invalid_argument("witness of wrong element for joinsplit input");
8448 +                     }
8449 +                 }
8450
8451 +                 // Ensure we have the key to this note.
8452 +                 if (inputs[i].note.a_pk != inputs[i].key.address().a_pk) {
8453 +                     throw std::invalid_argument("input note not authorized to spend with given key");
8454 +                 }
8455
8456 +                 // Balance must be sensical
8457 +                 if (inputs[i].note.value > MAX_MONEY) {
8458 +                     throw std::invalid_argument("nonsensical input note value");
8459 +                 }
8460
8461 +                 lhs_value += inputs[i].note.value;
8462
8463 +                 if (lhs_value > MAX_MONEY) {
8464 +                     throw std::invalid_argument("nonsensical left hand size of joinsplit balance");
8465 +                 }
8466 +             }
8467
8468 +             // Compute nullifier of input
8469               out_nullifiers[i] = inputs[i].nullifier();
8470           }
8471   
8472 ***************
8473 *** 197,208 ****
8474 --- 263,291 ----
8475   
8476           // Compute notes for outputs
8477           for (size_t i = 0; i < NumOutputs; i++) {
8478 +             // Sanity checks of output
8479 +             {
8480 +                 if (outputs[i].value > MAX_MONEY) {
8481 +                     throw std::invalid_argument("nonsensical output value");
8482 +                 }
8483
8484 +                 rhs_value += outputs[i].value;
8485
8486 +                 if (rhs_value > MAX_MONEY) {
8487 +                     throw std::invalid_argument("nonsensical right hand side of joinsplit balance");
8488 +                 }
8489 +             }
8490
8491               // Sample r
8492               uint256 r = random_uint256();
8493   
8494               out_notes[i] = outputs[i].note(phi, r, i, h_sig);
8495           }
8496   
8497 +         if (lhs_value != rhs_value) {
8498 +             throw std::invalid_argument("invalid joinsplit balance");
8499 +         }
8500
8501           // Compute the output commitments
8502           for (size_t i = 0; i < NumOutputs; i++) {
8503               out_commitments[i] = out_notes[i].cm();
8504 ***************
8505 *** 249,257 ****
8506               );
8507           }
8508   
8509 !         if (!pb.is_satisfied()) {
8510 !             throw std::invalid_argument("Constraint system not satisfied by inputs");
8511 !         }
8512   
8513           // TODO: These are copies, which is not strictly necessary.
8514           std::vector<FieldT> primary_input = pb.primary_input();
8515 --- 331,339 ----
8516               );
8517           }
8518   
8519 !         // The constraint system must be satisfied or there is an unimplemented
8520 !         // or incorrect sanity check above. Or the constraint system is broken!
8521 !         assert(pb.is_satisfied());
8522   
8523           // TODO: These are copies, which is not strictly necessary.
8524           std::vector<FieldT> primary_input = pb.primary_input();
8525 ***************
8526 *** 275,281 ****
8527   template<size_t NumInputs, size_t NumOutputs>
8528   JoinSplit<NumInputs, NumOutputs>* JoinSplit<NumInputs, NumOutputs>::Generate()
8529   {
8530 !     JoinSplitCircuit<NumInputs, NumOutputs>::initialize();
8531       auto js = new JoinSplitCircuit<NumInputs, NumOutputs>();
8532       js->generate();
8533   
8534 --- 357,363 ----
8535   template<size_t NumInputs, size_t NumOutputs>
8536   JoinSplit<NumInputs, NumOutputs>* JoinSplit<NumInputs, NumOutputs>::Generate()
8537   {
8538 !     initialize_curve_params();
8539       auto js = new JoinSplitCircuit<NumInputs, NumOutputs>();
8540       js->generate();
8541   
8542 ***************
8543 *** 285,291 ****
8544   template<size_t NumInputs, size_t NumOutputs>
8545   JoinSplit<NumInputs, NumOutputs>* JoinSplit<NumInputs, NumOutputs>::Unopened()
8546   {
8547 !     JoinSplitCircuit<NumInputs, NumOutputs>::initialize();
8548       return new JoinSplitCircuit<NumInputs, NumOutputs>();
8549   }
8550   
8551 --- 367,373 ----
8552   template<size_t NumInputs, size_t NumOutputs>
8553   JoinSplit<NumInputs, NumOutputs>* JoinSplit<NumInputs, NumOutputs>::Unopened()
8554   {
8555 !     initialize_curve_params();
8556       return new JoinSplitCircuit<NumInputs, NumOutputs>();
8557   }
8558   
8559 diff -crB ./src/zcash/JoinSplit.hpp ../../komodo-jl777/src/zcash/JoinSplit.hpp
8560 *** ./src/zcash/JoinSplit.hpp   2017-01-03 10:40:50.435340501 +0000
8561 --- ../../komodo-jl777/src/zcash/JoinSplit.hpp  2017-01-03 09:49:08.876507395 +0000
8562 ***************
8563 *** 62,67 ****
8564 --- 62,68 ----
8565       virtual void saveProvingKey(std::string path) = 0;
8566       virtual void loadVerifyingKey(std::string path) = 0;
8567       virtual void saveVerifyingKey(std::string path) = 0;
8568 +     virtual void saveR1CS(std::string path) = 0;
8569   
8570       virtual ZCProof prove(
8571           const boost::array<JSInput, NumInputs>& inputs,
8572 ***************
8573 *** 82,87 ****
8574 --- 83,89 ----
8575   
8576       virtual bool verify(
8577           const ZCProof& proof,
8578 +         ProofVerifier& verifier,
8579           const uint256& pubKeyHash,
8580           const uint256& randomSeed,
8581           const boost::array<uint256, NumInputs>& hmacs,
8582 diff -crB ./src/zcash/Proof.cpp ../../komodo-jl777/src/zcash/Proof.cpp
8583 *** ./src/zcash/Proof.cpp       2017-01-03 10:40:50.435340501 +0000
8584 --- ../../komodo-jl777/src/zcash/Proof.cpp      2017-01-03 09:49:08.876507395 +0000
8585 ***************
8586 *** 1,6 ****
8587 --- 1,7 ----
8588   #include "Proof.hpp"
8589   
8590   #include <boost/static_assert.hpp>
8591 + #include <mutex>
8592   
8593   #include "crypto/common.h"
8594   #include "libsnark/common/default_types/r1cs_ppzksnark_pp.hpp"
8595 ***************
8596 *** 211,214 ****
8597 --- 212,247 ----
8598       return p;
8599   }
8600   
8601 + std::once_flag init_public_params_once_flag;
8602
8603 + void initialize_curve_params()
8604 + {
8605 +     std::call_once (init_public_params_once_flag, curve_pp::init_public_params);
8606 + }
8607
8608 + ProofVerifier ProofVerifier::Strict() {
8609 +     initialize_curve_params();
8610 +     return ProofVerifier(true);
8611 + }
8612
8613 + ProofVerifier ProofVerifier::Disabled() {
8614 +     initialize_curve_params();
8615 +     return ProofVerifier(false);
8616 + }
8617
8618 + template<>
8619 + bool ProofVerifier::check(
8620 +     const r1cs_ppzksnark_verification_key<curve_pp>& vk,
8621 +     const r1cs_ppzksnark_processed_verification_key<curve_pp>& pvk,
8622 +     const r1cs_primary_input<curve_Fr>& primary_input,
8623 +     const r1cs_ppzksnark_proof<curve_pp>& proof
8624 + )
8625 + {
8626 +     if (perform_verification) {
8627 +         return r1cs_ppzksnark_online_verifier_strong_IC<curve_pp>(pvk, primary_input, proof);
8628 +     } else {
8629 +         return true;
8630 +     }
8631 + }
8632
8633   }
8634 diff -crB ./src/zcash/Proof.hpp ../../komodo-jl777/src/zcash/Proof.hpp
8635 *** ./src/zcash/Proof.hpp       2017-01-03 10:40:50.435340501 +0000
8636 --- ../../komodo-jl777/src/zcash/Proof.hpp      2017-01-03 09:49:08.876507395 +0000
8637 ***************
8638 *** 235,240 ****
8639 --- 235,276 ----
8640       }
8641   };
8642   
8643 + void initialize_curve_params();
8644
8645 + class ProofVerifier {
8646 + private:
8647 +     bool perform_verification;
8648
8649 +     ProofVerifier(bool perform_verification) : perform_verification(perform_verification) { }
8650
8651 + public:
8652 +     // ProofVerifier should never be copied
8653 +     ProofVerifier(const ProofVerifier&) = delete;
8654 +     ProofVerifier& operator=(const ProofVerifier&) = delete;
8655 +     ProofVerifier(ProofVerifier&&);
8656 +     ProofVerifier& operator=(ProofVerifier&&);
8657
8658 +     // Creates a verification context that strictly verifies
8659 +     // all proofs using libsnark's API.
8660 +     static ProofVerifier Strict();
8661
8662 +     // Creates a verification context that performs no
8663 +     // verification, used when avoiding duplicate effort
8664 +     // such as during reindexing.
8665 +     static ProofVerifier Disabled();
8666
8667 +     template <typename VerificationKey,
8668 +               typename ProcessedVerificationKey,
8669 +               typename PrimaryInput,
8670 +               typename Proof
8671 +               >
8672 +     bool check(
8673 +         const VerificationKey& vk,
8674 +         const ProcessedVerificationKey& pvk,
8675 +         const PrimaryInput& pi,
8676 +         const Proof& p
8677 +     );
8678 + };
8679   
8680   }
8681   
8682 diff -crB ./src/zcbenchmarks.cpp ../../komodo-jl777/src/zcbenchmarks.cpp
8683 *** ./src/zcbenchmarks.cpp      2017-01-03 10:40:50.435340501 +0000
8684 --- ../../komodo-jl777/src/zcbenchmarks.cpp     2017-01-03 09:49:08.876507395 +0000
8685 ***************
8686 *** 17,22 ****
8687 --- 17,23 ----
8688   #include "script/sign.h"
8689   #include "sodium.h"
8690   #include "streams.h"
8691 + #include "utiltest.h"
8692   #include "wallet/wallet.h"
8693   
8694   #include "zcbenchmarks.h"
8695 ***************
8696 *** 89,95 ****
8697                            0);
8698       double ret = timer_stop(tv_start);
8699   
8700 !     assert(jsdesc.Verify(*pzcashParams, pubKeyHash));
8701       return ret;
8702   }
8703   
8704 --- 90,97 ----
8705                            0);
8706       double ret = timer_stop(tv_start);
8707   
8708 !     auto verifier = libzcash::ProofVerifier::Strict();
8709 !     assert(jsdesc.Verify(*pzcashParams, verifier, pubKeyHash));
8710       return ret;
8711   }
8712   
8713 ***************
8714 *** 98,104 ****
8715       struct timeval tv_start;
8716       timer_start(tv_start);
8717       uint256 pubKeyHash;
8718 !     joinsplit.Verify(*pzcashParams, pubKeyHash);
8719       return timer_stop(tv_start);
8720   }
8721   
8722 --- 100,107 ----
8723       struct timeval tv_start;
8724       timer_start(tv_start);
8725       uint256 pubKeyHash;
8726 !     auto verifier = libzcash::ProofVerifier::Strict();
8727 !     joinsplit.Verify(*pzcashParams, verifier, pubKeyHash);
8728       return timer_stop(tv_start);
8729   }
8730   
8731 ***************
8732 *** 223,225 ****
8733 --- 226,301 ----
8734       return timer_stop(tv_start);
8735   }
8736   
8737 + double benchmark_try_decrypt_notes(size_t nAddrs)
8738 + {
8739 +     CWallet wallet;
8740 +     for (int i = 0; i < nAddrs; i++) {
8741 +         auto sk = libzcash::SpendingKey::random();
8742 +         wallet.AddSpendingKey(sk);
8743 +     }
8744
8745 +     auto sk = libzcash::SpendingKey::random();
8746 +     auto tx = GetValidReceive(*pzcashParams, sk, 10, true);
8747
8748 +     struct timeval tv_start;
8749 +     timer_start(tv_start);
8750 +     auto nd = wallet.FindMyNotes(tx);
8751 +     return timer_stop(tv_start);
8752 + }
8753
8754 + double benchmark_increment_note_witnesses(size_t nTxs)
8755 + {
8756 +     CWallet wallet;
8757 +     ZCIncrementalMerkleTree tree;
8758
8759 +     auto sk = libzcash::SpendingKey::random();
8760 +     wallet.AddSpendingKey(sk);
8761
8762 +     // First block
8763 +     CBlock block1;
8764 +     for (int i = 0; i < nTxs; i++) {
8765 +         auto wtx = GetValidReceive(*pzcashParams, sk, 10, true);
8766 +         auto note = GetNote(*pzcashParams, sk, wtx, 0, 1);
8767 +         auto nullifier = note.nullifier(sk);
8768
8769 +         mapNoteData_t noteData;
8770 +         JSOutPoint jsoutpt {wtx.GetHash(), 0, 1};
8771 +         CNoteData nd {sk.address(), nullifier};
8772 +         noteData[jsoutpt] = nd;
8773
8774 +         wtx.SetNoteData(noteData);
8775 +         wallet.AddToWallet(wtx, true, NULL);
8776 +         block1.vtx.push_back(wtx);
8777 +     }
8778 +     CBlockIndex index1(block1);
8779 +     index1.nHeight = 1;
8780
8781 +     // Increment to get transactions witnessed
8782 +     wallet.ChainTip(&index1, &block1, tree, true);
8783
8784 +     // Second block
8785 +     CBlock block2;
8786 +     block2.hashPrevBlock = block1.GetHash();
8787 +     {
8788 +         auto wtx = GetValidReceive(*pzcashParams, sk, 10, true);
8789 +         auto note = GetNote(*pzcashParams, sk, wtx, 0, 1);
8790 +         auto nullifier = note.nullifier(sk);
8791
8792 +         mapNoteData_t noteData;
8793 +         JSOutPoint jsoutpt {wtx.GetHash(), 0, 1};
8794 +         CNoteData nd {sk.address(), nullifier};
8795 +         noteData[jsoutpt] = nd;
8796
8797 +         wtx.SetNoteData(noteData);
8798 +         wallet.AddToWallet(wtx, true, NULL);
8799 +         block2.vtx.push_back(wtx);
8800 +     }
8801 +     CBlockIndex index2(block2);
8802 +     index2.nHeight = 2;
8803
8804 +     struct timeval tv_start;
8805 +     timer_start(tv_start);
8806 +     wallet.ChainTip(&index2, &block2, tree, true);
8807 +     return timer_stop(tv_start);
8808 + }
8809
8810 diff -crB ./src/zcbenchmarks.h ../../komodo-jl777/src/zcbenchmarks.h
8811 *** ./src/zcbenchmarks.h        2017-01-03 10:40:50.435340501 +0000
8812 --- ../../komodo-jl777/src/zcbenchmarks.h       2017-01-03 09:49:08.876507395 +0000
8813 ***************
8814 *** 12,16 ****
8815 --- 12,18 ----
8816   extern double benchmark_verify_joinsplit(const JSDescription &joinsplit);
8817   extern double benchmark_verify_equihash();
8818   extern double benchmark_large_tx();
8819 + extern double benchmark_try_decrypt_notes(size_t nAddrs);
8820 + extern double benchmark_increment_note_witnesses(size_t nTxs);
8821   
8822   #endif
8823 diff -crB ./zcutil/build-debian-package.sh ../../komodo-jl777/zcutil/build-debian-package.sh
8824 *** ./zcutil/build-debian-package.sh    2017-01-03 10:40:50.435340501 +0000
8825 --- ../../komodo-jl777/zcutil/build-debian-package.sh   2017-01-03 09:49:08.876507395 +0000
8826 ***************
8827 *** 23,32 ****
8828       rm -R $BUILD_DIR
8829   fi
8830   
8831   DEB_BIN=$BUILD_DIR/usr/bin
8832   DEB_DOC=$BUILD_DIR/usr/share/doc/$PACKAGE_NAME
8833   DEB_MAN=$BUILD_DIR/usr/share/man/man1
8834 ! mkdir -p $BUILD_DIR/DEBIAN $DEB_BIN $DEB_DOC $DEB_MAN
8835   chmod 0755 -R $BUILD_DIR/*
8836   
8837   # Copy control file
8838 --- 23,33 ----
8839       rm -R $BUILD_DIR
8840   fi
8841   
8842 + DEB_CMP=$BUILD_DIR/etc/bash_completion.d
8843   DEB_BIN=$BUILD_DIR/usr/bin
8844   DEB_DOC=$BUILD_DIR/usr/share/doc/$PACKAGE_NAME
8845   DEB_MAN=$BUILD_DIR/usr/share/man/man1
8846 ! mkdir -p $BUILD_DIR/DEBIAN $DEB_CMP $DEB_BIN $DEB_DOC $DEB_MAN
8847   chmod 0755 -R $BUILD_DIR/*
8848   
8849   # Copy control file
8850 ***************
8851 *** 48,53 ****
8852 --- 49,57 ----
8853   # Copy manpages
8854   cp $SRC_DEB/manpages/zcashd.1 $DEB_MAN
8855   cp $SRC_DEB/manpages/zcash-cli.1 $DEB_MAN
8856 + # Copy bash completion files
8857 + cp $SRC_PATH/contrib/bitcoind.bash-completion $DEB_CMP/zcashd
8858 + cp $SRC_PATH/contrib/bitcoin-cli.bash-completion $DEB_CMP/zcash-cli
8859   # Gzip files
8860   gzip --best -n $DEB_DOC/changelog
8861   gzip --best -n $DEB_DOC/changelog.Debian
8862 diff -crB ./zcutil/build.sh ../../komodo-jl777/zcutil/build.sh
8863 *** ./zcutil/build.sh   2017-01-03 10:40:50.435340501 +0000
8864 --- ../../komodo-jl777/zcutil/build.sh  2017-01-03 09:49:08.876507395 +0000
8865 ***************
8866 *** 1,7 ****
8867 ! #!/bin/bash
8868   
8869   set -eu -o pipefail
8870   
8871   if [ "x$*" = 'x--help' ]
8872   then
8873       cat <<EOF
8874 --- 1,30 ----
8875 ! #!/usr/bin/env bash
8876   
8877   set -eu -o pipefail
8878   
8879 + # Allow user overrides to $MAKE. Typical usage for users who need it:
8880 + #   MAKE=gmake ./zcutil/build.sh -j$(nproc)
8881 + if [[ -z "${MAKE-}" ]]; then
8882 +     MAKE=make
8883 + fi
8884
8885 + # Allow overrides to $BUILD and $HOST for porters. Most users will not need it.
8886 + #   BUILD=i686-pc-linux-gnu ./zcutil/build.sh
8887 + if [[ -z "${BUILD-}" ]]; then
8888 +     BUILD=x86_64-unknown-linux-gnu
8889 + fi
8890 + if [[ -z "${HOST-}" ]]; then
8891 +     HOST=x86_64-unknown-linux-gnu
8892 + fi
8893
8894 + # Allow override to $CC and $CXX for porters. Most users will not need it.
8895 + if [[ -z "${CC-}" ]]; then
8896 +     CC=gcc
8897 + fi
8898 + if [[ -z "${CXX-}" ]]; then
8899 +     CXX=g++
8900 + fi
8901
8902   if [ "x$*" = 'x--help' ]
8903   then
8904       cat <<EOF
8905 ***************
8906 *** 10,20 ****
8907   $0 --help
8908     Show this help message and exit.
8909   
8910 ! $0 [ --enable-lcov ] [ MAKEARGS... ]
8911     Build Zcash and most of its transitive dependencies from
8912 !   source. MAKEARGS are applied to both dependencies and Zcash itself. If
8913 !   --enable-lcov is passed, Zcash is configured to add coverage
8914     instrumentation, thus enabling "make cov" to work.
8915   EOF
8916       exit 0
8917   fi
8918 --- 33,45 ----
8919   $0 --help
8920     Show this help message and exit.
8921   
8922 ! $0 [ --enable-lcov || --disable-tests ] [ MAKEARGS... ]
8923     Build Zcash and most of its transitive dependencies from
8924 !   source. MAKEARGS are applied to both dependencies and Zcash itself.
8925
8926 !   If --enable-lcov is passed, Zcash is configured to add coverage
8927     instrumentation, thus enabling "make cov" to work.
8928 +   If --disable-tests is passed instead, the Zcash tests are not built.
8929   EOF
8930       exit 0
8931   fi
8932 ***************
8933 *** 25,41 ****
8934   # If --enable-lcov is the first argument, enable lcov coverage support:
8935   LCOV_ARG=''
8936   HARDENING_ARG='--enable-hardening'
8937   if [ "x${1:-}" = 'x--enable-lcov' ]
8938   then
8939       LCOV_ARG='--enable-lcov'
8940       HARDENING_ARG='--disable-hardening'
8941       shift
8942   fi
8943   
8944 ! # BUG: parameterize the platform/host directory:
8945 ! PREFIX="$(pwd)/depends/x86_64-unknown-linux-gnu/"
8946   
8947 ! HOST=x86_64-unknown-linux-gnu BUILD=x86_64-unknown-linux-gnu make "$@" -C ./depends/ V=1 NO_QT=1
8948   ./autogen.sh
8949 ! ./configure --prefix="${PREFIX}" --host=x86_64-unknown-linux-gnu --build=x86_64-unknown-linux-gnu --with-gui=no "$HARDENING_ARG" "$LCOV_ARG" CXXFLAGS='-fwrapv -fno-strict-aliasing -Werror -g'
8950 ! make "$@" V=1
8951 --- 50,70 ----
8952   # If --enable-lcov is the first argument, enable lcov coverage support:
8953   LCOV_ARG=''
8954   HARDENING_ARG='--enable-hardening'
8955 + TEST_ARG=''
8956   if [ "x${1:-}" = 'x--enable-lcov' ]
8957   then
8958       LCOV_ARG='--enable-lcov'
8959       HARDENING_ARG='--disable-hardening'
8960       shift
8961 + elif [ "x${1:-}" = 'x--disable-tests' ]
8962 + then
8963 +     TEST_ARG='--enable-tests=no'
8964 +     shift
8965   fi
8966   
8967 ! PREFIX="$(pwd)/depends/$BUILD/"
8968   
8969 ! HOST="$HOST" BUILD="$BUILD" "$MAKE" "$@" -C ./depends/ V=1 NO_QT=1
8970   ./autogen.sh
8971 ! CC="$CC" CXX="$CXX" ./configure --prefix="${PREFIX}" --host="$HOST" --build="$BUILD" --with-gui=no "$HARDENING_ARG" "$LCOV_ARG" "$TEST_ARG" CXXFLAGS='-fwrapv -fno-strict-aliasing -Werror -g'
8972 ! "$MAKE" "$@" V=1
8973 diff -crB ./zcutil/docker-entrypoint.sh ../../komodo-jl777/zcutil/docker-entrypoint.sh
8974 *** ./zcutil/docker-entrypoint.sh       2017-01-03 10:40:50.435340501 +0000
8975 --- ../../komodo-jl777/zcutil/docker-entrypoint.sh      2017-01-03 09:49:08.876507395 +0000
8976 ***************
8977 *** 14,25 ****
8978   txindex=1
8979   bind=${listenip:-127.0.0.1}
8980   rpcbind=${listenip:-127.0.0.1}
8981 - addnode=5.9.102.210
8982 - addnode=78.47.196.146
8983 - addnode=178.63.69.164
8984 - addnode=88.198.65.74
8985 - addnode=5.9.122.241
8986 - addnode=144.76.94.38
8987   EOF
8988   
8989       cat $HOME/.komodo/komodo.conf
8990 --- 14,19 ----
8991 ***************
8992 *** 27,35 ****
8993   
8994   echo "...Checking fetch-params"
8995   $HOME/zcutil/fetch-params.sh
8996
8997   echo "Initialization completed successfully"
8998   echo
8999   if [ $# -gt 0 ]; then
9000   
9001       args=("$@")
9002 --- 21,30 ----
9003   
9004   echo "...Checking fetch-params"
9005   $HOME/zcutil/fetch-params.sh
9006   echo "Initialization completed successfully"
9007   echo
9008
9009 + # ToDo: Needs some rework. I was sick
9010   if [ $# -gt 0 ]; then
9011   
9012       args=("$@")
9013 diff -crB ./zcutil/docker-komodo-cli.sh ../../komodo-jl777/zcutil/docker-komodo-cli.sh
9014 *** ./zcutil/docker-komodo-cli.sh       2017-01-03 10:40:50.435340501 +0000
9015 --- ../../komodo-jl777/zcutil/docker-komodo-cli.sh      2017-01-03 09:49:08.876507395 +0000
9016 ***************
9017 *** 1,11 ****
9018   #!/bin/bash
9019 - if [  -z ${assetchain+x} ]; then
9020   
9021 !     /komodo/src/komodo-cli $1 $2 $3 $4
9022   
9023 ! else
9024
9025 !     /komodo/src/komodo-cli -ac_name=$assetchain $1 $2 $3 $4
9026
9027 ! fi
9028   
9029 --- 1,6 ----
9030   #!/bin/bash
9031   
9032 ! # ToDo: check for docker arg ac_name
9033   
9034 ! /komodo/src/komodo-cli $1 $2 $3 $4
9035   
9036 diff -crB ./zcutil/fetch-params.sh ../../komodo-jl777/zcutil/fetch-params.sh
9037 *** ./zcutil/fetch-params.sh    2017-01-03 10:40:50.435340501 +0000
9038 --- ../../komodo-jl777/zcutil/fetch-params.sh   2017-01-03 09:49:08.876507395 +0000
9039 ***************
9040 *** 67,72 ****
9041 --- 67,76 ----
9042       cat <<EOF
9043   Zcash - fetch-params.sh
9044   
9045 + This script will fetch the Zcash zkSNARK parameters and verify their
9046 + integrity with sha256sum.
9047
9048 + If they already exist locally, it will exit now and do nothing else.
9049   EOF
9050   
9051       # Now create PARAMS_DIR and insert a README if necessary:
9052 ***************
9053 *** 84,92 ****
9054           # This may be the first time the user's run this script, so give
9055           # them some info, especially about bandwidth usage:
9056           cat <<EOF
9057 - This script will fetch the Zcash zkSNARK parameters and verify their
9058 - integrity with sha256sum.
9059
9060   The parameters are currently just under 911MB in size, so plan accordingly
9061   for your bandwidth constraints. If the files are already present and
9062   have the correct sha256sum, no networking is used.
9063 --- 88,93 ----
9064 ***************
9065 *** 104,107 ****
9066 --- 105,109 ----
9067   }
9068   
9069   main
9070 + rm -f /tmp/fetch_params.lock
9071   exit 0
9072 Only in ../../komodo-jl777/zcutil: release-notes.py
This page took 0.546381 seconds and 4 git commands to generate.