diff --git a/README.md b/README.md index 8bdea6f04c..64fa05b87a 100644 --- a/README.md +++ b/README.md @@ -16,14 +16,12 @@ This library provides a clean wrapper around all the methods exposed by a Polkad The API is split up into a number of internal packages - - [@polkadot/api](packages/api/) The low-level base API library +- [@polkadot/api-codec](packages/api-codec/) Codecs for all Polkadot primitives - [@polkadot/api-rx](packages/api-rx/) A RxJs Observable wrapper around the API -- [@polkadot/api-format](packages/api-format/) Input and output formatters - [@polkadot/api-provider](packages/api-provider/) Providers for connecting Type definitions for interfaces as exposed by Polkadot & Substrate clients - - [@polkadot/extrinsics](packages/type-extrinsics/) Base extrinsic definitions & codecs - [@polkadot/jsonrpc](packages/type-jsonrpc/) Definitions for JSONRPC endpoints -- [@polkadot/params](packages/type-params/) Input/output parameter formatting -- [@polkadot/primitives](packages/type-primitives/) Primitive type definitions, builder & codecs - [@polkadot/storage](packages/type-storage/) Definitions for storage entries diff --git a/jest.config.js b/jest.config.js index 20fe0e6f2c..c5958d3857 100644 --- a/jest.config.js +++ b/jest.config.js @@ -2,7 +2,7 @@ const config = require('@polkadot/dev/config/jest'); module.exports = Object.assign({}, config, { moduleNameMapper: { - '@polkadot/api-(codec|jsonrpc|provider|rx)(.*)$': '/packages/api-$1/src/$2', + '@polkadot/api-(codec|jsonrpc|observable|provider|rx)(.*)$': '/packages/api-$1/src/$2', '@polkadot/api(.*)$': '/packages/api/src/$1', '@polkadot/extrinsics(.*)$': '/packages/type-extrinsics/src/$1', '@polkadot/jsonrpc(.*)$': '/packages/type-jsonrpc/src/$1', diff --git a/packages/api-codec/src/Metadata.rpc.ts b/packages/api-codec/src/Metadata.rpc.ts index 43bb0f62bb..a3d2baced5 100644 --- a/packages/api-codec/src/Metadata.rpc.ts +++ b/packages/api-codec/src/Metadata.rpc.ts @@ -2,8 +2,6 @@ // This software may be modified and distributed under the terms // of the ISC license. See the LICENSE file for details. -const meta = [ - 20, 69, 118, 101, 110, 116, 40, 24, 115, 121, 115, 116, 101, 109, 8, 64, 69, 120, 116, 114, 105, 110, 115, 105, 99, 83, 117, 99, 99, 101, 115, 115, 0, 4, 148, 32, 65, 110, 32, 101, 120, 116, 114, 105, 110, 115, 105, 99, 32, 99, 111, 109, 112, 108, 101, 116, 101, 100, 32, 115, 117, 99, 99, 101, 115, 115, 102, 117, 108, 108, 121, 46, 60, 69, 120, 116, 114, 105, 110, 115, 105, 99, 70, 97, 105, 108, 101, 100, 0, 4, 84, 32, 65, 110, 32, 101, 120, 116, 114, 105, 110, 115, 105, 99, 32, 102, 97, 105, 108, 101, 100, 46, 32, 98, 97, 108, 97, 110, 99, 101, 115, 12, 40, 78, 101, 119, 65, 99, 99, 111, 117, 110, 116, 12, 36, 65, 99, 99, 111, 117, 110, 116, 73, 100, 48, 65, 99, 99, 111, 117, 110, 116, 73, 110, 100, 101, 120, 68, 78, 101, 119, 65, 99, 99, 111, 117, 110, 116, 79, 117, 116, 99, 111, 109, 101, 4, 108, 32, 65, 32, 110, 101, 119, 32, 97, 99, 99, 111, 117, 110, 116, 32, 119, 97, 115, 32, 99, 114, 101, 97, 116, 101, 100, 46, 52, 82, 101, 97, 112, 101, 100, 65, 99, 99, 111, 117, 110, 116, 4, 36, 65, 99, 99, 111, 117, 110, 116, 73, 100, 4, 92, 32, 65, 110, 32, 97, 99, 99, 111, 117, 110, 116, 32, 119, 97, 115, 32, 114, 101, 97, 112, 101, 100, 46, 32, 84, 114, 97, 110, 115, 102, 101, 114, 16, 36, 65, 99, 99, 111, 117, 110, 116, 73, 100, 36, 65, 99, 99, 111, 117, 110, 116, 73, 100, 28, 66, 97, 108, 97, 110, 99, 101, 28, 66, 97, 108, 97, 110, 99, 101, 4, 176, 32, 84, 114, 97, 110, 115, 102, 101, 114, 32, 115, 117, 99, 99, 101, 101, 100, 101, 100, 32, 40, 102, 114, 111, 109, 44, 32, 116, 111, 44, 32, 118, 97, 108, 117, 101, 44, 32, 102, 101, 101, 115, 41, 46, 28, 115, 101, 115, 115, 105, 111, 110, 4, 40, 78, 101, 119, 83, 101, 115, 115, 105, 111, 110, 4, 44, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 8, 85, 1, 32, 78, 101, 119, 32, 115, 101, 115, 115, 105, 111, 110, 32, 104, 97, 115, 32, 104, 97, 112, 112, 101, 110, 101, 100, 46, 32, 78, 111, 116, 101, 32, 116, 104, 97, 116, 32, 116, 104, 101, 32, 97, 114, 103, 117, 109, 101, 110, 116, 32, 105, 115, 32, 116, 104, 101, 32, 115, 101, 115, 115, 105, 111, 110, 32, 105, 110, 100, 101, 120, 44, 32, 110, 111, 116, 32, 116, 104, 101, 32, 98, 108, 111, 99, 107, 136, 32, 110, 117, 109, 98, 101, 114, 32, 97, 115, 32, 116, 104, 101, 32, 116, 121, 112, 101, 32, 109, 105, 103, 104, 116, 32, 115, 117, 103, 103, 101, 115, 116, 46, 28, 115, 116, 97, 107, 105, 110, 103, 12, 24, 82, 101, 119, 97, 114, 100, 4, 28, 66, 97, 108, 97, 110, 99, 101, 4, 224, 32, 65, 108, 108, 32, 118, 97, 108, 105, 100, 97, 116, 111, 114, 115, 32, 104, 97, 118, 101, 32, 98, 101, 101, 110, 32, 114, 101, 119, 97, 114, 100, 101, 100, 32, 98, 121, 32, 116, 104, 101, 32, 103, 105, 118, 101, 110, 32, 98, 97, 108, 97, 110, 99, 101, 46, 56, 79, 102, 102, 108, 105, 110, 101, 87, 97, 114, 110, 105, 110, 103, 8, 36, 65, 99, 99, 111, 117, 110, 116, 73, 100, 12, 117, 51, 50, 8, 85, 1, 32, 79, 110, 101, 32, 118, 97, 108, 105, 100, 97, 116, 111, 114, 32, 40, 97, 110, 100, 32, 116, 104, 101, 105, 114, 32, 110, 111, 109, 105, 110, 97, 116, 111, 114, 115, 41, 32, 104, 97, 115, 32, 98, 101, 101, 110, 32, 103, 105, 118, 101, 110, 32, 97, 32, 111, 102, 102, 108, 105, 110, 101, 45, 119, 97, 114, 110, 105, 110, 103, 32, 40, 116, 104, 101, 121, 39, 114, 101, 32, 115, 116, 105, 108, 108, 21, 1, 32, 119, 105, 116, 104, 105, 110, 32, 116, 104, 101, 105, 114, 32, 103, 114, 97, 99, 101, 41, 46, 32, 84, 104, 101, 32, 97, 99, 99, 114, 117, 101, 100, 32, 110, 117, 109, 98, 101, 114, 32, 111, 102, 32, 115, 108, 97, 115, 104, 101, 115, 32, 105, 115, 32, 114, 101, 99, 111, 114, 100, 101, 100, 44, 32, 116, 111, 111, 46, 48, 79, 102, 102, 108, 105, 110, 101, 83, 108, 97, 115, 104, 8, 36, 65, 99, 99, 111, 117, 110, 116, 73, 100, 28, 66, 97, 108, 97, 110, 99, 101, 4, 45, 1, 32, 79, 110, 101, 32, 118, 97, 108, 105, 100, 97, 116, 111, 114, 32, 40, 97, 110, 100, 32, 116, 104, 101, 105, 114, 32, 110, 111, 109, 105, 110, 97, 116, 111, 114, 115, 41, 32, 104, 97, 115, 32, 98, 101, 101, 110, 32, 115, 108, 97, 115, 104, 101, 100, 32, 98, 121, 32, 116, 104, 101, 32, 103, 105, 118, 101, 110, 32, 97, 109, 111, 117, 110, 116, 46, 36, 100, 101, 109, 111, 99, 114, 97, 99, 121, 24, 24, 84, 97, 98, 108, 101, 100, 12, 36, 80, 114, 111, 112, 73, 110, 100, 101, 120, 28, 66, 97, 108, 97, 110, 99, 101, 56, 86, 101, 99, 60, 65, 99, 99, 111, 117, 110, 116, 73, 100, 62, 0, 28, 83, 116, 97, 114, 116, 101, 100, 8, 60, 82, 101, 102, 101, 114, 101, 110, 100, 117, 109, 73, 110, 100, 101, 120, 52, 86, 111, 116, 101, 84, 104, 114, 101, 115, 104, 111, 108, 100, 0, 24, 80, 97, 115, 115, 101, 100, 4, 60, 82, 101, 102, 101, 114, 101, 110, 100, 117, 109, 73, 110, 100, 101, 120, 0, 36, 78, 111, 116, 80, 97, 115, 115, 101, 100, 4, 60, 82, 101, 102, 101, 114, 101, 110, 100, 117, 109, 73, 110, 100, 101, 120, 0, 36, 67, 97, 110, 99, 101, 108, 108, 101, 100, 4, 60, 82, 101, 102, 101, 114, 101, 110, 100, 117, 109, 73, 110, 100, 101, 120, 0, 32, 69, 120, 101, 99, 117, 116, 101, 100, 8, 60, 82, 101, 102, 101, 114, 101, 110, 100, 117, 109, 73, 110, 100, 101, 120, 16, 98, 111, 111, 108, 0, 28, 99, 111, 117, 110, 99, 105, 108, 16, 44, 86, 111, 116, 101, 114, 82, 101, 97, 112, 101, 100, 8, 36, 65, 99, 99, 111, 117, 110, 116, 73, 100, 36, 65, 99, 99, 111, 117, 110, 116, 73, 100, 4, 84, 32, 114, 101, 97, 112, 101, 100, 32, 118, 111, 116, 101, 114, 44, 32, 114, 101, 97, 112, 101, 114, 64, 66, 97, 100, 82, 101, 97, 112, 101, 114, 83, 108, 97, 115, 104, 101, 100, 4, 36, 65, 99, 99, 111, 117, 110, 116, 73, 100, 4, 60, 32, 115, 108, 97, 115, 104, 101, 100, 32, 114, 101, 97, 112, 101, 114, 48, 84, 97, 108, 108, 121, 83, 116, 97, 114, 116, 101, 100, 4, 12, 117, 51, 50, 4, 244, 32, 65, 32, 116, 97, 108, 108, 121, 32, 40, 102, 111, 114, 32, 97, 112, 112, 114, 111, 118, 97, 108, 32, 118, 111, 116, 101, 115, 32, 111, 102, 32, 99, 111, 117, 110, 99, 105, 108, 32, 115, 101, 97, 116, 40, 115, 41, 41, 32, 104, 97, 115, 32, 115, 116, 97, 114, 116, 101, 100, 46, 56, 84, 97, 108, 108, 121, 70, 105, 110, 97, 108, 105, 115, 101, 100, 8, 56, 86, 101, 99, 60, 65, 99, 99, 111, 117, 110, 116, 73, 100, 62, 56, 86, 101, 99, 60, 65, 99, 99, 111, 117, 110, 116, 73, 100, 62, 4, 105, 1, 32, 65, 32, 116, 97, 108, 108, 121, 32, 40, 102, 111, 114, 32, 97, 112, 112, 114, 111, 118, 97, 108, 32, 118, 111, 116, 101, 115, 32, 111, 102, 32, 99, 111, 117, 110, 99, 105, 108, 32, 115, 101, 97, 116, 40, 115, 41, 41, 32, 104, 97, 115, 32, 101, 110, 100, 101, 100, 32, 40, 119, 105, 116, 104, 32, 111, 110, 101, 32, 111, 114, 32, 109, 111, 114, 101, 32, 110, 101, 119, 32, 109, 101, 109, 98, 101, 114, 115, 41, 46, 56, 99, 111, 117, 110, 99, 105, 108, 95, 118, 111, 116, 105, 110, 103, 8, 64, 84, 97, 108, 108, 121, 67, 97, 110, 99, 101, 108, 97, 116, 105, 111, 110, 16, 16, 72, 97, 115, 104, 12, 117, 51, 50, 12, 117, 51, 50, 12, 117, 51, 50, 8, 252, 32, 65, 32, 118, 111, 116, 105, 110, 103, 32, 116, 97, 108, 108, 121, 32, 104, 97, 115, 32, 104, 97, 112, 112, 101, 110, 101, 100, 32, 102, 111, 114, 32, 97, 32, 114, 101, 102, 101, 114, 101, 110, 100, 117, 109, 32, 99, 97, 110, 99, 101, 108, 97, 116, 105, 111, 110, 32, 118, 111, 116, 101, 46, 160, 32, 76, 97, 115, 116, 32, 116, 104, 114, 101, 101, 32, 97, 114, 101, 32, 121, 101, 115, 44, 32, 110, 111, 44, 32, 97, 98, 115, 116, 97, 105, 110, 32, 99, 111, 117, 110, 116, 115, 46, 60, 84, 97, 108, 108, 121, 82, 101, 102, 101, 114, 101, 110, 100, 117, 109, 16, 16, 72, 97, 115, 104, 12, 117, 51, 50, 12, 117, 51, 50, 12, 117, 51, 50, 8, 204, 32, 65, 32, 118, 111, 116, 105, 110, 103, 32, 116, 97, 108, 108, 121, 32, 104, 97, 115, 32, 104, 97, 112, 112, 101, 110, 101, 100, 32, 102, 111, 114, 32, 97, 32, 114, 101, 102, 101, 114, 101, 110, 100, 117, 109, 32, 118, 111, 116, 101, 46, 160, 32, 76, 97, 115, 116, 32, 116, 104, 114, 101, 101, 32, 97, 114, 101, 32, 121, 101, 115, 44, 32, 110, 111, 44, 32, 97, 98, 115, 116, 97, 105, 110, 32, 99, 111, 117, 110, 116, 115, 46, 60, 99, 111, 117, 110, 99, 105, 108, 95, 109, 111, 116, 105, 111, 110, 115, 20, 32, 80, 114, 111, 112, 111, 115, 101, 100, 16, 36, 65, 99, 99, 111, 117, 110, 116, 73, 100, 52, 80, 114, 111, 112, 111, 115, 97, 108, 73, 110, 100, 101, 120, 16, 72, 97, 115, 104, 12, 117, 51, 50, 4, 101, 1, 32, 65, 32, 109, 111, 116, 105, 111, 110, 32, 40, 103, 105, 118, 101, 110, 32, 104, 97, 115, 104, 41, 32, 104, 97, 115, 32, 98, 101, 101, 110, 32, 112, 114, 111, 112, 111, 115, 101, 100, 32, 40, 98, 121, 32, 103, 105, 118, 101, 110, 32, 97, 99, 99, 111, 117, 110, 116, 41, 32, 119, 105, 116, 104, 32, 97, 32, 116, 104, 114, 101, 115, 104, 111, 108, 100, 32, 40, 103, 105, 118, 101, 110, 32, 117, 51, 50, 41, 46, 20, 86, 111, 116, 101, 100, 20, 36, 65, 99, 99, 111, 117, 110, 116, 73, 100, 16, 72, 97, 115, 104, 16, 98, 111, 111, 108, 12, 117, 51, 50, 12, 117, 51, 50, 8, 9, 1, 32, 65, 32, 109, 111, 116, 105, 111, 110, 32, 40, 103, 105, 118, 101, 110, 32, 104, 97, 115, 104, 41, 32, 104, 97, 115, 32, 98, 101, 101, 110, 32, 118, 111, 116, 101, 100, 32, 111, 110, 32, 98, 121, 32, 103, 105, 118, 101, 110, 32, 97, 99, 99, 111, 117, 110, 116, 44, 32, 108, 101, 97, 118, 105, 110, 103, 244, 32, 97, 32, 116, 97, 108, 108, 121, 32, 40, 121, 101, 115, 32, 118, 111, 116, 101, 115, 32, 97, 110, 100, 32, 110, 111, 32, 118, 111, 116, 101, 115, 32, 103, 105, 118, 101, 110, 32, 97, 115, 32, 117, 51, 50, 115, 32, 114, 101, 115, 112, 101, 99, 116, 105, 118, 101, 108, 121, 41, 46, 32, 65, 112, 112, 114, 111, 118, 101, 100, 4, 16, 72, 97, 115, 104, 4, 196, 32, 65, 32, 109, 111, 116, 105, 111, 110, 32, 119, 97, 115, 32, 97, 112, 112, 114, 111, 118, 101, 100, 32, 98, 121, 32, 116, 104, 101, 32, 114, 101, 113, 117, 105, 114, 101, 100, 32, 116, 104, 114, 101, 115, 104, 111, 108, 100, 46, 44, 68, 105, 115, 97, 112, 112, 114, 111, 118, 101, 100, 4, 16, 72, 97, 115, 104, 4, 212, 32, 65, 32, 109, 111, 116, 105, 111, 110, 32, 119, 97, 115, 32, 110, 111, 116, 32, 97, 112, 112, 114, 111, 118, 101, 100, 32, 98, 121, 32, 116, 104, 101, 32, 114, 101, 113, 117, 105, 114, 101, 100, 32, 116, 104, 114, 101, 115, 104, 111, 108, 100, 46, 32, 69, 120, 101, 99, 117, 116, 101, 100, 8, 16, 72, 97, 115, 104, 16, 98, 111, 111, 108, 4, 5, 1, 32, 65, 32, 109, 111, 116, 105, 111, 110, 32, 119, 97, 115, 32, 101, 120, 101, 99, 117, 116, 101, 100, 59, 32, 96, 98, 111, 111, 108, 96, 32, 105, 115, 32, 116, 114, 117, 101, 32, 105, 102, 32, 114, 101, 116, 117, 114, 110, 101, 100, 32, 119, 105, 116, 104, 111, 117, 116, 32, 101, 114, 114, 111, 114, 46, 32, 116, 114, 101, 97, 115, 117, 114, 121, 20, 32, 80, 114, 111, 112, 111, 115, 101, 100, 4, 52, 80, 114, 111, 112, 111, 115, 97, 108, 73, 110, 100, 101, 120, 4, 56, 32, 78, 101, 119, 32, 112, 114, 111, 112, 111, 115, 97, 108, 46, 32, 83, 112, 101, 110, 100, 105, 110, 103, 4, 28, 66, 97, 108, 97, 110, 99, 101, 4, 232, 32, 87, 101, 32, 104, 97, 118, 101, 32, 101, 110, 100, 101, 100, 32, 97, 32, 115, 112, 101, 110, 100, 32, 112, 101, 114, 105, 111, 100, 32, 97, 110, 100, 32, 119, 105, 108, 108, 32, 110, 111, 119, 32, 97, 108, 108, 111, 99, 97, 116, 101, 32, 102, 117, 110, 100, 115, 46, 28, 65, 119, 97, 114, 100, 101, 100, 12, 52, 80, 114, 111, 112, 111, 115, 97, 108, 73, 110, 100, 101, 120, 28, 66, 97, 108, 97, 110, 99, 101, 36, 65, 99, 99, 111, 117, 110, 116, 73, 100, 4, 128, 32, 83, 111, 109, 101, 32, 102, 117, 110, 100, 115, 32, 104, 97, 118, 101, 32, 98, 101, 101, 110, 32, 97, 108, 108, 111, 99, 97, 116, 101, 100, 46, 20, 66, 117, 114, 110, 116, 4, 28, 66, 97, 108, 97, 110, 99, 101, 4, 140, 32, 83, 111, 109, 101, 32, 111, 102, 32, 111, 117, 114, 32, 102, 117, 110, 100, 115, 32, 104, 97, 118, 101, 32, 98, 101, 101, 110, 32, 98, 117, 114, 110, 116, 46, 32, 82, 111, 108, 108, 111, 118, 101, 114, 4, 28, 66, 97, 108, 97, 110, 99, 101, 4, 49, 1, 32, 83, 112, 101, 110, 100, 105, 110, 103, 32, 104, 97, 115, 32, 102, 105, 110, 105, 115, 104, 101, 100, 59, 32, 116, 104, 105, 115, 32, 105, 115, 32, 116, 104, 101, 32, 97, 109, 111, 117, 110, 116, 32, 116, 104, 97, 116, 32, 114, 111, 108, 108, 115, 32, 111, 118, 101, 114, 32, 117, 110, 116, 105, 108, 32, 110, 101, 120, 116, 32, 115, 112, 101, 110, 100, 46, 32, 99, 111, 110, 116, 114, 97, 99, 116, 4, 32, 84, 114, 97, 110, 115, 102, 101, 114, 12, 36, 65, 99, 99, 111, 117, 110, 116, 73, 100, 36, 65, 99, 99, 111, 117, 110, 116, 73, 100, 28, 66, 97, 108, 97, 110, 99, 101, 4, 117, 1, 32, 84, 114, 97, 110, 115, 102, 101, 114, 32, 104, 97, 112, 112, 101, 110, 101, 100, 32, 96, 102, 114, 111, 109, 96, 32, 45, 62, 32, 96, 116, 111, 96, 32, 119, 105, 116, 104, 32, 103, 105, 118, 101, 110, 32, 96, 118, 97, 108, 117, 101, 96, 32, 97, 115, 32, 112, 97, 114, 116, 32, 111, 102, 32, 97, 32, 96, 109, 101, 115, 115, 97, 103, 101, 45, 99, 97, 108, 108, 96, 32, 111, 114, 32, 96, 99, 114, 101, 97, 116, 101, 96, 46, 48, 24, 115, 121, 115, 116, 101, 109, 24, 77, 111, 100, 117, 108, 101, 16, 67, 97, 108, 108, 0, 1, 24, 83, 121, 115, 116, 101, 109, 40, 48, 65, 99, 99, 111, 117, 110, 116, 78, 111, 110, 99, 101, 1, 1, 48, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 32, 84, 58, 58, 73, 110, 100, 101, 120, 0, 56, 69, 120, 116, 114, 105, 110, 115, 105, 99, 67, 111, 117, 110, 116, 0, 0, 12, 117, 51, 50, 0, 36, 66, 108, 111, 99, 107, 72, 97, 115, 104, 2, 1, 56, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 28, 84, 58, 58, 72, 97, 115, 104, 0, 52, 69, 120, 116, 114, 105, 110, 115, 105, 99, 68, 97, 116, 97, 2, 1, 12, 117, 51, 50, 28, 86, 101, 99, 60, 117, 56, 62, 0, 40, 82, 97, 110, 100, 111, 109, 83, 101, 101, 100, 2, 0, 28, 84, 58, 58, 72, 97, 115, 104, 0, 24, 78, 117, 109, 98, 101, 114, 2, 0, 56, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 4, 9, 1, 32, 84, 104, 101, 32, 99, 117, 114, 114, 101, 110, 116, 32, 98, 108, 111, 99, 107, 32, 110, 117, 109, 98, 101, 114, 32, 98, 101, 105, 110, 103, 32, 112, 114, 111, 99, 101, 115, 115, 101, 100, 46, 32, 83, 101, 116, 32, 98, 121, 32, 96, 101, 120, 101, 99, 117, 116, 101, 95, 98, 108, 111, 99, 107, 96, 46, 40, 80, 97, 114, 101, 110, 116, 72, 97, 115, 104, 2, 0, 28, 84, 58, 58, 72, 97, 115, 104, 0, 56, 69, 120, 116, 114, 105, 110, 115, 105, 99, 115, 82, 111, 111, 116, 2, 0, 28, 84, 58, 58, 72, 97, 115, 104, 0, 24, 68, 105, 103, 101, 115, 116, 1, 0, 36, 84, 58, 58, 68, 105, 103, 101, 115, 116, 0, 24, 69, 118, 101, 110, 116, 115, 1, 0, 104, 86, 101, 99, 60, 69, 118, 101, 110, 116, 82, 101, 99, 111, 114, 100, 60, 84, 58, 58, 69, 118, 101, 110, 116, 62, 62, 0, 36, 99, 111, 110, 115, 101, 110, 115, 117, 115, 24, 77, 111, 100, 117, 108, 101, 16, 67, 97, 108, 108, 20, 0, 0, 72, 114, 101, 112, 111, 114, 116, 95, 109, 105, 115, 98, 101, 104, 97, 118, 105, 111, 114, 8, 24, 111, 114, 105, 103, 105, 110, 36, 84, 58, 58, 79, 114, 105, 103, 105, 110, 24, 114, 101, 112, 111, 114, 116, 168, 77, 105, 115, 98, 101, 104, 97, 118, 105, 111, 114, 82, 101, 112, 111, 114, 116, 60, 84, 58, 58, 72, 97, 115, 104, 44, 32, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 62, 0, 1, 0, 48, 110, 111, 116, 101, 95, 111, 102, 102, 108, 105, 110, 101, 8, 24, 111, 114, 105, 103, 105, 110, 36, 84, 58, 58, 79, 114, 105, 103, 105, 110, 76, 111, 102, 102, 108, 105, 110, 101, 95, 118, 97, 108, 95, 105, 110, 100, 105, 99, 101, 115, 32, 86, 101, 99, 60, 117, 51, 50, 62, 0, 2, 0, 24, 114, 101, 109, 97, 114, 107, 8, 24, 111, 114, 105, 103, 105, 110, 36, 84, 58, 58, 79, 114, 105, 103, 105, 110, 24, 114, 101, 109, 97, 114, 107, 28, 86, 101, 99, 60, 117, 56, 62, 0, 3, 0, 32, 115, 101, 116, 95, 99, 111, 100, 101, 4, 12, 110, 101, 119, 28, 86, 101, 99, 60, 117, 56, 62, 0, 4, 0, 44, 115, 101, 116, 95, 115, 116, 111, 114, 97, 103, 101, 4, 20, 105, 116, 101, 109, 115, 52, 86, 101, 99, 60, 75, 101, 121, 86, 97, 108, 117, 101, 62, 0, 1, 36, 67, 111, 110, 115, 101, 110, 115, 117, 115, 4, 76, 79, 114, 105, 103, 105, 110, 97, 108, 65, 117, 116, 104, 111, 114, 105, 116, 105, 101, 115, 0, 0, 72, 86, 101, 99, 60, 84, 58, 58, 83, 101, 115, 115, 105, 111, 110, 75, 101, 121, 62, 0, 32, 98, 97, 108, 97, 110, 99, 101, 115, 24, 77, 111, 100, 117, 108, 101, 16, 67, 97, 108, 108, 8, 0, 0, 32, 116, 114, 97, 110, 115, 102, 101, 114, 12, 24, 111, 114, 105, 103, 105, 110, 36, 84, 58, 58, 79, 114, 105, 103, 105, 110, 16, 100, 101, 115, 116, 164, 82, 97, 119, 65, 100, 100, 114, 101, 115, 115, 60, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 44, 32, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 110, 100, 101, 120, 62, 20, 118, 97, 108, 117, 101, 40, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 0, 1, 0, 44, 115, 101, 116, 95, 98, 97, 108, 97, 110, 99, 101, 12, 12, 119, 104, 111, 164, 82, 97, 119, 65, 100, 100, 114, 101, 115, 115, 60, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 44, 32, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 110, 100, 101, 120, 62, 16, 102, 114, 101, 101, 40, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 32, 114, 101, 115, 101, 114, 118, 101, 100, 40, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 0, 1, 32, 66, 97, 108, 97, 110, 99, 101, 115, 44, 52, 84, 111, 116, 97, 108, 73, 115, 115, 117, 97, 110, 99, 101, 2, 0, 40, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 4, 164, 32, 84, 104, 101, 32, 116, 111, 116, 97, 108, 32, 97, 109, 111, 117, 110, 116, 32, 111, 102, 32, 115, 116, 97, 107, 101, 32, 111, 110, 32, 116, 104, 101, 32, 115, 121, 115, 116, 101, 109, 46, 72, 69, 120, 105, 115, 116, 101, 110, 116, 105, 97, 108, 68, 101, 112, 111, 115, 105, 116, 2, 0, 40, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 4, 208, 32, 84, 104, 101, 32, 109, 105, 110, 105, 109, 117, 109, 32, 97, 109, 111, 117, 110, 116, 32, 97, 108, 108, 111, 119, 101, 100, 32, 116, 111, 32, 107, 101, 101, 112, 32, 97, 110, 32, 97, 99, 99, 111, 117, 110, 116, 32, 111, 112, 101, 110, 46, 52, 82, 101, 99, 108, 97, 105, 109, 82, 101, 98, 97, 116, 101, 2, 0, 40, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 4, 41, 1, 32, 84, 104, 101, 32, 97, 109, 111, 117, 110, 116, 32, 99, 114, 101, 100, 105, 116, 101, 100, 32, 116, 111, 32, 97, 32, 100, 101, 115, 116, 105, 110, 97, 116, 105, 111, 110, 39, 115, 32, 97, 99, 99, 111, 117, 110, 116, 32, 119, 104, 111, 115, 101, 32, 105, 110, 100, 101, 120, 32, 119, 97, 115, 32, 114, 101, 99, 108, 97, 105, 109, 101, 100, 46, 44, 84, 114, 97, 110, 115, 102, 101, 114, 70, 101, 101, 2, 0, 40, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 4, 148, 32, 84, 104, 101, 32, 102, 101, 101, 32, 114, 101, 113, 117, 105, 114, 101, 100, 32, 116, 111, 32, 109, 97, 107, 101, 32, 97, 32, 116, 114, 97, 110, 115, 102, 101, 114, 46, 44, 67, 114, 101, 97, 116, 105, 111, 110, 70, 101, 101, 2, 0, 40, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 4, 37, 1, 32, 84, 104, 101, 32, 102, 101, 101, 32, 114, 101, 113, 117, 105, 114, 101, 100, 32, 116, 111, 32, 99, 114, 101, 97, 116, 101, 32, 97, 110, 32, 97, 99, 99, 111, 117, 110, 116, 46, 32, 65, 116, 32, 108, 101, 97, 115, 116, 32, 97, 115, 32, 98, 105, 103, 32, 97, 115, 32, 82, 101, 99, 108, 97, 105, 109, 82, 101, 98, 97, 116, 101, 46, 44, 78, 101, 120, 116, 69, 110, 117, 109, 83, 101, 116, 2, 0, 60, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 110, 100, 101, 120, 4, 124, 32, 84, 104, 101, 32, 110, 101, 120, 116, 32, 102, 114, 101, 101, 32, 101, 110, 117, 109, 101, 114, 97, 116, 105, 111, 110, 32, 115, 101, 116, 46, 28, 69, 110, 117, 109, 83, 101, 116, 1, 1, 60, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 110, 100, 101, 120, 68, 86, 101, 99, 60, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 62, 4, 88, 32, 84, 104, 101, 32, 101, 110, 117, 109, 101, 114, 97, 116, 105, 111, 110, 32, 115, 101, 116, 115, 46, 44, 70, 114, 101, 101, 66, 97, 108, 97, 110, 99, 101, 1, 1, 48, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 40, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 44, 156, 32, 84, 104, 101, 32, 39, 102, 114, 101, 101, 39, 32, 98, 97, 108, 97, 110, 99, 101, 32, 111, 102, 32, 97, 32, 103, 105, 118, 101, 110, 32, 97, 99, 99, 111, 117, 110, 116, 46, 0, 77, 1, 32, 84, 104, 105, 115, 32, 105, 115, 32, 116, 104, 101, 32, 111, 110, 108, 121, 32, 98, 97, 108, 97, 110, 99, 101, 32, 116, 104, 97, 116, 32, 109, 97, 116, 116, 101, 114, 115, 32, 105, 110, 32, 116, 101, 114, 109, 115, 32, 111, 102, 32, 109, 111, 115, 116, 32, 111, 112, 101, 114, 97, 116, 105, 111, 110, 115, 32, 111, 110, 32, 116, 111, 107, 101, 110, 115, 46, 32, 73, 116, 32, 105, 115, 105, 1, 32, 97, 108, 111, 110, 101, 32, 117, 115, 101, 100, 32, 116, 111, 32, 100, 101, 116, 101, 114, 109, 105, 110, 101, 32, 116, 104, 101, 32, 98, 97, 108, 97, 110, 99, 101, 32, 119, 104, 101, 110, 32, 105, 110, 32, 116, 104, 101, 32, 99, 111, 110, 116, 114, 97, 99, 116, 32, 101, 120, 101, 99, 117, 116, 105, 111, 110, 32, 101, 110, 118, 105, 114, 111, 110, 109, 101, 110, 116, 46, 32, 87, 104, 101, 110, 32, 116, 104, 105, 115, 85, 1, 32, 98, 97, 108, 97, 110, 99, 101, 32, 102, 97, 108, 108, 115, 32, 98, 101, 108, 111, 119, 32, 116, 104, 101, 32, 118, 97, 108, 117, 101, 32, 111, 102, 32, 96, 69, 120, 105, 115, 116, 101, 110, 116, 105, 97, 108, 68, 101, 112, 111, 115, 105, 116, 96, 44, 32, 116, 104, 101, 110, 32, 116, 104, 101, 32, 39, 99, 117, 114, 114, 101, 110, 116, 32, 97, 99, 99, 111, 117, 110, 116, 39, 32, 105, 115, 61, 1, 32, 100, 101, 108, 101, 116, 101, 100, 58, 32, 115, 112, 101, 99, 105, 102, 105, 99, 97, 108, 108, 121, 32, 96, 70, 114, 101, 101, 66, 97, 108, 97, 110, 99, 101, 96, 46, 32, 70, 117, 114, 116, 104, 101, 114, 109, 111, 114, 101, 44, 32, 96, 79, 110, 70, 114, 101, 101, 66, 97, 108, 97, 110, 99, 101, 90, 101, 114, 111, 96, 32, 99, 97, 108, 108, 98, 97, 99, 107, 65, 1, 32, 105, 115, 32, 105, 110, 118, 111, 107, 101, 100, 44, 32, 103, 105, 118, 105, 110, 103, 32, 97, 32, 99, 104, 97, 110, 99, 101, 32, 116, 111, 32, 101, 120, 116, 101, 114, 110, 97, 108, 32, 109, 111, 100, 117, 108, 101, 115, 32, 116, 111, 32, 99, 108, 101, 97, 110, 117, 112, 32, 100, 97, 116, 97, 32, 97, 115, 115, 111, 99, 105, 97, 116, 101, 100, 32, 119, 105, 116, 104, 84, 32, 116, 104, 101, 32, 100, 101, 108, 101, 116, 101, 100, 32, 97, 99, 99, 111, 117, 110, 116, 46, 0, 93, 1, 32, 96, 115, 121, 115, 116, 101, 109, 58, 58, 65, 99, 99, 111, 117, 110, 116, 78, 111, 110, 99, 101, 96, 32, 105, 115, 32, 97, 108, 115, 111, 32, 100, 101, 108, 101, 116, 101, 100, 32, 105, 102, 32, 96, 82, 101, 115, 101, 114, 118, 101, 100, 66, 97, 108, 97, 110, 99, 101, 96, 32, 105, 115, 32, 97, 108, 115, 111, 32, 122, 101, 114, 111, 32, 40, 105, 116, 32, 97, 108, 115, 111, 32, 103, 101, 116, 115, 21, 1, 32, 99, 111, 108, 108, 97, 112, 115, 101, 100, 32, 116, 111, 32, 122, 101, 114, 111, 32, 105, 102, 32, 105, 116, 32, 101, 118, 101, 114, 32, 98, 101, 99, 111, 109, 101, 115, 32, 108, 101, 115, 115, 32, 116, 104, 97, 110, 32, 96, 69, 120, 105, 115, 116, 101, 110, 116, 105, 97, 108, 68, 101, 112, 111, 115, 105, 116, 96, 46, 60, 82, 101, 115, 101, 114, 118, 101, 100, 66, 97, 108, 97, 110, 99, 101, 1, 1, 48, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 40, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 48, 113, 1, 32, 84, 104, 101, 32, 97, 109, 111, 117, 110, 116, 32, 111, 102, 32, 116, 104, 101, 32, 98, 97, 108, 97, 110, 99, 101, 32, 111, 102, 32, 97, 32, 103, 105, 118, 101, 110, 32, 97, 99, 99, 111, 117, 110, 116, 32, 116, 104, 97, 116, 32, 105, 115, 32, 101, 120, 116, 101, 114, 97, 108, 108, 121, 32, 114, 101, 115, 101, 114, 118, 101, 100, 59, 32, 116, 104, 105, 115, 32, 99, 97, 110, 32, 115, 116, 105, 108, 108, 32, 103, 101, 116, 156, 32, 115, 108, 97, 115, 104, 101, 100, 44, 32, 98, 117, 116, 32, 103, 101, 116, 115, 32, 115, 108, 97, 115, 104, 101, 100, 32, 108, 97, 115, 116, 32, 111, 102, 32, 97, 108, 108, 46, 0, 109, 1, 32, 84, 104, 105, 115, 32, 98, 97, 108, 97, 110, 99, 101, 32, 105, 115, 32, 97, 32, 39, 114, 101, 115, 101, 114, 118, 101, 39, 32, 98, 97, 108, 97, 110, 99, 101, 32, 116, 104, 97, 116, 32, 111, 116, 104, 101, 114, 32, 115, 117, 98, 115, 121, 115, 116, 101, 109, 115, 32, 117, 115, 101, 32, 105, 110, 32, 111, 114, 100, 101, 114, 32, 116, 111, 32, 115, 101, 116, 32, 97, 115, 105, 100, 101, 32, 116, 111, 107, 101, 110, 115, 113, 1, 32, 116, 104, 97, 116, 32, 97, 114, 101, 32, 115, 116, 105, 108, 108, 32, 39, 111, 119, 110, 101, 100, 39, 32, 98, 121, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 32, 104, 111, 108, 100, 101, 114, 44, 32, 98, 117, 116, 32, 119, 104, 105, 99, 104, 32, 97, 114, 101, 32, 117, 110, 115, 112, 101, 110, 100, 97, 98, 108, 101, 46, 32, 40, 84, 104, 105, 115, 32, 105, 115, 32, 100, 105, 102, 102, 101, 114, 101, 110, 116, 41, 1, 32, 97, 110, 100, 32, 119, 104, 111, 108, 108, 121, 32, 117, 110, 114, 101, 108, 97, 116, 101, 100, 32, 116, 111, 32, 116, 104, 101, 32, 96, 66, 111, 110, 100, 97, 103, 101, 96, 32, 115, 121, 115, 116, 101, 109, 32, 117, 115, 101, 100, 32, 105, 110, 32, 116, 104, 101, 32, 115, 116, 97, 107, 105, 110, 103, 32, 109, 111, 100, 117, 108, 101, 46, 41, 0, 117, 1, 32, 87, 104, 101, 110, 32, 116, 104, 105, 115, 32, 98, 97, 108, 97, 110, 99, 101, 32, 102, 97, 108, 108, 115, 32, 98, 101, 108, 111, 119, 32, 116, 104, 101, 32, 118, 97, 108, 117, 101, 32, 111, 102, 32, 96, 69, 120, 105, 115, 116, 101, 110, 116, 105, 97, 108, 68, 101, 112, 111, 115, 105, 116, 96, 44, 32, 116, 104, 101, 110, 32, 116, 104, 105, 115, 32, 39, 114, 101, 115, 101, 114, 118, 101, 32, 97, 99, 99, 111, 117, 110, 116, 39, 180, 32, 105, 115, 32, 100, 101, 108, 101, 116, 101, 100, 58, 32, 115, 112, 101, 99, 105, 102, 105, 99, 97, 108, 108, 121, 44, 32, 96, 82, 101, 115, 101, 114, 118, 101, 100, 66, 97, 108, 97, 110, 99, 101, 96, 46, 0, 77, 1, 32, 96, 115, 121, 115, 116, 101, 109, 58, 58, 65, 99, 99, 111, 117, 110, 116, 78, 111, 110, 99, 101, 96, 32, 105, 115, 32, 97, 108, 115, 111, 32, 100, 101, 108, 101, 116, 101, 100, 32, 105, 102, 32, 96, 70, 114, 101, 101, 66, 97, 108, 97, 110, 99, 101, 96, 32, 105, 115, 32, 97, 108, 115, 111, 32, 122, 101, 114, 111, 32, 40, 105, 116, 32, 97, 108, 115, 111, 32, 103, 101, 116, 115, 21, 1, 32, 99, 111, 108, 108, 97, 112, 115, 101, 100, 32, 116, 111, 32, 122, 101, 114, 111, 32, 105, 102, 32, 105, 116, 32, 101, 118, 101, 114, 32, 98, 101, 99, 111, 109, 101, 115, 32, 108, 101, 115, 115, 32, 116, 104, 97, 110, 32, 96, 69, 120, 105, 115, 116, 101, 110, 116, 105, 97, 108, 68, 101, 112, 111, 115, 105, 116, 96, 46, 72, 84, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 66, 97, 115, 101, 70, 101, 101, 2, 0, 40, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 4, 220, 32, 84, 104, 101, 32, 102, 101, 101, 32, 116, 111, 32, 98, 101, 32, 112, 97, 105, 100, 32, 102, 111, 114, 32, 109, 97, 107, 105, 110, 103, 32, 97, 32, 116, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 59, 32, 116, 104, 101, 32, 98, 97, 115, 101, 46, 72, 84, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 66, 121, 116, 101, 70, 101, 101, 2, 0, 40, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 4, 13, 1, 32, 84, 104, 101, 32, 102, 101, 101, 32, 116, 111, 32, 98, 101, 32, 112, 97, 105, 100, 32, 102, 111, 114, 32, 109, 97, 107, 105, 110, 103, 32, 97, 32, 116, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 59, 32, 116, 104, 101, 32, 112, 101, 114, 45, 98, 121, 116, 101, 32, 112, 111, 114, 116, 105, 111, 110, 46, 36, 116, 105, 109, 101, 115, 116, 97, 109, 112, 24, 77, 111, 100, 117, 108, 101, 16, 67, 97, 108, 108, 4, 0, 0, 12, 115, 101, 116, 8, 24, 111, 114, 105, 103, 105, 110, 36, 84, 58, 58, 79, 114, 105, 103, 105, 110, 12, 110, 111, 119, 36, 84, 58, 58, 77, 111, 109, 101, 110, 116, 0, 1, 36, 84, 105, 109, 101, 115, 116, 97, 109, 112, 12, 12, 78, 111, 119, 2, 0, 36, 84, 58, 58, 77, 111, 109, 101, 110, 116, 4, 144, 32, 67, 117, 114, 114, 101, 110, 116, 32, 116, 105, 109, 101, 32, 102, 111, 114, 32, 116, 104, 101, 32, 99, 117, 114, 114, 101, 110, 116, 32, 98, 108, 111, 99, 107, 46, 44, 66, 108, 111, 99, 107, 80, 101, 114, 105, 111, 100, 2, 0, 36, 84, 58, 58, 77, 111, 109, 101, 110, 116, 4, 196, 32, 84, 104, 101, 32, 109, 105, 110, 105, 109, 117, 109, 32, 40, 97, 110, 100, 32, 97, 100, 118, 105, 115, 101, 100, 41, 32, 112, 101, 114, 105, 111, 100, 32, 98, 101, 116, 119, 101, 101, 110, 32, 98, 108, 111, 99, 107, 115, 46, 36, 68, 105, 100, 85, 112, 100, 97, 116, 101, 1, 0, 16, 98, 111, 111, 108, 4, 180, 32, 68, 105, 100, 32, 116, 104, 101, 32, 116, 105, 109, 101, 115, 116, 97, 109, 112, 32, 103, 101, 116, 32, 117, 112, 100, 97, 116, 101, 100, 32, 105, 110, 32, 116, 104, 105, 115, 32, 98, 108, 111, 99, 107, 63, 28, 115, 101, 115, 115, 105, 111, 110, 24, 77, 111, 100, 117, 108, 101, 16, 67, 97, 108, 108, 12, 0, 0, 28, 115, 101, 116, 95, 107, 101, 121, 8, 24, 111, 114, 105, 103, 105, 110, 36, 84, 58, 58, 79, 114, 105, 103, 105, 110, 12, 107, 101, 121, 52, 84, 58, 58, 83, 101, 115, 115, 105, 111, 110, 75, 101, 121, 0, 1, 0, 40, 115, 101, 116, 95, 108, 101, 110, 103, 116, 104, 4, 12, 110, 101, 119, 56, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 0, 2, 0, 68, 102, 111, 114, 99, 101, 95, 110, 101, 119, 95, 115, 101, 115, 115, 105, 111, 110, 4, 52, 97, 112, 112, 108, 121, 95, 114, 101, 119, 97, 114, 100, 115, 16, 98, 111, 111, 108, 0, 1, 28, 83, 101, 115, 115, 105, 111, 110, 32, 40, 86, 97, 108, 105, 100, 97, 116, 111, 114, 115, 2, 0, 68, 86, 101, 99, 60, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 62, 4, 124, 32, 84, 104, 101, 32, 99, 117, 114, 114, 101, 110, 116, 32, 115, 101, 116, 32, 111, 102, 32, 118, 97, 108, 105, 100, 97, 116, 111, 114, 115, 46, 52, 83, 101, 115, 115, 105, 111, 110, 76, 101, 110, 103, 116, 104, 2, 0, 56, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 4, 124, 32, 67, 117, 114, 114, 101, 110, 116, 32, 108, 101, 110, 103, 116, 104, 32, 111, 102, 32, 116, 104, 101, 32, 115, 101, 115, 115, 105, 111, 110, 46, 48, 67, 117, 114, 114, 101, 110, 116, 73, 110, 100, 101, 120, 2, 0, 56, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 4, 120, 32, 67, 117, 114, 114, 101, 110, 116, 32, 105, 110, 100, 101, 120, 32, 111, 102, 32, 116, 104, 101, 32, 115, 101, 115, 115, 105, 111, 110, 46, 48, 67, 117, 114, 114, 101, 110, 116, 83, 116, 97, 114, 116, 2, 0, 36, 84, 58, 58, 77, 111, 109, 101, 110, 116, 4, 160, 32, 84, 105, 109, 101, 115, 116, 97, 109, 112, 32, 119, 104, 101, 110, 32, 99, 117, 114, 114, 101, 110, 116, 32, 115, 101, 115, 115, 105, 111, 110, 32, 115, 116, 97, 114, 116, 101, 100, 46, 68, 70, 111, 114, 99, 105, 110, 103, 78, 101, 119, 83, 101, 115, 115, 105, 111, 110, 0, 0, 16, 98, 111, 111, 108, 8, 121, 1, 32, 78, 101, 119, 32, 115, 101, 115, 115, 105, 111, 110, 32, 105, 115, 32, 98, 101, 105, 110, 103, 32, 102, 111, 114, 99, 101, 100, 32, 105, 115, 32, 116, 104, 105, 115, 32, 101, 110, 116, 114, 121, 32, 101, 120, 105, 115, 116, 115, 59, 32, 105, 110, 32, 119, 104, 105, 99, 104, 32, 99, 97, 115, 101, 44, 32, 116, 104, 101, 32, 98, 111, 111, 108, 101, 97, 110, 32, 118, 97, 108, 117, 101, 32, 105, 115, 32, 119, 104, 101, 116, 104, 101, 114, 129, 1, 32, 116, 104, 101, 32, 110, 101, 119, 32, 115, 101, 115, 115, 105, 111, 110, 32, 115, 104, 111, 117, 108, 100, 32, 98, 101, 32, 99, 111, 110, 115, 105, 100, 101, 114, 101, 100, 32, 97, 32, 110, 111, 114, 109, 97, 108, 32, 114, 111, 116, 97, 116, 105, 111, 110, 32, 40, 114, 101, 119, 97, 114, 100, 97, 98, 108, 101, 41, 32, 111, 114, 32, 101, 120, 99, 101, 112, 116, 105, 111, 110, 97, 108, 32, 40, 115, 108, 97, 115, 104, 97, 98, 108, 101, 41, 46, 64, 76, 97, 115, 116, 76, 101, 110, 103, 116, 104, 67, 104, 97, 110, 103, 101, 0, 0, 56, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 4, 192, 32, 66, 108, 111, 99, 107, 32, 97, 116, 32, 119, 104, 105, 99, 104, 32, 116, 104, 101, 32, 115, 101, 115, 115, 105, 111, 110, 32, 108, 101, 110, 103, 116, 104, 32, 108, 97, 115, 116, 32, 99, 104, 97, 110, 103, 101, 100, 46, 40, 78, 101, 120, 116, 75, 101, 121, 70, 111, 114, 0, 1, 48, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 52, 84, 58, 58, 83, 101, 115, 115, 105, 111, 110, 75, 101, 121, 4, 144, 32, 84, 104, 101, 32, 110, 101, 120, 116, 32, 107, 101, 121, 32, 102, 111, 114, 32, 97, 32, 103, 105, 118, 101, 110, 32, 118, 97, 108, 105, 100, 97, 116, 111, 114, 46, 68, 78, 101, 120, 116, 83, 101, 115, 115, 105, 111, 110, 76, 101, 110, 103, 116, 104, 0, 0, 56, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 4, 100, 32, 84, 104, 101, 32, 110, 101, 120, 116, 32, 115, 101, 115, 115, 105, 111, 110, 32, 108, 101, 110, 103, 116, 104, 46, 28, 115, 116, 97, 107, 105, 110, 103, 24, 77, 111, 100, 117, 108, 101, 16, 67, 97, 108, 108, 40, 0, 0, 20, 115, 116, 97, 107, 101, 4, 24, 111, 114, 105, 103, 105, 110, 36, 84, 58, 58, 79, 114, 105, 103, 105, 110, 0, 1, 0, 28, 117, 110, 115, 116, 97, 107, 101, 8, 24, 111, 114, 105, 103, 105, 110, 36, 84, 58, 58, 79, 114, 105, 103, 105, 110, 64, 105, 110, 116, 101, 110, 116, 105, 111, 110, 115, 95, 105, 110, 100, 101, 120, 12, 117, 51, 50, 0, 2, 0, 32, 110, 111, 109, 105, 110, 97, 116, 101, 8, 24, 111, 114, 105, 103, 105, 110, 36, 84, 58, 58, 79, 114, 105, 103, 105, 110, 24, 116, 97, 114, 103, 101, 116, 152, 65, 100, 100, 114, 101, 115, 115, 60, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 44, 32, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 110, 100, 101, 120, 62, 0, 3, 0, 40, 117, 110, 110, 111, 109, 105, 110, 97, 116, 101, 8, 24, 111, 114, 105, 103, 105, 110, 36, 84, 58, 58, 79, 114, 105, 103, 105, 110, 48, 116, 97, 114, 103, 101, 116, 95, 105, 110, 100, 101, 120, 12, 117, 51, 50, 0, 4, 0, 80, 114, 101, 103, 105, 115, 116, 101, 114, 95, 112, 114, 101, 102, 101, 114, 101, 110, 99, 101, 115, 12, 24, 111, 114, 105, 103, 105, 110, 36, 84, 58, 58, 79, 114, 105, 103, 105, 110, 64, 105, 110, 116, 101, 110, 116, 105, 111, 110, 115, 95, 105, 110, 100, 101, 120, 12, 117, 51, 50, 20, 112, 114, 101, 102, 115, 104, 86, 97, 108, 105, 100, 97, 116, 111, 114, 80, 114, 101, 102, 115, 60, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 62, 0, 5, 0, 80, 115, 101, 116, 95, 115, 101, 115, 115, 105, 111, 110, 115, 95, 112, 101, 114, 95, 101, 114, 97, 4, 12, 110, 101, 119, 56, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 0, 6, 0, 80, 115, 101, 116, 95, 98, 111, 110, 100, 105, 110, 103, 95, 100, 117, 114, 97, 116, 105, 111, 110, 4, 12, 110, 101, 119, 56, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 0, 7, 0, 76, 115, 101, 116, 95, 118, 97, 108, 105, 100, 97, 116, 111, 114, 95, 99, 111, 117, 110, 116, 4, 12, 110, 101, 119, 12, 117, 51, 50, 0, 8, 0, 52, 102, 111, 114, 99, 101, 95, 110, 101, 119, 95, 101, 114, 97, 4, 52, 97, 112, 112, 108, 121, 95, 114, 101, 119, 97, 114, 100, 115, 16, 98, 111, 111, 108, 0, 9, 0, 92, 115, 101, 116, 95, 111, 102, 102, 108, 105, 110, 101, 95, 115, 108, 97, 115, 104, 95, 103, 114, 97, 99, 101, 4, 12, 110, 101, 119, 12, 117, 51, 50, 0, 1, 28, 83, 116, 97, 107, 105, 110, 103, 84, 56, 86, 97, 108, 105, 100, 97, 116, 111, 114, 67, 111, 117, 110, 116, 2, 0, 12, 117, 51, 50, 4, 168, 32, 84, 104, 101, 32, 105, 100, 101, 97, 108, 32, 110, 117, 109, 98, 101, 114, 32, 111, 102, 32, 115, 116, 97, 107, 105, 110, 103, 32, 112, 97, 114, 116, 105, 99, 105, 112, 97, 110, 116, 115, 46, 84, 77, 105, 110, 105, 109, 117, 109, 86, 97, 108, 105, 100, 97, 116, 111, 114, 67, 111, 117, 110, 116, 0, 0, 12, 117, 51, 50, 4, 65, 1, 32, 77, 105, 110, 105, 109, 117, 109, 32, 110, 117, 109, 98, 101, 114, 32, 111, 102, 32, 115, 116, 97, 107, 105, 110, 103, 32, 112, 97, 114, 116, 105, 99, 105, 112, 97, 110, 116, 115, 32, 98, 101, 102, 111, 114, 101, 32, 101, 109, 101, 114, 103, 101, 110, 99, 121, 32, 99, 111, 110, 100, 105, 116, 105, 111, 110, 115, 32, 97, 114, 101, 32, 105, 109, 112, 111, 115, 101, 100, 46, 56, 83, 101, 115, 115, 105, 111, 110, 115, 80, 101, 114, 69, 114, 97, 2, 0, 56, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 4, 164, 32, 84, 104, 101, 32, 108, 101, 110, 103, 116, 104, 32, 111, 102, 32, 97, 32, 115, 116, 97, 107, 105, 110, 103, 32, 101, 114, 97, 32, 105, 110, 32, 115, 101, 115, 115, 105, 111, 110, 115, 46, 52, 83, 101, 115, 115, 105, 111, 110, 82, 101, 119, 97, 114, 100, 2, 0, 28, 80, 101, 114, 98, 105, 108, 108, 4, 33, 1, 32, 77, 97, 120, 105, 109, 117, 109, 32, 114, 101, 119, 97, 114, 100, 44, 32, 112, 101, 114, 32, 118, 97, 108, 105, 100, 97, 116, 111, 114, 44, 32, 116, 104, 97, 116, 32, 105, 115, 32, 112, 114, 111, 118, 105, 100, 101, 100, 32, 112, 101, 114, 32, 97, 99, 99, 101, 112, 116, 97, 98, 108, 101, 32, 115, 101, 115, 115, 105, 111, 110, 46, 48, 79, 102, 102, 108, 105, 110, 101, 83, 108, 97, 115, 104, 2, 0, 28, 80, 101, 114, 98, 105, 108, 108, 4, 81, 1, 32, 83, 108, 97, 115, 104, 44, 32, 112, 101, 114, 32, 118, 97, 108, 105, 100, 97, 116, 111, 114, 32, 116, 104, 97, 116, 32, 105, 115, 32, 116, 97, 107, 101, 110, 32, 102, 111, 114, 32, 116, 104, 101, 32, 102, 105, 114, 115, 116, 32, 116, 105, 109, 101, 32, 116, 104, 101, 121, 32, 97, 114, 101, 32, 102, 111, 117, 110, 100, 32, 116, 111, 32, 98, 101, 32, 111, 102, 102, 108, 105, 110, 101, 46, 68, 79, 102, 102, 108, 105, 110, 101, 83, 108, 97, 115, 104, 71, 114, 97, 99, 101, 1, 0, 12, 117, 51, 50, 4, 57, 1, 32, 78, 117, 109, 98, 101, 114, 32, 111, 102, 32, 105, 110, 115, 116, 97, 110, 99, 101, 115, 32, 111, 102, 32, 111, 102, 102, 108, 105, 110, 101, 32, 114, 101, 112, 111, 114, 116, 115, 32, 98, 101, 102, 111, 114, 101, 32, 115, 108, 97, 115, 104, 105, 110, 103, 32, 98, 101, 103, 105, 110, 115, 32, 102, 111, 114, 32, 118, 97, 108, 105, 100, 97, 116, 111, 114, 115, 46, 60, 66, 111, 110, 100, 105, 110, 103, 68, 117, 114, 97, 116, 105, 111, 110, 2, 0, 56, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 4, 184, 32, 84, 104, 101, 32, 108, 101, 110, 103, 116, 104, 32, 111, 102, 32, 116, 104, 101, 32, 98, 111, 110, 100, 105, 110, 103, 32, 100, 117, 114, 97, 116, 105, 111, 110, 32, 105, 110, 32, 98, 108, 111, 99, 107, 115, 46, 40, 67, 117, 114, 114, 101, 110, 116, 69, 114, 97, 2, 0, 56, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 4, 92, 32, 84, 104, 101, 32, 99, 117, 114, 114, 101, 110, 116, 32, 101, 114, 97, 32, 105, 110, 100, 101, 120, 46, 80, 86, 97, 108, 105, 100, 97, 116, 111, 114, 80, 114, 101, 102, 101, 114, 101, 110, 99, 101, 115, 1, 1, 48, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 104, 86, 97, 108, 105, 100, 97, 116, 111, 114, 80, 114, 101, 102, 115, 60, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 62, 4, 136, 32, 80, 114, 101, 102, 101, 114, 101, 110, 99, 101, 115, 32, 116, 104, 97, 116, 32, 97, 32, 118, 97, 108, 105, 100, 97, 116, 111, 114, 32, 104, 97, 115, 46, 40, 73, 110, 116, 101, 110, 116, 105, 111, 110, 115, 1, 0, 68, 86, 101, 99, 60, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 62, 4, 164, 32, 65, 108, 108, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 115, 32, 119, 105, 116, 104, 32, 97, 32, 100, 101, 115, 105, 114, 101, 32, 116, 111, 32, 115, 116, 97, 107, 101, 46, 40, 78, 111, 109, 105, 110, 97, 116, 105, 110, 103, 0, 1, 48, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 48, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 4, 160, 32, 65, 108, 108, 32, 110, 111, 109, 105, 110, 97, 116, 111, 114, 32, 45, 62, 32, 110, 111, 109, 105, 110, 101, 101, 32, 114, 101, 108, 97, 116, 105, 111, 110, 115, 104, 105, 112, 115, 46, 52, 78, 111, 109, 105, 110, 97, 116, 111, 114, 115, 70, 111, 114, 1, 1, 48, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 68, 86, 101, 99, 60, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 62, 4, 148, 32, 78, 111, 109, 105, 110, 97, 116, 111, 114, 115, 32, 102, 111, 114, 32, 97, 32, 112, 97, 114, 116, 105, 99, 117, 108, 97, 114, 32, 97, 99, 99, 111, 117, 110, 116, 46, 80, 67, 117, 114, 114, 101, 110, 116, 78, 111, 109, 105, 110, 97, 116, 111, 114, 115, 70, 111, 114, 1, 1, 48, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 68, 86, 101, 99, 60, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 62, 4, 5, 1, 32, 78, 111, 109, 105, 110, 97, 116, 111, 114, 115, 32, 102, 111, 114, 32, 97, 32, 112, 97, 114, 116, 105, 99, 117, 108, 97, 114, 32, 97, 99, 99, 111, 117, 110, 116, 32, 116, 104, 97, 116, 32, 105, 115, 32, 105, 110, 32, 97, 99, 116, 105, 111, 110, 32, 114, 105, 103, 104, 116, 32, 110, 111, 119, 46, 80, 67, 117, 114, 114, 101, 110, 116, 83, 101, 115, 115, 105, 111, 110, 82, 101, 119, 97, 114, 100, 1, 0, 40, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 4, 33, 1, 32, 77, 97, 120, 105, 109, 117, 109, 32, 114, 101, 119, 97, 114, 100, 44, 32, 112, 101, 114, 32, 118, 97, 108, 105, 100, 97, 116, 111, 114, 44, 32, 116, 104, 97, 116, 32, 105, 115, 32, 112, 114, 111, 118, 105, 100, 101, 100, 32, 112, 101, 114, 32, 97, 99, 99, 101, 112, 116, 97, 98, 108, 101, 32, 115, 101, 115, 115, 105, 111, 110, 46, 76, 67, 117, 114, 114, 101, 110, 116, 79, 102, 102, 108, 105, 110, 101, 83, 108, 97, 115, 104, 1, 0, 40, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 4, 81, 1, 32, 83, 108, 97, 115, 104, 44, 32, 112, 101, 114, 32, 118, 97, 108, 105, 100, 97, 116, 111, 114, 32, 116, 104, 97, 116, 32, 105, 115, 32, 116, 97, 107, 101, 110, 32, 102, 111, 114, 32, 116, 104, 101, 32, 102, 105, 114, 115, 116, 32, 116, 105, 109, 101, 32, 116, 104, 101, 121, 32, 97, 114, 101, 32, 102, 111, 117, 110, 100, 32, 116, 111, 32, 98, 101, 32, 111, 102, 102, 108, 105, 110, 101, 46, 72, 78, 101, 120, 116, 83, 101, 115, 115, 105, 111, 110, 115, 80, 101, 114, 69, 114, 97, 0, 0, 56, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 4, 144, 32, 84, 104, 101, 32, 110, 101, 120, 116, 32, 118, 97, 108, 117, 101, 32, 111, 102, 32, 115, 101, 115, 115, 105, 111, 110, 115, 32, 112, 101, 114, 32, 101, 114, 97, 46, 76, 76, 97, 115, 116, 69, 114, 97, 76, 101, 110, 103, 116, 104, 67, 104, 97, 110, 103, 101, 1, 0, 56, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 4, 224, 32, 84, 104, 101, 32, 115, 101, 115, 115, 105, 111, 110, 32, 105, 110, 100, 101, 120, 32, 97, 116, 32, 119, 104, 105, 99, 104, 32, 116, 104, 101, 32, 101, 114, 97, 32, 108, 101, 110, 103, 116, 104, 32, 108, 97, 115, 116, 32, 99, 104, 97, 110, 103, 101, 100, 46, 40, 83, 116, 97, 107, 101, 82, 97, 110, 103, 101, 1, 0, 72, 80, 97, 105, 114, 79, 102, 60, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 62, 4, 240, 32, 84, 104, 101, 32, 104, 105, 103, 104, 101, 115, 116, 32, 97, 110, 100, 32, 108, 111, 119, 101, 115, 116, 32, 115, 116, 97, 107, 101, 100, 32, 118, 97, 108, 105, 100, 97, 116, 111, 114, 32, 115, 108, 97, 115, 104, 97, 98, 108, 101, 32, 98, 97, 108, 97, 110, 99, 101, 115, 46, 28, 66, 111, 110, 100, 97, 103, 101, 1, 1, 48, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 56, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 4, 244, 32, 84, 104, 101, 32, 98, 108, 111, 99, 107, 32, 97, 116, 32, 119, 104, 105, 99, 104, 32, 116, 104, 101, 32, 96, 119, 104, 111, 96, 39, 115, 32, 102, 117, 110, 100, 115, 32, 98, 101, 99, 111, 109, 101, 32, 101, 110, 116, 105, 114, 101, 108, 121, 32, 108, 105, 113, 117, 105, 100, 46, 40, 83, 108, 97, 115, 104, 67, 111, 117, 110, 116, 1, 1, 48, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 12, 117, 51, 50, 4, 209, 1, 32, 84, 104, 101, 32, 110, 117, 109, 98, 101, 114, 32, 111, 102, 32, 116, 105, 109, 101, 115, 32, 97, 32, 103, 105, 118, 101, 110, 32, 118, 97, 108, 105, 100, 97, 116, 111, 114, 32, 104, 97, 115, 32, 98, 101, 101, 110, 32, 114, 101, 112, 111, 114, 116, 101, 100, 32, 111, 102, 102, 108, 105, 110, 101, 46, 32, 84, 104, 105, 115, 32, 103, 101, 116, 115, 32, 100, 101, 99, 114, 101, 109, 101, 110, 116, 101, 100, 32, 98, 121, 32, 111, 110, 101, 32, 101, 97, 99, 104, 32, 101, 114, 97, 32, 116, 104, 97, 116, 32, 112, 97, 115, 115, 101, 115, 46, 52, 70, 111, 114, 99, 105, 110, 103, 78, 101, 119, 69, 114, 97, 0, 0, 8, 40, 41, 4, 104, 32, 87, 101, 32, 97, 114, 101, 32, 102, 111, 114, 99, 105, 110, 103, 32, 97, 32, 110, 101, 119, 32, 101, 114, 97, 46, 36, 100, 101, 109, 111, 99, 114, 97, 99, 121, 24, 77, 111, 100, 117, 108, 101, 16, 67, 97, 108, 108, 20, 0, 0, 28, 112, 114, 111, 112, 111, 115, 101, 12, 24, 111, 114, 105, 103, 105, 110, 36, 84, 58, 58, 79, 114, 105, 103, 105, 110, 32, 112, 114, 111, 112, 111, 115, 97, 108, 64, 66, 111, 120, 60, 84, 58, 58, 80, 114, 111, 112, 111, 115, 97, 108, 62, 20, 118, 97, 108, 117, 101, 40, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 0, 1, 0, 24, 115, 101, 99, 111, 110, 100, 8, 24, 111, 114, 105, 103, 105, 110, 36, 84, 58, 58, 79, 114, 105, 103, 105, 110, 32, 112, 114, 111, 112, 111, 115, 97, 108, 36, 80, 114, 111, 112, 73, 110, 100, 101, 120, 0, 2, 0, 16, 118, 111, 116, 101, 12, 24, 111, 114, 105, 103, 105, 110, 36, 84, 58, 58, 79, 114, 105, 103, 105, 110, 36, 114, 101, 102, 95, 105, 110, 100, 101, 120, 60, 82, 101, 102, 101, 114, 101, 110, 100, 117, 109, 73, 110, 100, 101, 120, 64, 97, 112, 112, 114, 111, 118, 101, 95, 112, 114, 111, 112, 111, 115, 97, 108, 16, 98, 111, 111, 108, 0, 3, 0, 64, 115, 116, 97, 114, 116, 95, 114, 101, 102, 101, 114, 101, 110, 100, 117, 109, 8, 32, 112, 114, 111, 112, 111, 115, 97, 108, 64, 66, 111, 120, 60, 84, 58, 58, 80, 114, 111, 112, 111, 115, 97, 108, 62, 56, 118, 111, 116, 101, 95, 116, 104, 114, 101, 115, 104, 111, 108, 100, 52, 86, 111, 116, 101, 84, 104, 114, 101, 115, 104, 111, 108, 100, 0, 4, 0, 68, 99, 97, 110, 99, 101, 108, 95, 114, 101, 102, 101, 114, 101, 110, 100, 117, 109, 4, 36, 114, 101, 102, 95, 105, 110, 100, 101, 120, 60, 82, 101, 102, 101, 114, 101, 110, 100, 117, 109, 73, 110, 100, 101, 120, 0, 1, 36, 68, 101, 109, 111, 99, 114, 97, 99, 121, 44, 60, 80, 117, 98, 108, 105, 99, 80, 114, 111, 112, 67, 111, 117, 110, 116, 1, 0, 36, 80, 114, 111, 112, 73, 110, 100, 101, 120, 4, 244, 32, 84, 104, 101, 32, 110, 117, 109, 98, 101, 114, 32, 111, 102, 32, 40, 112, 117, 98, 108, 105, 99, 41, 32, 112, 114, 111, 112, 111, 115, 97, 108, 115, 32, 116, 104, 97, 116, 32, 104, 97, 118, 101, 32, 98, 101, 101, 110, 32, 109, 97, 100, 101, 32, 115, 111, 32, 102, 97, 114, 46, 44, 80, 117, 98, 108, 105, 99, 80, 114, 111, 112, 115, 1, 0, 172, 86, 101, 99, 60, 40, 80, 114, 111, 112, 73, 110, 100, 101, 120, 44, 32, 84, 58, 58, 80, 114, 111, 112, 111, 115, 97, 108, 44, 32, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 41, 62, 4, 128, 32, 84, 104, 101, 32, 112, 117, 98, 108, 105, 99, 32, 112, 114, 111, 112, 111, 115, 97, 108, 115, 46, 32, 85, 110, 115, 111, 114, 116, 101, 100, 46, 36, 68, 101, 112, 111, 115, 105, 116, 79, 102, 0, 1, 36, 80, 114, 111, 112, 73, 110, 100, 101, 120, 124, 40, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 44, 32, 86, 101, 99, 60, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 62, 41, 4, 132, 32, 84, 104, 111, 115, 101, 32, 119, 104, 111, 32, 104, 97, 118, 101, 32, 108, 111, 99, 107, 101, 100, 32, 97, 32, 100, 101, 112, 111, 115, 105, 116, 46, 48, 76, 97, 117, 110, 99, 104, 80, 101, 114, 105, 111, 100, 2, 0, 56, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 4, 228, 32, 72, 111, 119, 32, 111, 102, 116, 101, 110, 32, 40, 105, 110, 32, 98, 108, 111, 99, 107, 115, 41, 32, 110, 101, 119, 32, 112, 117, 98, 108, 105, 99, 32, 114, 101, 102, 101, 114, 101, 110, 100, 97, 32, 97, 114, 101, 32, 108, 97, 117, 110, 99, 104, 101, 100, 46, 56, 77, 105, 110, 105, 109, 117, 109, 68, 101, 112, 111, 115, 105, 116, 2, 0, 40, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 4, 53, 1, 32, 84, 104, 101, 32, 109, 105, 110, 105, 109, 117, 109, 32, 97, 109, 111, 117, 110, 116, 32, 116, 111, 32, 98, 101, 32, 117, 115, 101, 100, 32, 97, 115, 32, 97, 32, 100, 101, 112, 111, 115, 105, 116, 32, 102, 111, 114, 32, 97, 32, 112, 117, 98, 108, 105, 99, 32, 114, 101, 102, 101, 114, 101, 110, 100, 117, 109, 32, 112, 114, 111, 112, 111, 115, 97, 108, 46, 48, 86, 111, 116, 105, 110, 103, 80, 101, 114, 105, 111, 100, 2, 0, 56, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 4, 184, 32, 72, 111, 119, 32, 111, 102, 116, 101, 110, 32, 40, 105, 110, 32, 98, 108, 111, 99, 107, 115, 41, 32, 116, 111, 32, 99, 104, 101, 99, 107, 32, 102, 111, 114, 32, 110, 101, 119, 32, 118, 111, 116, 101, 115, 46, 60, 82, 101, 102, 101, 114, 101, 110, 100, 117, 109, 67, 111, 117, 110, 116, 2, 0, 60, 82, 101, 102, 101, 114, 101, 110, 100, 117, 109, 73, 110, 100, 101, 120, 4, 57, 1, 32, 84, 104, 101, 32, 110, 101, 120, 116, 32, 102, 114, 101, 101, 32, 114, 101, 102, 101, 114, 101, 110, 100, 117, 109, 32, 105, 110, 100, 101, 120, 44, 32, 97, 107, 97, 32, 116, 104, 101, 32, 110, 117, 109, 98, 101, 114, 32, 111, 102, 32, 114, 101, 102, 101, 114, 101, 110, 100, 117, 109, 115, 32, 115, 116, 97, 114, 116, 101, 100, 32, 115, 111, 32, 102, 97, 114, 46, 36, 78, 101, 120, 116, 84, 97, 108, 108, 121, 2, 0, 60, 82, 101, 102, 101, 114, 101, 110, 100, 117, 109, 73, 110, 100, 101, 120, 4, 200, 32, 84, 104, 101, 32, 110, 101, 120, 116, 32, 114, 101, 102, 101, 114, 101, 110, 100, 117, 109, 32, 105, 110, 100, 101, 120, 32, 116, 104, 97, 116, 32, 115, 104, 111, 117, 108, 100, 32, 98, 101, 32, 116, 97, 108, 108, 105, 101, 100, 46, 64, 82, 101, 102, 101, 114, 101, 110, 100, 117, 109, 73, 110, 102, 111, 79, 102, 0, 1, 60, 82, 101, 102, 101, 114, 101, 110, 100, 117, 109, 73, 110, 100, 101, 120, 176, 40, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 44, 32, 84, 58, 58, 80, 114, 111, 112, 111, 115, 97, 108, 44, 32, 86, 111, 116, 101, 84, 104, 114, 101, 115, 104, 111, 108, 100, 41, 4, 180, 32, 73, 110, 102, 111, 114, 109, 97, 116, 105, 111, 110, 32, 99, 111, 110, 99, 101, 114, 110, 105, 110, 103, 32, 97, 110, 121, 32, 103, 105, 118, 101, 110, 32, 114, 101, 102, 101, 114, 101, 110, 100, 117, 109, 46, 36, 86, 111, 116, 101, 114, 115, 70, 111, 114, 1, 1, 60, 82, 101, 102, 101, 114, 101, 110, 100, 117, 109, 73, 110, 100, 101, 120, 68, 86, 101, 99, 60, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 62, 4, 164, 32, 71, 101, 116, 32, 116, 104, 101, 32, 118, 111, 116, 101, 114, 115, 32, 102, 111, 114, 32, 116, 104, 101, 32, 99, 117, 114, 114, 101, 110, 116, 32, 112, 114, 111, 112, 111, 115, 97, 108, 46, 24, 86, 111, 116, 101, 79, 102, 0, 1, 124, 40, 82, 101, 102, 101, 114, 101, 110, 100, 117, 109, 73, 110, 100, 101, 120, 44, 32, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 41, 16, 98, 111, 111, 108, 4, 132, 32, 71, 101, 116, 32, 116, 104, 101, 32, 118, 111, 116, 101, 44, 32, 105, 102, 32, 83, 111, 109, 101, 44, 32, 111, 102, 32, 96, 119, 104, 111, 96, 46, 28, 99, 111, 117, 110, 99, 105, 108, 24, 77, 111, 100, 117, 108, 101, 16, 67, 97, 108, 108, 36, 0, 0, 52, 115, 101, 116, 95, 97, 112, 112, 114, 111, 118, 97, 108, 115, 12, 24, 111, 114, 105, 103, 105, 110, 36, 84, 58, 58, 79, 114, 105, 103, 105, 110, 20, 118, 111, 116, 101, 115, 36, 86, 101, 99, 60, 98, 111, 111, 108, 62, 20, 105, 110, 100, 101, 120, 36, 86, 111, 116, 101, 73, 110, 100, 101, 120, 0, 1, 0, 76, 114, 101, 97, 112, 95, 105, 110, 97, 99, 116, 105, 118, 101, 95, 118, 111, 116, 101, 114, 20, 24, 111, 114, 105, 103, 105, 110, 36, 84, 58, 58, 79, 114, 105, 103, 105, 110, 56, 114, 101, 112, 111, 114, 116, 101, 114, 95, 105, 110, 100, 101, 120, 12, 117, 51, 50, 12, 119, 104, 111, 152, 65, 100, 100, 114, 101, 115, 115, 60, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 44, 32, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 110, 100, 101, 120, 62, 36, 119, 104, 111, 95, 105, 110, 100, 101, 120, 12, 117, 51, 50, 72, 97, 115, 115, 117, 109, 101, 100, 95, 118, 111, 116, 101, 95, 105, 110, 100, 101, 120, 36, 86, 111, 116, 101, 73, 110, 100, 101, 120, 0, 2, 0, 52, 114, 101, 116, 114, 97, 99, 116, 95, 118, 111, 116, 101, 114, 8, 24, 111, 114, 105, 103, 105, 110, 36, 84, 58, 58, 79, 114, 105, 103, 105, 110, 20, 105, 110, 100, 101, 120, 12, 117, 51, 50, 0, 3, 0, 64, 115, 117, 98, 109, 105, 116, 95, 99, 97, 110, 100, 105, 100, 97, 99, 121, 8, 24, 111, 114, 105, 103, 105, 110, 36, 84, 58, 58, 79, 114, 105, 103, 105, 110, 16, 115, 108, 111, 116, 12, 117, 51, 50, 0, 4, 0, 56, 112, 114, 101, 115, 101, 110, 116, 95, 119, 105, 110, 110, 101, 114, 16, 24, 111, 114, 105, 103, 105, 110, 36, 84, 58, 58, 79, 114, 105, 103, 105, 110, 36, 99, 97, 110, 100, 105, 100, 97, 116, 101, 152, 65, 100, 100, 114, 101, 115, 115, 60, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 44, 32, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 110, 100, 101, 120, 62, 20, 116, 111, 116, 97, 108, 40, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 20, 105, 110, 100, 101, 120, 36, 86, 111, 116, 101, 73, 110, 100, 101, 120, 0, 5, 0, 68, 115, 101, 116, 95, 100, 101, 115, 105, 114, 101, 100, 95, 115, 101, 97, 116, 115, 4, 20, 99, 111, 117, 110, 116, 12, 117, 51, 50, 0, 6, 0, 52, 114, 101, 109, 111, 118, 101, 95, 109, 101, 109, 98, 101, 114, 4, 12, 119, 104, 111, 152, 65, 100, 100, 114, 101, 115, 115, 60, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 44, 32, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 110, 100, 101, 120, 62, 0, 7, 0, 100, 115, 101, 116, 95, 112, 114, 101, 115, 101, 110, 116, 97, 116, 105, 111, 110, 95, 100, 117, 114, 97, 116, 105, 111, 110, 4, 20, 99, 111, 117, 110, 116, 56, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 0, 8, 0, 68, 115, 101, 116, 95, 116, 101, 114, 109, 95, 100, 117, 114, 97, 116, 105, 111, 110, 4, 20, 99, 111, 117, 110, 116, 56, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 0, 1, 28, 67, 111, 117, 110, 99, 105, 108, 80, 52, 67, 97, 110, 100, 105, 100, 97, 99, 121, 66, 111, 110, 100, 2, 0, 40, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 4, 5, 1, 32, 72, 111, 119, 32, 109, 117, 99, 104, 32, 115, 104, 111, 117, 108, 100, 32, 98, 101, 32, 108, 111, 99, 107, 101, 100, 32, 117, 112, 32, 105, 110, 32, 111, 114, 100, 101, 114, 32, 116, 111, 32, 115, 117, 98, 109, 105, 116, 32, 111, 110, 101, 39, 115, 32, 99, 97, 110, 100, 105, 100, 97, 99, 121, 46, 40, 86, 111, 116, 105, 110, 103, 66, 111, 110, 100, 2, 0, 40, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 4, 9, 1, 32, 72, 111, 119, 32, 109, 117, 99, 104, 32, 115, 104, 111, 117, 108, 100, 32, 98, 101, 32, 108, 111, 99, 107, 101, 100, 32, 117, 112, 32, 105, 110, 32, 111, 114, 100, 101, 114, 32, 116, 111, 32, 98, 101, 32, 97, 98, 108, 101, 32, 116, 111, 32, 115, 117, 98, 109, 105, 116, 32, 118, 111, 116, 101, 115, 46, 80, 80, 114, 101, 115, 101, 110, 116, 83, 108, 97, 115, 104, 80, 101, 114, 86, 111, 116, 101, 114, 2, 0, 40, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 4, 13, 1, 32, 84, 104, 101, 32, 112, 117, 110, 105, 115, 104, 109, 101, 110, 116, 44, 32, 112, 101, 114, 32, 118, 111, 116, 101, 114, 44, 32, 105, 102, 32, 121, 111, 117, 32, 112, 114, 111, 118, 105, 100, 101, 32, 97, 110, 32, 105, 110, 118, 97, 108, 105, 100, 32, 112, 114, 101, 115, 101, 110, 116, 97, 116, 105, 111, 110, 46, 40, 67, 97, 114, 114, 121, 67, 111, 117, 110, 116, 2, 0, 12, 117, 51, 50, 4, 53, 1, 32, 72, 111, 119, 32, 109, 97, 110, 121, 32, 114, 117, 110, 110, 101, 114, 115, 45, 117, 112, 32, 115, 104, 111, 117, 108, 100, 32, 104, 97, 118, 101, 32, 116, 104, 101, 105, 114, 32, 97, 112, 112, 114, 111, 118, 97, 108, 115, 32, 112, 101, 114, 115, 105, 115, 116, 32, 117, 110, 116, 105, 108, 32, 116, 104, 101, 32, 110, 101, 120, 116, 32, 118, 111, 116, 101, 46, 80, 80, 114, 101, 115, 101, 110, 116, 97, 116, 105, 111, 110, 68, 117, 114, 97, 116, 105, 111, 110, 2, 0, 56, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 4, 61, 1, 32, 72, 111, 119, 32, 108, 111, 110, 103, 32, 116, 111, 32, 103, 105, 118, 101, 32, 101, 97, 99, 104, 32, 116, 111, 112, 32, 99, 97, 110, 100, 105, 100, 97, 116, 101, 32, 116, 111, 32, 112, 114, 101, 115, 101, 110, 116, 32, 116, 104, 101, 109, 115, 101, 108, 118, 101, 115, 32, 97, 102, 116, 101, 114, 32, 116, 104, 101, 32, 118, 111, 116, 101, 32, 101, 110, 100, 115, 46, 76, 73, 110, 97, 99, 116, 105, 118, 101, 71, 114, 97, 99, 101, 80, 101, 114, 105, 111, 100, 2, 0, 36, 86, 111, 116, 101, 73, 110, 100, 101, 120, 8, 105, 1, 32, 72, 111, 119, 32, 109, 97, 110, 121, 32, 118, 111, 116, 101, 115, 32, 110, 101, 101, 100, 32, 116, 111, 32, 103, 111, 32, 98, 121, 32, 97, 102, 116, 101, 114, 32, 97, 32, 118, 111, 116, 101, 114, 39, 115, 32, 108, 97, 115, 116, 32, 118, 111, 116, 101, 32, 98, 101, 102, 111, 114, 101, 32, 116, 104, 101, 121, 32, 99, 97, 110, 32, 98, 101, 32, 114, 101, 97, 112, 101, 100, 32, 105, 102, 32, 116, 104, 101, 105, 114, 80, 32, 97, 112, 112, 114, 111, 118, 97, 108, 115, 32, 97, 114, 101, 32, 109, 111, 111, 116, 46, 48, 86, 111, 116, 105, 110, 103, 80, 101, 114, 105, 111, 100, 2, 0, 56, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 4, 184, 32, 72, 111, 119, 32, 111, 102, 116, 101, 110, 32, 40, 105, 110, 32, 98, 108, 111, 99, 107, 115, 41, 32, 116, 111, 32, 99, 104, 101, 99, 107, 32, 102, 111, 114, 32, 110, 101, 119, 32, 118, 111, 116, 101, 115, 46, 48, 84, 101, 114, 109, 68, 117, 114, 97, 116, 105, 111, 110, 2, 0, 56, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 4, 152, 32, 72, 111, 119, 32, 108, 111, 110, 103, 32, 101, 97, 99, 104, 32, 112, 111, 115, 105, 116, 105, 111, 110, 32, 105, 115, 32, 97, 99, 116, 105, 118, 101, 32, 102, 111, 114, 46, 48, 68, 101, 115, 105, 114, 101, 100, 83, 101, 97, 116, 115, 2, 0, 12, 117, 51, 50, 4, 232, 32, 78, 117, 109, 98, 101, 114, 32, 111, 102, 32, 97, 99, 99, 111, 117, 110, 116, 115, 32, 116, 104, 97, 116, 32, 115, 104, 111, 117, 108, 100, 32, 98, 101, 32, 115, 105, 116, 116, 105, 110, 103, 32, 111, 110, 32, 116, 104, 101, 32, 99, 111, 117, 110, 99, 105, 108, 46, 52, 65, 99, 116, 105, 118, 101, 67, 111, 117, 110, 99, 105, 108, 1, 0, 140, 86, 101, 99, 60, 40, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 44, 32, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 41, 62, 8, 109, 1, 32, 84, 104, 101, 32, 99, 117, 114, 114, 101, 110, 116, 32, 99, 111, 117, 110, 99, 105, 108, 46, 32, 87, 104, 101, 110, 32, 116, 104, 101, 114, 101, 39, 115, 32, 97, 32, 118, 111, 116, 101, 32, 103, 111, 105, 110, 103, 32, 111, 110, 44, 32, 116, 104, 105, 115, 32, 115, 104, 111, 117, 108, 100, 32, 115, 116, 105, 108, 108, 32, 98, 101, 32, 117, 115, 101, 100, 32, 102, 111, 114, 32, 101, 120, 101, 99, 117, 116, 105, 118, 101, 36, 32, 109, 97, 116, 116, 101, 114, 115, 46, 36, 86, 111, 116, 101, 67, 111, 117, 110, 116, 1, 0, 36, 86, 111, 116, 101, 73, 110, 100, 101, 120, 4, 5, 1, 32, 84, 104, 101, 32, 116, 111, 116, 97, 108, 32, 110, 117, 109, 98, 101, 114, 32, 111, 102, 32, 118, 111, 116, 101, 115, 32, 116, 104, 97, 116, 32, 104, 97, 118, 101, 32, 104, 97, 112, 112, 101, 110, 101, 100, 32, 111, 114, 32, 97, 114, 101, 32, 105, 110, 32, 112, 114, 111, 103, 114, 101, 115, 115, 46, 44, 65, 112, 112, 114, 111, 118, 97, 108, 115, 79, 102, 1, 1, 48, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 36, 86, 101, 99, 60, 98, 111, 111, 108, 62, 4, 1, 1, 32, 84, 104, 101, 32, 108, 97, 115, 116, 32, 99, 108, 101, 97, 114, 101, 100, 32, 118, 111, 116, 101, 32, 105, 110, 100, 101, 120, 32, 116, 104, 97, 116, 32, 116, 104, 105, 115, 32, 118, 111, 116, 101, 114, 32, 119, 97, 115, 32, 108, 97, 115, 116, 32, 97, 99, 116, 105, 118, 101, 32, 97, 116, 46, 56, 82, 101, 103, 105, 115, 116, 101, 114, 73, 110, 102, 111, 79, 102, 0, 1, 48, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 64, 40, 86, 111, 116, 101, 73, 110, 100, 101, 120, 44, 32, 117, 51, 50, 41, 8, 125, 1, 32, 84, 104, 101, 32, 118, 111, 116, 101, 32, 105, 110, 100, 101, 120, 32, 97, 110, 100, 32, 108, 105, 115, 116, 32, 115, 108, 111, 116, 32, 116, 104, 97, 116, 32, 116, 104, 101, 32, 99, 97, 110, 100, 105, 100, 97, 116, 101, 32, 96, 119, 104, 111, 96, 32, 119, 97, 115, 32, 114, 101, 103, 105, 115, 116, 101, 114, 101, 100, 32, 111, 114, 32, 96, 78, 111, 110, 101, 96, 32, 105, 102, 32, 116, 104, 101, 121, 32, 97, 114, 101, 32, 110, 111, 116, 88, 32, 99, 117, 114, 114, 101, 110, 116, 108, 121, 32, 114, 101, 103, 105, 115, 116, 101, 114, 101, 100, 46, 48, 76, 97, 115, 116, 65, 99, 116, 105, 118, 101, 79, 102, 0, 1, 48, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 36, 86, 111, 116, 101, 73, 110, 100, 101, 120, 4, 1, 1, 32, 84, 104, 101, 32, 108, 97, 115, 116, 32, 99, 108, 101, 97, 114, 101, 100, 32, 118, 111, 116, 101, 32, 105, 110, 100, 101, 120, 32, 116, 104, 97, 116, 32, 116, 104, 105, 115, 32, 118, 111, 116, 101, 114, 32, 119, 97, 115, 32, 108, 97, 115, 116, 32, 97, 99, 116, 105, 118, 101, 32, 97, 116, 46, 24, 86, 111, 116, 101, 114, 115, 1, 0, 68, 86, 101, 99, 60, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 62, 4, 96, 32, 84, 104, 101, 32, 112, 114, 101, 115, 101, 110, 116, 32, 118, 111, 116, 101, 114, 32, 108, 105, 115, 116, 46, 40, 67, 97, 110, 100, 105, 100, 97, 116, 101, 115, 1, 0, 68, 86, 101, 99, 60, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 62, 4, 112, 32, 84, 104, 101, 32, 112, 114, 101, 115, 101, 110, 116, 32, 99, 97, 110, 100, 105, 100, 97, 116, 101, 32, 108, 105, 115, 116, 46, 56, 67, 97, 110, 100, 105, 100, 97, 116, 101, 67, 111, 117, 110, 116, 1, 0, 12, 117, 51, 50, 0, 48, 78, 101, 120, 116, 70, 105, 110, 97, 108, 105, 115, 101, 0, 0, 160, 40, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 44, 32, 117, 51, 50, 44, 32, 86, 101, 99, 60, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 62, 41, 4, 33, 1, 32, 84, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 115, 32, 104, 111, 108, 100, 105, 110, 103, 32, 116, 104, 101, 32, 115, 101, 97, 116, 115, 32, 116, 104, 97, 116, 32, 119, 105, 108, 108, 32, 98, 101, 99, 111, 109, 101, 32, 102, 114, 101, 101, 32, 111, 110, 32, 116, 104, 101, 32, 110, 101, 120, 116, 32, 116, 97, 108, 108, 121, 46, 64, 83, 110, 97, 112, 115, 104, 111, 116, 101, 100, 83, 116, 97, 107, 101, 115, 2, 0, 60, 86, 101, 99, 60, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 62, 4, 232, 32, 84, 104, 101, 32, 115, 116, 97, 107, 101, 115, 32, 97, 115, 32, 116, 104, 101, 121, 32, 119, 101, 114, 101, 32, 97, 116, 32, 116, 104, 101, 32, 112, 111, 105, 110, 116, 32, 116, 104, 97, 116, 32, 116, 104, 101, 32, 118, 111, 116, 101, 32, 101, 110, 100, 101, 100, 46, 44, 76, 101, 97, 100, 101, 114, 98, 111, 97, 114, 100, 0, 0, 124, 86, 101, 99, 60, 40, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 44, 32, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 41, 62, 4, 224, 32, 71, 101, 116, 32, 116, 104, 101, 32, 108, 101, 97, 100, 101, 114, 98, 111, 97, 114, 100, 32, 105, 102, 32, 119, 101, 59, 114, 101, 32, 105, 110, 32, 116, 104, 101, 32, 112, 114, 101, 115, 101, 110, 116, 97, 116, 105, 111, 110, 32, 112, 104, 97, 115, 101, 46, 56, 99, 111, 117, 110, 99, 105, 108, 95, 118, 111, 116, 105, 110, 103, 24, 77, 111, 100, 117, 108, 101, 16, 67, 97, 108, 108, 20, 0, 0, 28, 112, 114, 111, 112, 111, 115, 101, 8, 24, 111, 114, 105, 103, 105, 110, 36, 84, 58, 58, 79, 114, 105, 103, 105, 110, 32, 112, 114, 111, 112, 111, 115, 97, 108, 64, 66, 111, 120, 60, 84, 58, 58, 80, 114, 111, 112, 111, 115, 97, 108, 62, 0, 1, 0, 16, 118, 111, 116, 101, 12, 24, 111, 114, 105, 103, 105, 110, 36, 84, 58, 58, 79, 114, 105, 103, 105, 110, 32, 112, 114, 111, 112, 111, 115, 97, 108, 28, 84, 58, 58, 72, 97, 115, 104, 28, 97, 112, 112, 114, 111, 118, 101, 16, 98, 111, 111, 108, 0, 2, 0, 16, 118, 101, 116, 111, 8, 24, 111, 114, 105, 103, 105, 110, 36, 84, 58, 58, 79, 114, 105, 103, 105, 110, 52, 112, 114, 111, 112, 111, 115, 97, 108, 95, 104, 97, 115, 104, 28, 84, 58, 58, 72, 97, 115, 104, 0, 3, 0, 72, 115, 101, 116, 95, 99, 111, 111, 108, 111, 102, 102, 95, 112, 101, 114, 105, 111, 100, 4, 24, 98, 108, 111, 99, 107, 115, 56, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 0, 4, 0, 68, 115, 101, 116, 95, 118, 111, 116, 105, 110, 103, 95, 112, 101, 114, 105, 111, 100, 4, 24, 98, 108, 111, 99, 107, 115, 56, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 0, 1, 52, 67, 111, 117, 110, 99, 105, 108, 86, 111, 116, 105, 110, 103, 28, 52, 67, 111, 111, 108, 111, 102, 102, 80, 101, 114, 105, 111, 100, 2, 0, 56, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 0, 48, 86, 111, 116, 105, 110, 103, 80, 101, 114, 105, 111, 100, 2, 0, 56, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 0, 36, 80, 114, 111, 112, 111, 115, 97, 108, 115, 2, 0, 120, 86, 101, 99, 60, 40, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 44, 32, 84, 58, 58, 72, 97, 115, 104, 41, 62, 0, 40, 80, 114, 111, 112, 111, 115, 97, 108, 79, 102, 0, 1, 28, 84, 58, 58, 72, 97, 115, 104, 44, 84, 58, 58, 80, 114, 111, 112, 111, 115, 97, 108, 0, 56, 80, 114, 111, 112, 111, 115, 97, 108, 86, 111, 116, 101, 114, 115, 1, 1, 28, 84, 58, 58, 72, 97, 115, 104, 68, 86, 101, 99, 60, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 62, 0, 52, 67, 111, 117, 110, 99, 105, 108, 86, 111, 116, 101, 79, 102, 0, 1, 92, 40, 84, 58, 58, 72, 97, 115, 104, 44, 32, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 41, 16, 98, 111, 111, 108, 0, 56, 86, 101, 116, 111, 101, 100, 80, 114, 111, 112, 111, 115, 97, 108, 0, 1, 28, 84, 58, 58, 72, 97, 115, 104, 140, 40, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 44, 32, 86, 101, 99, 60, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 62, 41, 0, 60, 99, 111, 117, 110, 99, 105, 108, 95, 109, 111, 116, 105, 111, 110, 115, 24, 77, 111, 100, 117, 108, 101, 16, 67, 97, 108, 108, 8, 0, 0, 28, 112, 114, 111, 112, 111, 115, 101, 12, 24, 111, 114, 105, 103, 105, 110, 112, 60, 84, 32, 97, 115, 32, 115, 121, 115, 116, 101, 109, 58, 58, 84, 114, 97, 105, 116, 62, 58, 58, 79, 114, 105, 103, 105, 110, 36, 116, 104, 114, 101, 115, 104, 111, 108, 100, 12, 117, 51, 50, 32, 112, 114, 111, 112, 111, 115, 97, 108, 108, 66, 111, 120, 60, 60, 84, 32, 97, 115, 32, 84, 114, 97, 105, 116, 62, 58, 58, 80, 114, 111, 112, 111, 115, 97, 108, 62, 0, 1, 0, 16, 118, 111, 116, 101, 16, 24, 111, 114, 105, 103, 105, 110, 112, 60, 84, 32, 97, 115, 32, 115, 121, 115, 116, 101, 109, 58, 58, 84, 114, 97, 105, 116, 62, 58, 58, 79, 114, 105, 103, 105, 110, 32, 112, 114, 111, 112, 111, 115, 97, 108, 28, 84, 58, 58, 72, 97, 115, 104, 20, 105, 110, 100, 101, 120, 52, 80, 114, 111, 112, 111, 115, 97, 108, 73, 110, 100, 101, 120, 28, 97, 112, 112, 114, 111, 118, 101, 16, 98, 111, 111, 108, 0, 1, 56, 67, 111, 117, 110, 99, 105, 108, 77, 111, 116, 105, 111, 110, 115, 16, 36, 80, 114, 111, 112, 111, 115, 97, 108, 115, 1, 0, 48, 86, 101, 99, 60, 84, 58, 58, 72, 97, 115, 104, 62, 4, 152, 32, 84, 104, 101, 32, 40, 104, 97, 115, 104, 101, 115, 32, 111, 102, 41, 32, 116, 104, 101, 32, 97, 99, 116, 105, 118, 101, 32, 112, 114, 111, 112, 111, 115, 97, 108, 115, 46, 40, 80, 114, 111, 112, 111, 115, 97, 108, 79, 102, 0, 1, 28, 84, 58, 58, 72, 97, 115, 104, 88, 60, 84, 32, 97, 115, 32, 84, 114, 97, 105, 116, 62, 58, 58, 80, 114, 111, 112, 111, 115, 97, 108, 4, 204, 32, 65, 99, 116, 117, 97, 108, 32, 112, 114, 111, 112, 111, 115, 97, 108, 32, 102, 111, 114, 32, 97, 32, 103, 105, 118, 101, 110, 32, 104, 97, 115, 104, 44, 32, 105, 102, 32, 105, 116, 39, 115, 32, 99, 117, 114, 114, 101, 110, 116, 46, 24, 86, 111, 116, 105, 110, 103, 0, 1, 28, 84, 58, 58, 72, 97, 115, 104, 232, 40, 80, 114, 111, 112, 111, 115, 97, 108, 73, 110, 100, 101, 120, 44, 32, 117, 51, 50, 44, 32, 86, 101, 99, 60, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 62, 44, 32, 86, 101, 99, 60, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 62, 41, 4, 37, 1, 32, 86, 111, 116, 101, 115, 32, 102, 111, 114, 32, 97, 32, 103, 105, 118, 101, 110, 32, 112, 114, 111, 112, 111, 115, 97, 108, 58, 32, 40, 114, 101, 113, 117, 105, 114, 101, 100, 95, 121, 101, 115, 95, 118, 111, 116, 101, 115, 44, 32, 121, 101, 115, 95, 118, 111, 116, 101, 114, 115, 44, 32, 110, 111, 95, 118, 111, 116, 101, 114, 115, 41, 46, 52, 80, 114, 111, 112, 111, 115, 97, 108, 67, 111, 117, 110, 116, 1, 0, 12, 117, 51, 50, 4, 72, 32, 80, 114, 111, 112, 111, 115, 97, 108, 115, 32, 115, 111, 32, 102, 97, 114, 46, 32, 116, 114, 101, 97, 115, 117, 114, 121, 24, 77, 111, 100, 117, 108, 101, 16, 67, 97, 108, 108, 20, 0, 0, 52, 112, 114, 111, 112, 111, 115, 101, 95, 115, 112, 101, 110, 100, 12, 24, 111, 114, 105, 103, 105, 110, 36, 84, 58, 58, 79, 114, 105, 103, 105, 110, 20, 118, 97, 108, 117, 101, 40, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 44, 98, 101, 110, 101, 102, 105, 99, 105, 97, 114, 121, 48, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 0, 1, 0, 28, 115, 101, 116, 95, 112, 111, 116, 4, 28, 110, 101, 119, 95, 112, 111, 116, 40, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 0, 2, 0, 36, 99, 111, 110, 102, 105, 103, 117, 114, 101, 16, 52, 112, 114, 111, 112, 111, 115, 97, 108, 95, 98, 111, 110, 100, 28, 80, 101, 114, 109, 105, 108, 108, 84, 112, 114, 111, 112, 111, 115, 97, 108, 95, 98, 111, 110, 100, 95, 109, 105, 110, 105, 109, 117, 109, 40, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 48, 115, 112, 101, 110, 100, 95, 112, 101, 114, 105, 111, 100, 56, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 16, 98, 117, 114, 110, 28, 80, 101, 114, 109, 105, 108, 108, 0, 3, 0, 60, 114, 101, 106, 101, 99, 116, 95, 112, 114, 111, 112, 111, 115, 97, 108, 8, 24, 111, 114, 105, 103, 105, 110, 36, 84, 58, 58, 79, 114, 105, 103, 105, 110, 40, 114, 111, 112, 111, 115, 97, 108, 95, 105, 100, 52, 80, 114, 111, 112, 111, 115, 97, 108, 73, 110, 100, 101, 120, 0, 4, 0, 64, 97, 112, 112, 114, 111, 118, 101, 95, 112, 114, 111, 112, 111, 115, 97, 108, 8, 24, 111, 114, 105, 103, 105, 110, 36, 84, 58, 58, 79, 114, 105, 103, 105, 110, 44, 112, 114, 111, 112, 111, 115, 97, 108, 95, 105, 100, 52, 80, 114, 111, 112, 111, 115, 97, 108, 73, 110, 100, 101, 120, 0, 1, 32, 84, 114, 101, 97, 115, 117, 114, 121, 32, 48, 80, 114, 111, 112, 111, 115, 97, 108, 66, 111, 110, 100, 2, 0, 28, 80, 101, 114, 109, 105, 108, 108, 8, 81, 1, 32, 80, 114, 111, 112, 111, 114, 116, 105, 111, 110, 32, 111, 102, 32, 102, 117, 110, 100, 115, 32, 116, 104, 97, 116, 32, 115, 104, 111, 117, 108, 100, 32, 98, 101, 32, 98, 111, 110, 100, 101, 100, 32, 105, 110, 32, 111, 114, 100, 101, 114, 32, 116, 111, 32, 112, 108, 97, 99, 101, 32, 97, 32, 112, 114, 111, 112, 111, 115, 97, 108, 46, 32, 65, 110, 32, 97, 99, 99, 101, 112, 116, 101, 100, 220, 32, 112, 114, 111, 112, 111, 115, 97, 108, 32, 103, 101, 116, 115, 32, 116, 104, 101, 115, 101, 32, 98, 97, 99, 107, 46, 32, 65, 32, 114, 101, 106, 101, 99, 116, 101, 100, 32, 112, 114, 111, 112, 111, 115, 97, 108, 32, 100, 111, 101, 115, 110, 39, 116, 46, 76, 80, 114, 111, 112, 111, 115, 97, 108, 66, 111, 110, 100, 77, 105, 110, 105, 109, 117, 109, 2, 0, 40, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 4, 73, 1, 32, 77, 105, 110, 105, 109, 117, 109, 32, 97, 109, 111, 117, 110, 116, 32, 111, 102, 32, 102, 117, 110, 100, 115, 32, 116, 104, 97, 116, 32, 115, 104, 111, 117, 108, 100, 32, 98, 101, 32, 112, 108, 97, 99, 101, 100, 32, 105, 110, 32, 97, 32, 100, 101, 112, 111, 115, 105, 116, 32, 102, 111, 114, 32, 109, 97, 107, 105, 110, 103, 32, 97, 32, 112, 114, 111, 112, 111, 115, 97, 108, 46, 44, 83, 112, 101, 110, 100, 80, 101, 114, 105, 111, 100, 2, 0, 56, 84, 58, 58, 66, 108, 111, 99, 107, 78, 117, 109, 98, 101, 114, 4, 136, 32, 80, 101, 114, 105, 111, 100, 32, 98, 101, 116, 119, 101, 101, 110, 32, 115, 117, 99, 99, 101, 115, 115, 105, 118, 101, 32, 115, 112, 101, 110, 100, 115, 46, 16, 66, 117, 114, 110, 2, 0, 28, 80, 101, 114, 109, 105, 108, 108, 4, 17, 1, 32, 80, 101, 114, 99, 101, 110, 116, 97, 103, 101, 32, 111, 102, 32, 115, 112, 97, 114, 101, 32, 102, 117, 110, 100, 115, 32, 40, 105, 102, 32, 97, 110, 121, 41, 32, 116, 104, 97, 116, 32, 97, 114, 101, 32, 98, 117, 114, 110, 116, 32, 112, 101, 114, 32, 115, 112, 101, 110, 100, 32, 112, 101, 114, 105, 111, 100, 46, 12, 80, 111, 116, 1, 0, 40, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 4, 204, 32, 84, 111, 116, 97, 108, 32, 102, 117, 110, 100, 115, 32, 97, 118, 97, 105, 108, 97, 98, 108, 101, 32, 116, 111, 32, 116, 104, 105, 115, 32, 109, 111, 100, 117, 108, 101, 32, 102, 111, 114, 32, 115, 112, 101, 110, 100, 105, 110, 103, 46, 52, 80, 114, 111, 112, 111, 115, 97, 108, 67, 111, 117, 110, 116, 1, 0, 52, 80, 114, 111, 112, 111, 115, 97, 108, 73, 110, 100, 101, 120, 4, 164, 32, 78, 117, 109, 98, 101, 114, 32, 111, 102, 32, 112, 114, 111, 112, 111, 115, 97, 108, 115, 32, 116, 104, 97, 116, 32, 104, 97, 118, 101, 32, 98, 101, 101, 110, 32, 109, 97, 100, 101, 46, 36, 80, 114, 111, 112, 111, 115, 97, 108, 115, 0, 1, 52, 80, 114, 111, 112, 111, 115, 97, 108, 73, 110, 100, 101, 120, 136, 80, 114, 111, 112, 111, 115, 97, 108, 60, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 44, 32, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 62, 4, 124, 32, 80, 114, 111, 112, 111, 115, 97, 108, 115, 32, 116, 104, 97, 116, 32, 104, 97, 118, 101, 32, 98, 101, 101, 110, 32, 109, 97, 100, 101, 46, 36, 65, 112, 112, 114, 111, 118, 97, 108, 115, 1, 0, 72, 86, 101, 99, 60, 80, 114, 111, 112, 111, 115, 97, 108, 73, 110, 100, 101, 120, 62, 4, 248, 32, 80, 114, 111, 112, 111, 115, 97, 108, 32, 105, 110, 100, 105, 99, 101, 115, 32, 116, 104, 97, 116, 32, 104, 97, 118, 101, 32, 98, 101, 101, 110, 32, 97, 112, 112, 114, 111, 118, 101, 100, 32, 98, 117, 116, 32, 110, 111, 116, 32, 121, 101, 116, 32, 97, 119, 97, 114, 100, 101, 100, 46, 32, 99, 111, 110, 116, 114, 97, 99, 116, 24, 77, 111, 100, 117, 108, 101, 16, 67, 97, 108, 108, 8, 0, 0, 16, 99, 97, 108, 108, 20, 24, 111, 114, 105, 103, 105, 110, 36, 84, 58, 58, 79, 114, 105, 103, 105, 110, 16, 100, 101, 115, 116, 48, 84, 58, 58, 65, 99, 99, 111, 117, 110, 116, 73, 100, 20, 118, 97, 108, 117, 101, 40, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 36, 103, 97, 115, 95, 108, 105, 109, 105, 116, 24, 84, 58, 58, 71, 97, 115, 16, 100, 97, 116, 97, 28, 86, 101, 99, 60, 117, 56, 62, 0, 1, 0, 24, 99, 114, 101, 97, 116, 101, 20, 24, 111, 114, 105, 103, 105, 110, 36, 84, 58, 58, 79, 114, 105, 103, 105, 110, 20, 118, 97, 108, 117, 101, 40, 84, 58, 58, 66, 97, 108, 97, 110, 99, 101, 36, 103, 97, 115, 95, 108, 105, 109, 105, 116, 24, 84, 58, 58, 71, 97, 115, 36, 105, 110, 105, 116, 95, 99, 111, 100, 101, 28, 86, 101, 99, 60, 117, 56, 62, 16, 100, 97, 116, 97, 28, 86, 101, 99, 60, 117, 56, 62, 0, 0 -]; +const meta = '0x144576656e74281873797374656d084045787472696e7369635375636365737300049420416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e3c45787472696e7369634661696c656400045420416e2065787472696e736963206661696c65642e2062616c616e6365730c284e65774163636f756e740c244163636f756e744964304163636f756e74496e646578444e65774163636f756e744f7574636f6d65046c2041206e6577206163636f756e742077617320637265617465642e345265617065644163636f756e7404244163636f756e744964045c20416e206163636f756e7420776173207265617065642e205472616e7366657210244163636f756e744964244163636f756e7449641c42616c616e63651c42616c616e636504b0205472616e7366657220737563636565646564202866726f6d2c20746f2c2076616c75652c2066656573292e1c73657373696f6e04284e657753657373696f6e042c426c6f636b4e756d626572085501204e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e74206973207468652073657373696f6e20696e6465782c206e6f742074686520626c6f636b88206e756d626572206173207468652074797065206d6967687420737567676573742e1c7374616b696e670c18526577617264041c42616c616e636504e020416c6c2076616c696461746f72732068617665206265656e2072657761726465642062792074686520676976656e2062616c616e63652e384f66666c696e655761726e696e6708244163636f756e7449640c753332085501204f6e652076616c696461746f722028616e64207468656972206e6f6d696e61746f72732920686173206265656e20676976656e2061206f66666c696e652d7761726e696e67202874686579277265207374696c6c15012077697468696e207468656972206772616365292e205468652061636372756564206e756d626572206f6620736c6173686573206973207265636f726465642c20746f6f2e304f66666c696e65536c61736808244163636f756e7449641c42616c616e6365042d01204f6e652076616c696461746f722028616e64207468656972206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e2464656d6f637261637918185461626c65640c2450726f70496e6465781c42616c616e6365385665633c4163636f756e7449643e001c53746172746564083c5265666572656e64756d496e64657834566f74655468726573686f6c640018506173736564043c5265666572656e64756d496e64657800244e6f74506173736564043c5265666572656e64756d496e646578002443616e63656c6c6564043c5265666572656e64756d496e64657800204578656375746564083c5265666572656e64756d496e64657810626f6f6c001c636f756e63696c102c566f74657252656170656408244163636f756e744964244163636f756e74496404542072656170656420766f7465722c2072656170657240426164526561706572536c617368656404244163636f756e744964043c20736c6173686564207265617065723054616c6c7953746172746564040c75333204f420412074616c6c792028666f7220617070726f76616c20766f746573206f6620636f756e63696c2073656174287329292068617320737461727465642e3854616c6c7946696e616c6973656408385665633c4163636f756e7449643e385665633c4163636f756e7449643e04690120412074616c6c792028666f7220617070726f76616c20766f746573206f6620636f756e63696c2073656174287329292068617320656e646564202877697468206f6e65206f72206d6f7265206e6577206d656d62657273292e38636f756e63696c5f766f74696e67084054616c6c7943616e63656c6174696f6e1010486173680c7533320c7533320c75333208fc204120766f74696e672074616c6c79206861732068617070656e656420666f722061207265666572656e64756d2063616e63656c6174696f6e20766f74652ea0204c61737420746872656520617265207965732c206e6f2c206162737461696e20636f756e74732e3c54616c6c795265666572656e64756d1010486173680c7533320c7533320c75333208cc204120766f74696e672074616c6c79206861732068617070656e656420666f722061207265666572656e64756d20766f74652ea0204c61737420746872656520617265207965732c206e6f2c206162737461696e20636f756e74732e3c636f756e63696c5f6d6f74696f6e73142050726f706f73656410244163636f756e7449643450726f706f73616c496e64657810486173680c7533320465012041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e20753332292e14566f74656414244163636f756e744964104861736810626f6f6c0c7533320c7533320809012041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e67f420612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e206173207533327320726573706563746976656c79292e20417070726f76656404104861736804c42041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2c446973617070726f76656404104861736804d42041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e20457865637574656408104861736810626f6f6c0405012041206d6f74696f6e207761732065786563757465643b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e207472656173757279142050726f706f736564043450726f706f73616c496e6465780438204e65772070726f706f73616c2e205370656e64696e67041c42616c616e636504e8205765206861766520656e6465642061207370656e6420706572696f6420616e642077696c6c206e6f7720616c6c6f636174652066756e64732e1c417761726465640c3450726f706f73616c496e6465781c42616c616e6365244163636f756e744964048020536f6d652066756e64732068617665206265656e20616c6c6f63617465642e144275726e74041c42616c616e6365048c20536f6d65206f66206f75722066756e64732068617665206265656e206275726e742e20526f6c6c6f766572041c42616c616e6365043101205370656e64696e67206861732066696e69736865643b20746869732069732074686520616d6f756e74207468617420726f6c6c73206f76657220756e74696c206e657874207370656e642e20636f6e747261637404205472616e736665720c244163636f756e744964244163636f756e7449641c42616c616e6365047501205472616e736665722068617070656e6564206066726f6d60202d3e2060746f60207769746820676976656e206076616c7565602061732070617274206f66206120606d6573736167652d63616c6c60206f722060637265617465602e301873797374656d184d6f64756c651043616c6c00011853797374656d28304163636f756e744e6f6e6365010130543a3a4163636f756e74496420543a3a496e646578003845787472696e736963436f756e7400000c7533320024426c6f636b48617368020138543a3a426c6f636b4e756d6265721c543a3a48617368003445787472696e7369634461746102010c7533321c5665633c75383e002852616e646f6d5365656402001c543a3a4861736800184e756d626572020038543a3a426c6f636b4e756d626572040901205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e28506172656e744861736802001c543a3a48617368003845787472696e73696373526f6f7402001c543a3a486173680018446967657374010024543a3a44696765737400184576656e74730100685665633c4576656e745265636f72643c543a3a4576656e743e3e0024636f6e73656e737573184d6f64756c651043616c6c140000487265706f72745f6d69736265686176696f7208186f726967696e24543a3a4f726967696e187265706f7274a84d69736265686176696f725265706f72743c543a3a486173682c20543a3a426c6f636b4e756d6265723e000100306e6f74655f6f66666c696e6508186f726967696e24543a3a4f726967696e4c6f66666c696e655f76616c5f696e6469636573205665633c7533323e0002001872656d61726b08186f726967696e24543a3a4f726967696e1872656d61726b1c5665633c75383e000300207365745f636f6465040c6e65771c5665633c75383e0004002c7365745f73746f7261676504146974656d73345665633c4b657956616c75653e000124436f6e73656e737573044c4f726967696e616c417574686f7269746965730000485665633c543a3a53657373696f6e4b65793e002062616c616e636573184d6f64756c651043616c6c080000207472616e736665720c186f726967696e24543a3a4f726967696e1064657374a4526177416464726573733c543a3a4163636f756e7449642c20543a3a4163636f756e74496e6465783e1476616c756528543a3a42616c616e63650001002c7365745f62616c616e63650c0c77686fa4526177416464726573733c543a3a4163636f756e7449642c20543a3a4163636f756e74496e6465783e106672656528543a3a42616c616e636520726573657276656428543a3a42616c616e636500012042616c616e6365732c34546f74616c49737375616e6365020028543a3a42616c616e636504a42054686520746f74616c20616d6f756e74206f66207374616b65206f6e207468652073797374656d2e484578697374656e7469616c4465706f736974020028543a3a42616c616e636504d020546865206d696e696d756d20616d6f756e7420616c6c6f77656420746f206b65657020616e206163636f756e74206f70656e2e345265636c61696d526562617465020028543a3a42616c616e63650429012054686520616d6f756e7420637265646974656420746f20612064657374696e6174696f6e2773206163636f756e742077686f736520696e64657820776173207265636c61696d65642e2c5472616e73666572466565020028543a3a42616c616e63650494205468652066656520726571756972656420746f206d616b652061207472616e736665722e2c4372656174696f6e466565020028543a3a42616c616e6365042501205468652066656520726571756972656420746f2063726561746520616e206163636f756e742e204174206c6561737420617320626967206173205265636c61696d5265626174652e2c4e657874456e756d53657402003c543a3a4163636f756e74496e646578047c20546865206e657874206672656520656e756d65726174696f6e207365742e1c456e756d53657401013c543a3a4163636f756e74496e646578445665633c543a3a4163636f756e7449643e04582054686520656e756d65726174696f6e20736574732e2c4672656542616c616e6365010130543a3a4163636f756e74496428543a3a42616c616e63652c9c20546865202766726565272062616c616e6365206f66206120676976656e206163636f756e742e004d01205468697320697320746865206f6e6c792062616c616e63652074686174206d61747465727320696e207465726d73206f66206d6f7374206f7065726174696f6e73206f6e20746f6b656e732e204974206973690120616c6f6e65207573656420746f2064657465726d696e65207468652062616c616e6365207768656e20696e2074686520636f6e747261637420657865637574696f6e20656e7669726f6e6d656e742e205768656e207468697355012062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e20746865202763757272656e74206163636f756e74272069733d012064656c657465643a207370656369666963616c6c7920604672656542616c616e6365602e20467572746865726d6f72652c20604f6e4672656542616c616e63655a65726f602063616c6c6261636b410120697320696e766f6b65642c20676976696e672061206368616e636520746f2065787465726e616c206d6f64756c657320746f20636c65616e75702064617461206173736f636961746564207769746854207468652064656c65746564206163636f756e742e005d01206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c657465642069662060526573657276656442616c616e63656020697320616c736f207a65726f2028697420616c736f2067657473150120636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e3c526573657276656442616c616e6365010130543a3a4163636f756e74496428543a3a42616c616e63653071012054686520616d6f756e74206f66207468652062616c616e6365206f66206120676976656e206163636f756e742074686174206973206578746572616c6c792072657365727665643b20746869732063616e207374696c6c206765749c20736c61736865642c20627574206765747320736c6173686564206c617374206f6620616c6c2e006d0120546869732062616c616e63652069732061202772657365727665272062616c616e63652074686174206f746865722073756273797374656d732075736520696e206f7264657220746f2073657420617369646520746f6b656e737101207468617420617265207374696c6c20276f776e65642720627920746865206163636f756e7420686f6c6465722c206275742077686963682061726520756e7370656e6461626c652e20285468697320697320646966666572656e74290120616e642077686f6c6c7920756e72656c6174656420746f207468652060426f6e64616765602073797374656d207573656420696e20746865207374616b696e67206d6f64756c652e29007501205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e2074686973202772657365727665206163636f756e7427b42069732064656c657465643a207370656369666963616c6c792c2060526573657276656442616c616e6365602e004d01206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c6574656420696620604672656542616c616e63656020697320616c736f207a65726f2028697420616c736f2067657473150120636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e485472616e73616374696f6e42617365466565020028543a3a42616c616e636504dc205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b2074686520626173652e485472616e73616374696f6e42797465466565020028543a3a42616c616e6365040d01205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e2474696d657374616d70184d6f64756c651043616c6c0400000c73657408186f726967696e24543a3a4f726967696e0c6e6f7724543a3a4d6f6d656e7400012454696d657374616d700c0c4e6f77020024543a3a4d6f6d656e7404902043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e2c426c6f636b506572696f64020024543a3a4d6f6d656e7404c420546865206d696e696d756d2028616e6420616476697365642920706572696f64206265747765656e20626c6f636b732e24446964557064617465010010626f6f6c04b420446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f1c73657373696f6e184d6f64756c651043616c6c0c00001c7365745f6b657908186f726967696e24543a3a4f726967696e0c6b657934543a3a53657373696f6e4b6579000100287365745f6c656e677468040c6e657738543a3a426c6f636b4e756d62657200020044666f7263655f6e65775f73657373696f6e04346170706c795f7265776172647310626f6f6c00011c53657373696f6e202856616c696461746f72730200445665633c543a3a4163636f756e7449643e047c205468652063757272656e7420736574206f662076616c696461746f72732e3453657373696f6e4c656e677468020038543a3a426c6f636b4e756d626572047c2043757272656e74206c656e677468206f66207468652073657373696f6e2e3043757272656e74496e646578020038543a3a426c6f636b4e756d62657204782043757272656e7420696e646578206f66207468652073657373696f6e2e3043757272656e745374617274020024543a3a4d6f6d656e7404a02054696d657374616d70207768656e2063757272656e742073657373696f6e20737461727465642e44466f7263696e674e657753657373696f6e000010626f6f6c087901204e65772073657373696f6e206973206265696e6720666f72636564206973207468697320656e747279206578697374733b20696e20776869636820636173652c2074686520626f6f6c65616e2076616c75652069732077686574686572810120746865206e65772073657373696f6e2073686f756c6420626520636f6e736964657265642061206e6f726d616c20726f746174696f6e202872657761726461626c6529206f7220657863657074696f6e616c2028736c61736861626c65292e404c6173744c656e6774684368616e6765000038543a3a426c6f636b4e756d62657204c020426c6f636b206174207768696368207468652073657373696f6e206c656e677468206c617374206368616e6765642e284e6578744b6579466f72000130543a3a4163636f756e74496434543a3a53657373696f6e4b6579049020546865206e657874206b657920666f72206120676976656e2076616c696461746f722e444e65787453657373696f6e4c656e677468000038543a3a426c6f636b4e756d626572046420546865206e6578742073657373696f6e206c656e6774682e1c7374616b696e67184d6f64756c651043616c6c280000147374616b6504186f726967696e24543a3a4f726967696e0001001c756e7374616b6508186f726967696e24543a3a4f726967696e40696e74656e74696f6e735f696e6465780c753332000200206e6f6d696e61746508186f726967696e24543a3a4f726967696e1874617267657498416464726573733c543a3a4163636f756e7449642c20543a3a4163636f756e74496e6465783e00030028756e6e6f6d696e61746508186f726967696e24543a3a4f726967696e307461726765745f696e6465780c7533320004005072656769737465725f707265666572656e6365730c186f726967696e24543a3a4f726967696e40696e74656e74696f6e735f696e6465780c7533321470726566736856616c696461746f7250726566733c543a3a42616c616e63653e000500507365745f73657373696f6e735f7065725f657261040c6e657738543a3a426c6f636b4e756d626572000600507365745f626f6e64696e675f6475726174696f6e040c6e657738543a3a426c6f636b4e756d6265720007004c7365745f76616c696461746f725f636f756e74040c6e65770c75333200080034666f7263655f6e65775f65726104346170706c795f7265776172647310626f6f6c0009005c7365745f6f66666c696e655f736c6173685f6772616365040c6e65770c75333200011c5374616b696e67543856616c696461746f72436f756e7402000c75333204a82054686520696465616c206e756d626572206f66207374616b696e67207061727469636970616e74732e544d696e696d756d56616c696461746f72436f756e7400000c753332044101204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e3853657373696f6e73506572457261020038543a3a426c6f636b4e756d62657204a420546865206c656e677468206f662061207374616b696e672065726120696e2073657373696f6e732e3453657373696f6e52657761726402001c50657262696c6c042101204d6178696d756d207265776172642c207065722076616c696461746f722c20746861742069732070726f7669646564207065722061636365707461626c652073657373696f6e2e304f66666c696e65536c61736802001c50657262696c6c04510120536c6173682c207065722076616c696461746f7220746861742069732074616b656e20666f72207468652066697273742074696d6520746865792061726520666f756e6420746f206265206f66666c696e652e444f66666c696e65536c617368477261636501000c753332043901204e756d626572206f6620696e7374616e636573206f66206f66666c696e65207265706f727473206265666f726520736c617368696e6720626567696e7320666f722076616c696461746f72732e3c426f6e64696e674475726174696f6e020038543a3a426c6f636b4e756d62657204b820546865206c656e677468206f662074686520626f6e64696e67206475726174696f6e20696e20626c6f636b732e2843757272656e74457261020038543a3a426c6f636b4e756d626572045c205468652063757272656e742065726120696e6465782e5056616c696461746f72507265666572656e636573010130543a3a4163636f756e7449646856616c696461746f7250726566733c543a3a42616c616e63653e048820507265666572656e636573207468617420612076616c696461746f72206861732e28496e74656e74696f6e730100445665633c543a3a4163636f756e7449643e04a420416c6c20746865206163636f756e7473207769746820612064657369726520746f207374616b652e284e6f6d696e6174696e67000130543a3a4163636f756e74496430543a3a4163636f756e74496404a020416c6c206e6f6d696e61746f72202d3e206e6f6d696e65652072656c6174696f6e73686970732e344e6f6d696e61746f7273466f72010130543a3a4163636f756e744964445665633c543a3a4163636f756e7449643e0494204e6f6d696e61746f727320666f72206120706172746963756c6172206163636f756e742e5043757272656e744e6f6d696e61746f7273466f72010130543a3a4163636f756e744964445665633c543a3a4163636f756e7449643e040501204e6f6d696e61746f727320666f72206120706172746963756c6172206163636f756e74207468617420697320696e20616374696f6e207269676874206e6f772e5043757272656e7453657373696f6e526577617264010028543a3a42616c616e6365042101204d6178696d756d207265776172642c207065722076616c696461746f722c20746861742069732070726f7669646564207065722061636365707461626c652073657373696f6e2e4c43757272656e744f66666c696e65536c617368010028543a3a42616c616e636504510120536c6173682c207065722076616c696461746f7220746861742069732074616b656e20666f72207468652066697273742074696d6520746865792061726520666f756e6420746f206265206f66666c696e652e484e65787453657373696f6e73506572457261000038543a3a426c6f636b4e756d626572049020546865206e6578742076616c7565206f662073657373696f6e7320706572206572612e4c4c6173744572614c656e6774684368616e6765010038543a3a426c6f636b4e756d62657204e0205468652073657373696f6e20696e6465782061742077686963682074686520657261206c656e677468206c617374206368616e6765642e285374616b6552616e6765010048506169724f663c543a3a42616c616e63653e04f020546865206869676865737420616e64206c6f77657374207374616b65642076616c696461746f7220736c61736861626c652062616c616e6365732e1c426f6e64616765010130543a3a4163636f756e74496438543a3a426c6f636b4e756d62657204f42054686520626c6f636b20617420776869636820746865206077686f6027732066756e6473206265636f6d6520656e746972656c79206c69717569642e28536c617368436f756e74010130543a3a4163636f756e7449640c75333204d10120546865206e756d626572206f662074696d6573206120676976656e2076616c696461746f7220686173206265656e207265706f72746564206f66666c696e652e205468697320676574732064656372656d656e746564206279206f6e652065616368206572612074686174207061737365732e34466f7263696e674e6577457261000008282904682057652061726520666f7263696e672061206e6577206572612e2464656d6f6372616379184d6f64756c651043616c6c1400001c70726f706f73650c186f726967696e24543a3a4f726967696e2070726f706f73616c40426f783c543a3a50726f706f73616c3e1476616c756528543a3a42616c616e6365000100187365636f6e6408186f726967696e24543a3a4f726967696e2070726f706f73616c2450726f70496e64657800020010766f74650c186f726967696e24543a3a4f726967696e247265665f696e6465783c5265666572656e64756d496e64657840617070726f76655f70726f706f73616c10626f6f6c0003004073746172745f7265666572656e64756d082070726f706f73616c40426f783c543a3a50726f706f73616c3e38766f74655f7468726573686f6c6434566f74655468726573686f6c640004004463616e63656c5f7265666572656e64756d04247265665f696e6465783c5265666572656e64756d496e64657800012444656d6f63726163792c3c5075626c696350726f70436f756e7401002450726f70496e64657804f420546865206e756d626572206f6620287075626c6963292070726f706f73616c7320746861742068617665206265656e206d61646520736f206661722e2c5075626c696350726f70730100ac5665633c2850726f70496e6465782c20543a3a50726f706f73616c2c20543a3a4163636f756e744964293e048020546865207075626c69632070726f706f73616c732e20556e736f727465642e244465706f7369744f6600012450726f70496e6465787c28543a3a42616c616e63652c205665633c543a3a4163636f756e7449643e2904842054686f73652077686f2068617665206c6f636b65642061206465706f7369742e304c61756e6368506572696f64020038543a3a426c6f636b4e756d62657204e420486f77206f6674656e2028696e20626c6f636b7329206e6577207075626c6963207265666572656e646120617265206c61756e636865642e384d696e696d756d4465706f736974020028543a3a42616c616e636504350120546865206d696e696d756d20616d6f756e7420746f20626520757365642061732061206465706f73697420666f722061207075626c6963207265666572656e64756d2070726f706f73616c2e30566f74696e67506572696f64020038543a3a426c6f636b4e756d62657204b820486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e3c5265666572656e64756d436f756e7402003c5265666572656e64756d496e64657804390120546865206e6578742066726565207265666572656e64756d20696e6465782c20616b6120746865206e756d626572206f66207265666572656e64756d73207374617274656420736f206661722e244e65787454616c6c7902003c5265666572656e64756d496e64657804c820546865206e657874207265666572656e64756d20696e64657820746861742073686f756c642062652074616c6c6965642e405265666572656e64756d496e666f4f6600013c5265666572656e64756d496e646578b028543a3a426c6f636b4e756d6265722c20543a3a50726f706f73616c2c20566f74655468726573686f6c642904b420496e666f726d6174696f6e20636f6e6365726e696e6720616e7920676976656e207265666572656e64756d2e24566f74657273466f7201013c5265666572656e64756d496e646578445665633c543a3a4163636f756e7449643e04a4204765742074686520766f7465727320666f72207468652063757272656e742070726f706f73616c2e18566f74654f6600017c285265666572656e64756d496e6465782c20543a3a4163636f756e7449642910626f6f6c0484204765742074686520766f74652c20696620536f6d652c206f66206077686f602e1c636f756e63696c184d6f64756c651043616c6c240000347365745f617070726f76616c730c186f726967696e24543a3a4f726967696e14766f746573245665633c626f6f6c3e14696e64657824566f7465496e6465780001004c726561705f696e6163746976655f766f74657214186f726967696e24543a3a4f726967696e387265706f727465725f696e6465780c7533320c77686f98416464726573733c543a3a4163636f756e7449642c20543a3a4163636f756e74496e6465783e2477686f5f696e6465780c75333248617373756d65645f766f74655f696e64657824566f7465496e64657800020034726574726163745f766f74657208186f726967696e24543a3a4f726967696e14696e6465780c753332000300407375626d69745f63616e64696461637908186f726967696e24543a3a4f726967696e10736c6f740c7533320004003870726573656e745f77696e6e657210186f726967696e24543a3a4f726967696e2463616e64696461746598416464726573733c543a3a4163636f756e7449642c20543a3a4163636f756e74496e6465783e14746f74616c28543a3a42616c616e636514696e64657824566f7465496e646578000500447365745f646573697265645f73656174730414636f756e740c7533320006003472656d6f76655f6d656d626572040c77686f98416464726573733c543a3a4163636f756e7449642c20543a3a4163636f756e74496e6465783e000700647365745f70726573656e746174696f6e5f6475726174696f6e0414636f756e7438543a3a426c6f636b4e756d626572000800447365745f7465726d5f6475726174696f6e0414636f756e7438543a3a426c6f636b4e756d62657200011c436f756e63696c503443616e646964616379426f6e64020028543a3a42616c616e636504050120486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f207375626d6974206f6e6527732063616e6469646163792e28566f74696e67426f6e64020028543a3a42616c616e636504090120486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f2062652061626c6520746f207375626d697420766f7465732e5050726573656e74536c617368506572566f746572020028543a3a42616c616e6365040d01205468652070756e6973686d656e742c2070657220766f7465722c20696620796f752070726f7669646520616e20696e76616c69642070726573656e746174696f6e2e284361727279436f756e7402000c75333204350120486f77206d616e792072756e6e6572732d75702073686f756c64206861766520746865697220617070726f76616c73207065727369737420756e74696c20746865206e65787420766f74652e5050726573656e746174696f6e4475726174696f6e020038543a3a426c6f636b4e756d626572043d0120486f77206c6f6e6720746f2067697665206561636820746f702063616e64696461746520746f2070726573656e74207468656d73656c7665732061667465722074686520766f746520656e64732e4c496e6163746976654772616365506572696f64020024566f7465496e64657808690120486f77206d616e7920766f746573206e65656420746f20676f206279206166746572206120766f7465722773206c61737420766f7465206265666f726520746865792063616e206265207265617065642069662074686569725020617070726f76616c7320617265206d6f6f742e30566f74696e67506572696f64020038543a3a426c6f636b4e756d62657204b820486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e305465726d4475726174696f6e020038543a3a426c6f636b4e756d626572049820486f77206c6f6e67206561636820706f736974696f6e2069732061637469766520666f722e3044657369726564536561747302000c75333204e8204e756d626572206f66206163636f756e747320746861742073686f756c642062652073697474696e67206f6e2074686520636f756e63696c2e34416374697665436f756e63696c01008c5665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d626572293e086d01205468652063757272656e7420636f756e63696c2e205768656e2074686572652773206120766f746520676f696e67206f6e2c20746869732073686f756c64207374696c6c206265207573656420666f722065786563757469766524206d6174746572732e24566f7465436f756e74010024566f7465496e6465780405012054686520746f74616c206e756d626572206f6620766f746573207468617420686176652068617070656e6564206f722061726520696e2070726f67726573732e2c417070726f76616c734f66010130543a3a4163636f756e744964245665633c626f6f6c3e04010120546865206c61737420636c656172656420766f746520696e6465782074686174207468697320766f74657220776173206c617374206163746976652061742e385265676973746572496e666f4f66000130543a3a4163636f756e7449644028566f7465496e6465782c2075333229087d012054686520766f746520696e64657820616e64206c69737420736c6f742074686174207468652063616e646964617465206077686f60207761732072656769737465726564206f7220604e6f6e6560206966207468657920617265206e6f74582063757272656e746c7920726567697374657265642e304c6173744163746976654f66000130543a3a4163636f756e74496424566f7465496e64657804010120546865206c61737420636c656172656420766f746520696e6465782074686174207468697320766f74657220776173206c617374206163746976652061742e18566f746572730100445665633c543a3a4163636f756e7449643e0460205468652070726573656e7420766f746572206c6973742e2843616e646964617465730100445665633c543a3a4163636f756e7449643e0470205468652070726573656e742063616e646964617465206c6973742e3843616e646964617465436f756e7401000c75333200304e65787446696e616c6973650000a028543a3a426c6f636b4e756d6265722c207533322c205665633c543a3a4163636f756e7449643e2904210120546865206163636f756e747320686f6c64696e672074686520736561747320746861742077696c6c206265636f6d652066726565206f6e20746865206e6578742074616c6c792e40536e617073686f7465645374616b657302003c5665633c543a3a42616c616e63653e04e820546865207374616b6573206173207468657920776572652061742074686520706f696e7420746861742074686520766f746520656e6465642e2c4c6561646572626f61726400007c5665633c28543a3a42616c616e63652c20543a3a4163636f756e744964293e04e02047657420746865206c6561646572626f6172642069662077653b726520696e207468652070726573656e746174696f6e2070686173652e38636f756e63696c5f766f74696e67184d6f64756c651043616c6c1400001c70726f706f736508186f726967696e24543a3a4f726967696e2070726f706f73616c40426f783c543a3a50726f706f73616c3e00010010766f74650c186f726967696e24543a3a4f726967696e2070726f706f73616c1c543a3a486173681c617070726f766510626f6f6c000200107665746f08186f726967696e24543a3a4f726967696e3470726f706f73616c5f686173681c543a3a48617368000300487365745f636f6f6c6f66665f706572696f640418626c6f636b7338543a3a426c6f636b4e756d626572000400447365745f766f74696e675f706572696f640418626c6f636b7338543a3a426c6f636b4e756d626572000134436f756e63696c566f74696e671c34436f6f6c6f6666506572696f64020038543a3a426c6f636b4e756d6265720030566f74696e67506572696f64020038543a3a426c6f636b4e756d626572002450726f706f73616c730200785665633c28543a3a426c6f636b4e756d6265722c20543a3a48617368293e002850726f706f73616c4f6600011c543a3a486173682c543a3a50726f706f73616c003850726f706f73616c566f7465727301011c543a3a48617368445665633c543a3a4163636f756e7449643e0034436f756e63696c566f74654f6600015c28543a3a486173682c20543a3a4163636f756e7449642910626f6f6c00385665746f656450726f706f73616c00011c543a3a486173688c28543a3a426c6f636b4e756d6265722c205665633c543a3a4163636f756e7449643e29003c636f756e63696c5f6d6f74696f6e73184d6f64756c651043616c6c0800001c70726f706f73650c186f726967696e703c542061732073797374656d3a3a54726169743e3a3a4f726967696e247468726573686f6c640c7533322070726f706f73616c6c426f783c3c542061732054726169743e3a3a50726f706f73616c3e00010010766f746510186f726967696e703c542061732073797374656d3a3a54726169743e3a3a4f726967696e2070726f706f73616c1c543a3a4861736814696e6465783450726f706f73616c496e6465781c617070726f766510626f6f6c000138436f756e63696c4d6f74696f6e73102450726f706f73616c730100305665633c543a3a486173683e0498205468652028686173686573206f662920746865206163746976652070726f706f73616c732e2850726f706f73616c4f6600011c543a3a48617368583c542061732054726169743e3a3a50726f706f73616c04cc2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e18566f74696e6700011c543a3a48617368e82850726f706f73616c496e6465782c207533322c205665633c543a3a4163636f756e7449643e2c205665633c543a3a4163636f756e7449643e2904250120566f74657320666f72206120676976656e2070726f706f73616c3a202872657175697265645f7965735f766f7465732c207965735f766f746572732c206e6f5f766f74657273292e3450726f706f73616c436f756e7401000c75333204482050726f706f73616c7320736f206661722e207472656173757279184d6f64756c651043616c6c1400003470726f706f73655f7370656e640c186f726967696e24543a3a4f726967696e1476616c756528543a3a42616c616e63652c62656e656669636961727930543a3a4163636f756e7449640001001c7365745f706f74041c6e65775f706f7428543a3a42616c616e636500020024636f6e666967757265103470726f706f73616c5f626f6e641c5065726d696c6c5470726f706f73616c5f626f6e645f6d696e696d756d28543a3a42616c616e6365307370656e645f706572696f6438543a3a426c6f636b4e756d626572106275726e1c5065726d696c6c0003003c72656a6563745f70726f706f73616c08186f726967696e24543a3a4f726967696e28726f706f73616c5f69643450726f706f73616c496e64657800040040617070726f76655f70726f706f73616c08186f726967696e24543a3a4f726967696e2c70726f706f73616c5f69643450726f706f73616c496e6465780001205472656173757279203050726f706f73616c426f6e6402001c5065726d696c6c0851012050726f706f7274696f6e206f662066756e647320746861742073686f756c6420626520626f6e64656420696e206f7264657220746f20706c61636520612070726f706f73616c2e20416e206163636570746564dc2070726f706f73616c2067657473207468657365206261636b2e20412072656a65637465642070726f706f73616c20646f65736e27742e4c50726f706f73616c426f6e644d696e696d756d020028543a3a42616c616e6365044901204d696e696d756d20616d6f756e74206f662066756e647320746861742073686f756c6420626520706c6163656420696e2061206465706f73697420666f72206d616b696e6720612070726f706f73616c2e2c5370656e64506572696f64020038543a3a426c6f636b4e756d626572048820506572696f64206265747765656e2073756363657373697665207370656e64732e104275726e02001c5065726d696c6c0411012050657263656e74616765206f662073706172652066756e64732028696620616e7929207468617420617265206275726e7420706572207370656e6420706572696f642e0c506f74010028543a3a42616c616e636504cc20546f74616c2066756e647320617661696c61626c6520746f2074686973206d6f64756c6520666f72207370656e64696e672e3450726f706f73616c436f756e7401003450726f706f73616c496e64657804a4204e756d626572206f662070726f706f73616c7320746861742068617665206265656e206d6164652e2450726f706f73616c7300013450726f706f73616c496e6465788850726f706f73616c3c543a3a4163636f756e7449642c20543a3a42616c616e63653e047c2050726f706f73616c7320746861742068617665206265656e206d6164652e24417070726f76616c730100485665633c50726f706f73616c496e6465783e04f82050726f706f73616c20696e646963657320746861742068617665206265656e20617070726f76656420627574206e6f742079657420617761726465642e20636f6e7472616374184d6f64756c651043616c6c0800001063616c6c14186f726967696e24543a3a4f726967696e106465737430543a3a4163636f756e7449641476616c756528543a3a42616c616e6365246761735f6c696d697418543a3a47617310646174611c5665633c75383e0001001863726561746514186f726967696e24543a3a4f726967696e1476616c756528543a3a42616c616e6365246761735f6c696d697418543a3a47617324696e69745f636f64651c5665633c75383e10646174611c5665633c75383e0000'; export default meta; diff --git a/packages/api-codec/src/Metadata.ts b/packages/api-codec/src/Metadata.ts index 50f82ff587..708c0f9775 100644 --- a/packages/api-codec/src/Metadata.ts +++ b/packages/api-codec/src/Metadata.ts @@ -4,6 +4,8 @@ import { AnyNumber } from './types'; +import toU8a from '@polkadot/util/u8a/toU8a'; + import Vector from './codec/Vector'; import Base from './codec/Base'; import Enum from './codec/Enum'; @@ -285,9 +287,9 @@ export default class RuntimeMetadata extends Struct { // We receive this as an Array in the JSON output from the Node. Convert // to u8a and use the fromU8a to do the actual parsing - fromJSON (input: Array): RuntimeMetadata { + fromJSON (input: Uint8Array | string | Array): RuntimeMetadata { return this.fromU8a( - Uint8Array.from(input) + toU8a(input) ) as RuntimeMetadata; } diff --git a/packages/api-codec/src/Moment.ts b/packages/api-codec/src/Moment.ts index c0b1c03fd0..88559513b0 100644 --- a/packages/api-codec/src/Moment.ts +++ b/packages/api-codec/src/Moment.ts @@ -17,7 +17,7 @@ const BITLENGTH = 64; // per-second. For any encoding/decoding the 1000 multiplier would be applied to // get it in line with JavaScript formats export default class Moment extends Base { - constructor (value: Uint8Array | Moment | Date | number = 0) { + constructor (value: Uint8Array | Moment | Date | BN | number = 0) { super( value instanceof Date ? new Date(Math.ceil(value.getTime() / 1000) * 1000) @@ -55,6 +55,10 @@ export default class Moment extends Base { return this; } + getTime (): number { + return this.raw.getTime(); + } + toJSON (): any { return this.toNumber(); } @@ -67,6 +71,10 @@ export default class Moment extends Base { return this.raw.toISOString(); } + toBn (): BN { + return new BN(this.toNumber()); + } + toNumber (): number { return Math.ceil(this.raw.getTime() / 1000); } diff --git a/packages/api-codec/src/Proposal.ts b/packages/api-codec/src/Proposal.ts new file mode 100644 index 0000000000..6507255706 --- /dev/null +++ b/packages/api-codec/src/Proposal.ts @@ -0,0 +1,10 @@ +// Copyright 2017-2018 @polkadot/api-codec authors & contributors +// This software may be modified and distributed under the terms +// of the ISC license. See the LICENSE file for details. + +import Extrinsic from './Extrinsic'; + +// The Nonce or number of transactiosn sent by a specific account. Generally used +// with extrinsics to determine the order of execution. +export default class Proposal extends Extrinsic { +} diff --git a/packages/api-codec/src/codec/Compact.ts b/packages/api-codec/src/codec/Compact.ts new file mode 100644 index 0000000000..1a57709e17 --- /dev/null +++ b/packages/api-codec/src/codec/Compact.ts @@ -0,0 +1,64 @@ +// Copyright 2017-2018 @polkadot/api-codec authors & contributors +// This software may be modified and distributed under the terms +// of the ISC license. See the LICENSE file for details. + +import BN from 'bn.js'; +import bnToU8a from '@polkadot/util/bn/toU8a'; +import u8aConcat from '@polkadot/util/u8a/concat'; +import u8aToBn from '@polkadot/util/u8a/toBn'; + +const MAX_U8 = new BN(2).pow(new BN(8 - 2)).subn(1); +const MAX_U16 = new BN(2).pow(new BN(16 - 2)).subn(1); +const MAX_U32 = new BN(2).pow(new BN(32 - 2)).subn(1); + +type BitLength = 32; + +// A new compact length-encoding algorithm. It performs the same function as Length, however +// differs in that it uses a variable number of bytes to do the actual encoding. From the Rust +// implementation for compact encoding +// +// 0b00 00 00 00 / 00 00 00 00 / 00 00 00 00 / 00 00 00 00 +// (0 ... 2**6 - 1) (u8) +// xx xx xx 00 +// (2**6 ... 2**14 - 1) (u8, u16) low LH high +// yL yL yL 01 / yH yH yH yL +// (2**14 ... 2**30 - 1) (u16, u32) low LMMH high +// zL zL zL 10 / zM zM zM zL / zM zM zM zM / zH zH zH zM +// (2**30 ... 2**536 - 1) (u32, u64, u128, U256, U512, U520) straight LE-encoded +// nn nn nn 11 [ / zz zz zz zz ]{4 + n} +// +// Note: we use *LOW BITS* of the LSB in LE encoding to encode the 2 bit key. +export default class Compact { + static decode (input: Uint8Array, bitLength: BitLength): BN { + const flag = input[0] & 0b11; + + if (flag === 0b00) { + return new BN(input[0]).shrn(2); + } else if (flag === 0b01) { + return u8aToBn(input.slice(0, 2), true).shrn(2); + } else if (flag === 0b10) { + return u8aToBn(input.slice(0, 4), true).shrn(2); + } + + const byteLength = bitLength / 8; + + return u8aToBn(input.subarray(1, 1 + byteLength), true); + } + + static encode (length: BN, bitLength: BitLength): Uint8Array { + if (length.lte(MAX_U8)) { + return new Uint8Array([length.toNumber() << 2]); + } else if (length.lte(MAX_U16)) { + return bnToU8a(length.shln(2).addn(0b01), 16, true); + } else if (length.lte(MAX_U32)) { + return bnToU8a(length.shln(2).addn(0b10), 32, true); + } + + return u8aConcat( + new Uint8Array([ + 0b11 + ]), + bnToU8a(length, bitLength, true) + ); + } +} diff --git a/packages/api-codec/src/codec/Length.ts b/packages/api-codec/src/codec/Length.ts index 6cbd96ddc4..1fa3aea476 100644 --- a/packages/api-codec/src/codec/Length.ts +++ b/packages/api-codec/src/codec/Length.ts @@ -6,33 +6,16 @@ import { AnyNumber } from '../types'; import BN from 'bn.js'; import bnToBn from '@polkadot/util/bn/toBn'; -import bnToU8a from '@polkadot/util/bn/toU8a'; -import u8aConcat from '@polkadot/util/u8a/concat'; -import u8aToBn from '@polkadot/util/u8a/toBn'; import u8aToHex from '@polkadot/util/u8a/toHex'; import Base from './Base'; +import Compact from './Compact'; import UInt from './UInt'; -const MAX_U8 = new BN(2).pow(new BN(8 - 2)).subn(1); -const MAX_U16 = new BN(2).pow(new BN(16 - 2)).subn(1); -const MAX_U32 = new BN(2).pow(new BN(32 - 2)).subn(1); +type BitLength = 32; -// A new compact length-encoding algorithm. It performs the same function as Length, however -// differs in that it uses a variable number of bytes to do the actual encoding. From the Rust -// implementation for compact encoding -// -// 0b00 00 00 00 / 00 00 00 00 / 00 00 00 00 / 00 00 00 00 -// (0 ... 2**6 - 1) (u8) -// xx xx xx 00 -// (2**6 ... 2**14 - 1) (u8, u16) low LH high -// yL yL yL 01 / yH yH yH yL -// (2**14 ... 2**30 - 1) (u16, u32) low LMMH high -// zL zL zL 10 / zM zM zM zL / zM zM zM zM / zH zH zH zM -// (2**30 ... 2**536 - 1) (u32, u64, u128, U256, U512, U520) straight LE-encoded -// nn nn nn 11 [ / zz zz zz zz ]{4 + n} -// -// Note: we use *LOW BITS* of the LSB in LE encoding to encode the 2 bit key. +// A Length-prefix that can be added to any variable length stream of bytes, e.g. String, +// Vectors and Bytes // // FIXME Not crazy about the use of Length. If we look at Vector, Bytes & String, // the implementations are basically the same. Vector is slightly different since @@ -40,41 +23,14 @@ const MAX_U32 = new BN(2).pow(new BN(32 - 2)).subn(1); // code and a more generic implementation around the use of Length. Looking at // Array or Struct, the same type of wrapper would be useful here. export default class Length extends Base { - constructor (value: AnyNumber = new BN(0)) { + private _bitLength: BitLength; + + constructor (value: AnyNumber = new BN(0), bitLength: BitLength = 32) { super( UInt.decode(value) ); - } - static decode (input: Uint8Array): BN { - const flag = input[0] & 0b11; - - if (flag === 0b00) { - return new BN(input[0]).shrn(2); - } else if (flag === 0b01) { - return u8aToBn(input.slice(0, 2), true).shrn(2); - } else if (flag === 0b10) { - return u8aToBn(input.slice(0, 4), true).shrn(2); - } - - return u8aToBn(input.subarray(1, 5), true); - } - - static encode (length: BN): Uint8Array { - if (length.lte(MAX_U8)) { - return new Uint8Array([length.toNumber() << 2]); - } else if (length.lte(MAX_U16)) { - return bnToU8a(length.shln(2).addn(0b01), 16, true); - } else if (length.lte(MAX_U32)) { - return bnToU8a(length.shln(2).addn(0b10), 32, true); - } - - return u8aConcat( - new Uint8Array([ - 0b11 - ]), - bnToU8a(length, 32, true) - ); + this._bitLength = bitLength; } byteLength (): number { @@ -82,7 +38,7 @@ export default class Length extends Base { } fromU8a (input: Uint8Array): Length { - this.raw = Length.decode(input); + this.raw = Compact.decode(input, this._bitLength); return this; } @@ -98,7 +54,7 @@ export default class Length extends Base { toU8a (isBare?: boolean): Uint8Array { return isBare ? new Uint8Array() - : Length.encode(this.raw); + : Compact.encode(this.raw, this._bitLength); } setValue (value: BN | number): void { diff --git a/packages/api-codec/src/codec/Struct.ts b/packages/api-codec/src/codec/Struct.ts index 051739e64b..1cda12b183 100644 --- a/packages/api-codec/src/codec/Struct.ts +++ b/packages/api-codec/src/codec/Struct.ts @@ -2,6 +2,8 @@ // This software may be modified and distributed under the terms // of the ISC license. See the LICENSE file for details. +import hexToU8a from '@polkadot/util/hex/toU8a'; +import isHex from '@polkadot/util/is/hex'; import u8aConcat from '@polkadot/util/u8a/concat'; import Base, { l } from './Base'; @@ -82,6 +84,10 @@ export default class Struct < } fromJSON (input: any): Struct { + if (isHex(input)) { + return this.fromU8a(hexToU8a(input)); + } + Object.keys(this.raw).forEach((key) => { const jsonKey = this._jsonMap.get(key as any) || key; @@ -102,6 +108,10 @@ export default class Struct < return this; } + get (index: number): Base { + return this.values()[index]; + } + toJSON (): any { return Object.keys(this.raw).reduce((json, key) => { const jsonKey = this._jsonMap.get(key as any) || key; diff --git a/packages/api-codec/src/codec/Tuple.ts b/packages/api-codec/src/codec/Tuple.ts index 70efdab0fc..a8f14dc1c2 100644 --- a/packages/api-codec/src/codec/Tuple.ts +++ b/packages/api-codec/src/codec/Tuple.ts @@ -2,6 +2,9 @@ // This software may be modified and distributed under the terms // of the ISC license. See the LICENSE file for details. +import hexToU8a from '@polkadot/util/hex/toU8a'; +import isHex from '@polkadot/util/is/hex'; + import Base from './Base'; import Struct from './Struct'; @@ -29,6 +32,10 @@ export default class Tuple < } fromJSON (input: any): Tuple { + if (isHex(input)) { + return this.fromU8a(hexToU8a(input)); + } + Object.values(this.raw).forEach((entry, index) => { entry.fromJSON(input[index]); }); diff --git a/packages/api-codec/src/codec/UInt.ts b/packages/api-codec/src/codec/UInt.ts index d793989e96..4adc1568d0 100644 --- a/packages/api-codec/src/codec/UInt.ts +++ b/packages/api-codec/src/codec/UInt.ts @@ -89,4 +89,54 @@ export default class UInt extends Base { toNumber (): number { return this.raw.toNumber(); } + + // helpers from BN, this would be great as a "don't do this", i.e. extending properly + // from BN. Underlying these will always return BN (unless it is compare checks) + add (other: UInt | BN | number): BN { + return other instanceof UInt + ? this.raw.add(other.raw) + : this.raw.add(bnToBn(other)); + } + + div (other: UInt | BN | number): BN { + return other instanceof UInt + ? this.raw.div(other.raw) + : this.raw.div(bnToBn(other)); + } + + lt (test: UInt | BN | number): boolean { + return test instanceof UInt + ? this.raw.lt(test.raw) + : this.raw.lt(bnToBn(test)); + } + + lte (test: UInt | BN | number): boolean { + return test instanceof UInt + ? this.raw.lte(test.raw) + : this.raw.lte(bnToBn(test)); + } + + gt (test: UInt | BN | number): boolean { + return test instanceof UInt + ? this.raw.gt(test.raw) + : this.raw.gt(bnToBn(test)); + } + + gte (test: UInt | BN | number): boolean { + return test instanceof UInt + ? this.raw.gte(test.raw) + : this.raw.gte(bnToBn(test)); + } + + mul (other: UInt | BN | number): BN { + return other instanceof UInt + ? this.raw.mul(other.raw) + : this.raw.mul(bnToBn(other)); + } + + sub (other: UInt | BN | number): BN { + return other instanceof UInt + ? this.raw.sub(other.raw) + : this.raw.sub(bnToBn(other)); + } } diff --git a/packages/api-codec/src/index.ts b/packages/api-codec/src/index.ts index aecd53a6c0..39105119cc 100644 --- a/packages/api-codec/src/index.ts +++ b/packages/api-codec/src/index.ts @@ -40,6 +40,7 @@ export { default as PendingExtrinsics } from './PendingExtrinsics'; export { default as Permill } from './Permill'; export { default as Perbill } from './Perbill'; export { default as PropIndex } from './PropIndex'; +export { default as Proposal } from './Proposal'; export { default as ProposalIndex } from './ProposalIndex'; export { default as RawAddress } from './RawAddress'; export { default as ReferendumIndex } from './ReferendumIndex'; diff --git a/packages/api-observable/LICENSE b/packages/api-observable/LICENSE new file mode 100644 index 0000000000..55c595033a --- /dev/null +++ b/packages/api-observable/LICENSE @@ -0,0 +1,15 @@ +ISC License (ISC) + +Copyright 2017-2018 @polkadot/api-observable authors & contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. diff --git a/packages/api-observable/README.md b/packages/api-observable/README.md new file mode 100644 index 0000000000..d658e75c3e --- /dev/null +++ b/packages/api-observable/README.md @@ -0,0 +1,13 @@ +[![polkadotjs](https://img.shields.io/badge/polkadot-js-orange.svg?style=flat-square)](https://polkadot.js.org) +![isc](https://img.shields.io/badge/license-ISC-lightgrey.svg?style=flat-square) +[![style](https://img.shields.io/badge/code%20style-semistandard-lightgrey.svg?style=flat-square)](https://github.com/Flet/semistandard) +[![npm](https://img.shields.io/npm/v/@polkadot/api-observable.svg?style=flat-square)](https://www.npmjs.com/package/@polkadot/api-observable) +[![travis](https://img.shields.io/travis/polkadot-js/api.svg?style=flat-square)](https://travis-ci.org/polkadot-js/api) +[![maintainability](https://img.shields.io/codeclimate/maintainability/polkadot-js/api.svg?style=flat-square)](https://codeclimate.com/github/polkadot-js/api/maintainability) +[![coverage](https://img.shields.io/coveralls/polkadot-js/api.svg?style=flat-square)](https://coveralls.io/github/polkadot-js/api?branch=master) +[![dependency](https://david-dm.org/polkadot-js/api.svg?style=flat-square&path=packages/api-observable)](https://david-dm.org/polkadot-js/api?path=packages/api-observable) +[![devDependency](https://david-dm.org/polkadot-js/api/dev-status.svg?style=flat-square&path=packages/api-observable)](https://david-dm.org/polkadot-js/api?path=packages/api-observable#info=devDependencies) + +# @polkadot/api-observable + +An RxJs wrapper around the [@polkadot/api](../api). diff --git a/packages/api-observable/package.json b/packages/api-observable/package.json new file mode 100644 index 0000000000..51c32c61e7 --- /dev/null +++ b/packages/api-observable/package.json @@ -0,0 +1,38 @@ +{ + "name": "@polkadot/api-observable", + "version": "0.30.3", + "description": "An Observable wrapper around the Polkadot JS API", + "main": "index.js", + "keywords": [ + "Polkadot", + "RxJs" + ], + "author": "Jaco Greeff ", + "maintainers": [ + "Jaco Greeff " + ], + "contributors": [], + "license": "ISC", + "engines": { + "node": ">=8.0" + }, + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/polkadot-js/api.git" + }, + "bugs": { + "url": "https://github.com/polkadot-js/api/issues" + }, + "homepage": "https://github.com/polkadot-js/api/tree/master/packages/api-rx#readme", + "dependencies": { + "@babel/runtime": "^7.0.0", + "@polkadot/api": "^0.30.3", + "@polkadot/api-provider": "^0.30.3", + "@types/rx": "^4.1.1", + "rxjs": "^6.3.2" + } +} diff --git a/packages/api-observable/src/Base.ts b/packages/api-observable/src/Base.ts new file mode 100644 index 0000000000..089c8c3ddd --- /dev/null +++ b/packages/api-observable/src/Base.ts @@ -0,0 +1,74 @@ +// Copyright 2017-2018 @polkadot/ui-observable authors & contributors +// This software may be modified and distributed under the terms +// of the ISC license. See the LICENSE file for details. + +import { RxApiInterface, RxApiInterface$Method, RxApiInterface$Section } from '@polkadot/api-rx/types'; +import { Method } from '@polkadot/jsonrpc/types'; + +import { Observable, combineLatest } from 'rxjs'; +import { defaultIfEmpty, map } from 'rxjs/operators'; +import { StorageFunction } from '@polkadot/api-codec/StorageKey'; +import assert from '@polkadot/util/assert'; +import isUndefined from '@polkadot/util/is/undefined'; + +type MapFn = (combined: R) => T; + +const defaultMapFn = (result: any): any => + result; + +// Raw base implementation for the observable API. It simply provides access to raw calls, allowing +// decendants to make direct queries to either API methods or actual storage +export default class ApiBase { + protected api: RxApiInterface; + + constructor (api: RxApiInterface) { + this.api = api; + } + + protected combine = (observables: Array>, mapfn: MapFn = defaultMapFn): Observable => { + return combineLatest(...observables).pipe( + // FIXME There are a couple of places now where this casting happens after rxjs 6.3.2 + defaultIfEmpty([] as any), + map(mapfn) + ); + } + + isConnected = (): Observable => { + return this.api.isConnected(); + } + + rawCall = ({ name, section }: Method, ...params: Array): Observable => { + const apiSection = this.api[section as keyof RxApiInterface] as RxApiInterface$Section; + + assert(apiSection, `Unable to find 'api.${section}'`); + + const fn: RxApiInterface$Method = apiSection[name]; + + assert(fn, `Unable to find 'api.${section}.${name}'`); + + return fn.apply(null, params); + } + + rawStorage = (key: StorageFunction, ...params: Array): Observable => { + return this + .rawStorageMulti([key, ...params] as [StorageFunction, any]) + .pipe( + // @ts-ignore After upgrade to 6.3.2 + map(([result]: Array): T => + result + ) + ); + } + + rawStorageMulti = (...keys: Array<[StorageFunction] | [StorageFunction, any]>): Observable => { + return this.api.state + .storage(keys) + .pipe( + map((result?: any) => + isUndefined(result) + ? [] + : result + ) + ); + } +} diff --git a/packages/api-observable/src/Calls.ts b/packages/api-observable/src/Calls.ts new file mode 100644 index 0000000000..a48e9dee5c --- /dev/null +++ b/packages/api-observable/src/Calls.ts @@ -0,0 +1,34 @@ +// Copyright 2017-2018 @polkadot/ui-observable authors & contributors +// This software may be modified and distributed under the terms +// of the ISC license. See the LICENSE file for details. + +import { Observable } from 'rxjs'; +import { defaultIfEmpty, map } from 'rxjs/operators'; +import { BlockNumber, Header, SignedBlock } from '@polkadot/api-codec/index'; + +import ApiQueries from './Queries'; + +// Implementation of calls to API endpoints. +export default class ApiCalls extends ApiQueries { + bestNumber = (): Observable => { + return this + .chainNewHead() + .pipe( + map((header?: Header): BlockNumber | undefined => + header && header.blockNumber + ? header.blockNumber + : undefined + ) + ); + } + + chainGetBlock = (hash: Uint8Array): Observable => { + return this.api.chain.getBlock(hash); + } + + chainNewHead = (): Observable
=> { + return this.api.chain.newHead().pipe( + defaultIfEmpty() + ); + } +} diff --git a/packages/api-observable/src/Combined.ts b/packages/api-observable/src/Combined.ts new file mode 100644 index 0000000000..c603c0bd2d --- /dev/null +++ b/packages/api-observable/src/Combined.ts @@ -0,0 +1,329 @@ +// Copyright 2017-2018 @polkadot/ui-observable authors & contributors +// This software may be modified and distributed under the terms +// of the ISC license. See the LICENSE file for details. + +import { RxBalance, RxBalanceMap, RxReferendumVote } from './types'; + +import BN from 'bn.js'; +import { EMPTY, Observable } from 'rxjs'; +import { switchMap, defaultIfEmpty, map } from 'rxjs/operators'; +import { AccountId, Balance, Bool, BlockNumber, Moment, ReferendumIndex } from '@polkadot/api-codec/index'; +import isString from '@polkadot/util/is/string'; + +import ApiCalls from './Calls'; +import { RxProposal, RxReferendum } from './classes'; + +// Combines API calls and queries into single results. This allos for the exposed API to have +// useful extensions, i.e. queries can be made that returns the results from multiple observables, +// make the noise for the API users significantly less +export default class ApiCombined extends ApiCalls { + democracyProposalCount = (): Observable => { + return this + .democracyPublicProposals() + .pipe( + map((proposals: Array) => + proposals.length + ) + ); + } + + democracyReferendumInfos = (referendumIds: Array): Observable> => { + return this.combine( + referendumIds.map((referendumId) => + this.democracyReferendumInfoOf(referendumId) + ), + (referendums: Array = []): Array => + referendums.filter((referendum) => + referendum + ) + ); + } + + democracyReferendumVoters = (referendumId: ReferendumIndex | BN | number): Observable> => { + return this.combine( + [ + this.democacyVotersFor(referendumId), + this.democracyVotersBalancesOf(referendumId), + this.democracyVotersVotesOf(referendumId) + ], + ([voters, balances, votes]: [Array, Array, Array]): Array => + voters.map((address, index): RxReferendumVote => ({ + address, + balance: balances[index] || new Balance(0), + vote: votes[index] || new Bool(false) + })) + ); + } + + democracyReferendums = (): Observable> => { + return this.combine( + [ + this.democracyReferendumCount(), + this.democracyNextTally() + ] + ).pipe( + // @ts-ignore After upgrade to 6.3.2 + switchMap(([referendumCount, nextTally]: [ReferendumIndex | undefined, ReferendumIndex | undefined]): Observable> => + referendumCount && nextTally && referendumCount.gt(nextTally) && referendumCount.gt(0) + ? this.democracyReferendumInfos( + [...Array(referendumCount.toBn().sub(nextTally.toBn()).toNumber())].map((_, i) => + nextTally.add(i).toNumber() + ) + ) + : EMPTY + ), + defaultIfEmpty([]) + ); + } + + democracyVotesOf = (index: ReferendumIndex | BN | number, addresses: Array): Observable => { + return this.combine( + addresses.map((address) => + this.democacyVoteOf(index, address) + ) + ); + } + + democracyVotersBalancesOf = (referendumId: ReferendumIndex | BN | number): Observable> => { + return this + .democacyVotersFor(referendumId) + .pipe( + switchMap((voters: Array = []) => + this.votingBalances(...voters) + ), + defaultIfEmpty([] as any), + map((balances: Array) => + balances.map(({ votingBalance }) => + votingBalance + ) + ) + ); + } + + democracyVotersVotesOf = (referendumId: ReferendumIndex | BN | number): Observable> => { + return this + .democacyVotersFor(referendumId) + .pipe( + switchMap((voters: Array = []) => + this.democracyVotesOf(referendumId, voters) + ), + defaultIfEmpty([] as any) + ); + } + + eraBlockLength = (): Observable => { + return this.combine( + [ + this.sessionLength(), + this.sessionsPerEra() + ], + ([sessionLength, sessionsPerEra]: [BlockNumber | undefined, BlockNumber | undefined]): BlockNumber | undefined => + sessionLength && sessionsPerEra + ? new BlockNumber( + sessionLength.mul(sessionsPerEra) + ) + : undefined + ); + } + + eraBlockProgress = (): Observable => { + return this.combine( + [ + this.sessionBlockProgress(), + this.sessionLength(), + this.sessionCurrentIndex(), + this.sessionsPerEra(), + this.eraLastLengthChange() + ], + ([sessionBlockProgress, sessionLength, sessionCurrentIndex, sessionsPerEra, eraLastLengthChange = new BlockNumber(0)]: [BlockNumber | undefined, BlockNumber | undefined, BlockNumber | undefined, BlockNumber | undefined, BlockNumber | undefined]): BlockNumber | undefined => + sessionsPerEra && sessionCurrentIndex && sessionLength && sessionBlockProgress && eraLastLengthChange + ? new BlockNumber( + sessionCurrentIndex + .sub(eraLastLengthChange) + .mod(sessionsPerEra.toBn()) + .mul(sessionLength.toBn()) + .add(sessionBlockProgress.toBn()) + ) + : undefined + ); + } + + eraBlockRemaining = (): Observable => { + return this.combine( + [ + this.eraBlockLength(), + this.eraBlockProgress() + ], + ([eraBlockLength, eraBlockProgress]: [BlockNumber | undefined, BlockNumber | undefined]): BlockNumber | undefined => + eraBlockLength && eraBlockProgress + ? new BlockNumber( + eraBlockLength.sub(eraBlockProgress) + ) + : undefined + ); + } + + sessionBlockProgress = (): Observable => { + return this.combine( + [ + this.bestNumber(), + this.sessionLength(), + this.sessionLastLengthChange() + ], + ([bestNumber, sessionLength, lastSessionLengthChange]: [BlockNumber | undefined, BlockNumber | undefined, BlockNumber | undefined]): BlockNumber | undefined => + bestNumber && sessionLength && lastSessionLengthChange + ? new BlockNumber( + bestNumber + .sub(lastSessionLengthChange) + .add(sessionLength.toBn()) + .mod(sessionLength.toBn()) + ) + : undefined + ); + } + + sessionBlockRemaining = (): Observable => { + return this.combine( + [ + this.sessionBlockProgress(), + this.sessionLength() + ], + ([sessionBlockProgress, sessionLength]: [BlockNumber | undefined, BlockNumber | undefined]): BlockNumber | undefined => + sessionBlockProgress && sessionLength + ? new BlockNumber( + sessionLength.sub(sessionBlockProgress) + ) + : undefined + ); + } + + sessionBrokenValue = (): Observable => { + return this.combine( + [ + this.timestampNow(), + this.sessionTimeExpected(), + this.sessionTimeRemaining(), + this.sessionCurrentStart() + ], + ([now, sessionTimeExpected, sessionTimeRemaining, sessionCurrentStart]: [Moment | undefined, Moment | undefined, Moment | undefined, Moment | undefined]): Moment | undefined => + sessionTimeExpected && sessionTimeRemaining && sessionCurrentStart && now + ? new Moment( + Math.round( + 100 * (now.getTime() + sessionTimeRemaining.toNumber() - sessionCurrentStart.getTime()) / sessionTimeExpected.toNumber() - 100 + ) + ) + : undefined + ); + } + + sessionTimeExpected = (): Observable => { + return this.combine( + [ + this.sessionLength(), + this.timestampBlockPeriod() + ], + ([sessionLength, blockPeriod]: [BlockNumber | undefined, Moment | undefined]): Moment | undefined => + sessionLength && blockPeriod + ? new Moment( + sessionLength.mul(blockPeriod.toBn()).muln(1000) + ) + : undefined + ); + } + + sessionTimeRemaining = (): Observable => { + return this.combine( + [ + this.sessionBlockRemaining(), + this.timestampBlockPeriod() + ], + ([sessionBlockRemaining, blockPeriod]: [BlockNumber | undefined, Moment | undefined]): Moment | undefined => + blockPeriod && sessionBlockRemaining + ? new Moment( + sessionBlockRemaining.mul(blockPeriod.toBn()).muln(1000) + ) + : undefined + ); + } + + validatingBalance = (address: AccountId | string): Observable => { + return this.combine( + [ + this.votingBalance(address), + this.votingBalancesNominatorsFor(address) + ], + ([balance, nominators = []]: [RxBalance, Array]): RxBalance => { + const nominatedBalance = nominators.reduce((total, nominator: RxBalance) => { + return total.add(nominator.votingBalance.toBn()); + }, new BN(0)); + + const result = { + ...balance, + nominators, + nominatedBalance: new Balance(nominatedBalance), + stakingBalance: new Balance( + nominatedBalance.add(balance.votingBalance.toBn()) + ) + }; + + return result; + } + ); + } + + validatingBalances = (...addresses: Array): Observable => { + return this.combine( + addresses.map((address) => + this.validatingBalance(address) + ), + (result: Array): RxBalanceMap => + result.reduce((balances, balance) => { + balances[balance.address.toString()] = balance; + + return balances; + }, {} as RxBalanceMap) + ); + } + + votingBalance = (_address: AccountId | string): Observable => { + const address = isString(_address) + ? new AccountId(_address) + : _address; + + return this.combine( + [ + this.stakingFreeBalanceOf(address), + this.stakingReservedBalanceOf(address) + ], + ([freeBalance = new Balance(0), reservedBalance = new Balance(0)]: [Balance | undefined, Balance | undefined]): RxBalance => ({ + address, + freeBalance, + nominatedBalance: new Balance(0), + reservedBalance, + stakingBalance: new Balance(0), + votingBalance: new Balance( + freeBalance.add(reservedBalance) + ) + }) + ); + } + + votingBalancesNominatorsFor = (address: AccountId | string) => { + return this + .stakingNominatorsFor(address) + .pipe( + switchMap((nominators: Array) => + this.votingBalances(...nominators) + ), + defaultIfEmpty([] as any) + ); + } + + votingBalances = (...addresses: Array): Observable => { + return this.combine( + addresses.map((address) => + this.votingBalance(address) + ) + ); + } +} diff --git a/packages/api-observable/src/Queries.ts b/packages/api-observable/src/Queries.ts new file mode 100644 index 0000000000..997ebf74bc --- /dev/null +++ b/packages/api-observable/src/Queries.ts @@ -0,0 +1,210 @@ +// Copyright 2017-2018 @polkadot/ui-observable authors & contributors +// This software may be modified and distributed under the terms +// of the ISC license. See the LICENSE file for details. + +import { RxFees } from './types'; + +import BN from 'bn.js'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { AccountId, Balance, Bool, BlockNumber, Index, Moment, Perbill, PropIndex, ReferendumIndex, u32 } from '@polkadot/api-codec/index'; +import { Tuple } from '@polkadot/api-codec/codec'; +import storage from '@polkadot/storage/testing'; + +import ApiBase from './Base'; +import { RxProposal, RxProposalDeposits, RxReferendum } from './classes'; + +// Perform storage queries to the API endpoints. +export default class ApiQueries extends ApiBase { + democracyLaunchPeriod = (): Observable => { + return this.rawStorage(storage.democracy.launchPeriod); + } + + democracyNextTally = (): Observable => { + return this.rawStorage(storage.democracy.nextTally); + } + + democracyProposalDeposits = (proposalId: PropIndex | BN | number): Observable => { + return this + .rawStorage(storage.democracy.depositOf, proposalId) + .pipe( + // @ts-ignore After upgrade to 6.3.2 + map((result: Tuple): RxProposalDeposits | undefined => + result + ? new RxProposalDeposits(result) + : undefined + ) + ); + } + + democracyPublicProposals = (): Observable> => { + return this + .rawStorage(storage.democracy.publicProps) + .pipe( + // @ts-ignore After upgrade to 6.3.2 + map((proposals: Array = []) => + proposals + .map((result: Tuple): RxProposal | undefined => + result + ? new RxProposal(result) + : undefined + ) + .filter((proposal) => + proposal + ) + ) + ); + } + + democracyReferendumCount = (): Observable => { + return this.rawStorage(storage.democracy.referendumCount); + } + + democracyReferendumInfoOf = (referendumId: ReferendumIndex | BN | number): Observable => { + return this + .rawStorage(storage.democracy.referendumInfoOf, referendumId) + .pipe( + // @ts-ignore After upgrade to 6.3.2 + map((result: Tuple): RxReferendum | undefined => + result + ? new RxReferendum(result, referendumId) + : undefined + ) + ); + } + + democacyVoteOf = (index: ReferendumIndex | BN | number, address: AccountId | string): Observable => { + return this.rawStorage(storage.democracy.voteOf, index, address); + } + + democacyVotersFor = (index: ReferendumIndex | BN | number): Observable> => { + return this + .rawStorage(storage.democracy.votersFor, index) + .pipe( + // @ts-ignore After upgrade to 6.3.2 + map((voters: Array = []) => + voters + ) + ); + } + + democracyVotingPeriod = (): Observable => { + return this.rawStorage(storage.democracy.votingPeriod); + } + + fees = (): Observable => { + return this + .rawStorageMulti( + [storage.balances.transactionBaseFee], + [storage.balances.transactionByteFee], + [storage.balances.creationFee], + [storage.balances.existentialDeposit], + [storage.balances.transferFee] + ) + .pipe( + // @ts-ignore After upgrade to 6.3.2 + map(([baseFee = new Balance(0), byteFee = new Balance(0), creationFee = new Balance(0), existentialDeposit = new Balance(0), transferFee = new Balance(0)]: [Balance | undefined, Balance | undefined, Balance | undefined, Balance | undefined, Balance | undefined]) => ({ + baseFee, + byteFee, + creationFee, + existentialDeposit, + transferFee + })) + ); + } + + eraLastLengthChange = (): Observable => { + return this.rawStorage(storage.staking.lastEraLengthChange); + } + + sessionReward = (): Observable => { + return this.rawStorage(storage.staking.sessionReward); + } + + sessionRewardCurrent = (): Observable => { + return this.rawStorage(storage.staking.currentSessionReward); + } + + sessionCurrentIndex = (): Observable => { + return this.rawStorage(storage.session.currentIndex); + } + + sessionCurrentStart = (): Observable => { + return this.rawStorage(storage.session.currentStart); + } + + sessionLastLengthChange = (): Observable => { + return this.rawStorage(storage.session.lastLengthChange); + } + + sessionLength = (): Observable => { + return this.rawStorage(storage.session.sessionLength); + } + + sessionsPerEra = (): Observable => { + return this.rawStorage(storage.staking.sessionsPerEra); + } + + sessionValidators = (): Observable> => { + return this + .rawStorage(storage.session.validators) + .pipe( + // @ts-ignore After upgrade to 6.3.2 + map((validators: Array = []) => + validators + ) + ); + } + + stakingIntentions = (): Observable> => { + return this + .rawStorage(storage.staking.intentions) + .pipe( + // @ts-ignore After upgrade to 6.3.2 + map((intentions: Array = []) => + intentions + ) + ); + } + + // FIXME -> freeBalance + stakingFreeBalanceOf = (address: AccountId | string): Observable => { + return this.rawStorage(storage.balances.freeBalance, address); + } + + stakingNominatorsFor = (address: AccountId | string): Observable> => { + return this + .rawStorage(storage.staking.nominatorsFor, address) + .pipe( + // @ts-ignore After upgrade to 6.3.2 + map((nominators: Array = []) => + nominators + ) + ); + } + + stakingNominating = (address: AccountId | string): Observable => { + return this.rawStorage(storage.staking.nominating, address); + } + + // FIXME -> reservedBalance + stakingReservedBalanceOf = (address: AccountId | string): Observable => { + return this.rawStorage(storage.balances.reservedBalance, address); + } + + timestampBlockPeriod = (): Observable => { + return this.rawStorage(storage.timestamp.blockPeriod); + } + + timestampNow = (): Observable => { + return this.rawStorage(storage.timestamp.now); + } + + systemAccountIndexOf = (address: AccountId | string): Observable => { + return this.rawStorage(storage.system.accountNonce, address); + } + + validatorCount = (): Observable => { + return this.rawStorage(storage.staking.validatorCount); + } +} diff --git a/packages/api-observable/src/classes.ts b/packages/api-observable/src/classes.ts new file mode 100644 index 0000000000..b696c3834c --- /dev/null +++ b/packages/api-observable/src/classes.ts @@ -0,0 +1,73 @@ +// Copyright 2017-2018 @polkadot/ui-observable authors & contributors +// This software may be modified and distributed under the terms +// of the ISC license. See the LICENSE file for details. + +import BN from 'bn.js'; +import { AccountId, Balance, BlockNumber, PropIndex, Proposal, ReferendumIndex, VoteThreshold } from '@polkadot/api-codec/index'; +import { Struct, Tuple, Vector } from '@polkadot/api-codec/codec'; + +export class RxProposal extends Struct.with({ id: PropIndex, proposal: Proposal, address: AccountId }) { + constructor (value: Tuple) { + super({ + id: value.get(0), + proposal: value.get(1), + address: value.get(2) + }); + } + + get address (): AccountId { + return this.raw.address as AccountId; + } + + get id (): PropIndex { + return this.raw.id as PropIndex; + } + + get proposal (): Proposal { + return this.raw.proposal as Proposal; + } +} + +export class RxProposalDeposits extends Struct.with({ balance: Balance, addresses: Vector.with(AccountId) }) { + constructor (value: Tuple) { + super({ + balance: value.get(0), + addresses: value.get(1) + }); + } + + get addresses (): Vector { + return this.raw.addresses as Vector; + } + + get balance (): Balance { + return this.raw.balance as Balance; + } +} + +export class RxReferendum extends Struct.with({ blockNumber: BlockNumber, proposal: Proposal, voteThreshold: VoteThreshold, id: ReferendumIndex }) { + constructor (value: Tuple, id: ReferendumIndex | BN | number) { + super({ + blockNumber: value.get(0), + proposal: value.get(1), + voteThreshold: value.get(2), + id + }); + } + + get blockNumber (): BlockNumber { + return this.raw.blockNumber as BlockNumber; + } + + get id (): ReferendumIndex { + return this.raw.id as ReferendumIndex; + } + + get proposal (): Proposal { + return this.raw.proposal as Proposal; + } + + get voteThreshold (): VoteThreshold { + return this.raw.voteThreshold as VoteThreshold; + } +} diff --git a/packages/api-observable/src/index.ts b/packages/api-observable/src/index.ts new file mode 100644 index 0000000000..fc38fd51cd --- /dev/null +++ b/packages/api-observable/src/index.ts @@ -0,0 +1,8 @@ +// Copyright 2017-2018 @polkadot/ui-observable authors & contributors +// This software may be modified and distributed under the terms +// of the ISC license. See the LICENSE file for details. + +import ApiCombined from './Combined'; + +export default class Api extends ApiCombined { +} diff --git a/packages/api-observable/src/types.d.ts b/packages/api-observable/src/types.d.ts new file mode 100644 index 0000000000..05d47346cf --- /dev/null +++ b/packages/api-observable/src/types.d.ts @@ -0,0 +1,42 @@ +// Copyright 2017-2018 @polkadot/ui-observable authors & contributors +// This software may be modified and distributed under the terms +// of the ISC license. See the LICENSE file for details. + +import { Observable } from 'rxjs'; +import { AccountId, Balance, BlockNumber, Bool, Header, PropIndex, Proposal, ReferendumIndex, u32, VoteThreshold } from '@polkadot/api-codec/index'; +import { Tuple } from '@polkadot/api-codec/codec'; + +import ApiBase from './Base'; +import ApiCalls from './Calls'; +import ApiCombined from './Combined'; +import ApiQueries from './Queries'; + +export type ApiFunctions = keyof ApiBase | keyof ApiCalls | keyof ApiCombined | keyof ApiQueries; + +export type RxBalance = { + address: AccountId, + freeBalance: Balance, + nominatedBalance: Balance, + reservedBalance: Balance, + votingBalance: Balance, + stakingBalance: Balance, + nominators?: Array +} + +export type RxFees = { + baseFee: Balance, + byteFee: Balance, + creationFee: Balance, + existentialDeposit: Balance, + transferFee: Balance, +}; + +export type RxReferendumVote = { + address: AccountId, + balance: Balance, + vote: Bool +}; + +export type RxBalanceMap = { + [index: string]: RxBalance +} diff --git a/packages/api-rx/src/types.d.ts b/packages/api-rx/src/types.d.ts index 407c894e4b..ad25821f5d 100644 --- a/packages/api-rx/src/types.d.ts +++ b/packages/api-rx/src/types.d.ts @@ -12,10 +12,11 @@ export type RxApiInterface$Section = { [index: string]: RxApiInterface$Method }; -type RxApiInterface$Keys = { - readonly [key in keyof typeof interfaces]: RxApiInterface$Section; -}; +export type RxApiInterface = { + readonly author: RxApiInterface$Section; + readonly chain: RxApiInterface$Section; + readonly state: RxApiInterface$Section; + readonly system: RxApiInterface$Section; -export type RxApiInterface = RxApiInterface$Keys & { isConnected: () => BehaviorSubject } diff --git a/tsconfig.json b/tsconfig.json index 409ab40102..85802bdb9a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,6 +6,7 @@ "paths": { "@polkadot/api-codec/*": ["packages/api-codec/src/*"], + "@polkadot/api-observable/*": ["packages/api-observable/src/*"], "@polkadot/api-provider/*": ["packages/api-provider/src/*"], "@polkadot/api-rx/*": ["packages/api-rx/src/*"], "@polkadot/api/*": ["packages/api/src/*"],