From d1b2afd78db081e41c9fbbff5cddc92f60d66738 Mon Sep 17 00:00:00 2001 From: Aaron Cox Date: Sat, 26 Aug 2023 08:51:02 -0700 Subject: [PATCH] All system contract compatibility and better tests (#52) * Rewrote tests to remove recursion and throw * removed try/catch * Fixed issue with Symbol typing * Switching imports to wharfkit/antelope * catching `Bool` type * Dynamically import all core types related to ABIs * Adding missing types * Fixing TableNames key stringify * Updating tests to support many contracts * Changing imports over to wharfkit/antelope instead of session * Removed notes * Only override `action` and `table` call if data for those exist * Scopes should accept generic numbers and cast to strings Fixes #53 * Fixed scope logic It was casting undefined to a string and never using `this.account` * Allow passing `scope` as 2nd param to `contract.table` This matches the syntax used in the CDT, as discussed here: https://github.com/orgs/wharfkit/discussions/5#discussioncomment-6515701 * Version 0.4.1 * chore: renamed EOSIO_CORE variables * refactor: added helper folder * enhancement: making sure that Name is always in contract imports * fix: removing $ from field name when applicable * chore: added full eosio abi * cleanup: removed contracts folder * fix: parsing data types properly * fix: using proper eosio abi * fix: handling variant and alias types * fix: handling booleans properly * fix: handling variants in external and internal types * cleanup: removed redundant Types namespace from Struct field type * style: linted --------- Co-authored-by: dafuga --- contracts/decentiumorg.ts | 805 ------ package.json | 2 +- src/codegen.ts | 16 +- src/codegen/contract.ts | 27 +- src/codegen/helpers.ts | 98 +- src/codegen/interfaces.ts | 29 +- src/codegen/maps.ts | 4 +- src/codegen/structs.ts | 41 +- src/contract.ts | 2 +- src/contract/table.ts | 15 +- test/data/abis/eosio.json | 2566 +++++++++++++++++ test/data/abis/eosio.msig.json | 365 +++ test/data/abis/eosio.token.json | 187 ++ test/data/contracts/mock-eosio.msig.ts | 241 ++ test/data/contracts/mock-eosio.token.ts | 136 + test/data/contracts/mock-eosio.ts | 1538 ++++++++++ .../{mock-rewards.ts => mock-rewards.gm.ts} | 10 +- ...a4eb8b69502e8647161673b5d5646e5ba971c.json | 17 + ...556beab3147198d2a4b8ff6f22208f19691ab.json | 365 +++ ...5f4150110e252e2d5b4e6b09866e65bbbb177.json | 161 ++ ...3d654fdb4c4ef32e6909e26c66f73c34f5f3e.json | 18 + ...f0891251fa520755ab314e09cdaac9a7d5b7f.json | 18 + ...b9e791a1f8ba9f62dc3fdfb46fdef3b872052.json | 19 + test/tests/codegen.ts | 181 +- test/tests/contract.ts | 102 +- test/tests/helpers/generic.ts | 87 + test/tests/mock.ts | 2 +- test/tests/table.ts | 42 +- 28 files changed, 6050 insertions(+), 1044 deletions(-) delete mode 100644 contracts/decentiumorg.ts create mode 100644 test/data/abis/eosio.json create mode 100644 test/data/abis/eosio.msig.json create mode 100644 test/data/abis/eosio.token.json create mode 100644 test/data/contracts/mock-eosio.msig.ts create mode 100644 test/data/contracts/mock-eosio.token.ts create mode 100644 test/data/contracts/mock-eosio.ts rename test/data/contracts/{mock-rewards.ts => mock-rewards.gm.ts} (97%) create mode 100644 test/data/requests/6cda4eb8b69502e8647161673b5d5646e5ba971c.json create mode 100644 test/data/requests/821556beab3147198d2a4b8ff6f22208f19691ab.json create mode 100644 test/data/requests/9195f4150110e252e2d5b4e6b09866e65bbbb177.json create mode 100644 test/data/requests/ac83d654fdb4c4ef32e6909e26c66f73c34f5f3e.json create mode 100644 test/data/requests/b1cf0891251fa520755ab314e09cdaac9a7d5b7f.json create mode 100644 test/data/requests/f6cb9e791a1f8ba9f62dc3fdfb46fdef3b872052.json create mode 100644 test/tests/helpers/generic.ts diff --git a/contracts/decentiumorg.ts b/contracts/decentiumorg.ts deleted file mode 100644 index 5916879..0000000 --- a/contracts/decentiumorg.ts +++ /dev/null @@ -1,805 +0,0 @@ -import {Contract, Table, TableCursor} from '@wharfkit/contract' -import { - Struct, - Name, - NameType, - Asset, - AssetType, - UInt16, - UInt16Type, - UInt32, - UInt32Type, - UInt64, - UInt64Type, - UInt8, - UInt8Type, - TransactResult, - APIClient, - Checksum256, - TimePointSec, -} from '@wharfkit/session' -export class _Decentiumorg extends Contract { - addcategory(category: NameType): Promise { - return this.call( - 'addcategory', - _Decentiumorg.types.Action_addcategory.from({category: category}) - ) - } - addmoderator(account: NameType): Promise { - return this.call( - 'addmoderator', - _Decentiumorg.types.Action_addmoderator.from({account: account}) - ) - } - createblog(author: NameType): Promise { - return this.call('createblog', _Decentiumorg.types.Action_createblog.from({author: author})) - } - delcategory(category: NameType): Promise { - return this.call( - 'delcategory', - _Decentiumorg.types.Action_delcategory.from({category: category}) - ) - } - deleteblog(author: NameType, max_itr: UInt32Type): Promise { - return this.call( - 'deleteblog', - _Decentiumorg.types.Action_deleteblog.from({author: author, max_itr: max_itr}) - ) - } - delmoderator(account: NameType): Promise { - return this.call( - 'delmoderator', - _Decentiumorg.types.Action_delmoderator.from({account: account}) - ) - } - freezeblog(author: NameType, reason: string): Promise { - return this.call( - 'freezeblog', - _Decentiumorg.types.Action_freezeblog.from({author: author, reason: reason}) - ) - } - housekeeping(max_itr: UInt32Type): Promise { - return this.call( - 'housekeeping', - _Decentiumorg.types.Action_housekeeping.from({max_itr: max_itr}) - ) - } - pinpost(author: NameType, slug: NameType): Promise { - return this.call( - 'pinpost', - _Decentiumorg.types.Action_pinpost.from({author: author, slug: slug}) - ) - } - post(author: NameType, slug: NameType): Promise { - return this.call( - 'post', - _Decentiumorg.types.Action_pinpost.from({author: author, slug: slug}) - ) - } - postedit( - author: NameType, - new_title: string, - patch: string, - new_metadata: _Decentiumorg.types.Metadata - ): Promise { - return this.call( - 'postedit', - _Decentiumorg.types.Action_postedit.from({ - author: author, - new_title: new_title, - patch: patch, - new_metadata: new_metadata, - }) - ) - } - profile(author: NameType, name: string, bio: string, image: string): Promise { - return this.call( - 'profile', - _Decentiumorg.types.Action_profile.from({ - author: author, - name: name, - bio: bio, - image: image, - }) - ) - } - publish( - permlink: _Decentiumorg.types.Permlink, - tx: _Decentiumorg.types.Tx_ref, - category: NameType, - options: post_options, - links: _Decentiumorg.types.Permlink - ): Promise { - return this.call( - 'publish', - _Decentiumorg.types.Action_publish.from({ - permlink: permlink, - tx: tx, - category: category, - options: options, - links: links, - }) - ) - } - publishedit( - permlink: _Decentiumorg.types.Permlink, - edit_tx: _Decentiumorg.types.Tx_ref - ): Promise { - return this.call( - 'publishedit', - _Decentiumorg.types.Action_publishedit.from({permlink: permlink, edit_tx: edit_tx}) - ) - } - setlinkflags(link_id: UInt64Type, new_flags: link_flags): Promise { - return this.call( - 'setlinkflags', - _Decentiumorg.types.Action_setlinkflags.from({link_id: link_id, new_flags: new_flags}) - ) - } - setprofile(author: NameType, profile: _Decentiumorg.types.Tx_ref): Promise { - return this.call( - 'setprofile', - _Decentiumorg.types.Action_setprofile.from({author: author, profile: profile}) - ) - } - unfreezeblog(author: NameType): Promise { - return this.call( - 'unfreezeblog', - _Decentiumorg.types.Action_unfreezeblog.from({author: author}) - ) - } - unpinpost(author: NameType, slug: NameType): Promise { - return this.call( - 'unpinpost', - _Decentiumorg.types.Action_unpinpost.from({author: author, slug: slug}) - ) - } - unpublish(permlink: _Decentiumorg.types.Permlink): Promise { - return this.call( - 'unpublish', - _Decentiumorg.types.Action_unpublish.from({permlink: permlink}) - ) - } - updatescore(post_permlink: _Decentiumorg.types.Permlink): Promise { - return this.call( - 'updatescore', - _Decentiumorg.types.Action_updatescore.from({post_permlink: post_permlink}) - ) - } -} -export namespace _Decentiumorg { - export namespace tables { - export class blogs { - static fieldToIndex = {author: {type: 'name', index_position: 'primary'}} - static query( - {limit = 10}, - queryParams: _Decentiumorg.types.blogsQueryParams, - client: APIClient - ): Promise> { - const blogsTable = Table.from({ - contract: 'blog', - name: 'blogs', - client: client, - rowType: _Decentiumorg.types.Blog_row, - fieldToIndex: blogs.fieldToIndex, - }) - return blogsTable.query(queryParams) - } - static get( - queryParams: _Decentiumorg.types.blogsQueryParams, - client: APIClient - ): Promise<_Decentiumorg.types.Blog_row> { - const blogsTable = Table.from({ - contract: 'blog', - name: 'blogs', - client: client, - rowType: _Decentiumorg.types.Blog_row, - fieldToIndex: blogs.fieldToIndex, - }) - return blogsTable.get(queryParams) - } - static all( - queryParams: _Decentiumorg.types.blogsQueryParams, - client: APIClient - ): Promise> { - const blogsTable = Table.from({ - contract: 'blog', - name: 'blogs', - client: client, - rowType: _Decentiumorg.types.Blog_row, - fieldToIndex: blogs.fieldToIndex, - }) - return blogsTable.all(queryParams) - } - } - export class links { - static fieldToIndex = { - id: {type: 'uint64', index_position: 'primary'}, - from: {type: 'uint128', index_position: 'secondary'}, - to: {type: 'uint128', index_position: 'tertiary'}, - } - static query( - {limit = 10}, - queryParams: _Decentiumorg.types.linksQueryParams, - client: APIClient - ): Promise> { - const linksTable = Table.from({ - contract: 'blog', - name: 'links', - client: client, - rowType: _Decentiumorg.types.Link_row, - fieldToIndex: links.fieldToIndex, - }) - return linksTable.query(queryParams) - } - static get( - queryParams: _Decentiumorg.types.linksQueryParams, - client: APIClient - ): Promise<_Decentiumorg.types.Link_row> { - const linksTable = Table.from({ - contract: 'blog', - name: 'links', - client: client, - rowType: _Decentiumorg.types.Link_row, - fieldToIndex: links.fieldToIndex, - }) - return linksTable.get(queryParams) - } - static all( - queryParams: _Decentiumorg.types.linksQueryParams, - client: APIClient - ): Promise> { - const linksTable = Table.from({ - contract: 'blog', - name: 'links', - client: client, - rowType: _Decentiumorg.types.Link_row, - fieldToIndex: links.fieldToIndex, - }) - return linksTable.all(queryParams) - } - } - export class posts { - static fieldToIndex = { - slug: {type: 'name', index_position: 'primary'}, - updated: {type: 'uint64', index_position: 'secondary'}, - } - static query( - {limit = 10}, - queryParams: _Decentiumorg.types.postsQueryParams, - client: APIClient - ): Promise> { - const postsTable = Table.from({ - contract: 'blog', - name: 'posts', - client: client, - rowType: _Decentiumorg.types.Post_row, - fieldToIndex: posts.fieldToIndex, - }) - return postsTable.query(queryParams) - } - static get( - queryParams: _Decentiumorg.types.postsQueryParams, - client: APIClient - ): Promise<_Decentiumorg.types.Post_row> { - const postsTable = Table.from({ - contract: 'blog', - name: 'posts', - client: client, - rowType: _Decentiumorg.types.Post_row, - fieldToIndex: posts.fieldToIndex, - }) - return postsTable.get(queryParams) - } - static all( - queryParams: _Decentiumorg.types.postsQueryParams, - client: APIClient - ): Promise> { - const postsTable = Table.from({ - contract: 'blog', - name: 'posts', - client: client, - rowType: _Decentiumorg.types.Post_row, - fieldToIndex: posts.fieldToIndex, - }) - return postsTable.all(queryParams) - } - } - export class state { - static fieldToIndex = {} - static query( - {limit = 10}, - queryParams: _Decentiumorg.types.stateQueryParams, - client: APIClient - ): Promise> { - const stateTable = Table.from({ - contract: 'blog', - name: 'state', - client: client, - rowType: _Decentiumorg.types.State, - fieldToIndex: state.fieldToIndex, - }) - return stateTable.query(queryParams) - } - static get( - queryParams: _Decentiumorg.types.stateQueryParams, - client: APIClient - ): Promise<_Decentiumorg.types.State> { - const stateTable = Table.from({ - contract: 'blog', - name: 'state', - client: client, - rowType: _Decentiumorg.types.State, - fieldToIndex: state.fieldToIndex, - }) - return stateTable.get(queryParams) - } - static all( - queryParams: _Decentiumorg.types.stateQueryParams, - client: APIClient - ): Promise> { - const stateTable = Table.from({ - contract: 'blog', - name: 'state', - client: client, - rowType: _Decentiumorg.types.State, - fieldToIndex: state.fieldToIndex, - }) - return stateTable.all(queryParams) - } - } - export class trending { - static fieldToIndex = { - id: {type: 'uint64', index_position: 'primary'}, - score: {type: 'uint64', index_position: 'secondary'}, - cscore: {type: 'uint128', index_position: 'tertiary'}, - permlink: {type: 'uint128', index_position: 'fourth'}, - } - static query( - {limit = 10}, - queryParams: _Decentiumorg.types.trendingQueryParams, - client: APIClient - ): Promise> { - const trendingTable = Table.from({ - contract: 'blog', - name: 'trending', - client: client, - rowType: _Decentiumorg.types.Trending_row, - fieldToIndex: trending.fieldToIndex, - }) - return trendingTable.query(queryParams) - } - static get( - queryParams: _Decentiumorg.types.trendingQueryParams, - client: APIClient - ): Promise<_Decentiumorg.types.Trending_row> { - const trendingTable = Table.from({ - contract: 'blog', - name: 'trending', - client: client, - rowType: _Decentiumorg.types.Trending_row, - fieldToIndex: trending.fieldToIndex, - }) - return trendingTable.get(queryParams) - } - static all( - queryParams: _Decentiumorg.types.trendingQueryParams, - client: APIClient - ): Promise> { - const trendingTable = Table.from({ - contract: 'blog', - name: 'trending', - client: client, - rowType: _Decentiumorg.types.Trending_row, - fieldToIndex: trending.fieldToIndex, - }) - return trendingTable.all(queryParams) - } - } - } -} -export namespace _Decentiumorg { - export namespace types { - @Struct.type('action_addcategory') - export class Action_addcategory extends Struct { - @Struct.field('category') - declare category: Name - } - @Struct.type('action_addmoderator') - export class Action_addmoderator extends Struct { - @Struct.field('account') - declare account: Name - } - @Struct.type('action_createblog') - export class Action_createblog extends Struct { - @Struct.field('author') - declare author: Name - } - @Struct.type('action_delcategory') - export class Action_delcategory extends Struct { - @Struct.field('category') - declare category: Name - } - @Struct.type('action_deleteblog') - export class Action_deleteblog extends Struct { - @Struct.field('author') - declare author: Name - @Struct.field('max_itr') - declare max_itr: UInt32 - } - @Struct.type('action_delmoderator') - export class Action_delmoderator extends Struct { - @Struct.field('account') - declare account: Name - } - @Struct.type('action_freezeblog') - export class Action_freezeblog extends Struct { - @Struct.field('author') - declare author: Name - @Struct.field('reason') - declare reason: String - } - @Struct.type('action_housekeeping') - export class Action_housekeeping extends Struct { - @Struct.field('max_itr') - declare max_itr: UInt32 - } - @Struct.type('action_pinpost') - export class Action_pinpost extends Struct { - @Struct.field('author') - declare author: Name - @Struct.field('slug') - declare slug: Name - } - @Struct.type('action_post') - export class Action_post extends Struct { - @Struct.field('author') - declare author: Name - @Struct.field('title') - declare title: String - @Struct.field('doc') - declare doc: _Decentiumorg.types.Document - @Struct.field('metadata') - declare metadata: _Decentiumorg.types.Metadata? - } - @Struct.type('action_postedit') - export class Action_postedit extends Struct { - @Struct.field('author') - declare author: Name - @Struct.field('new_title') - declare new_title: String? - @Struct.field('patch') - declare patch: String? - @Struct.field('new_metadata') - declare new_metadata: _Decentiumorg.types.Metadata? - } - @Struct.type('action_profile') - export class Action_profile extends Struct { - @Struct.field('author') - declare author: Name - @Struct.field('name') - declare name: String - @Struct.field('bio') - declare bio: String - @Struct.field('image') - declare image: String? - } - @Struct.type('action_publish') - export class Action_publish extends Struct { - @Struct.field('permlink') - declare permlink: _Decentiumorg.types.Permlink - @Struct.field('tx') - declare tx: _Decentiumorg.types.Tx_ref - @Struct.field('category') - declare category: Name - @Struct.field('options') - declare options: Post_options - @Struct.field('links') - declare links: _Decentiumorg.types.Permlink[] - } - @Struct.type('action_publishedit') - export class Action_publishedit extends Struct { - @Struct.field('permlink') - declare permlink: _Decentiumorg.types.Permlink - @Struct.field('edit_tx') - declare edit_tx: _Decentiumorg.types.Tx_ref - } - @Struct.type('action_setlinkflags') - export class Action_setlinkflags extends Struct { - @Struct.field('link_id') - declare link_id: UInt64 - @Struct.field('new_flags') - declare new_flags: Link_flags - } - @Struct.type('action_setprofile') - export class Action_setprofile extends Struct { - @Struct.field('author') - declare author: Name - @Struct.field('profile') - declare profile: _Decentiumorg.types.Tx_ref - } - @Struct.type('action_unfreezeblog') - export class Action_unfreezeblog extends Struct { - @Struct.field('author') - declare author: Name - } - @Struct.type('action_unpinpost') - export class Action_unpinpost extends Struct { - @Struct.field('author') - declare author: Name - @Struct.field('slug') - declare slug: Name - } - @Struct.type('action_unpublish') - export class Action_unpublish extends Struct { - @Struct.field('permlink') - declare permlink: _Decentiumorg.types.Permlink - } - @Struct.type('action_updatescore') - export class Action_updatescore extends Struct { - @Struct.field('post_permlink') - declare post_permlink: _Decentiumorg.types.Permlink - } - @Struct.type('blog_row') - export class Blog_row extends Struct { - @Struct.field('author') - declare author: Name - @Struct.field('flags') - declare flags: Blog_flags - @Struct.field('pinned') - declare pinned: Name[] - @Struct.field('stats') - declare stats: _Decentiumorg.types.Blog_stats - @Struct.field('profile') - declare profile: _Decentiumorg.types.Tx_ref? - @Struct.field('extensions') - declare extensions: _Decentiumorg.types.Future_extensions[] - } - @Struct.type('blog_stats') - export class Blog_stats extends Struct { - @Struct.field('total_posts') - declare total_posts: UInt32 - @Struct.field('endorsements_received') - declare endorsements_received: _Decentiumorg.types.Reward_stat - @Struct.field('endorsements_sent') - declare endorsements_sent: _Decentiumorg.types.Reward_stat - @Struct.field('incoming_linkbacks') - declare incoming_linkbacks: _Decentiumorg.types.Reward_stat - @Struct.field('outgoing_linkbacks') - declare outgoing_linkbacks: _Decentiumorg.types.Reward_stat - } - @Struct.type('bold') - export class Bold extends Struct {} - @Struct.type('category_stat') - export class Category_stat extends Struct { - @Struct.field('endorsements') - declare endorsements: _Decentiumorg.types.Reward_stat - @Struct.field('linkbacks') - declare linkbacks: _Decentiumorg.types.Reward_stat - } - @Struct.type('code') - export class Code extends Struct {} - @Struct.type('code_block') - export class Code_block extends Struct { - @Struct.field('code') - declare code: String - @Struct.field('lang') - declare lang: String - } - @Struct.type('color') - export class Color extends Struct { - @Struct.field('r') - declare r: UInt8 - @Struct.field('g') - declare g: UInt8 - @Struct.field('b') - declare b: UInt8 - } - @Struct.type('divider') - export class Divider extends Struct {} - @Struct.type('document') - export class Document extends Struct { - @Struct.field('content') - declare content: Variant_block_nodes[] - } - @Struct.type('future_extensions') - export class Future_extensions extends Struct {} - @Struct.type('geometrize_triangles') - export class Geometrize_triangles extends Struct { - @Struct.field('base') - declare base: _Decentiumorg.types.Color - @Struct.field('triangles') - declare triangles: _Decentiumorg.types.Triangle[] - } - @Struct.type('hard_break') - export class Hard_break extends Struct {} - @Struct.type('heading') - export class Heading extends Struct { - @Struct.field('value') - declare value: String - @Struct.field('level') - declare level: UInt8 - } - @Struct.type('image') - export class Image extends Struct { - @Struct.field('src') - declare src: String - @Struct.field('caption') - declare caption: Variant_inline_nodes[] - @Struct.field('layout') - declare layout: UInt8 - } - @Struct.type('image_info') - export class Image_info extends Struct { - @Struct.field('width') - declare width: UInt16 - @Struct.field('height') - declare height: UInt16 - @Struct.field('placeholder') - declare placeholder: Variant_placeholder - } - @Struct.type('italic') - export class Italic extends Struct {} - @Struct.type('link') - export class Link extends Struct { - @Struct.field('href') - declare href: String - @Struct.field('title') - declare title: String - } - @Struct.type('link_row') - export class Link_row extends Struct { - @Struct.field('id') - declare id: UInt64 - @Struct.field('from') - declare from: _Decentiumorg.types.Permlink - @Struct.field('to') - declare to: _Decentiumorg.types.Permlink - @Struct.field('flags') - declare flags: Link_flags - @Struct.field('payment') - declare payment: Asset? - } - @Struct.type('linkref') - export class Linkref extends Struct { - @Struct.field('to') - declare to: _Decentiumorg.types.Permlink - } - @Struct.type('list') - export class List extends Struct { - @Struct.field('type') - declare type: UInt8 - @Struct.field('items') - declare items: _Decentiumorg.types.List_item[] - } - @Struct.type('list_item') - export class List_item extends Struct { - @Struct.field('content') - declare content: Variant_inline_nodes[] - } - @Struct.type('metadata') - export class Metadata extends Struct { - @Struct.field('image') - declare image: String? - @Struct.field('summary') - declare summary: String? - @Struct.field('image_info') - declare image_info: _Decentiumorg.types.Pair_string_image_info[] - } - @Struct.type('pair_name_category_stat') - export class Pair_name_category_stat extends Struct { - @Struct.field('key') - declare key: Name - @Struct.field('value') - declare value: _Decentiumorg.types.Category_stat - } - @Struct.type('pair_string_image_info') - export class Pair_string_image_info extends Struct { - @Struct.field('key') - declare key: String - @Struct.field('value') - declare value: _Decentiumorg.types.Image_info - } - @Struct.type('paragraph') - export class Paragraph extends Struct { - @Struct.field('content') - declare content: Variant_inline_nodes[] - } - @Struct.type('permlink') - export class Permlink extends Struct { - @Struct.field('author') - declare author: Name - @Struct.field('slug') - declare slug: Name - } - @Struct.type('post_ref') - export class Post_ref extends Struct { - @Struct.field('permlink') - declare permlink: _Decentiumorg.types.Permlink - @Struct.field('timestamp') - declare timestamp: TimePointSec - @Struct.field('category') - declare category: Name - @Struct.field('options') - declare options: Post_options - @Struct.field('tx') - declare tx: _Decentiumorg.types.Tx_ref - @Struct.field('edit_tx') - declare edit_tx: _Decentiumorg.types.Tx_ref? - @Struct.field('endorsements') - declare endorsements: _Decentiumorg.types.Reward_stat? - @Struct.field('extensions') - declare extensions: _Decentiumorg.types.Future_extensions[] - } - @Struct.type('post_row') - export class Post_row extends Struct { - @Struct.field('ref') - declare ref: _Decentiumorg.types.Post_ref - @Struct.field('extensions') - declare extensions: _Decentiumorg.types.Future_extensions[] - } - @Struct.type('quote') - export class Quote extends Struct { - @Struct.field('content') - declare content: Variant_inline_nodes[] - } - @Struct.type('reward_stat') - export class Reward_stat extends Struct { - @Struct.field('count') - declare count: UInt32 - @Struct.field('amount') - declare amount: UInt64 - } - @Struct.type('state') - export class State extends Struct { - @Struct.field('moderators') - declare moderators: Name[] - @Struct.field('categories') - declare categories: _Decentiumorg.types.Pair_name_category_stat[] - } - @Struct.type('strike') - export class Strike extends Struct {} - @Struct.type('text') - export class Text extends Struct { - @Struct.field('value') - declare value: String - @Struct.field('marks') - declare marks: Variant_mark_nodes[] - } - @Struct.type('trending_row') - export class Trending_row extends Struct { - @Struct.field('id') - declare id: UInt64 - @Struct.field('score') - declare score: UInt64 - @Struct.field('ref') - declare ref: _Decentiumorg.types.Post_ref - @Struct.field('extensions') - declare extensions: _Decentiumorg.types.Future_extensions[] - } - @Struct.type('triangle') - export class Triangle extends Struct { - @Struct.field('ax') - declare ax: UInt8 - @Struct.field('ay') - declare ay: UInt8 - @Struct.field('bx') - declare bx: UInt8 - @Struct.field('by') - declare by: UInt8 - @Struct.field('cx') - declare cx: UInt8 - @Struct.field('cy') - declare cy: UInt8 - @Struct.field('color') - declare color: _Decentiumorg.types.Color - } - @Struct.type('tx_ref') - export class Tx_ref extends Struct { - @Struct.field('block_num') - declare block_num: UInt32 - @Struct.field('transaction_id') - declare transaction_id: Checksum256 - } - } -} diff --git a/package.json b/package.json index e5f48c9..46f7d30 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@wharfkit/contract", "description": "ContractKit for Wharf", - "version": "0.4.0", + "version": "0.4.1", "homepage": "https://github.com/wharfkit/contract", "license": "BSD-3-Clause", "main": "lib/contract.js", diff --git a/src/codegen.ts b/src/codegen.ts index 9c46250..4ddd77c 100644 --- a/src/codegen.ts +++ b/src/codegen.ts @@ -19,11 +19,21 @@ export async function codegen(contractName, abi) { '@wharfkit/contract' ) - const sessionImports = ['ABI', 'Action', 'Blob', 'Struct', ...getCoreImports(abi)] + const allAntelopeImports = [ + 'ABI', + 'Action', + 'Blob', + 'Struct', + 'Name', + ...getCoreImports(abi), + ] + const antelopeImports = allAntelopeImports.filter( + (item, index) => allAntelopeImports.indexOf(item) === index + ) - sessionImports.sort() + antelopeImports.sort() - const importCoreStatement = generateImportStatement(sessionImports, '@wharfkit/session') + const importCoreStatement = generateImportStatement(antelopeImports, '@wharfkit/antelope') const {classDeclaration} = await generateContractClass(contractName, abi) diff --git a/src/codegen/contract.ts b/src/codegen/contract.ts index 1f197cb..519616c 100644 --- a/src/codegen/contract.ts +++ b/src/codegen/contract.ts @@ -1,4 +1,4 @@ -import {ABI} from '@wharfkit/session' +import {ABI} from '@wharfkit/antelope' import * as ts from 'typescript' import {generateClassDeclaration} from './helpers' @@ -43,13 +43,17 @@ export async function generateContractClass(contractName: string, abi: ABI.Def) classMembers.push(constructorMember) - const actionMethod = generateActionMethod(abi) + if (abi.actions.length) { + const actionMethod = generateActionMethod(abi) - classMembers.push(actionMethod) + classMembers.push(actionMethod) + } - const tableMethod = generateTableMethod(abi) + if (abi.tables.length) { + const tableMethod = generateTableMethod(abi) - classMembers.push(tableMethod) + classMembers.push(tableMethod) + } // Construct class declaration const classDeclaration = generateClassDeclaration('Contract', classMembers, { @@ -189,6 +193,16 @@ function generateTableMethod(abi: ABI.Def): ts.MethodDeclaration { undefined ) + const scopeParameter = ts.factory.createParameterDeclaration( + undefined, + undefined, + undefined, + 'scope', + ts.factory.createToken(ts.SyntaxKind.QuestionToken), + ts.factory.createTypeReferenceNode('NameType'), + undefined + ) + // 4. Generate the function body. const methodBody = ts.factory.createBlock( [ @@ -201,6 +215,7 @@ function generateTableMethod(abi: ABI.Def): ts.MethodDeclaration { undefined, [ ts.factory.createIdentifier('name'), + ts.factory.createIdentifier('scope'), ts.factory.createIdentifier('TableMap[name]'), ] ) @@ -216,7 +231,7 @@ function generateTableMethod(abi: ABI.Def): ts.MethodDeclaration { 'table', undefined, [typeParameter], - [nameParameter], + [nameParameter, scopeParameter], undefined, methodBody ) diff --git a/src/codegen/helpers.ts b/src/codegen/helpers.ts index 3d569a5..87a6e18 100644 --- a/src/codegen/helpers.ts +++ b/src/codegen/helpers.ts @@ -1,34 +1,19 @@ +import * as Antelope from '@wharfkit/antelope' import {ABI} from '@wharfkit/antelope' import * as ts from 'typescript' import {capitalize} from '../utils' -export const EOSIO_CORE_CLASSES = [ - 'Asset', - 'Checksum256', - 'Float64', - 'Name', - 'TimePoint', - 'TimePointSec', - 'UInt128', - 'UInt16', - 'UInt32', - 'UInt64', - 'UInt8', -] - -export const EOSIO_CORE_TYPES = [ - 'AssetType', - 'Checksum256Type', - 'Float64Type', - 'NameType', - 'TimePointType', - 'UInt128Type', - 'UInt16Type', - 'UInt32Type', - 'UInt64Type', - 'UInt8Type', -] +const ANTELOPE_CLASSES: string[] = [] +Object.keys(Antelope).map((key) => { + if (Antelope[key].abiName) { + ANTELOPE_CLASSES.push(key) + } +}) + +export const ANTELOPE_CLASS_MAPPINGS = { + block_timestamp_type: 'BlockTimestamp', +} export function getCoreImports(abi: ABI.Def) { const coreImports: string[] = [] @@ -127,11 +112,18 @@ export function generateInterface( } export function findCoreClass(type: string): string | undefined { - for (const coreType of EOSIO_CORE_CLASSES) { - if (type.split('_').join('') === coreType.toLowerCase()) { - return coreType - } + if (ANTELOPE_CLASS_MAPPINGS[type]) { + return ANTELOPE_CLASS_MAPPINGS[type] } + + const parsedType = parseType(type).split('_').join('') + + return ( + ANTELOPE_CLASSES.find((antelopeClass) => parsedType === antelopeClass.toLowerCase()) || + ANTELOPE_CLASSES.find( + (antelopeClass) => parsedType.replace(/[0-9]/g, '') === antelopeClass.toLowerCase() + ) + ) } export function findCoreType(type: string): string | undefined { @@ -145,18 +137,14 @@ export function findCoreType(type: string): string | undefined { export function findInternalType(type: string, typeNamespace: string | null, abi: ABI.Def): string { let {type: typeString} = extractDecorator(type) + typeString = parseType(typeString) + const relevantAbitype = findAbiType(typeString, abi) if (relevantAbitype) { typeString = relevantAbitype } - const variantType = findVariantType(typeString, typeNamespace, abi) - - if (variantType) { - typeString = variantType - } - return formatInternalType(typeString, typeNamespace, abi) } @@ -164,7 +152,7 @@ function formatInternalType(typeString: string, namespace: string | null, abi: A const structNames = abi.structs.map((struct) => struct.name.toLowerCase()) if (structNames.includes(typeString.toLowerCase())) { - return `${namespace ? `${namespace}.` : ''}${generateStructClassName(typeString)}` + return `${namespace ? `${namespace}` : ''}${generateStructClassName(typeString)}` } else { return findCoreClass(typeString) || capitalize(typeString) } @@ -177,6 +165,12 @@ export function generateStructClassName(name) { .join('') } +function findAliasType(typeString: string, abi: ABI.Def): string | undefined { + const alias = abi.types.find((type) => type.new_type_name === typeString) + + return alias?.type +} + function findVariantType( typeString: string, namespace: string | null, @@ -190,16 +184,24 @@ function findVariantType( return } - return abiVariant.types - .map((variant) => formatInternalType(variant, namespace, abi)) - .join(' | ') + return abiVariant.types.join(' | ') } -export function findAbiType( - typeString: string, - abi: ABI.Def, - typeNamespace = '' -): string | undefined { +export function findAbiType(type: string, abi: ABI.Def, typeNamespace = ''): string | undefined { + let typeString = type + + const aliasType = findAliasType(typeString, abi) + + if (aliasType) { + typeString = aliasType + } + + const variantType = findVariantType(typeString, typeNamespace, abi) + + if (variantType) { + typeString = variantType + } + const abiType = abi.structs.find((abiType) => abiType.name === typeString)?.name if (abiType) { @@ -211,6 +213,8 @@ export function findExternalType(type: string, abi: ABI.Def, typeNamespace?: str let {type: typeString} = extractDecorator(type) const {decorator} = extractDecorator(type) + typeString = parseType(typeString) + const relevantAbitype = findAbiType(typeString, abi, typeNamespace) if (relevantAbitype) { @@ -232,3 +236,7 @@ export function extractDecorator(type: string): {type: string; decorator?: strin return {type} } + +function parseType(type: string): string { + return type.replace('$', '') +} diff --git a/src/codegen/interfaces.ts b/src/codegen/interfaces.ts index 0b14a75..c1c3c0d 100644 --- a/src/codegen/interfaces.ts +++ b/src/codegen/interfaces.ts @@ -1,4 +1,4 @@ -import {ABI} from '@wharfkit/session' +import {ABI} from '@wharfkit/antelope' import ts from 'typescript' import {capitalize} from '../utils' import {findExternalType} from './helpers' @@ -29,16 +29,17 @@ export function generateActionNamesInterface(abi: ABI.Def): ts.InterfaceDeclarat export function generateActionInterface(actionStruct, abi): ts.InterfaceDeclaration { const members = actionStruct.fields.map((field) => { + const typeReferenceNode = ts.factory.createTypeReferenceNode( + findParamTypeString(field.type, 'Types.', abi) + ) + return ts.factory.createPropertySignature( undefined, field.name.toLowerCase(), field.type.includes('?') ? ts.factory.createToken(ts.SyntaxKind.QuestionToken) : undefined, - ts.factory.createTypeReferenceNode( - findExternalType(field.type, abi, 'Types.'), - undefined - ) + typeReferenceNode ) }) @@ -68,3 +69,21 @@ export function generateActionsNamespace(abi: ABI.Def): ts.ModuleDeclaration { ts.NodeFlags.Namespace ) } + +function findParamTypeString(typeString: string, namespace: string | null, abi: ABI.Def): string { + const fieldType = findExternalType(typeString, abi, namespace ? namespace : undefined) + + if (fieldType === 'Symbol') { + return 'Asset.SymbolType' + } + + if (fieldType === 'Bool') { + return 'boolean' + } + + if (['String', 'Boolean', 'Number'].includes(fieldType)) { + return fieldType.toLowerCase() + } + + return fieldType +} diff --git a/src/codegen/maps.ts b/src/codegen/maps.ts index 7be0611..f4616ef 100644 --- a/src/codegen/maps.ts +++ b/src/codegen/maps.ts @@ -1,4 +1,4 @@ -import {ABI} from '@wharfkit/session' +import {ABI} from '@wharfkit/antelope' import * as ts from 'typescript' import {findAbiType} from './helpers' @@ -6,7 +6,7 @@ export function generateTableMap(abi: ABI.Def): ts.VariableStatement { // Map over tables to create the object properties const tableProperties = abi.tables.map((table) => ts.factory.createPropertyAssignment( - String(table.name), + JSON.stringify(table.name), ts.factory.createIdentifier(findAbiType(table.type, abi, 'Types.') || table.type) ) ) diff --git a/src/codegen/structs.ts b/src/codegen/structs.ts index da6436c..1697b1d 100644 --- a/src/codegen/structs.ts +++ b/src/codegen/structs.ts @@ -157,20 +157,9 @@ export function generateField( function orderStructs(structs) { const orderedStructs: StructData[] = [] - const structNames = structs.map((struct) => struct.structName) for (const struct of structs) { - for (const field of struct.fields) { - const {type: fieldType} = extractDecorator(field.type) - - if (structNames.includes(fieldType.toLowerCase())) { - const dependencyStruct = structs.find( - (struct) => struct.structName === fieldType.toLowerCase() - ) - orderedStructs.push(dependencyStruct) - } - } - + orderedStructs.push(...findDependencies(struct, structs)) orderedStructs.push(struct) } @@ -179,6 +168,28 @@ function orderStructs(structs) { }) } +function findDependencies(struct: StructData, allStructs: StructData[]): StructData[] { + const dependencies: StructData[] = [] + + const structNames = allStructs.map((struct) => struct.structName) + + for (const field of struct.fields) { + const {type: fieldType} = extractDecorator(field.type) + + if (structNames.includes(fieldType.toLowerCase())) { + const dependencyStruct = allStructs.find( + (struct) => struct.structName === fieldType.toLowerCase() + ) + if (dependencyStruct) { + dependencies.push(...findDependencies(dependencyStruct, allStructs)) + dependencies.push(dependencyStruct) + } + } + } + + return dependencies +} + function findFieldStructType( typeString: string, namespace: string | null, @@ -200,10 +211,14 @@ function findFieldStructTypeString( ): string { const fieldType = findInternalType(typeString, namespace, abi) - if (['String', 'Boolean', 'Number'].includes(fieldType)) { + if (['String', 'Number'].includes(fieldType)) { return fieldType.toLowerCase() } + if (fieldType === 'Bool') { + return 'boolean' + } + if (fieldType === 'Symbol') { return 'Asset.Symbol' } diff --git a/src/contract.ts b/src/contract.ts index c9df4d7..bb87a2a 100644 --- a/src/contract.ts +++ b/src/contract.ts @@ -73,7 +73,7 @@ export class Contract { return this.tableNames.includes(String(name)) } - public table(name: NameType, rowType?): Table { + public table(name: NameType, scope?: NameType, rowType?): Table { if (!this.hasTable(name)) { throw new Error(`Contract (${this.account}) does not have a table named (${name})`) } diff --git a/src/contract/table.ts b/src/contract/table.ts index 936a326..533a35e 100644 --- a/src/contract/table.ts +++ b/src/contract/table.ts @@ -6,7 +6,7 @@ import {TableCursor} from './table-cursor' export interface QueryParams { index?: string - scope?: NameType + scope?: NameType | number key_type?: keyof API.v1.TableIndexTypes json?: boolean from?: API.v1.TableIndexType | string | number @@ -29,6 +29,7 @@ interface TableParams { rowType?: TableRow fieldToIndex?: FieldToIndex defaultRowLimit?: number + defaultScope?: NameType } export interface GetTableRowsOptions { @@ -52,6 +53,7 @@ export class Table { private fieldToIndex?: any + public defaultScope?: NameType public defaultRowLimit = 1000 /** @@ -77,6 +79,7 @@ export class Table { throw new Error(`Table ${this.name} not found in ABI`) } this.tableABI = tableABI + this.defaultScope = args.defaultScope } /** @@ -110,7 +113,10 @@ export class Table { // Table query table: this.name, code: this.account, - scope: params.scope || this.account, + scope: + params.scope !== undefined + ? String(params.scope) + : this.defaultScope || this.account, // Response typing type: this.rowType, // Filtering @@ -151,7 +157,10 @@ export class Table { const tableRowsParams = { table: this.name, code: this.account, - scope: params.scope || this.account, + scope: + params.scope !== undefined + ? String(params.scope) + : this.defaultScope || this.account, type: this.rowType!, limit: 1, lower_bound: wrapIndexValue(value), diff --git a/test/data/abis/eosio.json b/test/data/abis/eosio.json new file mode 100644 index 0000000..71e4704 --- /dev/null +++ b/test/data/abis/eosio.json @@ -0,0 +1,2566 @@ +{ + "version": "eosio::abi/1.2", + "types": [ + { + "new_type_name": "block_signing_authority", + "type": "variant_block_signing_authority_v0" + }, + { + "new_type_name": "blockchain_parameters_t", + "type": "blockchain_parameters_v1" + } + ], + "structs": [ + { + "name": "abi_hash", + "base": "", + "fields": [ + { + "name": "owner", + "type": "name" + }, + { + "name": "hash", + "type": "checksum256" + } + ] + }, + { + "name": "activate", + "base": "", + "fields": [ + { + "name": "feature_digest", + "type": "checksum256" + } + ] + }, + { + "name": "authority", + "base": "", + "fields": [ + { + "name": "threshold", + "type": "uint32" + }, + { + "name": "keys", + "type": "key_weight[]" + }, + { + "name": "accounts", + "type": "permission_level_weight[]" + }, + { + "name": "waits", + "type": "wait_weight[]" + } + ] + }, + { + "name": "bid_refund", + "base": "", + "fields": [ + { + "name": "bidder", + "type": "name" + }, + { + "name": "amount", + "type": "asset" + } + ] + }, + { + "name": "bidname", + "base": "", + "fields": [ + { + "name": "bidder", + "type": "name" + }, + { + "name": "newname", + "type": "name" + }, + { + "name": "bid", + "type": "asset" + } + ] + }, + { + "name": "bidrefund", + "base": "", + "fields": [ + { + "name": "bidder", + "type": "name" + }, + { + "name": "newname", + "type": "name" + } + ] + }, + { + "name": "block_header", + "base": "", + "fields": [ + { + "name": "timestamp", + "type": "uint32" + }, + { + "name": "producer", + "type": "name" + }, + { + "name": "confirmed", + "type": "uint16" + }, + { + "name": "previous", + "type": "checksum256" + }, + { + "name": "transaction_mroot", + "type": "checksum256" + }, + { + "name": "action_mroot", + "type": "checksum256" + }, + { + "name": "schedule_version", + "type": "uint32" + }, + { + "name": "new_producers", + "type": "producer_schedule?" + } + ] + }, + { + "name": "block_info_record", + "base": "", + "fields": [ + { + "name": "version", + "type": "uint8" + }, + { + "name": "block_height", + "type": "uint32" + }, + { + "name": "block_timestamp", + "type": "time_point" + } + ] + }, + { + "name": "block_signing_authority_v0", + "base": "", + "fields": [ + { + "name": "threshold", + "type": "uint32" + }, + { + "name": "keys", + "type": "key_weight[]" + } + ] + }, + { + "name": "blockchain_parameters", + "base": "", + "fields": [ + { + "name": "max_block_net_usage", + "type": "uint64" + }, + { + "name": "target_block_net_usage_pct", + "type": "uint32" + }, + { + "name": "max_transaction_net_usage", + "type": "uint32" + }, + { + "name": "base_per_transaction_net_usage", + "type": "uint32" + }, + { + "name": "net_usage_leeway", + "type": "uint32" + }, + { + "name": "context_free_discount_net_usage_num", + "type": "uint32" + }, + { + "name": "context_free_discount_net_usage_den", + "type": "uint32" + }, + { + "name": "max_block_cpu_usage", + "type": "uint32" + }, + { + "name": "target_block_cpu_usage_pct", + "type": "uint32" + }, + { + "name": "max_transaction_cpu_usage", + "type": "uint32" + }, + { + "name": "min_transaction_cpu_usage", + "type": "uint32" + }, + { + "name": "max_transaction_lifetime", + "type": "uint32" + }, + { + "name": "deferred_trx_expiration_window", + "type": "uint32" + }, + { + "name": "max_transaction_delay", + "type": "uint32" + }, + { + "name": "max_inline_action_size", + "type": "uint32" + }, + { + "name": "max_inline_action_depth", + "type": "uint16" + }, + { + "name": "max_authority_depth", + "type": "uint16" + } + ] + }, + { + "name": "blockchain_parameters_v1", + "base": "blockchain_parameters", + "fields": [ + { + "name": "max_action_return_value_size", + "type": "uint32$" + } + ] + }, + { + "name": "buyram", + "base": "", + "fields": [ + { + "name": "payer", + "type": "name" + }, + { + "name": "receiver", + "type": "name" + }, + { + "name": "quant", + "type": "asset" + } + ] + }, + { + "name": "buyrambytes", + "base": "", + "fields": [ + { + "name": "payer", + "type": "name" + }, + { + "name": "receiver", + "type": "name" + }, + { + "name": "bytes", + "type": "uint32" + } + ] + }, + { + "name": "buyrex", + "base": "", + "fields": [ + { + "name": "from", + "type": "name" + }, + { + "name": "amount", + "type": "asset" + } + ] + }, + { + "name": "canceldelay", + "base": "", + "fields": [ + { + "name": "canceling_auth", + "type": "permission_level" + }, + { + "name": "trx_id", + "type": "checksum256" + } + ] + }, + { + "name": "cfgpowerup", + "base": "", + "fields": [ + { + "name": "args", + "type": "powerup_config" + } + ] + }, + { + "name": "claimrewards", + "base": "", + "fields": [ + { + "name": "owner", + "type": "name" + } + ] + }, + { + "name": "closerex", + "base": "", + "fields": [ + { + "name": "owner", + "type": "name" + } + ] + }, + { + "name": "cnclrexorder", + "base": "", + "fields": [ + { + "name": "owner", + "type": "name" + } + ] + }, + { + "name": "connector", + "base": "", + "fields": [ + { + "name": "balance", + "type": "asset" + }, + { + "name": "weight", + "type": "float64" + } + ] + }, + { + "name": "consolidate", + "base": "", + "fields": [ + { + "name": "owner", + "type": "name" + } + ] + }, + { + "name": "defcpuloan", + "base": "", + "fields": [ + { + "name": "from", + "type": "name" + }, + { + "name": "loan_num", + "type": "uint64" + }, + { + "name": "amount", + "type": "asset" + } + ] + }, + { + "name": "defnetloan", + "base": "", + "fields": [ + { + "name": "from", + "type": "name" + }, + { + "name": "loan_num", + "type": "uint64" + }, + { + "name": "amount", + "type": "asset" + } + ] + }, + { + "name": "delegatebw", + "base": "", + "fields": [ + { + "name": "from", + "type": "name" + }, + { + "name": "receiver", + "type": "name" + }, + { + "name": "stake_net_quantity", + "type": "asset" + }, + { + "name": "stake_cpu_quantity", + "type": "asset" + }, + { + "name": "transfer", + "type": "bool" + } + ] + }, + { + "name": "delegated_bandwidth", + "base": "", + "fields": [ + { + "name": "from", + "type": "name" + }, + { + "name": "to", + "type": "name" + }, + { + "name": "net_weight", + "type": "asset" + }, + { + "name": "cpu_weight", + "type": "asset" + } + ] + }, + { + "name": "deleteauth", + "base": "", + "fields": [ + { + "name": "account", + "type": "name" + }, + { + "name": "permission", + "type": "name" + }, + { + "name": "authorized_by", + "type": "name$" + } + ] + }, + { + "name": "deposit", + "base": "", + "fields": [ + { + "name": "owner", + "type": "name" + }, + { + "name": "amount", + "type": "asset" + } + ] + }, + { + "name": "eosio_global_state", + "base": "blockchain_parameters", + "fields": [ + { + "name": "max_ram_size", + "type": "uint64" + }, + { + "name": "total_ram_bytes_reserved", + "type": "uint64" + }, + { + "name": "total_ram_stake", + "type": "int64" + }, + { + "name": "last_producer_schedule_update", + "type": "block_timestamp_type" + }, + { + "name": "last_pervote_bucket_fill", + "type": "time_point" + }, + { + "name": "pervote_bucket", + "type": "int64" + }, + { + "name": "perblock_bucket", + "type": "int64" + }, + { + "name": "total_unpaid_blocks", + "type": "uint32" + }, + { + "name": "total_activated_stake", + "type": "int64" + }, + { + "name": "thresh_activated_stake_time", + "type": "time_point" + }, + { + "name": "last_producer_schedule_size", + "type": "uint16" + }, + { + "name": "total_producer_vote_weight", + "type": "float64" + }, + { + "name": "last_name_close", + "type": "block_timestamp_type" + } + ] + }, + { + "name": "eosio_global_state2", + "base": "", + "fields": [ + { + "name": "new_ram_per_block", + "type": "uint16" + }, + { + "name": "last_ram_increase", + "type": "block_timestamp_type" + }, + { + "name": "last_block_num", + "type": "block_timestamp_type" + }, + { + "name": "total_producer_votepay_share", + "type": "float64" + }, + { + "name": "revision", + "type": "uint8" + } + ] + }, + { + "name": "eosio_global_state3", + "base": "", + "fields": [ + { + "name": "last_vpay_state_update", + "type": "time_point" + }, + { + "name": "total_vpay_share_change_rate", + "type": "float64" + } + ] + }, + { + "name": "eosio_global_state4", + "base": "", + "fields": [ + { + "name": "continuous_rate", + "type": "float64" + }, + { + "name": "inflation_pay_factor", + "type": "int64" + }, + { + "name": "votepay_factor", + "type": "int64" + } + ] + }, + { + "name": "exchange_state", + "base": "", + "fields": [ + { + "name": "supply", + "type": "asset" + }, + { + "name": "base", + "type": "connector" + }, + { + "name": "quote", + "type": "connector" + } + ] + }, + { + "name": "fundcpuloan", + "base": "", + "fields": [ + { + "name": "from", + "type": "name" + }, + { + "name": "loan_num", + "type": "uint64" + }, + { + "name": "payment", + "type": "asset" + } + ] + }, + { + "name": "fundnetloan", + "base": "", + "fields": [ + { + "name": "from", + "type": "name" + }, + { + "name": "loan_num", + "type": "uint64" + }, + { + "name": "payment", + "type": "asset" + } + ] + }, + { + "name": "init", + "base": "", + "fields": [ + { + "name": "version", + "type": "varuint32" + }, + { + "name": "core", + "type": "symbol" + } + ] + }, + { + "name": "key_weight", + "base": "", + "fields": [ + { + "name": "key", + "type": "public_key" + }, + { + "name": "weight", + "type": "uint16" + } + ] + }, + { + "name": "limitauthchg", + "base": "", + "fields": [ + { + "name": "account", + "type": "name" + }, + { + "name": "allow_perms", + "type": "name[]" + }, + { + "name": "disallow_perms", + "type": "name[]" + } + ] + }, + { + "name": "linkauth", + "base": "", + "fields": [ + { + "name": "account", + "type": "name" + }, + { + "name": "code", + "type": "name" + }, + { + "name": "type", + "type": "name" + }, + { + "name": "requirement", + "type": "name" + }, + { + "name": "authorized_by", + "type": "name$" + } + ] + }, + { + "name": "mvfrsavings", + "base": "", + "fields": [ + { + "name": "owner", + "type": "name" + }, + { + "name": "rex", + "type": "asset" + } + ] + }, + { + "name": "mvtosavings", + "base": "", + "fields": [ + { + "name": "owner", + "type": "name" + }, + { + "name": "rex", + "type": "asset" + } + ] + }, + { + "name": "name_bid", + "base": "", + "fields": [ + { + "name": "newname", + "type": "name" + }, + { + "name": "high_bidder", + "type": "name" + }, + { + "name": "high_bid", + "type": "int64" + }, + { + "name": "last_bid_time", + "type": "time_point" + } + ] + }, + { + "name": "newaccount", + "base": "", + "fields": [ + { + "name": "creator", + "type": "name" + }, + { + "name": "name", + "type": "name" + }, + { + "name": "owner", + "type": "authority" + }, + { + "name": "active", + "type": "authority" + } + ] + }, + { + "name": "onblock", + "base": "", + "fields": [ + { + "name": "header", + "type": "block_header" + } + ] + }, + { + "name": "onerror", + "base": "", + "fields": [ + { + "name": "sender_id", + "type": "uint128" + }, + { + "name": "sent_trx", + "type": "bytes" + } + ] + }, + { + "name": "pair_time_point_sec_int64", + "base": "", + "fields": [ + { + "name": "first", + "type": "time_point_sec" + }, + { + "name": "second", + "type": "int64" + } + ] + }, + { + "name": "permission_level", + "base": "", + "fields": [ + { + "name": "actor", + "type": "name" + }, + { + "name": "permission", + "type": "name" + } + ] + }, + { + "name": "permission_level_weight", + "base": "", + "fields": [ + { + "name": "permission", + "type": "permission_level" + }, + { + "name": "weight", + "type": "uint16" + } + ] + }, + { + "name": "powerup", + "base": "", + "fields": [ + { + "name": "payer", + "type": "name" + }, + { + "name": "receiver", + "type": "name" + }, + { + "name": "days", + "type": "uint32" + }, + { + "name": "net_frac", + "type": "int64" + }, + { + "name": "cpu_frac", + "type": "int64" + }, + { + "name": "max_payment", + "type": "asset" + } + ] + }, + { + "name": "powerup_config", + "base": "", + "fields": [ + { + "name": "net", + "type": "powerup_config_resource" + }, + { + "name": "cpu", + "type": "powerup_config_resource" + }, + { + "name": "powerup_days", + "type": "uint32?" + }, + { + "name": "min_powerup_fee", + "type": "asset?" + } + ] + }, + { + "name": "powerup_config_resource", + "base": "", + "fields": [ + { + "name": "current_weight_ratio", + "type": "int64?" + }, + { + "name": "target_weight_ratio", + "type": "int64?" + }, + { + "name": "assumed_stake_weight", + "type": "int64?" + }, + { + "name": "target_timestamp", + "type": "time_point_sec?" + }, + { + "name": "exponent", + "type": "float64?" + }, + { + "name": "decay_secs", + "type": "uint32?" + }, + { + "name": "min_price", + "type": "asset?" + }, + { + "name": "max_price", + "type": "asset?" + } + ] + }, + { + "name": "powerup_order", + "base": "", + "fields": [ + { + "name": "version", + "type": "uint8" + }, + { + "name": "id", + "type": "uint64" + }, + { + "name": "owner", + "type": "name" + }, + { + "name": "net_weight", + "type": "int64" + }, + { + "name": "cpu_weight", + "type": "int64" + }, + { + "name": "expires", + "type": "time_point_sec" + } + ] + }, + { + "name": "powerup_state", + "base": "", + "fields": [ + { + "name": "version", + "type": "uint8" + }, + { + "name": "net", + "type": "powerup_state_resource" + }, + { + "name": "cpu", + "type": "powerup_state_resource" + }, + { + "name": "powerup_days", + "type": "uint32" + }, + { + "name": "min_powerup_fee", + "type": "asset" + } + ] + }, + { + "name": "powerup_state_resource", + "base": "", + "fields": [ + { + "name": "version", + "type": "uint8" + }, + { + "name": "weight", + "type": "int64" + }, + { + "name": "weight_ratio", + "type": "int64" + }, + { + "name": "assumed_stake_weight", + "type": "int64" + }, + { + "name": "initial_weight_ratio", + "type": "int64" + }, + { + "name": "target_weight_ratio", + "type": "int64" + }, + { + "name": "initial_timestamp", + "type": "time_point_sec" + }, + { + "name": "target_timestamp", + "type": "time_point_sec" + }, + { + "name": "exponent", + "type": "float64" + }, + { + "name": "decay_secs", + "type": "uint32" + }, + { + "name": "min_price", + "type": "asset" + }, + { + "name": "max_price", + "type": "asset" + }, + { + "name": "utilization", + "type": "int64" + }, + { + "name": "adjusted_utilization", + "type": "int64" + }, + { + "name": "utilization_timestamp", + "type": "time_point_sec" + } + ] + }, + { + "name": "powerupexec", + "base": "", + "fields": [ + { + "name": "user", + "type": "name" + }, + { + "name": "max", + "type": "uint16" + } + ] + }, + { + "name": "producer_info", + "base": "", + "fields": [ + { + "name": "owner", + "type": "name" + }, + { + "name": "total_votes", + "type": "float64" + }, + { + "name": "producer_key", + "type": "public_key" + }, + { + "name": "is_active", + "type": "bool" + }, + { + "name": "url", + "type": "string" + }, + { + "name": "unpaid_blocks", + "type": "uint32" + }, + { + "name": "last_claim_time", + "type": "time_point" + }, + { + "name": "location", + "type": "uint16" + }, + { + "name": "producer_authority", + "type": "block_signing_authority$" + } + ] + }, + { + "name": "producer_info2", + "base": "", + "fields": [ + { + "name": "owner", + "type": "name" + }, + { + "name": "votepay_share", + "type": "float64" + }, + { + "name": "last_votepay_share_update", + "type": "time_point" + } + ] + }, + { + "name": "producer_key", + "base": "", + "fields": [ + { + "name": "producer_name", + "type": "name" + }, + { + "name": "block_signing_key", + "type": "public_key" + } + ] + }, + { + "name": "producer_schedule", + "base": "", + "fields": [ + { + "name": "version", + "type": "uint32" + }, + { + "name": "producers", + "type": "producer_key[]" + } + ] + }, + { + "name": "refund", + "base": "", + "fields": [ + { + "name": "owner", + "type": "name" + } + ] + }, + { + "name": "refund_request", + "base": "", + "fields": [ + { + "name": "owner", + "type": "name" + }, + { + "name": "request_time", + "type": "time_point_sec" + }, + { + "name": "net_amount", + "type": "asset" + }, + { + "name": "cpu_amount", + "type": "asset" + } + ] + }, + { + "name": "regproducer", + "base": "", + "fields": [ + { + "name": "producer", + "type": "name" + }, + { + "name": "producer_key", + "type": "public_key" + }, + { + "name": "url", + "type": "string" + }, + { + "name": "location", + "type": "uint16" + } + ] + }, + { + "name": "regproducer2", + "base": "", + "fields": [ + { + "name": "producer", + "type": "name" + }, + { + "name": "producer_authority", + "type": "block_signing_authority" + }, + { + "name": "url", + "type": "string" + }, + { + "name": "location", + "type": "uint16" + } + ] + }, + { + "name": "regproxy", + "base": "", + "fields": [ + { + "name": "proxy", + "type": "name" + }, + { + "name": "isproxy", + "type": "bool" + } + ] + }, + { + "name": "rentcpu", + "base": "", + "fields": [ + { + "name": "from", + "type": "name" + }, + { + "name": "receiver", + "type": "name" + }, + { + "name": "loan_payment", + "type": "asset" + }, + { + "name": "loan_fund", + "type": "asset" + } + ] + }, + { + "name": "rentnet", + "base": "", + "fields": [ + { + "name": "from", + "type": "name" + }, + { + "name": "receiver", + "type": "name" + }, + { + "name": "loan_payment", + "type": "asset" + }, + { + "name": "loan_fund", + "type": "asset" + } + ] + }, + { + "name": "rex_balance", + "base": "", + "fields": [ + { + "name": "version", + "type": "uint8" + }, + { + "name": "owner", + "type": "name" + }, + { + "name": "vote_stake", + "type": "asset" + }, + { + "name": "rex_balance", + "type": "asset" + }, + { + "name": "matured_rex", + "type": "int64" + }, + { + "name": "rex_maturities", + "type": "pair_time_point_sec_int64[]" + } + ] + }, + { + "name": "rex_fund", + "base": "", + "fields": [ + { + "name": "version", + "type": "uint8" + }, + { + "name": "owner", + "type": "name" + }, + { + "name": "balance", + "type": "asset" + } + ] + }, + { + "name": "rex_loan", + "base": "", + "fields": [ + { + "name": "version", + "type": "uint8" + }, + { + "name": "from", + "type": "name" + }, + { + "name": "receiver", + "type": "name" + }, + { + "name": "payment", + "type": "asset" + }, + { + "name": "balance", + "type": "asset" + }, + { + "name": "total_staked", + "type": "asset" + }, + { + "name": "loan_num", + "type": "uint64" + }, + { + "name": "expiration", + "type": "time_point" + } + ] + }, + { + "name": "rex_order", + "base": "", + "fields": [ + { + "name": "version", + "type": "uint8" + }, + { + "name": "owner", + "type": "name" + }, + { + "name": "rex_requested", + "type": "asset" + }, + { + "name": "proceeds", + "type": "asset" + }, + { + "name": "stake_change", + "type": "asset" + }, + { + "name": "order_time", + "type": "time_point" + }, + { + "name": "is_open", + "type": "bool" + } + ] + }, + { + "name": "rex_pool", + "base": "", + "fields": [ + { + "name": "version", + "type": "uint8" + }, + { + "name": "total_lent", + "type": "asset" + }, + { + "name": "total_unlent", + "type": "asset" + }, + { + "name": "total_rent", + "type": "asset" + }, + { + "name": "total_lendable", + "type": "asset" + }, + { + "name": "total_rex", + "type": "asset" + }, + { + "name": "namebid_proceeds", + "type": "asset" + }, + { + "name": "loan_num", + "type": "uint64" + } + ] + }, + { + "name": "rex_return_buckets", + "base": "", + "fields": [ + { + "name": "version", + "type": "uint8" + }, + { + "name": "return_buckets", + "type": "pair_time_point_sec_int64[]" + } + ] + }, + { + "name": "rex_return_pool", + "base": "", + "fields": [ + { + "name": "version", + "type": "uint8" + }, + { + "name": "last_dist_time", + "type": "time_point_sec" + }, + { + "name": "pending_bucket_time", + "type": "time_point_sec" + }, + { + "name": "oldest_bucket_time", + "type": "time_point_sec" + }, + { + "name": "pending_bucket_proceeds", + "type": "int64" + }, + { + "name": "current_rate_of_increase", + "type": "int64" + }, + { + "name": "proceeds", + "type": "int64" + } + ] + }, + { + "name": "rexexec", + "base": "", + "fields": [ + { + "name": "user", + "type": "name" + }, + { + "name": "max", + "type": "uint16" + } + ] + }, + { + "name": "rmvproducer", + "base": "", + "fields": [ + { + "name": "producer", + "type": "name" + } + ] + }, + { + "name": "sellram", + "base": "", + "fields": [ + { + "name": "account", + "type": "name" + }, + { + "name": "bytes", + "type": "int64" + } + ] + }, + { + "name": "sellrex", + "base": "", + "fields": [ + { + "name": "from", + "type": "name" + }, + { + "name": "rex", + "type": "asset" + } + ] + }, + { + "name": "setabi", + "base": "", + "fields": [ + { + "name": "account", + "type": "name" + }, + { + "name": "abi", + "type": "bytes" + }, + { + "name": "memo", + "type": "string$" + } + ] + }, + { + "name": "setacctcpu", + "base": "", + "fields": [ + { + "name": "account", + "type": "name" + }, + { + "name": "cpu_weight", + "type": "int64?" + } + ] + }, + { + "name": "setacctnet", + "base": "", + "fields": [ + { + "name": "account", + "type": "name" + }, + { + "name": "net_weight", + "type": "int64?" + } + ] + }, + { + "name": "setacctram", + "base": "", + "fields": [ + { + "name": "account", + "type": "name" + }, + { + "name": "ram_bytes", + "type": "int64?" + } + ] + }, + { + "name": "setalimits", + "base": "", + "fields": [ + { + "name": "account", + "type": "name" + }, + { + "name": "ram_bytes", + "type": "int64" + }, + { + "name": "net_weight", + "type": "int64" + }, + { + "name": "cpu_weight", + "type": "int64" + } + ] + }, + { + "name": "setcode", + "base": "", + "fields": [ + { + "name": "account", + "type": "name" + }, + { + "name": "vmtype", + "type": "uint8" + }, + { + "name": "vmversion", + "type": "uint8" + }, + { + "name": "code", + "type": "bytes" + }, + { + "name": "memo", + "type": "string$" + } + ] + }, + { + "name": "setinflation", + "base": "", + "fields": [ + { + "name": "annual_rate", + "type": "int64" + }, + { + "name": "inflation_pay_factor", + "type": "int64" + }, + { + "name": "votepay_factor", + "type": "int64" + } + ] + }, + { + "name": "setparams", + "base": "", + "fields": [ + { + "name": "params", + "type": "blockchain_parameters_t" + } + ] + }, + { + "name": "setpriv", + "base": "", + "fields": [ + { + "name": "account", + "type": "name" + }, + { + "name": "is_priv", + "type": "uint8" + } + ] + }, + { + "name": "setram", + "base": "", + "fields": [ + { + "name": "max_ram_size", + "type": "uint64" + } + ] + }, + { + "name": "setramrate", + "base": "", + "fields": [ + { + "name": "bytes_per_block", + "type": "uint16" + } + ] + }, + { + "name": "setrex", + "base": "", + "fields": [ + { + "name": "balance", + "type": "asset" + } + ] + }, + { + "name": "undelegatebw", + "base": "", + "fields": [ + { + "name": "from", + "type": "name" + }, + { + "name": "receiver", + "type": "name" + }, + { + "name": "unstake_net_quantity", + "type": "asset" + }, + { + "name": "unstake_cpu_quantity", + "type": "asset" + } + ] + }, + { + "name": "unlinkauth", + "base": "", + "fields": [ + { + "name": "account", + "type": "name" + }, + { + "name": "code", + "type": "name" + }, + { + "name": "type", + "type": "name" + }, + { + "name": "authorized_by", + "type": "name$" + } + ] + }, + { + "name": "unregprod", + "base": "", + "fields": [ + { + "name": "producer", + "type": "name" + } + ] + }, + { + "name": "unstaketorex", + "base": "", + "fields": [ + { + "name": "owner", + "type": "name" + }, + { + "name": "receiver", + "type": "name" + }, + { + "name": "from_net", + "type": "asset" + }, + { + "name": "from_cpu", + "type": "asset" + } + ] + }, + { + "name": "updateauth", + "base": "", + "fields": [ + { + "name": "account", + "type": "name" + }, + { + "name": "permission", + "type": "name" + }, + { + "name": "parent", + "type": "name" + }, + { + "name": "auth", + "type": "authority" + }, + { + "name": "authorized_by", + "type": "name$" + } + ] + }, + { + "name": "updaterex", + "base": "", + "fields": [ + { + "name": "owner", + "type": "name" + } + ] + }, + { + "name": "updtrevision", + "base": "", + "fields": [ + { + "name": "revision", + "type": "uint8" + } + ] + }, + { + "name": "user_resources", + "base": "", + "fields": [ + { + "name": "owner", + "type": "name" + }, + { + "name": "net_weight", + "type": "asset" + }, + { + "name": "cpu_weight", + "type": "asset" + }, + { + "name": "ram_bytes", + "type": "int64" + } + ] + }, + { + "name": "voteproducer", + "base": "", + "fields": [ + { + "name": "voter", + "type": "name" + }, + { + "name": "proxy", + "type": "name" + }, + { + "name": "producers", + "type": "name[]" + } + ] + }, + { + "name": "voter_info", + "base": "", + "fields": [ + { + "name": "owner", + "type": "name" + }, + { + "name": "proxy", + "type": "name" + }, + { + "name": "producers", + "type": "name[]" + }, + { + "name": "staked", + "type": "int64" + }, + { + "name": "last_vote_weight", + "type": "float64" + }, + { + "name": "proxied_vote_weight", + "type": "float64" + }, + { + "name": "is_proxy", + "type": "bool" + }, + { + "name": "flags1", + "type": "uint32" + }, + { + "name": "reserved2", + "type": "uint32" + }, + { + "name": "reserved3", + "type": "asset" + } + ] + }, + { + "name": "voteupdate", + "base": "", + "fields": [ + { + "name": "voter_name", + "type": "name" + } + ] + }, + { + "name": "wait_weight", + "base": "", + "fields": [ + { + "name": "wait_sec", + "type": "uint32" + }, + { + "name": "weight", + "type": "uint16" + } + ] + }, + { + "name": "wasmcfg", + "base": "", + "fields": [ + { + "name": "settings", + "type": "name" + } + ] + }, + { + "name": "withdraw", + "base": "", + "fields": [ + { + "name": "owner", + "type": "name" + }, + { + "name": "amount", + "type": "asset" + } + ] + }, + { + "name": "limit_auth_change", + "base": "", + "fields": [ + { + "name": "version", + "type": "uint8" + }, + { + "name": "account", + "type": "name" + }, + { + "name": "allow_perms", + "type": "name[]" + }, + { + "name": "disallow_perms", + "type": "name[]" + } + ] + } + ], + "actions": [ + { + "name": "activate", + "type": "activate", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Activate Protocol Feature\nsummary: 'Activate protocol feature {{nowrap feature_digest}}'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/admin.png#9bf1cec664863bd6aaac0f814b235f8799fb02c850e9aa5da34e8a004bd6518e\n---\n\n{{$action.account}} activates the protocol feature with a digest of {{feature_digest}}." + }, + { + "name": "bidname", + "type": "bidname", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Bid On a Premium Account Name\nsummary: '{{nowrap bidder}} bids on the premium account name {{nowrap newname}}'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/account.png#3d55a2fc3a5c20b456f5657faf666bc25ffd06f4836c5e8256f741149b0b294f\n---\n\n{{bidder}} bids {{bid}} on an auction to own the premium account name {{newname}}.\n\n{{bidder}} transfers {{bid}} to the system to cover the cost of the bid, which will be returned to {{bidder}} only if {{bidder}} is later outbid in the auction for {{newname}} by another account.\n\nIf the auction for {{newname}} closes with {{bidder}} remaining as the highest bidder, {{bidder}} will be authorized to create the account with name {{newname}}.\n\n## Bid refund behavior\n\nIf {{bidder}}’s bid on {{newname}} is later outbid by another account, {{bidder}} will be able to claim back the transferred amount of {{bid}}. The system will attempt to automatically do this on behalf of {{bidder}}, but the automatic refund may occasionally fail which will then require {{bidder}} to manually claim the refund with the bidrefund action.\n\n## Auction close criteria\n\nThe system should automatically close the auction for {{newname}} if it satisfies the condition that over a period of two minutes the following two properties continuously hold:\n\n- no one has bid on {{newname}} within the last 24 hours;\n- and, the value of the latest bid on {{newname}} is greater than the value of the bids on each of the other open auctions.\n\nBe aware that the condition to close the auction described above are sufficient but not necessary. The auction for {{newname}} cannot close unless both of the properties are simultaneously satisfied, but it may be closed without requiring the properties to hold for a period of 2 minutes." + }, + { + "name": "bidrefund", + "type": "bidrefund", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Claim Refund on Name Bid\nsummary: 'Claim refund on {{nowrap newname}} bid'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/account.png#3d55a2fc3a5c20b456f5657faf666bc25ffd06f4836c5e8256f741149b0b294f\n---\n\n{{bidder}} claims refund on {{newname}} bid after being outbid by someone else." + }, + { + "name": "buyram", + "type": "buyram", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Buy RAM\nsummary: '{{nowrap payer}} buys RAM on behalf of {{nowrap receiver}} by paying {{nowrap quant}}'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/resource.png#3830f1ce8cb07f7757dbcf383b1ec1b11914ac34a1f9d8b065f07600fa9dac19\n---\n\n{{payer}} buys RAM on behalf of {{receiver}} by paying {{quant}}. This transaction will incur a 0.5% fee out of {{quant}} and the amount of RAM delivered will depend on market rates." + }, + { + "name": "buyrambytes", + "type": "buyrambytes", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Buy RAM\nsummary: '{{nowrap payer}} buys {{nowrap bytes}} bytes of RAM on behalf of {{nowrap receiver}}'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/resource.png#3830f1ce8cb07f7757dbcf383b1ec1b11914ac34a1f9d8b065f07600fa9dac19\n---\n\n{{payer}} buys approximately {{bytes}} bytes of RAM on behalf of {{receiver}} by paying market rates for RAM. This transaction will incur a 0.5% fee and the cost will depend on market rates." + }, + { + "name": "buyrex", + "type": "buyrex", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Buy REX Tokens\nsummary: '{{nowrap from}} buys REX tokens in exchange for {{nowrap amount}} and their vote stake increases by {{nowrap amount}}'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/rex.png#d229837fa62a464b9c71e06060aa86179adf0b3f4e3b8c4f9702f4f4b0c340a8\n---\n\n{{amount}} is taken out of {{from}}’s REX fund and used to purchase REX tokens at the current market exchange rate. In order for the action to succeed, {{from}} must have voted for a proxy or at least 21 block producers. {{amount}} is added to {{from}}’s vote stake.\n\nA sell order of the purchased amount can only be initiated after waiting for the maturity period of 4 to 5 days to pass. Even then, depending on the market conditions, the initiated sell order may not be executed immediately." + }, + { + "name": "canceldelay", + "type": "canceldelay", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Cancel Delayed Transaction\nsummary: '{{nowrap canceling_auth.actor}} cancels a delayed transaction'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/account.png#3d55a2fc3a5c20b456f5657faf666bc25ffd06f4836c5e8256f741149b0b294f\n---\n\n{{canceling_auth.actor}} cancels the delayed transaction with id {{trx_id}}." + }, + { + "name": "cfgpowerup", + "type": "cfgpowerup", + "ricardian_contract": "" + }, + { + "name": "claimrewards", + "type": "claimrewards", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Claim Block Producer Rewards\nsummary: '{{nowrap owner}} claims block and vote rewards'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/admin.png#9bf1cec664863bd6aaac0f814b235f8799fb02c850e9aa5da34e8a004bd6518e\n---\n\n{{owner}} claims block and vote rewards from the system." + }, + { + "name": "closerex", + "type": "closerex", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Cleanup Unused REX Data\nsummary: 'Delete REX related DB entries and free associated RAM'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/rex.png#d229837fa62a464b9c71e06060aa86179adf0b3f4e3b8c4f9702f4f4b0c340a8\n---\n\nDelete REX related DB entries and free associated RAM for {{owner}}.\n\nTo fully delete all REX related DB entries, {{owner}} must ensure that their REX balance and REX fund amounts are both zero and they have no outstanding loans." + }, + { + "name": "cnclrexorder", + "type": "cnclrexorder", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Cancel Scheduled REX Sell Order\nsummary: '{{nowrap owner}} cancels a scheduled sell order if not yet filled'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/rex.png#d229837fa62a464b9c71e06060aa86179adf0b3f4e3b8c4f9702f4f4b0c340a8\n---\n\n{{owner}} cancels their open sell order." + }, + { + "name": "consolidate", + "type": "consolidate", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Consolidate REX Maturity Buckets Into One\nsummary: 'Consolidate REX maturity buckets into one'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/rex.png#d229837fa62a464b9c71e06060aa86179adf0b3f4e3b8c4f9702f4f4b0c340a8\n---\n\nConsolidate REX maturity buckets into one bucket that {{owner}} will not be able to sell until 4 to 5 days later." + }, + { + "name": "defcpuloan", + "type": "defcpuloan", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Withdraw from the Fund of a Specific CPU Loan\nsummary: '{{nowrap from}} transfers {{nowrap amount}} from the fund of CPU loan number {{nowrap loan_num}} back to REX fund'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/rex.png#d229837fa62a464b9c71e06060aa86179adf0b3f4e3b8c4f9702f4f4b0c340a8\n---\n\n{{from}} transfers {{amount}} from the fund of CPU loan number {{loan_num}} back to REX fund." + }, + { + "name": "defnetloan", + "type": "defnetloan", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Withdraw from the Fund of a Specific NET Loan\nsummary: '{{nowrap from}} transfers {{nowrap amount}} from the fund of NET loan number {{nowrap loan_num}} back to REX fund'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/rex.png#d229837fa62a464b9c71e06060aa86179adf0b3f4e3b8c4f9702f4f4b0c340a8\n---\n\n{{from}} transfers {{amount}} from the fund of NET loan number {{loan_num}} back to REX fund." + }, + { + "name": "delegatebw", + "type": "delegatebw", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Stake Tokens for NET and/or CPU\nsummary: 'Stake tokens for NET and/or CPU and optionally transfer ownership'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/resource.png#3830f1ce8cb07f7757dbcf383b1ec1b11914ac34a1f9d8b065f07600fa9dac19\n---\n\n{{#if transfer}} {{from}} stakes on behalf of {{receiver}} {{stake_net_quantity}} for NET bandwidth and {{stake_cpu_quantity}} for CPU bandwidth.\n\nStaked tokens will also be transferred to {{receiver}}. The sum of these two quantities will be deducted from {{from}}’s liquid balance and add to the vote weight of {{receiver}}.\n{{else}}\n{{from}} stakes to self and delegates to {{receiver}} {{stake_net_quantity}} for NET bandwidth and {{stake_cpu_quantity}} for CPU bandwidth.\n\nThe sum of these two quantities add to the vote weight of {{from}}.\n{{/if}}" + }, + { + "name": "deleteauth", + "type": "deleteauth", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Delete Account Permission\nsummary: 'Delete the {{nowrap permission}} permission of {{nowrap account}}'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/account.png#3d55a2fc3a5c20b456f5657faf666bc25ffd06f4836c5e8256f741149b0b294f\n---\n\nDelete the {{permission}} permission of {{account}}." + }, + { + "name": "deposit", + "type": "deposit", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Deposit Into REX Fund\nsummary: 'Add to {{nowrap owner}}’s REX fund by transferring {{nowrap amount}} from {{nowrap owner}}’s liquid balance'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/rex.png#d229837fa62a464b9c71e06060aa86179adf0b3f4e3b8c4f9702f4f4b0c340a8\n---\n\nTransfer {{amount}} from {{owner}}’s liquid balance to {{owner}}’s REX fund. All proceeds and expenses related to REX are added to or taken out of this fund." + }, + { + "name": "fundcpuloan", + "type": "fundcpuloan", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Deposit into the Fund of a Specific CPU Loan\nsummary: '{{nowrap from}} funds a CPU loan'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/rex.png#d229837fa62a464b9c71e06060aa86179adf0b3f4e3b8c4f9702f4f4b0c340a8\n---\n\n{{from}} transfers {{payment}} from REX fund to the fund of CPU loan number {{loan_num}} in order to be used in loan renewal at expiry. {{from}} can withdraw the total balance of the loan fund at any time." + }, + { + "name": "fundnetloan", + "type": "fundnetloan", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Deposit into the Fund of a Specific NET Loan\nsummary: '{{nowrap from}} funds a NET loan'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/rex.png#d229837fa62a464b9c71e06060aa86179adf0b3f4e3b8c4f9702f4f4b0c340a8\n---\n\n{{from}} transfers {{payment}} from REX fund to the fund of NET loan number {{loan_num}} in order to be used in loan renewal at expiry. {{from}} can withdraw the total balance of the loan fund at any time." + }, + { + "name": "init", + "type": "init", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Initialize System Contract\nsummary: 'Initialize system contract'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/admin.png#9bf1cec664863bd6aaac0f814b235f8799fb02c850e9aa5da34e8a004bd6518e\n---\n\nInitialize system contract. The core token symbol will be set to {{core}}." + }, + { + "name": "limitauthchg", + "type": "limitauthchg", + "ricardian_contract": "" + }, + { + "name": "linkauth", + "type": "linkauth", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Link Action to Permission\nsummary: '{{nowrap account}} sets the minimum required permission for the {{#if type}}{{nowrap type}} action of the{{/if}} {{nowrap code}} contract to {{nowrap requirement}}'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/account.png#3d55a2fc3a5c20b456f5657faf666bc25ffd06f4836c5e8256f741149b0b294f\n---\n\n{{account}} sets the minimum required permission for the {{#if type}}{{type}} action of the{{/if}} {{code}} contract to {{requirement}}.\n\n{{#if type}}{{else}}Any links explicitly associated to specific actions of {{code}} will take precedence.{{/if}}" + }, + { + "name": "mvfrsavings", + "type": "mvfrsavings", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Unlock REX Tokens\nsummary: '{{nowrap owner}} unlocks REX Tokens'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/rex.png#d229837fa62a464b9c71e06060aa86179adf0b3f4e3b8c4f9702f4f4b0c340a8\n---\n\n{{owner}} unlocks {{rex}} by moving it out of the REX savings bucket. The unlocked REX tokens cannot be sold until 4 to 5 days later." + }, + { + "name": "mvtosavings", + "type": "mvtosavings", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Lock REX Tokens\nsummary: '{{nowrap owner}} locks REX Tokens'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/rex.png#d229837fa62a464b9c71e06060aa86179adf0b3f4e3b8c4f9702f4f4b0c340a8\n---\n\n{{owner}} locks {{rex}} by moving it into the REX savings bucket. The locked REX tokens cannot be sold directly and will have to be unlocked explicitly before selling." + }, + { + "name": "newaccount", + "type": "newaccount", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Create New Account\nsummary: '{{nowrap creator}} creates a new account with the name {{nowrap name}}'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/account.png#3d55a2fc3a5c20b456f5657faf666bc25ffd06f4836c5e8256f741149b0b294f\n---\n\n{{creator}} creates a new account with the name {{name}} and the following permissions:\n\nowner permission with authority:\n{{to_json owner}}\n\nactive permission with authority:\n{{to_json active}}" + }, + { + "name": "onblock", + "type": "onblock", + "ricardian_contract": "" + }, + { + "name": "onerror", + "type": "onerror", + "ricardian_contract": "" + }, + { + "name": "powerup", + "type": "powerup", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Powerup resources\nsummary: 'User may powerup to reserve resources'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/resource.png#3830f1ce8cb07f7757dbcf383b1ec1b11914ac34a1f9d8b065f07600fa9dac19\n---\n\nUsers may use the powerup action to reserve resources." + }, + { + "name": "powerupexec", + "type": "powerupexec", + "ricardian_contract": "" + }, + { + "name": "refund", + "type": "refund", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Claim Unstaked Tokens\nsummary: 'Return previously unstaked tokens to {{nowrap owner}}'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/account.png#3d55a2fc3a5c20b456f5657faf666bc25ffd06f4836c5e8256f741149b0b294f\n---\n\nReturn previously unstaked tokens to {{owner}} after the unstaking period has elapsed." + }, + { + "name": "regproducer", + "type": "regproducer", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Register as a Block Producer Candidate\nsummary: 'Register {{nowrap producer}} account as a block producer candidate'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/voting.png#db28cd3db6e62d4509af3644ce7d377329482a14bb4bfaca2aa5f1400d8e8a84\n---\n\nRegister {{producer}} account as a block producer candidate.\n\nURL: {{url}}\nLocation code: {{location}}\nBlock signing key: {{producer_key}}\n\n## Block Producer Agreement\n{{$clauses.BlockProducerAgreement}}" + }, + { + "name": "regproducer2", + "type": "regproducer2", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Register as a Block Producer Candidate\nsummary: 'Register {{nowrap producer}} account as a block producer candidate'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/voting.png#db28cd3db6e62d4509af3644ce7d377329482a14bb4bfaca2aa5f1400d8e8a84\n---\n\nRegister {{producer}} account as a block producer candidate.\n\nURL: {{url}}\nLocation code: {{location}}\nBlock signing authority:\n{{to_json producer_authority}}\n\n## Block Producer Agreement\n{{$clauses.BlockProducerAgreement}}" + }, + { + "name": "regproxy", + "type": "regproxy", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Register/unregister as a Proxy\nsummary: 'Register/unregister {{nowrap proxy}} as a proxy account'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/voting.png#db28cd3db6e62d4509af3644ce7d377329482a14bb4bfaca2aa5f1400d8e8a84\n---\n\n{{#if isproxy}}\n{{proxy}} registers as a proxy that can vote on behalf of accounts that appoint it as their proxy.\n{{else}}\n{{proxy}} unregisters as a proxy that can vote on behalf of accounts that appoint it as their proxy.\n{{/if}}" + }, + { + "name": "rentcpu", + "type": "rentcpu", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Rent CPU Bandwidth for 30 Days\nsummary: '{{nowrap from}} pays {{nowrap loan_payment}} to rent CPU bandwidth for {{nowrap receiver}}'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/rex.png#d229837fa62a464b9c71e06060aa86179adf0b3f4e3b8c4f9702f4f4b0c340a8\n---\n\n{{from}} pays {{loan_payment}} to rent CPU bandwidth on behalf of {{receiver}} for a period of 30 days.\n\n{{loan_payment}} is taken out of {{from}}’s REX fund. The market price determines the number of tokens to be staked to {{receiver}}’s CPU resources. In addition, {{from}} provides {{loan_fund}}, which is also taken out of {{from}}’s REX fund, to be used for automatic renewal of the loan.\n\nAt expiration, if the loan has less funds than {{loan_payment}}, it is closed and lent tokens that have been staked are taken out of {{receiver}}’s CPU bandwidth. Otherwise, it is renewed at the market price at the time of renewal, that is, the number of staked tokens is recalculated and {{receiver}}’s CPU bandwidth is updated accordingly. {{from}} can fund or defund a loan at any time before expiration. When the loan is closed, {{from}} is refunded any tokens remaining in the loan fund." + }, + { + "name": "rentnet", + "type": "rentnet", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Rent NET Bandwidth for 30 Days\nsummary: '{{nowrap from}} pays {{nowrap loan_payment}} to rent NET bandwidth for {{nowrap receiver}}'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/rex.png#d229837fa62a464b9c71e06060aa86179adf0b3f4e3b8c4f9702f4f4b0c340a8\n---\n\n{{from}} pays {{loan_payment}} to rent NET bandwidth on behalf of {{receiver}} for a period of 30 days.\n\n{{loan_payment}} is taken out of {{from}}’s REX fund. The market price determines the number of tokens to be staked to {{receiver}}’s NET resources for 30 days. In addition, {{from}} provides {{loan_fund}}, which is also taken out of {{from}}’s REX fund, to be used for automatic renewal of the loan.\n\nAt expiration, if the loan has less funds than {{loan_payment}}, it is closed and lent tokens that have been staked are taken out of {{receiver}}’s NET bandwidth. Otherwise, it is renewed at the market price at the time of renewal, that is, the number of staked tokens is recalculated and {{receiver}}’s NET bandwidth is updated accordingly. {{from}} can fund or defund a loan at any time before expiration. When the loan is closed, {{from}} is refunded any tokens remaining in the loan fund." + }, + { + "name": "rexexec", + "type": "rexexec", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Perform REX Maintenance\nsummary: 'Process sell orders and expired loans'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/rex.png#d229837fa62a464b9c71e06060aa86179adf0b3f4e3b8c4f9702f4f4b0c340a8\n---\n\nPerforms REX maintenance by processing a maximum of {{max}} REX sell orders and expired loans. Any account can execute this action." + }, + { + "name": "rmvproducer", + "type": "rmvproducer", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Forcibly Unregister a Block Producer Candidate\nsummary: '{{nowrap producer}} is unregistered as a block producer candidate'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/admin.png#9bf1cec664863bd6aaac0f814b235f8799fb02c850e9aa5da34e8a004bd6518e\n---\n\n{{$action.account}} unregisters {{producer}} as a block producer candidate. {{producer}} account will retain its votes and those votes can change based on voter stake changes or votes removed from {{producer}}. However new voters will not be able to vote for {{producer}} while it remains unregistered." + }, + { + "name": "sellram", + "type": "sellram", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Sell RAM From Account\nsummary: 'Sell unused RAM from {{nowrap account}}'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/resource.png#3830f1ce8cb07f7757dbcf383b1ec1b11914ac34a1f9d8b065f07600fa9dac19\n---\n\nSell {{bytes}} bytes of unused RAM from account {{account}} at market price. This transaction will incur a 0.5% fee on the proceeds which depend on market rates." + }, + { + "name": "sellrex", + "type": "sellrex", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Sell REX Tokens in Exchange for EOS\nsummary: '{{nowrap from}} sells {{nowrap rex}} tokens'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/rex.png#d229837fa62a464b9c71e06060aa86179adf0b3f4e3b8c4f9702f4f4b0c340a8\n---\n\n{{from}} initiates a sell order to sell {{rex}} tokens at the market exchange rate during the time at which the order is ultimately executed. If {{from}} already has an open sell order in the sell queue, {{rex}} will be added to the amount of the sell order without change the position of the sell order within the queue. Once the sell order is executed, proceeds are added to {{from}}’s REX fund, the value of sold REX tokens is deducted from {{from}}’s vote stake, and votes are updated accordingly.\n\nDepending on the market conditions, it may not be possible to fill the entire sell order immediately. In such a case, the sell order is added to the back of a sell queue. A sell order at the front of the sell queue will automatically be executed when the market conditions allow for the entire order to be filled. Regardless of the market conditions, the system is designed to execute this sell order within 30 days. {{from}} can cancel the order at any time before it is filled using the cnclrexorder action." + }, + { + "name": "setabi", + "type": "setabi", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Deploy Contract ABI\nsummary: 'Deploy contract ABI on account {{nowrap account}}'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/account.png#3d55a2fc3a5c20b456f5657faf666bc25ffd06f4836c5e8256f741149b0b294f\n---\n\nDeploy the ABI file associated with the contract on account {{account}}." + }, + { + "name": "setacctcpu", + "type": "setacctcpu", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Explicitly Manage the CPU Quota of Account\nsummary: 'Explicitly manage the CPU bandwidth quota of account {{nowrap account}}'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/admin.png#9bf1cec664863bd6aaac0f814b235f8799fb02c850e9aa5da34e8a004bd6518e\n---\n\n{{#if_has_value cpu_weight}}\nExplicitly manage the CPU bandwidth quota of account {{account}} by pinning it to a weight of {{cpu_weight}}.\n\n{{account}} can stake and unstake, however, it will not change their CPU bandwidth quota as long as it remains pinned.\n{{else}}\nUnpin the CPU bandwidth quota of account {{account}}. The CPU bandwidth quota of {{account}} will be driven by the current tokens staked for CPU bandwidth by {{account}}.\n{{/if_has_value}}" + }, + { + "name": "setacctnet", + "type": "setacctnet", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Explicitly Manage the NET Quota of Account\nsummary: 'Explicitly manage the NET bandwidth quota of account {{nowrap account}}'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/admin.png#9bf1cec664863bd6aaac0f814b235f8799fb02c850e9aa5da34e8a004bd6518e\n---\n\n{{#if_has_value net_weight}}\nExplicitly manage the network bandwidth quota of account {{account}} by pinning it to a weight of {{net_weight}}.\n\n{{account}} can stake and unstake, however, it will not change their NET bandwidth quota as long as it remains pinned.\n{{else}}\nUnpin the NET bandwidth quota of account {{account}}. The NET bandwidth quota of {{account}} will be driven by the current tokens staked for NET bandwidth by {{account}}.\n{{/if_has_value}}" + }, + { + "name": "setacctram", + "type": "setacctram", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Explicitly Manage the RAM Quota of Account\nsummary: 'Explicitly manage the RAM quota of account {{nowrap account}}'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/admin.png#9bf1cec664863bd6aaac0f814b235f8799fb02c850e9aa5da34e8a004bd6518e\n---\n\n{{#if_has_value ram_bytes}}\nExplicitly manage the RAM quota of account {{account}} by pinning it to {{ram_bytes}} bytes.\n\n{{account}} can buy and sell RAM, however, it will not change their RAM quota as long as it remains pinned.\n{{else}}\nUnpin the RAM quota of account {{account}}. The RAM quota of {{account}} will be driven by the current RAM holdings of {{account}}.\n{{/if_has_value}}" + }, + { + "name": "setalimits", + "type": "setalimits", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Adjust Resource Limits of Account\nsummary: 'Adjust resource limits of account {{nowrap account}}'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/admin.png#9bf1cec664863bd6aaac0f814b235f8799fb02c850e9aa5da34e8a004bd6518e\n---\n\n{{$action.account}} updates {{account}}’s resource limits to have a RAM quota of {{ram_bytes}} bytes, a NET bandwidth quota of {{net_weight}} and a CPU bandwidth quota of {{cpu_weight}}." + }, + { + "name": "setcode", + "type": "setcode", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Deploy Contract Code\nsummary: 'Deploy contract code on account {{nowrap account}}'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/account.png#3d55a2fc3a5c20b456f5657faf666bc25ffd06f4836c5e8256f741149b0b294f\n---\n\nDeploy compiled contract code to the account {{account}}." + }, + { + "name": "setinflation", + "type": "setinflation", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Set Inflation Parameters\nsummary: 'Set inflation parameters'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/admin.png#9bf1cec664863bd6aaac0f814b235f8799fb02c850e9aa5da34e8a004bd6518e\n---\n\n{{$action.account}} sets the inflation parameters as follows:\n\n* Annual inflation rate (in units of a hundredth of a percent): {{annual_rate}}\n* Fraction of inflation used to reward block producers: 10000/{{inflation_pay_factor}}\n* Fraction of block producer rewards to be distributed proportional to blocks produced: 10000/{{votepay_factor}}" + }, + { + "name": "setparams", + "type": "setparams", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Set System Parameters\nsummary: 'Set System Parameters'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/admin.png#9bf1cec664863bd6aaac0f814b235f8799fb02c850e9aa5da34e8a004bd6518e\n---\n\n{{$action.account}} sets system parameters to:\n{{to_json params}}" + }, + { + "name": "setpriv", + "type": "setpriv", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Make an Account Privileged or Unprivileged\nsummary: '{{#if is_priv}}Make {{nowrap account}} privileged{{else}}Remove privileged status of {{nowrap account}}{{/if}}'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/admin.png#9bf1cec664863bd6aaac0f814b235f8799fb02c850e9aa5da34e8a004bd6518e\n---\n\n{{#if is_priv}}\n{{$action.account}} makes {{account}} privileged.\n{{else}}\n{{$action.account}} removes privileged status of {{account}}.\n{{/if}}" + }, + { + "name": "setram", + "type": "setram", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Configure the Available RAM\nsummary: 'Configure the available RAM'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/admin.png#9bf1cec664863bd6aaac0f814b235f8799fb02c850e9aa5da34e8a004bd6518e\n---\n\n{{$action.account}} configures the available RAM to {{max_ram_size}} bytes." + }, + { + "name": "setramrate", + "type": "setramrate", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Set the Rate of Increase of RAM\nsummary: 'Set the rate of increase of RAM per block'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/admin.png#9bf1cec664863bd6aaac0f814b235f8799fb02c850e9aa5da34e8a004bd6518e\n---\n\n{{$action.account}} sets the rate of increase of RAM to {{bytes_per_block}} bytes/block." + }, + { + "name": "setrex", + "type": "setrex", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Adjust REX Pool Virtual Balance\nsummary: 'Adjust REX Pool Virtual Balance'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/admin.png#9bf1cec664863bd6aaac0f814b235f8799fb02c850e9aa5da34e8a004bd6518e\n---\n\n{{$action.account}} adjusts REX loan rate by setting REX pool virtual balance to {{balance}}. No token transfer or issue is executed in this action." + }, + { + "name": "undelegatebw", + "type": "undelegatebw", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Unstake Tokens for NET and/or CPU\nsummary: 'Unstake tokens for NET and/or CPU from {{nowrap receiver}}'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/resource.png#3830f1ce8cb07f7757dbcf383b1ec1b11914ac34a1f9d8b065f07600fa9dac19\n---\n\n{{from}} unstakes from {{receiver}} {{unstake_net_quantity}} for NET bandwidth and {{unstake_cpu_quantity}} for CPU bandwidth.\n\nThe sum of these two quantities will be removed from the vote weight of {{receiver}} and will be made available to {{from}} after an uninterrupted 3 day period without further unstaking by {{from}}. After the uninterrupted 3 day period passes, the system will attempt to automatically return the funds to {{from}}’s regular token balance. However, this automatic refund may occasionally fail which will then require {{from}} to manually claim the funds with the refund action." + }, + { + "name": "unlinkauth", + "type": "unlinkauth", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Unlink Action from Permission\nsummary: '{{nowrap account}} unsets the minimum required permission for the {{#if type}}{{nowrap type}} action of the{{/if}} {{nowrap code}} contract'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/account.png#3d55a2fc3a5c20b456f5657faf666bc25ffd06f4836c5e8256f741149b0b294f\n---\n\n{{account}} removes the association between the {{#if type}}{{type}} action of the{{/if}} {{code}} contract and its minimum required permission.\n\n{{#if type}}{{else}}This will not remove any links explicitly associated to specific actions of {{code}}.{{/if}}" + }, + { + "name": "unregprod", + "type": "unregprod", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Unregister as a Block Producer Candidate\nsummary: '{{nowrap producer}} unregisters as a block producer candidate'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/voting.png#db28cd3db6e62d4509af3644ce7d377329482a14bb4bfaca2aa5f1400d8e8a84\n---\n\n{{producer}} unregisters as a block producer candidate. {{producer}} account will retain its votes and those votes can change based on voter stake changes or votes removed from {{producer}}. However new voters will not be able to vote for {{producer}} while it remains unregistered." + }, + { + "name": "unstaketorex", + "type": "unstaketorex", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Buy REX Tokens Using Staked Tokens\nsummary: '{{nowrap owner}} buys REX tokens in exchange for tokens currently staked to NET and/or CPU'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/rex.png#d229837fa62a464b9c71e06060aa86179adf0b3f4e3b8c4f9702f4f4b0c340a8\n---\n\n{{from_net}} and {{from_cpu}} are withdrawn from {{receiver}}’s NET and CPU bandwidths respectively. These funds are used to purchase REX tokens at the current market exchange rate. In order for the action to succeed, {{owner}} must have voted for a proxy or at least 21 block producers.\n\nA sell order of the purchased amount can only be initiated after waiting for the maturity period of 4 to 5 days to pass. Even then, depending on the market conditions, the initiated sell order may not be executed immediately." + }, + { + "name": "updateauth", + "type": "updateauth", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Modify Account Permission\nsummary: 'Add or update the {{nowrap permission}} permission of {{nowrap account}}'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/account.png#3d55a2fc3a5c20b456f5657faf666bc25ffd06f4836c5e8256f741149b0b294f\n---\n\nModify, and create if necessary, the {{permission}} permission of {{account}} to have a parent permission of {{parent}} and the following authority:\n{{to_json auth}}" + }, + { + "name": "updaterex", + "type": "updaterex", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Update REX Owner Vote Weight\nsummary: 'Update vote weight to current value of held REX tokens'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/rex.png#d229837fa62a464b9c71e06060aa86179adf0b3f4e3b8c4f9702f4f4b0c340a8\n---\n\nUpdate vote weight of {{owner}} account to current value of held REX tokens." + }, + { + "name": "updtrevision", + "type": "updtrevision", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Update System Contract Revision Number\nsummary: 'Update system contract revision number'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/admin.png#9bf1cec664863bd6aaac0f814b235f8799fb02c850e9aa5da34e8a004bd6518e\n---\n\n{{$action.account}} advances the system contract revision number to {{revision}}." + }, + { + "name": "voteproducer", + "type": "voteproducer", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Vote for Block Producers\nsummary: '{{nowrap voter}} votes for {{#if proxy}}the proxy {{nowrap proxy}}{{else}}up to 30 block producer candidates{{/if}}'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/voting.png#db28cd3db6e62d4509af3644ce7d377329482a14bb4bfaca2aa5f1400d8e8a84\n---\n\n{{#if proxy}}\n{{voter}} votes for the proxy {{proxy}}.\nAt the time of voting the full weight of voter’s staked (CPU + NET) tokens will be cast towards each of the producers voted by {{proxy}}.\n{{else}}\n{{voter}} votes for the following block producer candidates:\n\n{{#each producers}}\n + {{this}}\n{{/each}}\n\nAt the time of voting the full weight of voter’s staked (CPU + NET) tokens will be cast towards each of the above producers.\n{{/if}}" + }, + { + "name": "voteupdate", + "type": "voteupdate", + "ricardian_contract": "" + }, + { + "name": "wasmcfg", + "type": "wasmcfg", + "ricardian_contract": "" + }, + { + "name": "withdraw", + "type": "withdraw", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Withdraw from REX Fund\nsummary: 'Withdraw {{nowrap amount}} from {{nowrap owner}}’s REX fund by transferring to {{owner}}’s liquid balance'\nicon: https://raw.githubusercontent.com/eosnetworkfoundation/eos-system-contracts/main/contracts/icons/rex.png#d229837fa62a464b9c71e06060aa86179adf0b3f4e3b8c4f9702f4f4b0c340a8\n---\n\nWithdraws {{amount}} from {{owner}}’s REX fund and transfer them to {{owner}}’s liquid balance." + } + ], + "tables": [ + { + "name": "abihash", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "abi_hash" + }, + { + "name": "bidrefunds", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "bid_refund" + }, + { + "name": "blockinfo", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "block_info_record" + }, + { + "name": "cpuloan", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "rex_loan" + }, + { + "name": "delband", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "delegated_bandwidth" + }, + { + "name": "global", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "eosio_global_state" + }, + { + "name": "global2", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "eosio_global_state2" + }, + { + "name": "global3", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "eosio_global_state3" + }, + { + "name": "global4", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "eosio_global_state4" + }, + { + "name": "namebids", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "name_bid" + }, + { + "name": "netloan", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "rex_loan" + }, + { + "name": "powup.order", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "powerup_order" + }, + { + "name": "powup.state", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "powerup_state" + }, + { + "name": "producers", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "producer_info" + }, + { + "name": "producers2", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "producer_info2" + }, + { + "name": "rammarket", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "exchange_state" + }, + { + "name": "refunds", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "refund_request" + }, + { + "name": "retbuckets", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "rex_return_buckets" + }, + { + "name": "rexbal", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "rex_balance" + }, + { + "name": "rexfund", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "rex_fund" + }, + { + "name": "rexpool", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "rex_pool" + }, + { + "name": "rexqueue", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "rex_order" + }, + { + "name": "rexretpool", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "rex_return_pool" + }, + { + "name": "userres", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "user_resources" + }, + { + "name": "voters", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "voter_info" + }, + { + "name": "limitauthchg", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "limit_auth_change" + } + ], + "ricardian_clauses": [ + { + "id": "UserAgreement", + "body": "# EOS User Agreement\n\n## Definitions\n\n All capitalized, italicized, or inline code terms in *The EOS User Agreement* will be given the same effect and meaning as in *Definitions*.\n\n* EOS User Agreement: This document (*EUA*)\n\n* Chain ID: `chain_id` - aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906\n\n* User: Any person or organization of persons who maintain(s) direct or indirect ownership of an EOS account, or EOS-based property connected to an EOS account.\n\n* Ownership: Direct or indirect access to an EOS account through one or more valid permissions checks. Ownership may be partially shared between Users through the use of multi-signature permissions.\n\n* Block Producer: Users who have called `regproducer` and receive rewards from eosio.vpay.\n\n* `eosio.prods`: An EOS account with a dynamic permissions structure that can assume the privileges of the `eosio` account when 15/21 Block Producers agree to do so.\n\n* Network Funds: Tokens contained within the following accounts: `eosio.names`, `eosio.ramfee`, `eosio.saving`.\n\n* Governing Documents: *regproducer* is considered a governing document.\n\n* On-Chain: Any transaction, smart contract, or Ricardian contract which is located within a block that is irreversible and appended to the EOS blockchain `chain_id`.\n\n* EOS-based Property: Anything that requires a valid permission in order to directly manipulate, alter, transfer, influence, or otherwise effect on the EOS Blockchain\n\n* Call: To submit an action to the EOS Blockchain `chain_id`.\n\n* Authorizations & Permissions: Permissions are arbitrary names used to define the requirements for a transaction sent on behalf of that permission. Permissions can be assigned for authority over specific contract actions.\n\n* Ricardian Contract: A contract that places the defining elements of a legal agreement in a format that can be expressed and executed in software.\n\n## Article I -  User Acknowledgement of Risks\nIf User loses access to their EOS account on `chain_id` and has not taken appropriate measures to secure access to their EOS account by other means, the User acknowledges and agrees that that EOS account will become inaccessible. Users acknowledge that the User has an adequate understanding of the risks, usage and intricacies of cryptographic tokens and blockchain-based software. The User acknowledges and agrees that the User is using the EOS blockchain at their sole risk.\n\n## Article II - Special User Types\nUsers who call `regproducer` agree to, and are bound by, the *regproducer* Ricardian Contract.\n\n## Article III - Consent of the EUA\nThe nature of the *EOS User Agreement* is such that it serves as a description of the current EOS Mainnet governance functions that are in place. These functions, enforced by code, do not require the consent of Users as these functions are inherent and systemic to the EOS Mainnet itself.\n\n## Article IV - Governing Documents\nAny modifications to the *EUA* and *governing documents* may be made by `eosio.prods`. It is admonished that a statement be crafted and issued through `eosio.prods` via eosio.forum referendum contract describing such a modification in advance.\n\n## Article V - Native Unit of Value\nThe native unit of value on EOS chain_id shall be the EOS token as defined and created by the `eosio.token` smart contract.\n\n## Article VI - Maintaining the EOS blockchain\n`eosio.prods` will maintain the active blockchain codebase which includes, but is not limited to, the implementation of all modifications of all features, optimizations, and upgrades: present and future.\n\n## Article VII - Network Funds\nIt is admonished that any altering of the state of any tokens contained within network fund accounts, or altering any pre-existing code that directly or indirectly governs the allocation, fulfillment, or distribution of any *network funds* be preceded by a statement crafted and issued by `eosio.prods` to the *eosio.forum* referendum system contract describing the effect in advance.\n\n## Article VIII - Freedom of Account Creation\nAny current or future User is able to create an EOS Account without the permission by any other User. `eosio.prods` may never affect an EOS User Account(s) without valid permission(s) which have been shared with `eosio.prods` by an EOS account. `eosio.prods` may charge a fee for any actions that are requested by other Users pertaining to an EOS account where permissions are shared.\n\n## Article IX - No Fiduciary\nNo User shall have a fiduciary purpose to support the value of the EOS token. No User can authorize anyone to hold assets, borrow, speak, contract on behalf of other EOS Users or the EOS blockchain `chain_id` collectively. This EOS blockchain shall have no owners, managers, or fiduciaries.\n\n## Article X - User Security\nAll items pertaining to personal account security, including but not limited to the safekeeping of private keys, is solely the responsibility of the User to secure.\n\n## Article XI - `eosio.prods` Limited Liability\nThe User acknowledges and agrees that, to the fullest extent permitted by any applicable law, this disclaimer of liability applies to any and all damages or injury whatsoever caused by or related to risks of, use of, or inability to use, the EOS token or the EOS blockchain `chain_id` under any cause of action whatsoever of any kind in any jurisdiction, including, without limitation, actions for breach of warranty, breach of contract or tort (including negligence) and that `eosio.prods`, nor the individual permissions that operate it, shall not be liable for any indirect, incidental, special, exemplary or consequential damages, including for loss of profits, goodwill or data.\n\n# EOS 사용자 동의서\n\n## 정의\n\nEOS 사용자 동의서의 모든 대문자, 기울임 꼴, 또는 인라인 코드 용어는 정의에서와 동일한 효과와 의미가 부여됩니다.\n\n- EOS 사용자 동의서: 본 문서 (EUA)\n- 체인 ID: chain_id --- aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906\n- 사용자: EOS 계정을 직접 또는 간접적으로 소유하거나 EOS 계정에 연결된 EOS 기반 속성을 유지하거나 관리하는 사람, 조직, 또는 조직의 모든 사람.\n- 소유권: 하나 이상의 유효한 사용권한 확인을 통해 EOS 계정에 직접 또는 간접적으로 접근합니다. 소유권은 다중 서명권한을 사용하여 사용자간에 부분적으로 공유 될 수 있습니다.\n- 블록 프로듀서: regproducer를 실행하고 eosio.vpay로부터 보상을 받는 사용자.\n- eosio.prods: 15/21 블록 프로듀서들이 동의 할 때 eosio 계정의 권한을 가질 수 있는 동적 권한 구조를 가진 EOS 계정.\n- 네트워크 자금: 다음 계정에 포함 된 토큰: eosio.names, eosio.ramfee, eosio.saving.\n- 관리 문서: regproducer는 관리 문서로 간주됩니다.\n- 온체인: EOS 블록체인 chain_id에 비가역적이며 추가 할 수 있는 블록 내에 위치한 모든 거래, 스마트 계약 또는 리카르디안 계약.\n- EOS 기반 속성: EOS 블록체인을 직접 조작, 변경, 전송, 영향 또는 달리 적용하기 위해 유효한 사용 권한이 필요한 모든 것\n- 콜: EOS 블록체인 chain_id에 작업을 신청하는 것.\n- 허가 및 권한: '허가'는 해당 권한을 대신하여 전송되는 트랜잭션의 요구사항을 정의하는 데 사용됩니다. '권한'은 특정 계약 조치에 대한 권한을 부여합니다.\n- 리카르디안 계약: 합법적 계약의 정의 요소를 소프트웨어로 표현하고 실행할 수 있는 형식으로 배치하는 계약.\n\n## 제 1조 --- 위험에 대한 사용자들의 인지\n\n사용자가 chain_id에서 EOS 계정에 대한 접근 권한을 잃고, 다른 방법으로 EOS 계정에 대한 접근을 보호하기 위해 적절한 조치를 취하지 않는 경우에는 EOS 계정에 접근할 수 없게 된다는 것을 인정하고 동의합니다. 사용자는 암호화 토큰과 블록체인 기반 소프트웨어의 위험, 사용법, 그리고 복잡성에 대해 충분히 이해하고 있음을 인정합니다. 사용자는 EOS 블록체인의 사용에 대한 전적인 책임을 진다는 것에 인정하고 동의합니다.\n\n## 제 2조 --- 특별한 사용자 유형\n\nregproducer를 실행하는 사용자는 regproducer 리카르디안 계약에 동의하고, 이에 구속됩니다.\n\n## 제 3조 --- EUA의 동의\n\nEOS 사용자 동의서는 현재 시행중인 EOS 메인넷 거버넌스에 대한 설명으로 사용됩니다. 코드에 의해 시행되는 이러한 기능은 EOS 메인넷 자체의 체계적이고 고유한 기능이므로 사용자의 동의를 필요로 하지 않습니다.\n\n## 제 4조 --- 관리 문서\n\nEUA와 관리 문서는 eosio.prods를 통해 수정이 가능합니다. 특정 변경사항을 사전에 설명하는 eosio.forum 투표 계약을 통해 eosio.prods가 성명서를 작성하고 발급할 것을 권고합니다.\n\n## 제 5조 --- 가치의 기본 단위\n\nEOS chain_id의 기본 단위는 eosio.token 스마트 계약에 의해 정의되고 작성된 EOS 토큰입니다.\n\n## 제 6조 --- EOS 블록체인 유지\n\neosio.prods는 모든 기능, 최적화, 그리고 업그레이드의 현재와 미래의 모든 수정사항을 구현하는 것을 포함하되, 이에 국한되지 않는 활성화된 블록체인 코드베이스를 유지합니다\n\n## 제 7조 --- 네트워크 자금\n\n네트워크 자금 계정에 포함된 토큰의 상태를 변경하거나, 네트워크 자금의 배분, 이행, 또는 배포를 직/간접적으로 관리하는 기존 코드를 변경하는 경우에는 eosio.prods를 eosio.forum 총 투표 시스템 계약에 추가하여 사전에 충분한 설명이 이루어져야 합니다.\n\n## 제 8조 --- 계정 생성의 자유\n\n현재, 또는 미래의 사용자는 다른 사용자의 허가 없이 EOS 계정을 만들 수 있습니다. eosio.prods는 EOS 계정에 의해 공유된 유효한 허가 없이는 EOS 사용자 계정에 영향을 줄 수 없습니다. eosio.prods는 권한이 공유되는 EOS 계정과 관련하여 다른 사용자가 요청한 모든 작업에 대해 요금을 부과할 수 있습니다.\n\n## 제 9조 --- 신탁 불가\n\n사용자는 EOS 토큰의 가치를 뒷받침할 수 있는 신탁 목적을 가져서는 안됩니다. 사용자는 EOS 사용자 또는 EOS 블록체인 chain_id를 대표하여 누구에게도 자산을 보유하거나, 대여하거나, 자산에 대해 얘기하거나, 계약을 맺을 권한을 부여할 수 없습니다. EOS 블록체인에는 소유자, 관리자, 그리고 수탁자가 없어야 합니다.\n\n## 제 10조 --- 사용자 보안\n\n비공개 키의 보관을 포함하되, 이에 국한되지 않는 개인 계좌 보안과 관련된 모든 항목들 또한 전적으로 사용자가 안전하게 보관해야 합니다.\n\n## 제 11조 --- eosio.prods 유한책임\n\n사용자는 법률이 허용하는 한도 내에서 EOS 토큰의 위험, 사용, 또는 사용 불가로 인해 발생하는 모든 손해에 대해 책임의 면책 조항이 적용된다는 것을 인정하고, 동의합니다. 계약 위반, 불법 행위, 그리고 위반 행위 (관리 태만 포함)와 eosio.prods 또는 이를 운영하는 개별 사용 권한을 포함하되, 이에 국한하지 않고 모든 관할 지역에서의 모든 종류의 사유로 인한 EOS 블록체인 chain_id 이익, 영업권, 또는 데이터의 손실을 포함하여 간접적, 우발적, 특수한, 대표적, 그리고 파생적인 손해에 대한 책임을 지지 않습니다.\n\n# EOS用户协议\n\n## **定义**\n\nEOS用户协议中的所有大写,斜体或内联代码术语将具有与以下定义相同的效果和含义。\n\n- EOS用户协议:即本文档(EUA)\n\n- 链上ID: chain_id - aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906\n\n- 用户:任意满足下列要求的个人或组织:直接或者间接拥有EOS账户或与EOS账户关联的基于EOS发行的财产。\n\n- 所有权:直接或者间接通过一个或多个有效的权限检查访问一个EOS账户。所有权可以通过多签权限许可在用户间共享。\n\n- 执行了regproduce,并且从eosio.vpay领取收入的用户。\n\n- eosio.prods:具有动态权限结构的EOS帐户,当15/21 Block Producers同意时,该帐户可以承担eosio帐户的权限。\n\n- 网络资产:包含在以下账户中的代币:eosio.names、eosio.ramfee、 eosio.saving。\n\n- 治理文档:regproducer是治理文档。\n\n- 任何交易、智能合约或者李嘉图合约,它们已经位于一个区块中,并且这个区块是不可逆转的、已附加到名为chain_id的EOS区块链中。\n\n- 基于EOS资产:任何需要有效许可来操作、改变、转移、影响或者进行其他操作的东西。\n\n- 执行:在名为chain_id的EOS区块链中提交一个行动。\n\n- 授权和权限:权限(Permissions)是用来定义代表该权限发送的交易的要求的任意名字。可以给特定的合约操作的授权(Authorizations)分配权限(Permissions)。\n\n- 李嘉图合约:将法律协议中的定义要素以能在软件中表达和执行的格式表达的合约。\n\n## **条款一****用****户风险确认**\n\n如果用户丢失账户访问权限或者没有采取合适的方式保护账户访问权限,用户应知悉并同意,EOS账户将无法访问。用户应确认用户对加密代币和区块链软件的风险、用法和复杂性有充分了解。用户承认并同意用户自行承担使用EOS区块链的风险。\n\n## **条款二****特殊用****户类型**\n\n执行regproduce,同意并且受regproducer李嘉图合约约束的用户。\n\n## **条款三****同意****EOS****用****户协议**\n\nEOS用户协议的实质是对当前EOS主网治理功能的描述。由代码强制执行的功能不需要用户的同意,因为这些功能是EOS主网系统自带的。\n\n## **条款四** - **治理文档**\n\neosio.prods可以对EOS用户协议和治理文档进行任何修改。严正提醒,提前用eosio.forum公投合约,通过eosio.prods编写、发布一个声明来描述那个修改。\n\n## **条款五****原生价****值单位**\n\nEOS公链上的原生价值单位应为eosio.token智能合约定义和创建的EOS通证。\n\n## **条款六****维护****EOS****区****块链**\n\n无论现在或将来将来,eosio.prods将维护活跃的区块链代码库,包括但不限于所有功能、优化、升级的所有修改、实现。\n\n## 条款七 - ****定****义****EOS****网络资产\n\n更改网络资产账户中的任何代币的状态,更改任何现存的直接或间接管理任何网络资产的分配、实现或分发的代码,需要事先用eosio.prods在eosio.forum公投合约上编写和发布效果描述的声明。\n\n## **条款八-创建账户自由**\n\n任何现在或将来的用户都可以在未经任何其他用户许可的情况下创建EOS帐户。 如何没有收到EOS帐户的有效许可(permission),eosio.prods永远不会影响EOS用户帐户。 对于共享权限的EOS帐户的其他用户请求的任何操作,eosio.prods可能会收取费用。\n\n## **条款九没有受托人**\n\n没有用户承担信托责任来维持EOS代币的价值。没有用户可以代表EOS用户或者代表名为chain_ID的EOS区块链授权任何人共同持有资产、借款、发言或定合同。此区块链不存在拥有者、管理者或者受托人。\n\n## **条款十个人安全**\n\n所有有关个人账户安全的事项,包括但不限于私钥的安全保存,都由用户自己负责。\n\n## **条款十一 eosio.prods的有限责任**\n\n用户应知悉和同意,在任何适用法律允许的最大范围内,本免责声明适用于与EOS代币风险,使用或无法使用EOS代币有关或导致的任何或所有损害或伤害,也适用于任何司法管辖区内的任何任何行为下的EOS区块链chain_id,包括但不限于违反担保、违反合同或侵权行为(包括疏忽)。eosio.prods以及操作它的个人权限对于任何间接的,偶然的,特殊的,示例性的或后果性的损害,包括利润损失,商誉或数据,不承担任何责任。" + }, + { + "id": "BlockProducerAgreement", + "body": "### 1. The intent of regproducer\n\nThe intent of the `regproducer` action is to register a block producer candidacy. This contract is considered a governing document as defined by the EOS User Agreement (EUA).\n\nregproducer의 목적\n\n`regproducer` 작업의 목적은 블록생산자 입후보 등록을 하는 것입니다. 이 계약은 EOS 사용자 계약서 (EUA)에 정의된 바와 같이 관리 문서로 간주됩니다.\n\nregproducer 的目的\n\n`regproducer`操作的目的是注册成为出块节点候选者。根据 EOS 用户协议(EUA)的定义,本合约属于治理文本(governing document)\n\n### 2. Nomination\n\nI, {{ producer }}, hereby nominate myself for consideration as a block producer candidate. This nomination includes agreement to the terms of this contract by my block producer candidate entity, including all of its shareholders, owners, employees, staff, members, and any individual working in official, direct, or affiliated capacity for my Block Producer entity.\n\n지명\n\n나, {{ producer }}는 블록프로듀서 후보로 고려되도록 자신을 지명합니다. 이 지명에는 블록프로듀서회사의 모든 주주, 소유자, 직원, 멤버, 회원 및 공식인원, 직접 또는 계열사에서 일하는 모든 개인을 포함한 블록프로듀서 회사가 계약 조건에 대해 동의함을 인정합니다.\n\n提名\n\n本人,{{ producer }},特此提名本人为出块节点候选人。本提名包括了本出块节点候选人实体对本合约中所有条款的明确同意,包含其所有者、雇员、员工、成员,以及任何以正式方式、直接或附属方式为本出块节点实体工作的个人。\n\n### 3. Resignation and Removal for Inability to Perform Obligations.\n\nIf I, {{ producer }}, am unable to perform any of the obligations stipulated in this contract, I will resign my position by calling the `unregprod` action.\n\nIf I, {{ producer }}, fail to resign when unable to perform said obligations, I understand that procedures enumerated in this contract shall be enacted.\n\n의무의 불이행에 대한 사임 및 철회\n\n{{ producer }}가 본 계약서에 명시된 의무를 수행 할 수 없는 경우, 생산자 키를 null 로 함으로써 본인의 지위를 사임합니다.\n\n만약 내가 {{producer}}의 의무를 이행 할 수 없을 때 사임하지 않는다면, 나는 본 계약에 열거된 절차가 집행됨을 동의합니다.\n\n因不能履行义务而退出或被取消出块资格\n\n如果我,{{ producer }},不能履行本合约中所规定的所有义务,我将使用 `unregprod` 操作来自我退出(resign)。\n\n如果我 {{ producer }}, 在无法履行上述义务时未能退出(resign),我知晓本合约将会按照所有列举的程序对我实行制裁或处罚程序。\n\n### 4. EOS Accounts\n\nBlock Producers may never affect an account on the EOS blockchain, except for the reasons specifically cited in this contract that pertain to Block Producer accounts. User accounts can only be affected on the basis of Article VIII in the EOS User Agreement.\n\nEOS 계정\n\n블록프로듀서는 본 계약에서 해당하는 블록프로듀서의 계정 차단에 관련하여 특별히 언급한 이유를 제외하고는 EOS 블록체인의 계정에 결코 영향을 미치지 않습니다. 사용자 계정은 EOS 사용자 계약서의 8조에 근거할 때만 영향을 받을 수 있습니다.\n\nEOS 账号\n\n出块节点永远不会对 EOS 区块链上的帐户造成影响,除非是本合约中特别提到与出块节点帐户有关的原因。只有基于 EOS用户协议中的第八条的情形下,用户的账号才会受到影响.\n\n### 5. Producer Key\n\nI, {{ producer }}, will sign blocks with {{ producer_key }}\n\nIf I, {{ producer }} suspect my key has been compromised I will alert the other Block Producers immediately.\n\nI, {{ producer }}, acknowledge that any and all actions executed with my {{ producer_key }} is my responsibility, regardless of the account being compromised.\n\n프로듀서 키\n\n나, {{ producer }}는 {{ producer _ key }} 로 블록에 서명 할 것입니다.\n만약 내, {{producer}} 가 본인의 키가 손상되었다고 의심되면 즉시 다른 블록프로듀서에게 알려줄 것입니다.\n나, {{producer}}는 EOS 블록체인에서 본인의 블록프로듀서 계정이 실행하는 모든 작업에 대해, 계정 이상 유무와 관련 없이, 책임이 있음을 인정합니다.\n\n出块节点公钥\n\n 我, {{ producer }}, 将使用 {{ producer_key }} 对区块签名。\n如果我, {{ producer }}, 怀疑我的密钥已被泄露,我将立即通知其他节点。\n我,{{ producer }},承认我的出块节点帐户在EOS区块链上所执行的任何操作都是我的责任,无论该帐户是否被盗。\n\n### 6. API Endpoints\n\nIf I, {{ producer }}, qualify for, and choose to claim rewards due to votes received, and/or blocks produced, I, {{ producer }}, will provide functioning and queryable public P2P and API endpoints to maintain synchronization with the blockchain and submit transactions to be included. API endpoints must be updated to a recent functional version that does not have known security vulnerabilities.\n\nI, {{ producer }}, hereby acknowledge that if I am unable to do so within 30 minutes of being alerted by another block producer candidate, I can be removed by use of the `rmvproducer` action.\n\nAPI 엔드포인트\n\n만약 내, {{ producer }} 가 투표를 받아 블록 보상을 청구할 수 있는 자격을 얻으면, 나 {{ producer }}는 작동 및 쿼리 가능한 공개 P2P 및 API 엔드포인트를 블록체인과의 동기화 및 트랜잭션을 제출할 수 있게 유지관리합니다. API 엔드포인트는 알려진 보안 취약성이 없는 최신버전으로 업데이트해야 합니다.\n\n나, {{ producer }} 는 다른 block producer candidate 가 경고 ​​한 후, 30분 이내에 바로잡을 수 없다면 `rmvproducer` 조치를 통해 자격이 제거 될 수 있음을 인정합니다.\n\nAPI 端点\n\n如果我,{{ producer }} 由于得到投票和/或出块的原因,符合领取奖励的条件并选择接受奖励,那么我, {{ producer }},将提供功能正常的公共 P2P 和 API 端点来维护与区块链的同步,并提交要打包入块的事务。API 端点必须更新到最新的可用版本,并且该版本没有已知的安全漏洞\n\n我,{{producer}},在此确认,如果我在收到另一个 block producer candidate的警告后30分钟内仍不能符合上述要求,可以使用`rmvproducer`操作移除我的账户。\n\n### 7. Execution time\n\nI, {{ producer }}, will deploy and run network infrastructure capable of maintaining 2ms or less CPU execution times.\n\nI, {{ producer }}, hereby acknowledge that if I am unable to do so within 30 minutes of being alerted by another block producer candidate, I can be removed by use of the `rmvproducer` action.\n\n실행 시간\n\n나, {{ producer }}는 2ms 또는 그 이하의 CPU 실행 시간을 유지할 수 있는 네트워크 인프라를 배포하고 실행합니다.\n\n 나, {{ producer }} 는 다른 block producer candidate가 경고 ​​한 후, 30분 이내에 바로잡을 수 없다면 `rmvproducer` 조치를 통해 자격이 제거 될 수 있음을 인정합니다.\n\n执行时间\n\n我, {{ producer }},将部署和运行网络基础设施,能够将 CPU 执行时间维持在 2ms 或更少的水平。\n\n我,{{ producer }},在此确认,如果我在收到另一个block producer candidate的警告后30分钟内不能符合上述条件,可以使用 `rmvproducer` 操作将我移除。\n\n### 8. Ordering\n\nI {{ producer }} agree to process transactions on a first-in-first-out (FIFO) basis, and not to manipulate the contents of blocks in order to derive profit from the order in which transactions are included: the hash of the block that is produced.\n\n생산\n나, {{ producer }}는 선입 선출법 (FIFO) 방식으로 거래를 처리하고 거래가 블록의 해시에 포함되는 순서에서 이익을 얻으려는 목적으로 생산하는 블록의 내용을 조작하지 않기로 동의합니다.\n\n顺序\n\n我, {{ producer }} ,同意根据先进先出(FIFO)的方式处理事务,并且绝不会为了牟利而利用区块内容、操纵区块中交易处理的顺序。\n\n### 9. Random Rotation of Standbys\n\nI, {{ producer }}, agree that if I am in a paid standby position, I can be randomly called into a producing position. Upon failure to produce blocks, code may self-execute penalties regarding future vpay rewards.\n\n유급 대기 블록프로듀서의 무작위 로테이션\n\n나, {{ producer }}는 본인이 유급 대기직에 있을 때, 무작위로 생산직으로 부름 받을 수 있다는 것에 동의합니다. 이때 블록을 생성하지 못하면 코드는 향후 vpay 보상에 대한 처벌을 집행할 수 있습니다.\n\n备选节点随机轮换\n\n我,{{ producer }},同意若本节点处于有偿备选状态,可被随机调入出块状态。如果我无法出块,合约代码可能会自动执行就未来的 vpay 报酬进行处罚。\n\n### 10. Missing Two or More Rounds of Blocks\n\nI, {{ producer }}, acknowledge that if after missing 2 or more rounds of blocks in succession I am unable to be contacted within 20 minutes, I, {{ producer }}, acknowledge that I may be removed from a producing position by use of the `rmvproducer` action.\n\nI, {{ producer }}, acknowledge that after missing two or more rounds of blocks in succession, standard practice stipulates removing my producer by using the `unregprod` action until the given issue is resolved.\n\n두 라운드 이상의 블록 누락\n\n나, {{ producer }}는 두 라운드 이상 연속하여 블록을 누락 한 후, 20분 이내에 연락 할 수 없다면 {{ producer }} 가 `rmvproducer` 액션의 사용되어 생산 위치에서 제거 될 수 있음을 인정합니다.\n\n{{ producer }}는 두 라운드 이상으로 블록을 연속적으로 누락한다면, 주어진 문제가 해결 될 때까지 `unregprod` 작업을 사용하여 본인이 생산 위치에서 제거됨이 표준 관행으로 규정되어 있음을 인정합니다.\n\n两轮或更多轮丢块的情形\n\n我,{{ producer }}, 确认如果连续两轮或更多轮丢块且无法在20分钟内联系到我,我,{{ producer }}, 同意可能会用 `rmvproducer` 操作将我移除。\n我,{{ producer }}, 如果连续两轮或更多轮丢块,根据标准实践会发起 `unregprod` 操作将我移除出块资格,直到问题解决。\n\n### 11. Urgent Security Patches\n\nI, {{ producer }}, acknowledge that if I am not able to be contacted in any form after an urgent security patch is announced, I may be removed by use of the `rmvproducer` action.\n\n긴급 보안 패치\n긴급 보안 패치가 발표 된 후, 어떤 형태로든 연락 할 수 없는 경우 `rmvproducer` 작업을 사용하여 제거 될 수 있음을 나, {{ producer }}는 인정합니다.\n\n紧急安全补丁\n\n我,{{ producer }},确认如果在紧急安全补丁发布后用任何方式都无法联系到我,可能会用 `rmvproducer` 指令将我移除。\n\n### 12. Disclosure of Entity and Server Information\n\nI, {{ producer }}, attest that I have disclosed the approximate geolocation for my main production node as being {{ location }}.\n\n법인 및 서버 정보의 공개\n\n나, {{ producer }} 는 주 생산 노드에 대한 위치 정보를 공개했음을 증명합니다.\n\n实体和服务器的信息披露\n\n我,{{ producer }},确认我已经披露了主出块节点服务器地理位置的准确信息。其地址为 {{ location }}。\n\n### 13. Establishes the penalty and procedure for unwillingness to comply with penalties or procedures\n\nI, {{ producer }}, acknowledge that failing to comply with penalties or procedures enacted against me will result in Block Producers executing the `rmvproducer` contract to remove me.\n\nI, {{ producer }}, will not execute the `regproducer` contract until serving or fulfilling the requirements from a penalty or procedure that results in having the `rmvproducer` contract executed to remove me.\n\nI, {{ producer }}, acknowledge that if I continue to call the `regproducer` action without serving or fulfilling the requirements from breach of `regproducer`, my account keys associated with the registered Block Producer in question may be nulled by Block Producers by using `eosio.wrap`.\n\n페널티를 준수하지 않을 경우 벌칙\n\n나, {{ producer }} 는 나에게 제재된 처벌을 준수하지 않으면 블록프로듀서들이 `rmvproducer` 계약을 집행하게 될 것이라고 인정합니다. 나, {{ producer }} 는 `rmvproducer` 계약이 집행된다면 요구 사항을 충족될 때까지 `regproducer` 계약을 이행하지 않을 것입니다.\n`regproducer` 계약 위반으로 인한 요구 사항을 충족시키지 않고 `regproducer` 계약을 계속 호출하면 해당 블록프로듀서와 관련된 계정 키가 `eosio.wrap` 을 사용하여 블록프로듀서들에 의해 무효화 될 수 있음을 인정합니다.\n\n对不愿遵守处罚的行为予以处罚\n\n我,{{ producer }},承认若不遵守对本人制裁的处罚,BP 可以实施 `rmvproducer` 合约,我接受投票的资格将被取消。若有针对我实施 `rmvproducer` 合约的情况发生,我, {{ producer }} 在遵守/履行所收到的处罚之前,不会再次执行 `regproducer` 合约。\n\n我,{{ producer }},在履行惩罚程序的要求之前,不会执行 `regproducer` 合同。我知晓如不履行此程序, `rmvproducer` 合同将会再次将我移除。\n\n我,{{ producer }}, 承认如果没有遵守或履行因违反 `regproducer` 而受到的惩罚要求却继续调用`regproducer`操作,BP 可以调用 `eosio.wrap` 合约将我用来注册出块节点的账号密钥设置为无效值。" + } + ], + "error_messages": [], + "abi_extensions": [], + "variants": [ + { + "name": "variant_block_signing_authority_v0", + "types": [ + "block_signing_authority_v0" + ] + } + ], + "action_results": [] +} diff --git a/test/data/abis/eosio.msig.json b/test/data/abis/eosio.msig.json new file mode 100644 index 0000000..83a50df --- /dev/null +++ b/test/data/abis/eosio.msig.json @@ -0,0 +1,365 @@ +{ + "version": "eosio::abi/1.1", + "types": [], + "structs": [ + { + "name": "action", + "base": "", + "fields": [ + { + "name": "account", + "type": "name" + }, + { + "name": "name", + "type": "name" + }, + { + "name": "authorization", + "type": "permission_level[]" + }, + { + "name": "data", + "type": "bytes" + } + ] + }, + { + "name": "approval", + "base": "", + "fields": [ + { + "name": "level", + "type": "permission_level" + }, + { + "name": "time", + "type": "time_point" + } + ] + }, + { + "name": "approvals_info", + "base": "", + "fields": [ + { + "name": "version", + "type": "uint8" + }, + { + "name": "proposal_name", + "type": "name" + }, + { + "name": "requested_approvals", + "type": "approval[]" + }, + { + "name": "provided_approvals", + "type": "approval[]" + } + ] + }, + { + "name": "approve", + "base": "", + "fields": [ + { + "name": "proposer", + "type": "name" + }, + { + "name": "proposal_name", + "type": "name" + }, + { + "name": "level", + "type": "permission_level" + }, + { + "name": "proposal_hash", + "type": "checksum256$" + } + ] + }, + { + "name": "cancel", + "base": "", + "fields": [ + { + "name": "proposer", + "type": "name" + }, + { + "name": "proposal_name", + "type": "name" + }, + { + "name": "canceler", + "type": "name" + } + ] + }, + { + "name": "exec", + "base": "", + "fields": [ + { + "name": "proposer", + "type": "name" + }, + { + "name": "proposal_name", + "type": "name" + }, + { + "name": "executer", + "type": "name" + } + ] + }, + { + "name": "extension", + "base": "", + "fields": [ + { + "name": "type", + "type": "uint16" + }, + { + "name": "data", + "type": "bytes" + } + ] + }, + { + "name": "invalidate", + "base": "", + "fields": [ + { + "name": "account", + "type": "name" + } + ] + }, + { + "name": "invalidation", + "base": "", + "fields": [ + { + "name": "account", + "type": "name" + }, + { + "name": "last_invalidation_time", + "type": "time_point" + } + ] + }, + { + "name": "old_approvals_info", + "base": "", + "fields": [ + { + "name": "proposal_name", + "type": "name" + }, + { + "name": "requested_approvals", + "type": "permission_level[]" + }, + { + "name": "provided_approvals", + "type": "permission_level[]" + } + ] + }, + { + "name": "permission_level", + "base": "", + "fields": [ + { + "name": "actor", + "type": "name" + }, + { + "name": "permission", + "type": "name" + } + ] + }, + { + "name": "proposal", + "base": "", + "fields": [ + { + "name": "proposal_name", + "type": "name" + }, + { + "name": "packed_transaction", + "type": "bytes" + }, + { + "name": "earliest_exec_time", + "type": "time_point?$" + } + ] + }, + { + "name": "propose", + "base": "", + "fields": [ + { + "name": "proposer", + "type": "name" + }, + { + "name": "proposal_name", + "type": "name" + }, + { + "name": "requested", + "type": "permission_level[]" + }, + { + "name": "trx", + "type": "transaction" + } + ] + }, + { + "name": "transaction", + "base": "transaction_header", + "fields": [ + { + "name": "context_free_actions", + "type": "action[]" + }, + { + "name": "actions", + "type": "action[]" + }, + { + "name": "transaction_extensions", + "type": "extension[]" + } + ] + }, + { + "name": "transaction_header", + "base": "", + "fields": [ + { + "name": "expiration", + "type": "time_point_sec" + }, + { + "name": "ref_block_num", + "type": "uint16" + }, + { + "name": "ref_block_prefix", + "type": "uint32" + }, + { + "name": "max_net_usage_words", + "type": "varuint32" + }, + { + "name": "max_cpu_usage_ms", + "type": "uint8" + }, + { + "name": "delay_sec", + "type": "varuint32" + } + ] + }, + { + "name": "unapprove", + "base": "", + "fields": [ + { + "name": "proposer", + "type": "name" + }, + { + "name": "proposal_name", + "type": "name" + }, + { + "name": "level", + "type": "permission_level" + } + ] + } + ], + "actions": [ + { + "name": "approve", + "type": "approve", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Approve Proposed Transaction\nsummary: '{{nowrap level.actor}} approves the {{nowrap proposal_name}} proposal'\nicon: https://raw.githubusercontent.com/EOS-Nation/eosio.msig/master/contracts/icons/multisig.png#4fb41d3cf02d0dd2d35a29308e93c2d826ec770d6bb520db668f530764be7153\n---\n\n{{level.actor}} approves the {{proposal_name}} proposal proposed by {{proposer}} with the {{level.permission}} permission of {{level.actor}}." + }, + { + "name": "cancel", + "type": "cancel", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Cancel Proposed Transaction\nsummary: '{{nowrap canceler}} cancels the {{nowrap proposal_name}} proposal'\nicon: https://raw.githubusercontent.com/EOS-Nation/eosio.msig/master/contracts/icons/multisig.png#4fb41d3cf02d0dd2d35a29308e93c2d826ec770d6bb520db668f530764be7153\n---\n\n{{canceler}} cancels the {{proposal_name}} proposal submitted by {{proposer}}." + }, + { + "name": "exec", + "type": "exec", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Execute Proposed Transaction\nsummary: '{{nowrap executer}} executes the {{nowrap proposal_name}} proposal'\nicon: https://raw.githubusercontent.com/EOS-Nation/eosio.msig/master/contracts/icons/multisig.png#4fb41d3cf02d0dd2d35a29308e93c2d826ec770d6bb520db668f530764be7153\n---\n\n{{executer}} executes the {{proposal_name}} proposal submitted by {{proposer}} if the minimum required approvals for the proposal have been secured." + }, + { + "name": "invalidate", + "type": "invalidate", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Invalidate All Approvals\nsummary: '{{nowrap account}} invalidates approvals on outstanding proposals'\nicon: https://raw.githubusercontent.com/EOS-Nation/eosio.msig/master/contracts/icons/multisig.png#4fb41d3cf02d0dd2d35a29308e93c2d826ec770d6bb520db668f530764be7153\n---\n\n{{account}} invalidates all approvals on proposals which have not yet executed." + }, + { + "name": "propose", + "type": "propose", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Propose Transaction\nsummary: '{{nowrap proposer}} creates the {{nowrap proposal_name}}'\nicon: https://raw.githubusercontent.com/EOS-Nation/eosio.msig/master/contracts/icons/multisig.png#4fb41d3cf02d0dd2d35a29308e93c2d826ec770d6bb520db668f530764be7153\n---\n\n{{proposer}} creates the {{proposal_name}} proposal for the following transaction:\n{{to_json trx}}\n\nThe proposal requests approvals from the following accounts at the specified permission levels:\n{{#each requested}}\n + {{this.permission}} permission of {{this.actor}}\n{{/each}}\n\nIf the proposed transaction is not executed prior to {{trx.expiration}}, the proposal will automatically expire." + }, + { + "name": "unapprove", + "type": "unapprove", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Unapprove Proposed Transaction\nsummary: '{{nowrap level.actor}} revokes the approval previously provided to {{nowrap proposal_name}} proposal'\nicon: https://raw.githubusercontent.com/EOS-Nation/eosio.msig/master/contracts/icons/multisig.png#4fb41d3cf02d0dd2d35a29308e93c2d826ec770d6bb520db668f530764be7153\n---\n\n{{level.actor}} revokes the approval previously provided at their {{level.permission}} permission level from the {{proposal_name}} proposal proposed by {{proposer}}." + } + ], + "tables": [ + { + "name": "approvals", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "old_approvals_info" + }, + { + "name": "approvals2", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "approvals_info" + }, + { + "name": "invals", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "invalidation" + }, + { + "name": "proposal", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "proposal" + } + ], + "ricardian_clauses": [], + "error_messages": [], + "abi_extensions": [], + "variants": [], + "action_results": [] + } diff --git a/test/data/abis/eosio.token.json b/test/data/abis/eosio.token.json new file mode 100644 index 0000000..2863d5f --- /dev/null +++ b/test/data/abis/eosio.token.json @@ -0,0 +1,187 @@ +{ + "version": "eosio::abi/1.1", + "types": [], + "structs": [ + { + "name": "account", + "base": "", + "fields": [ + { + "name": "balance", + "type": "asset" + } + ] + }, + { + "name": "close", + "base": "", + "fields": [ + { + "name": "owner", + "type": "name" + }, + { + "name": "symbol", + "type": "symbol" + } + ] + }, + { + "name": "create", + "base": "", + "fields": [ + { + "name": "issuer", + "type": "name" + }, + { + "name": "maximum_supply", + "type": "asset" + } + ] + }, + { + "name": "currency_stats", + "base": "", + "fields": [ + { + "name": "supply", + "type": "asset" + }, + { + "name": "max_supply", + "type": "asset" + }, + { + "name": "issuer", + "type": "name" + } + ] + }, + { + "name": "issue", + "base": "", + "fields": [ + { + "name": "to", + "type": "name" + }, + { + "name": "quantity", + "type": "asset" + }, + { + "name": "memo", + "type": "string" + } + ] + }, + { + "name": "open", + "base": "", + "fields": [ + { + "name": "owner", + "type": "name" + }, + { + "name": "symbol", + "type": "symbol" + }, + { + "name": "ram_payer", + "type": "name" + } + ] + }, + { + "name": "retire", + "base": "", + "fields": [ + { + "name": "quantity", + "type": "asset" + }, + { + "name": "memo", + "type": "string" + } + ] + }, + { + "name": "transfer", + "base": "", + "fields": [ + { + "name": "from", + "type": "name" + }, + { + "name": "to", + "type": "name" + }, + { + "name": "quantity", + "type": "asset" + }, + { + "name": "memo", + "type": "string" + } + ] + } + ], + "actions": [ + { + "name": "close", + "type": "close", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Close Token Balance\nsummary: 'Close {{nowrap owner}}’s zero quantity balance'\nicon: https://raw.githubusercontent.com/cryptokylin/eosio.contracts/v1.7.0/contracts/icons/token.png#207ff68b0406eaa56618b08bda81d6a0954543f36adc328ab3065f31a5c5d654\n---\n\n{{owner}} agrees to close their zero quantity balance for the {{symbol_to_symbol_code symbol}} token.\n\nRAM will be refunded to the RAM payer of the {{symbol_to_symbol_code symbol}} token balance for {{owner}}." + }, + { + "name": "create", + "type": "create", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Create New Token\nsummary: 'Create a new token'\nicon: https://raw.githubusercontent.com/cryptokylin/eosio.contracts/v1.7.0/contracts/icons/token.png#207ff68b0406eaa56618b08bda81d6a0954543f36adc328ab3065f31a5c5d654\n---\n\n{{$action.account}} agrees to create a new token with symbol {{asset_to_symbol_code maximum_supply}} to be managed by {{issuer}}.\n\nThis action will not result any any tokens being issued into circulation.\n\n{{issuer}} will be allowed to issue tokens into circulation, up to a maximum supply of {{maximum_supply}}.\n\nRAM will deducted from {{$action.account}}’s resources to create the necessary records." + }, + { + "name": "issue", + "type": "issue", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Issue Tokens into Circulation\nsummary: 'Issue {{nowrap quantity}} into circulation and transfer into {{nowrap to}}’s account'\nicon: https://raw.githubusercontent.com/cryptokylin/eosio.contracts/v1.7.0/contracts/icons/token.png#207ff68b0406eaa56618b08bda81d6a0954543f36adc328ab3065f31a5c5d654\n---\n\nThe token manager agrees to issue {{quantity}} into circulation, and transfer it into {{to}}’s account.\n\n{{#if memo}}There is a memo attached to the transfer stating:\n{{memo}}\n{{/if}}\n\nIf {{to}} does not have a balance for {{asset_to_symbol_code quantity}}, or the token manager does not have a balance for {{asset_to_symbol_code quantity}}, the token manager will be designated as the RAM payer of the {{asset_to_symbol_code quantity}} token balance for {{to}}. As a result, RAM will be deducted from the token manager’s resources to create the necessary records.\n\nThis action does not allow the total quantity to exceed the max allowed supply of the token." + }, + { + "name": "open", + "type": "open", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Open Token Balance\nsummary: 'Open a zero quantity balance for {{nowrap owner}}'\nicon: https://raw.githubusercontent.com/cryptokylin/eosio.contracts/v1.7.0/contracts/icons/token.png#207ff68b0406eaa56618b08bda81d6a0954543f36adc328ab3065f31a5c5d654\n---\n\n{{ram_payer}} agrees to establish a zero quantity balance for {{owner}} for the {{symbol_to_symbol_code symbol}} token.\n\nIf {{owner}} does not have a balance for {{symbol_to_symbol_code symbol}}, {{ram_payer}} will be designated as the RAM payer of the {{symbol_to_symbol_code symbol}} token balance for {{owner}}. As a result, RAM will be deducted from {{ram_payer}}’s resources to create the necessary records." + }, + { + "name": "retire", + "type": "retire", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Remove Tokens from Circulation\nsummary: 'Remove {{nowrap quantity}} from circulation'\nicon: https://raw.githubusercontent.com/cryptokylin/eosio.contracts/v1.7.0/contracts/icons/token.png#207ff68b0406eaa56618b08bda81d6a0954543f36adc328ab3065f31a5c5d654\n---\n\nThe token manager agrees to remove {{quantity}} from circulation, taken from their own account.\n\n{{#if memo}} There is a memo attached to the action stating:\n{{memo}}\n{{/if}}" + }, + { + "name": "transfer", + "type": "transfer", + "ricardian_contract": "---\nspec_version: \"0.2.0\"\ntitle: Transfer Tokens\nsummary: 'Send {{nowrap quantity}} from {{nowrap from}} to {{nowrap to}}'\nicon: https://raw.githubusercontent.com/cryptokylin/eosio.contracts/v1.7.0/contracts/icons/transfer.png#5dfad0df72772ee1ccc155e670c1d124f5c5122f1d5027565df38b418042d1dd\n---\n\n{{from}} agrees to send {{quantity}} to {{to}}.\n\n{{#if memo}}There is a memo attached to the transfer stating:\n{{memo}}\n{{/if}}\n\nIf {{from}} is not already the RAM payer of their {{asset_to_symbol_code quantity}} token balance, {{from}} will be designated as such. As a result, RAM will be deducted from {{from}}’s resources to refund the original RAM payer.\n\nIf {{to}} does not have a balance for {{asset_to_symbol_code quantity}}, {{from}} will be designated as the RAM payer of the {{asset_to_symbol_code quantity}} token balance for {{to}}. As a result, RAM will be deducted from {{from}}’s resources to create the necessary records." + } + ], + "tables": [ + { + "name": "accounts", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "account" + }, + { + "name": "stat", + "index_type": "i64", + "key_names": [], + "key_types": [], + "type": "currency_stats" + } + ], + "ricardian_clauses": [], + "error_messages": [], + "abi_extensions": [], + "variants": [], + "action_results": [] +} diff --git a/test/data/contracts/mock-eosio.msig.ts b/test/data/contracts/mock-eosio.msig.ts new file mode 100644 index 0000000..dc742bb --- /dev/null +++ b/test/data/contracts/mock-eosio.msig.ts @@ -0,0 +1,241 @@ +import { + ABI, + Action, + Blob, + Bytes, + Checksum256, + Checksum256Type, + Name, + NameType, + Struct, + TimePoint, + TimePointSec, + UInt16, + UInt32, + UInt8, + VarUInt, +} from '@wharfkit/antelope' +import {ActionOptions, Contract as BaseContract, ContractArgs, PartialBy} from '@wharfkit/contract' +export namespace EosioMsig { + export const abiBlob = Blob.from( + 'DmVvc2lvOjphYmkvMS4xABAGYWN0aW9uAAQHYWNjb3VudARuYW1lBG5hbWUEbmFtZQ1hdXRob3JpemF0aW9uEnBlcm1pc3Npb25fbGV2ZWxbXQRkYXRhBWJ5dGVzCGFwcHJvdmFsAAIFbGV2ZWwQcGVybWlzc2lvbl9sZXZlbAR0aW1lCnRpbWVfcG9pbnQOYXBwcm92YWxzX2luZm8ABAd2ZXJzaW9uBXVpbnQ4DXByb3Bvc2FsX25hbWUEbmFtZRNyZXF1ZXN0ZWRfYXBwcm92YWxzCmFwcHJvdmFsW10ScHJvdmlkZWRfYXBwcm92YWxzCmFwcHJvdmFsW10HYXBwcm92ZQAECHByb3Bvc2VyBG5hbWUNcHJvcG9zYWxfbmFtZQRuYW1lBWxldmVsEHBlcm1pc3Npb25fbGV2ZWwNcHJvcG9zYWxfaGFzaAxjaGVja3N1bTI1NiQGY2FuY2VsAAMIcHJvcG9zZXIEbmFtZQ1wcm9wb3NhbF9uYW1lBG5hbWUIY2FuY2VsZXIEbmFtZQRleGVjAAMIcHJvcG9zZXIEbmFtZQ1wcm9wb3NhbF9uYW1lBG5hbWUIZXhlY3V0ZXIEbmFtZQlleHRlbnNpb24AAgR0eXBlBnVpbnQxNgRkYXRhBWJ5dGVzCmludmFsaWRhdGUAAQdhY2NvdW50BG5hbWUMaW52YWxpZGF0aW9uAAIHYWNjb3VudARuYW1lFmxhc3RfaW52YWxpZGF0aW9uX3RpbWUKdGltZV9wb2ludBJvbGRfYXBwcm92YWxzX2luZm8AAw1wcm9wb3NhbF9uYW1lBG5hbWUTcmVxdWVzdGVkX2FwcHJvdmFscxJwZXJtaXNzaW9uX2xldmVsW10ScHJvdmlkZWRfYXBwcm92YWxzEnBlcm1pc3Npb25fbGV2ZWxbXRBwZXJtaXNzaW9uX2xldmVsAAIFYWN0b3IEbmFtZQpwZXJtaXNzaW9uBG5hbWUIcHJvcG9zYWwAAw1wcm9wb3NhbF9uYW1lBG5hbWUScGFja2VkX3RyYW5zYWN0aW9uBWJ5dGVzEmVhcmxpZXN0X2V4ZWNfdGltZQx0aW1lX3BvaW50PyQHcHJvcG9zZQAECHByb3Bvc2VyBG5hbWUNcHJvcG9zYWxfbmFtZQRuYW1lCXJlcXVlc3RlZBJwZXJtaXNzaW9uX2xldmVsW10DdHJ4C3RyYW5zYWN0aW9uC3RyYW5zYWN0aW9uEnRyYW5zYWN0aW9uX2hlYWRlcgMUY29udGV4dF9mcmVlX2FjdGlvbnMIYWN0aW9uW10HYWN0aW9ucwhhY3Rpb25bXRZ0cmFuc2FjdGlvbl9leHRlbnNpb25zC2V4dGVuc2lvbltdEnRyYW5zYWN0aW9uX2hlYWRlcgAGCmV4cGlyYXRpb24OdGltZV9wb2ludF9zZWMNcmVmX2Jsb2NrX251bQZ1aW50MTYQcmVmX2Jsb2NrX3ByZWZpeAZ1aW50MzITbWF4X25ldF91c2FnZV93b3Jkcwl2YXJ1aW50MzIQbWF4X2NwdV91c2FnZV9tcwV1aW50OAlkZWxheV9zZWMJdmFydWludDMyCXVuYXBwcm92ZQADCHByb3Bvc2VyBG5hbWUNcHJvcG9zYWxfbmFtZQRuYW1lBWxldmVsEHBlcm1pc3Npb25fbGV2ZWwGAAAAQG16azUHYXBwcm92ZcQDLS0tCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogQXBwcm92ZSBQcm9wb3NlZCBUcmFuc2FjdGlvbgpzdW1tYXJ5OiAne3tub3dyYXAgbGV2ZWwuYWN0b3J9fSBhcHByb3ZlcyB0aGUge3tub3dyYXAgcHJvcG9zYWxfbmFtZX19IHByb3Bvc2FsJwppY29uOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vRU9TLU5hdGlvbi9lb3Npby5tc2lnL21hc3Rlci9jb250cmFjdHMvaWNvbnMvbXVsdGlzaWcucG5nIzRmYjQxZDNjZjAyZDBkZDJkMzVhMjkzMDhlOTNjMmQ4MjZlYzc3MGQ2YmI1MjBkYjY2OGY1MzA3NjRiZTcxNTMKLS0tCgp7e2xldmVsLmFjdG9yfX0gYXBwcm92ZXMgdGhlIHt7cHJvcG9zYWxfbmFtZX19IHByb3Bvc2FsIHByb3Bvc2VkIGJ5IHt7cHJvcG9zZXJ9fSB3aXRoIHRoZSB7e2xldmVsLnBlcm1pc3Npb259fSBwZXJtaXNzaW9uIG9mIHt7bGV2ZWwuYWN0b3J9fS4AAAAARIWmQQZjYW5jZWyAAy0tLQpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IENhbmNlbCBQcm9wb3NlZCBUcmFuc2FjdGlvbgpzdW1tYXJ5OiAne3tub3dyYXAgY2FuY2VsZXJ9fSBjYW5jZWxzIHRoZSB7e25vd3JhcCBwcm9wb3NhbF9uYW1lfX0gcHJvcG9zYWwnCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9FT1MtTmF0aW9uL2Vvc2lvLm1zaWcvbWFzdGVyL2NvbnRyYWN0cy9pY29ucy9tdWx0aXNpZy5wbmcjNGZiNDFkM2NmMDJkMGRkMmQzNWEyOTMwOGU5M2MyZDgyNmVjNzcwZDZiYjUyMGRiNjY4ZjUzMDc2NGJlNzE1MwotLS0KCnt7Y2FuY2VsZXJ9fSBjYW5jZWxzIHRoZSB7e3Byb3Bvc2FsX25hbWV9fSBwcm9wb3NhbCBzdWJtaXR0ZWQgYnkge3twcm9wb3Nlcn19LgAAAAAAgFRXBGV4ZWPIAy0tLQpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IEV4ZWN1dGUgUHJvcG9zZWQgVHJhbnNhY3Rpb24Kc3VtbWFyeTogJ3t7bm93cmFwIGV4ZWN1dGVyfX0gZXhlY3V0ZXMgdGhlIHt7bm93cmFwIHByb3Bvc2FsX25hbWV9fSBwcm9wb3NhbCcKaWNvbjogaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0VPUy1OYXRpb24vZW9zaW8ubXNpZy9tYXN0ZXIvY29udHJhY3RzL2ljb25zL211bHRpc2lnLnBuZyM0ZmI0MWQzY2YwMmQwZGQyZDM1YTI5MzA4ZTkzYzJkODI2ZWM3NzBkNmJiNTIwZGI2NjhmNTMwNzY0YmU3MTUzCi0tLQoKe3tleGVjdXRlcn19IGV4ZWN1dGVzIHRoZSB7e3Byb3Bvc2FsX25hbWV9fSBwcm9wb3NhbCBzdWJtaXR0ZWQgYnkge3twcm9wb3Nlcn19IGlmIHRoZSBtaW5pbXVtIHJlcXVpcmVkIGFwcHJvdmFscyBmb3IgdGhlIHByb3Bvc2FsIGhhdmUgYmVlbiBzZWN1cmVkLgCAyia5aPZ0CmludmFsaWRhdGX+Ai0tLQpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IEludmFsaWRhdGUgQWxsIEFwcHJvdmFscwpzdW1tYXJ5OiAne3tub3dyYXAgYWNjb3VudH19IGludmFsaWRhdGVzIGFwcHJvdmFscyBvbiBvdXRzdGFuZGluZyBwcm9wb3NhbHMnCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9FT1MtTmF0aW9uL2Vvc2lvLm1zaWcvbWFzdGVyL2NvbnRyYWN0cy9pY29ucy9tdWx0aXNpZy5wbmcjNGZiNDFkM2NmMDJkMGRkMmQzNWEyOTMwOGU5M2MyZDgyNmVjNzcwZDZiYjUyMGRiNjY4ZjUzMDc2NGJlNzE1MwotLS0KCnt7YWNjb3VudH19IGludmFsaWRhdGVzIGFsbCBhcHByb3ZhbHMgb24gcHJvcG9zYWxzIHdoaWNoIGhhdmUgbm90IHlldCBleGVjdXRlZC4AAABAYVrprQdwcm9wb3NlqgUtLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBQcm9wb3NlIFRyYW5zYWN0aW9uCnN1bW1hcnk6ICd7e25vd3JhcCBwcm9wb3Nlcn19IGNyZWF0ZXMgdGhlIHt7bm93cmFwIHByb3Bvc2FsX25hbWV9fScKaWNvbjogaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0VPUy1OYXRpb24vZW9zaW8ubXNpZy9tYXN0ZXIvY29udHJhY3RzL2ljb25zL211bHRpc2lnLnBuZyM0ZmI0MWQzY2YwMmQwZGQyZDM1YTI5MzA4ZTkzYzJkODI2ZWM3NzBkNmJiNTIwZGI2NjhmNTMwNzY0YmU3MTUzCi0tLQoKe3twcm9wb3Nlcn19IGNyZWF0ZXMgdGhlIHt7cHJvcG9zYWxfbmFtZX19IHByb3Bvc2FsIGZvciB0aGUgZm9sbG93aW5nIHRyYW5zYWN0aW9uOgp7e3RvX2pzb24gdHJ4fX0KClRoZSBwcm9wb3NhbCByZXF1ZXN0cyBhcHByb3ZhbHMgZnJvbSB0aGUgZm9sbG93aW5nIGFjY291bnRzIGF0IHRoZSBzcGVjaWZpZWQgcGVybWlzc2lvbiBsZXZlbHM6Cnt7I2VhY2ggcmVxdWVzdGVkfX0KICAgKyB7e3RoaXMucGVybWlzc2lvbn19IHBlcm1pc3Npb24gb2Yge3t0aGlzLmFjdG9yfX0Ke3svZWFjaH19CgpJZiB0aGUgcHJvcG9zZWQgdHJhbnNhY3Rpb24gaXMgbm90IGV4ZWN1dGVkIHByaW9yIHRvIHt7dHJ4LmV4cGlyYXRpb259fSwgdGhlIHByb3Bvc2FsIHdpbGwgYXV0b21hdGljYWxseSBleHBpcmUuAABQm95azdQJdW5hcHByb3Zl/QMtLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBVbmFwcHJvdmUgUHJvcG9zZWQgVHJhbnNhY3Rpb24Kc3VtbWFyeTogJ3t7bm93cmFwIGxldmVsLmFjdG9yfX0gcmV2b2tlcyB0aGUgYXBwcm92YWwgcHJldmlvdXNseSBwcm92aWRlZCB0byB7e25vd3JhcCBwcm9wb3NhbF9uYW1lfX0gcHJvcG9zYWwnCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9FT1MtTmF0aW9uL2Vvc2lvLm1zaWcvbWFzdGVyL2NvbnRyYWN0cy9pY29ucy9tdWx0aXNpZy5wbmcjNGZiNDFkM2NmMDJkMGRkMmQzNWEyOTMwOGU5M2MyZDgyNmVjNzcwZDZiYjUyMGRiNjY4ZjUzMDc2NGJlNzE1MwotLS0KCnt7bGV2ZWwuYWN0b3J9fSByZXZva2VzIHRoZSBhcHByb3ZhbCBwcmV2aW91c2x5IHByb3ZpZGVkIGF0IHRoZWlyIHt7bGV2ZWwucGVybWlzc2lvbn19IHBlcm1pc3Npb24gbGV2ZWwgZnJvbSB0aGUge3twcm9wb3NhbF9uYW1lfX0gcHJvcG9zYWwgcHJvcG9zZWQgYnkge3twcm9wb3Nlcn19LgQAAMDRbHprNQNpNjQAABJvbGRfYXBwcm92YWxzX2luZm8AgMDRbHprNQNpNjQAAA5hcHByb3ZhbHNfaW5mbwAAAADgaPZ0A2k2NAAADGludmFsaWRhdGlvbgAAANFgWumtA2k2NAAACHByb3Bvc2FsAAAAAA==' + ) + export const abi = ABI.from(abiBlob) + export class Contract extends BaseContract { + constructor(args: PartialBy) { + super({ + client: args.client, + abi: abi, + account: Name.from('eosio.msig'), + }) + } + action( + name: T, + data: ActionNameParams[T], + options?: ActionOptions + ): Action { + return super.action(name, data, options) + } + table( + name: T, + scope?: NameType + ) { + return super.table(name, scope, TableMap[name]) + } + } + export interface ActionNameParams { + approve: ActionParams.Approve + cancel: ActionParams.Cancel + exec: ActionParams.Exec + invalidate: ActionParams.Invalidate + propose: ActionParams.Propose + unapprove: ActionParams.Unapprove + } + export namespace ActionParams { + export interface Approve { + proposer: NameType + proposal_name: NameType + level: Types.PermissionLevel + proposal_hash: Checksum256Type + } + export interface Cancel { + proposer: NameType + proposal_name: NameType + canceler: NameType + } + export interface Exec { + proposer: NameType + proposal_name: NameType + executer: NameType + } + export interface Invalidate { + account: NameType + } + export interface Propose { + proposer: NameType + proposal_name: NameType + requested: Types.PermissionLevel[] + trx: Types.Transaction + } + export interface Unapprove { + proposer: NameType + proposal_name: NameType + level: Types.PermissionLevel + } + } + export namespace Types { + @Struct.type('permission_level') + export class PermissionLevel extends Struct { + @Struct.field(Name) + actor!: Name + @Struct.field(Name) + permission!: Name + } + @Struct.type('action') + export class Action extends Struct { + @Struct.field(Name) + account!: Name + @Struct.field(Name) + name!: Name + @Struct.field(PermissionLevel, {array: true}) + authorization!: PermissionLevel[] + @Struct.field(Bytes) + data!: Bytes + } + @Struct.type('approval') + export class Approval extends Struct { + @Struct.field(PermissionLevel) + level!: PermissionLevel + @Struct.field(TimePoint) + time!: TimePoint + } + @Struct.type('approvals_info') + export class ApprovalsInfo extends Struct { + @Struct.field(UInt8) + version!: UInt8 + @Struct.field(Name) + proposal_name!: Name + @Struct.field(Approval, {array: true}) + requested_approvals!: Approval[] + @Struct.field(Approval, {array: true}) + provided_approvals!: Approval[] + } + @Struct.type('approve') + export class Approve extends Struct { + @Struct.field(Name) + proposer!: Name + @Struct.field(Name) + proposal_name!: Name + @Struct.field(PermissionLevel) + level!: PermissionLevel + @Struct.field(Checksum256) + proposal_hash!: Checksum256 + } + @Struct.type('cancel') + export class Cancel extends Struct { + @Struct.field(Name) + proposer!: Name + @Struct.field(Name) + proposal_name!: Name + @Struct.field(Name) + canceler!: Name + } + @Struct.type('exec') + export class Exec extends Struct { + @Struct.field(Name) + proposer!: Name + @Struct.field(Name) + proposal_name!: Name + @Struct.field(Name) + executer!: Name + } + @Struct.type('extension') + export class Extension extends Struct { + @Struct.field(UInt16) + type!: UInt16 + @Struct.field(Bytes) + data!: Bytes + } + @Struct.type('invalidate') + export class Invalidate extends Struct { + @Struct.field(Name) + account!: Name + } + @Struct.type('invalidation') + export class Invalidation extends Struct { + @Struct.field(Name) + account!: Name + @Struct.field(TimePoint) + last_invalidation_time!: TimePoint + } + @Struct.type('old_approvals_info') + export class OldApprovalsInfo extends Struct { + @Struct.field(Name) + proposal_name!: Name + @Struct.field(PermissionLevel, {array: true}) + requested_approvals!: PermissionLevel[] + @Struct.field(PermissionLevel, {array: true}) + provided_approvals!: PermissionLevel[] + } + @Struct.type('proposal') + export class Proposal extends Struct { + @Struct.field(Name) + proposal_name!: Name + @Struct.field(Bytes) + packed_transaction!: Bytes + @Struct.field(TimePoint) + earliest_exec_time!: TimePoint + } + @Struct.type('transaction') + export class Transaction extends Struct { + @Struct.field(Action, {array: true}) + context_free_actions!: Action[] + @Struct.field(Action, {array: true}) + actions!: Action[] + @Struct.field(Extension, {array: true}) + transaction_extensions!: Extension[] + } + @Struct.type('propose') + export class Propose extends Struct { + @Struct.field(Name) + proposer!: Name + @Struct.field(Name) + proposal_name!: Name + @Struct.field(PermissionLevel, {array: true}) + requested!: PermissionLevel[] + @Struct.field(Transaction) + trx!: Transaction + } + @Struct.type('transaction_header') + export class TransactionHeader extends Struct { + @Struct.field(TimePointSec) + expiration!: TimePointSec + @Struct.field(UInt16) + ref_block_num!: UInt16 + @Struct.field(UInt32) + ref_block_prefix!: UInt32 + @Struct.field(VarUInt) + max_net_usage_words!: VarUInt + @Struct.field(UInt8) + max_cpu_usage_ms!: UInt8 + @Struct.field(VarUInt) + delay_sec!: VarUInt + } + @Struct.type('unapprove') + export class Unapprove extends Struct { + @Struct.field(Name) + proposer!: Name + @Struct.field(Name) + proposal_name!: Name + @Struct.field(PermissionLevel) + level!: PermissionLevel + } + } + const TableMap = { + approvals: Types.OldApprovalsInfo, + approvals2: Types.ApprovalsInfo, + invals: Types.Invalidation, + proposal: Types.Proposal, + } +} +export default EosioMsig diff --git a/test/data/contracts/mock-eosio.token.ts b/test/data/contracts/mock-eosio.token.ts new file mode 100644 index 0000000..7e64164 --- /dev/null +++ b/test/data/contracts/mock-eosio.token.ts @@ -0,0 +1,136 @@ +import {ABI, Action, Asset, AssetType, Blob, Name, NameType, Struct} from '@wharfkit/antelope' +import {ActionOptions, Contract as BaseContract, ContractArgs, PartialBy} from '@wharfkit/contract' +export namespace EosioToken { + export const abiBlob = Blob.from( + 'DmVvc2lvOjphYmkvMS4xAAgHYWNjb3VudAABB2JhbGFuY2UFYXNzZXQFY2xvc2UAAgVvd25lcgRuYW1lBnN5bWJvbAZzeW1ib2wGY3JlYXRlAAIGaXNzdWVyBG5hbWUObWF4aW11bV9zdXBwbHkFYXNzZXQOY3VycmVuY3lfc3RhdHMAAwZzdXBwbHkFYXNzZXQKbWF4X3N1cHBseQVhc3NldAZpc3N1ZXIEbmFtZQVpc3N1ZQADAnRvBG5hbWUIcXVhbnRpdHkFYXNzZXQEbWVtbwZzdHJpbmcEb3BlbgADBW93bmVyBG5hbWUGc3ltYm9sBnN5bWJvbAlyYW1fcGF5ZXIEbmFtZQZyZXRpcmUAAghxdWFudGl0eQVhc3NldARtZW1vBnN0cmluZwh0cmFuc2ZlcgAEBGZyb20EbmFtZQJ0bwRuYW1lCHF1YW50aXR5BWFzc2V0BG1lbW8Gc3RyaW5nBgAAAAAAhWlEBWNsb3Nl7QMtLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBDbG9zZSBUb2tlbiBCYWxhbmNlCnN1bW1hcnk6ICdDbG9zZSB7e25vd3JhcCBvd25lcn194oCZcyB6ZXJvIHF1YW50aXR5IGJhbGFuY2UnCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9jcnlwdG9reWxpbi9lb3Npby5jb250cmFjdHMvdjEuNy4wL2NvbnRyYWN0cy9pY29ucy90b2tlbi5wbmcjMjA3ZmY2OGIwNDA2ZWFhNTY2MThiMDhiZGE4MWQ2YTA5NTQ1NDNmMzZhZGMzMjhhYjMwNjVmMzFhNWM1ZDY1NAotLS0KCnt7b3duZXJ9fSBhZ3JlZXMgdG8gY2xvc2UgdGhlaXIgemVybyBxdWFudGl0eSBiYWxhbmNlIGZvciB0aGUge3tzeW1ib2xfdG9fc3ltYm9sX2NvZGUgc3ltYm9sfX0gdG9rZW4uCgpSQU0gd2lsbCBiZSByZWZ1bmRlZCB0byB0aGUgUkFNIHBheWVyIG9mIHRoZSB7e3N5bWJvbF90b19zeW1ib2xfY29kZSBzeW1ib2x9fSB0b2tlbiBiYWxhbmNlIGZvciB7e293bmVyfX0uAAAAAKhs1EUGY3JlYXRljgUtLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBDcmVhdGUgTmV3IFRva2VuCnN1bW1hcnk6ICdDcmVhdGUgYSBuZXcgdG9rZW4nCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9jcnlwdG9reWxpbi9lb3Npby5jb250cmFjdHMvdjEuNy4wL2NvbnRyYWN0cy9pY29ucy90b2tlbi5wbmcjMjA3ZmY2OGIwNDA2ZWFhNTY2MThiMDhiZGE4MWQ2YTA5NTQ1NDNmMzZhZGMzMjhhYjMwNjVmMzFhNWM1ZDY1NAotLS0KCnt7JGFjdGlvbi5hY2NvdW50fX0gYWdyZWVzIHRvIGNyZWF0ZSBhIG5ldyB0b2tlbiB3aXRoIHN5bWJvbCB7e2Fzc2V0X3RvX3N5bWJvbF9jb2RlIG1heGltdW1fc3VwcGx5fX0gdG8gYmUgbWFuYWdlZCBieSB7e2lzc3Vlcn19LgoKVGhpcyBhY3Rpb24gd2lsbCBub3QgcmVzdWx0IGFueSBhbnkgdG9rZW5zIGJlaW5nIGlzc3VlZCBpbnRvIGNpcmN1bGF0aW9uLgoKe3tpc3N1ZXJ9fSB3aWxsIGJlIGFsbG93ZWQgdG8gaXNzdWUgdG9rZW5zIGludG8gY2lyY3VsYXRpb24sIHVwIHRvIGEgbWF4aW11bSBzdXBwbHkgb2Yge3ttYXhpbXVtX3N1cHBseX19LgoKUkFNIHdpbGwgZGVkdWN0ZWQgZnJvbSB7eyRhY3Rpb24uYWNjb3VudH194oCZcyByZXNvdXJjZXMgdG8gY3JlYXRlIHRoZSBuZWNlc3NhcnkgcmVjb3Jkcy4AAAAAAKUxdgVpc3N1ZeIHLS0tCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogSXNzdWUgVG9rZW5zIGludG8gQ2lyY3VsYXRpb24Kc3VtbWFyeTogJ0lzc3VlIHt7bm93cmFwIHF1YW50aXR5fX0gaW50byBjaXJjdWxhdGlvbiBhbmQgdHJhbnNmZXIgaW50byB7e25vd3JhcCB0b3194oCZcyBhY2NvdW50JwppY29uOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vY3J5cHRva3lsaW4vZW9zaW8uY29udHJhY3RzL3YxLjcuMC9jb250cmFjdHMvaWNvbnMvdG9rZW4ucG5nIzIwN2ZmNjhiMDQwNmVhYTU2NjE4YjA4YmRhODFkNmEwOTU0NTQzZjM2YWRjMzI4YWIzMDY1ZjMxYTVjNWQ2NTQKLS0tCgpUaGUgdG9rZW4gbWFuYWdlciBhZ3JlZXMgdG8gaXNzdWUge3txdWFudGl0eX19IGludG8gY2lyY3VsYXRpb24sIGFuZCB0cmFuc2ZlciBpdCBpbnRvIHt7dG99feKAmXMgYWNjb3VudC4KCnt7I2lmIG1lbW99fVRoZXJlIGlzIGEgbWVtbyBhdHRhY2hlZCB0byB0aGUgdHJhbnNmZXIgc3RhdGluZzoKe3ttZW1vfX0Ke3svaWZ9fQoKSWYge3t0b319IGRvZXMgbm90IGhhdmUgYSBiYWxhbmNlIGZvciB7e2Fzc2V0X3RvX3N5bWJvbF9jb2RlIHF1YW50aXR5fX0sIG9yIHRoZSB0b2tlbiBtYW5hZ2VyIGRvZXMgbm90IGhhdmUgYSBiYWxhbmNlIGZvciB7e2Fzc2V0X3RvX3N5bWJvbF9jb2RlIHF1YW50aXR5fX0sIHRoZSB0b2tlbiBtYW5hZ2VyIHdpbGwgYmUgZGVzaWduYXRlZCBhcyB0aGUgUkFNIHBheWVyIG9mIHRoZSB7e2Fzc2V0X3RvX3N5bWJvbF9jb2RlIHF1YW50aXR5fX0gdG9rZW4gYmFsYW5jZSBmb3Ige3t0b319LiBBcyBhIHJlc3VsdCwgUkFNIHdpbGwgYmUgZGVkdWN0ZWQgZnJvbSB0aGUgdG9rZW4gbWFuYWdlcuKAmXMgcmVzb3VyY2VzIHRvIGNyZWF0ZSB0aGUgbmVjZXNzYXJ5IHJlY29yZHMuCgpUaGlzIGFjdGlvbiBkb2VzIG5vdCBhbGxvdyB0aGUgdG90YWwgcXVhbnRpdHkgdG8gZXhjZWVkIHRoZSBtYXggYWxsb3dlZCBzdXBwbHkgb2YgdGhlIHRva2VuLgAAAAAAMFWlBG9wZW66BS0tLQpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IE9wZW4gVG9rZW4gQmFsYW5jZQpzdW1tYXJ5OiAnT3BlbiBhIHplcm8gcXVhbnRpdHkgYmFsYW5jZSBmb3Ige3tub3dyYXAgb3duZXJ9fScKaWNvbjogaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2NyeXB0b2t5bGluL2Vvc2lvLmNvbnRyYWN0cy92MS43LjAvY29udHJhY3RzL2ljb25zL3Rva2VuLnBuZyMyMDdmZjY4YjA0MDZlYWE1NjYxOGIwOGJkYTgxZDZhMDk1NDU0M2YzNmFkYzMyOGFiMzA2NWYzMWE1YzVkNjU0Ci0tLQoKe3tyYW1fcGF5ZXJ9fSBhZ3JlZXMgdG8gZXN0YWJsaXNoIGEgemVybyBxdWFudGl0eSBiYWxhbmNlIGZvciB7e293bmVyfX0gZm9yIHRoZSB7e3N5bWJvbF90b19zeW1ib2xfY29kZSBzeW1ib2x9fSB0b2tlbi4KCklmIHt7b3duZXJ9fSBkb2VzIG5vdCBoYXZlIGEgYmFsYW5jZSBmb3Ige3tzeW1ib2xfdG9fc3ltYm9sX2NvZGUgc3ltYm9sfX0sIHt7cmFtX3BheWVyfX0gd2lsbCBiZSBkZXNpZ25hdGVkIGFzIHRoZSBSQU0gcGF5ZXIgb2YgdGhlIHt7c3ltYm9sX3RvX3N5bWJvbF9jb2RlIHN5bWJvbH19IHRva2VuIGJhbGFuY2UgZm9yIHt7b3duZXJ9fS4gQXMgYSByZXN1bHQsIFJBTSB3aWxsIGJlIGRlZHVjdGVkIGZyb20ge3tyYW1fcGF5ZXJ9feKAmXMgcmVzb3VyY2VzIHRvIGNyZWF0ZSB0aGUgbmVjZXNzYXJ5IHJlY29yZHMuAAAAAKjrsroGcmV0aXJl0AMtLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBSZW1vdmUgVG9rZW5zIGZyb20gQ2lyY3VsYXRpb24Kc3VtbWFyeTogJ1JlbW92ZSB7e25vd3JhcCBxdWFudGl0eX19IGZyb20gY2lyY3VsYXRpb24nCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9jcnlwdG9reWxpbi9lb3Npby5jb250cmFjdHMvdjEuNy4wL2NvbnRyYWN0cy9pY29ucy90b2tlbi5wbmcjMjA3ZmY2OGIwNDA2ZWFhNTY2MThiMDhiZGE4MWQ2YTA5NTQ1NDNmMzZhZGMzMjhhYjMwNjVmMzFhNWM1ZDY1NAotLS0KClRoZSB0b2tlbiBtYW5hZ2VyIGFncmVlcyB0byByZW1vdmUge3txdWFudGl0eX19IGZyb20gY2lyY3VsYXRpb24sIHRha2VuIGZyb20gdGhlaXIgb3duIGFjY291bnQuCgp7eyNpZiBtZW1vfX0gVGhlcmUgaXMgYSBtZW1vIGF0dGFjaGVkIHRvIHRoZSBhY3Rpb24gc3RhdGluZzoKe3ttZW1vfX0Ke3svaWZ9fQAAAFctPM3NCHRyYW5zZmVyqgctLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBUcmFuc2ZlciBUb2tlbnMKc3VtbWFyeTogJ1NlbmQge3tub3dyYXAgcXVhbnRpdHl9fSBmcm9tIHt7bm93cmFwIGZyb219fSB0byB7e25vd3JhcCB0b319JwppY29uOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vY3J5cHRva3lsaW4vZW9zaW8uY29udHJhY3RzL3YxLjcuMC9jb250cmFjdHMvaWNvbnMvdHJhbnNmZXIucG5nIzVkZmFkMGRmNzI3NzJlZTFjY2MxNTVlNjcwYzFkMTI0ZjVjNTEyMmYxZDUwMjc1NjVkZjM4YjQxODA0MmQxZGQKLS0tCgp7e2Zyb219fSBhZ3JlZXMgdG8gc2VuZCB7e3F1YW50aXR5fX0gdG8ge3t0b319LgoKe3sjaWYgbWVtb319VGhlcmUgaXMgYSBtZW1vIGF0dGFjaGVkIHRvIHRoZSB0cmFuc2ZlciBzdGF0aW5nOgp7e21lbW99fQp7ey9pZn19CgpJZiB7e2Zyb219fSBpcyBub3QgYWxyZWFkeSB0aGUgUkFNIHBheWVyIG9mIHRoZWlyIHt7YXNzZXRfdG9fc3ltYm9sX2NvZGUgcXVhbnRpdHl9fSB0b2tlbiBiYWxhbmNlLCB7e2Zyb219fSB3aWxsIGJlIGRlc2lnbmF0ZWQgYXMgc3VjaC4gQXMgYSByZXN1bHQsIFJBTSB3aWxsIGJlIGRlZHVjdGVkIGZyb20ge3tmcm9tfX3igJlzIHJlc291cmNlcyB0byByZWZ1bmQgdGhlIG9yaWdpbmFsIFJBTSBwYXllci4KCklmIHt7dG99fSBkb2VzIG5vdCBoYXZlIGEgYmFsYW5jZSBmb3Ige3thc3NldF90b19zeW1ib2xfY29kZSBxdWFudGl0eX19LCB7e2Zyb219fSB3aWxsIGJlIGRlc2lnbmF0ZWQgYXMgdGhlIFJBTSBwYXllciBvZiB0aGUge3thc3NldF90b19zeW1ib2xfY29kZSBxdWFudGl0eX19IHRva2VuIGJhbGFuY2UgZm9yIHt7dG99fS4gQXMgYSByZXN1bHQsIFJBTSB3aWxsIGJlIGRlZHVjdGVkIGZyb20ge3tmcm9tfX3igJlzIHJlc291cmNlcyB0byBjcmVhdGUgdGhlIG5lY2Vzc2FyeSByZWNvcmRzLgIAAAA4T00RMgNpNjQAAAdhY2NvdW50AAAAAACQTcYDaTY0AAAOY3VycmVuY3lfc3RhdHMAAAAA' + ) + export const abi = ABI.from(abiBlob) + export class Contract extends BaseContract { + constructor(args: PartialBy) { + super({ + client: args.client, + abi: abi, + account: Name.from('eosio.token'), + }) + } + action( + name: T, + data: ActionNameParams[T], + options?: ActionOptions + ): Action { + return super.action(name, data, options) + } + table(name: T, scope?: NameType) { + return super.table(name, scope, TableMap[name]) + } + } + export interface ActionNameParams { + close: ActionParams.Close + create: ActionParams.Create + issue: ActionParams.Issue + open: ActionParams.Open + retire: ActionParams.Retire + transfer: ActionParams.Transfer + } + export namespace ActionParams { + export interface Close { + owner: NameType + symbol: Asset.SymbolType + } + export interface Create { + issuer: NameType + maximum_supply: AssetType + } + export interface Issue { + to: NameType + quantity: AssetType + memo: string + } + export interface Open { + owner: NameType + symbol: Asset.SymbolType + ram_payer: NameType + } + export interface Retire { + quantity: AssetType + memo: string + } + export interface Transfer { + from: NameType + to: NameType + quantity: AssetType + memo: string + } + } + export namespace Types { + @Struct.type('account') + export class Account extends Struct { + @Struct.field(Asset) + balance!: Asset + } + @Struct.type('close') + export class Close extends Struct { + @Struct.field(Name) + owner!: Name + @Struct.field(Asset.Symbol) + symbol!: Asset.Symbol + } + @Struct.type('create') + export class Create extends Struct { + @Struct.field(Name) + issuer!: Name + @Struct.field(Asset) + maximum_supply!: Asset + } + @Struct.type('currency_stats') + export class CurrencyStats extends Struct { + @Struct.field(Asset) + supply!: Asset + @Struct.field(Asset) + max_supply!: Asset + @Struct.field(Name) + issuer!: Name + } + @Struct.type('issue') + export class Issue extends Struct { + @Struct.field(Name) + to!: Name + @Struct.field(Asset) + quantity!: Asset + @Struct.field('string') + memo!: string + } + @Struct.type('open') + export class Open extends Struct { + @Struct.field(Name) + owner!: Name + @Struct.field(Asset.Symbol) + symbol!: Asset.Symbol + @Struct.field(Name) + ram_payer!: Name + } + @Struct.type('retire') + export class Retire extends Struct { + @Struct.field(Asset) + quantity!: Asset + @Struct.field('string') + memo!: string + } + @Struct.type('transfer') + export class Transfer extends Struct { + @Struct.field(Name) + from!: Name + @Struct.field(Name) + to!: Name + @Struct.field(Asset) + quantity!: Asset + @Struct.field('string') + memo!: string + } + } + const TableMap = { + accounts: Types.Account, + stat: Types.CurrencyStats, + } +} +export default EosioToken diff --git a/test/data/contracts/mock-eosio.ts b/test/data/contracts/mock-eosio.ts new file mode 100644 index 0000000..126ffbd --- /dev/null +++ b/test/data/contracts/mock-eosio.ts @@ -0,0 +1,1538 @@ +import { + ABI, + Action, + Asset, + AssetType, + Blob, + BlockTimestamp, + Bytes, + BytesType, + Checksum256, + Checksum256Type, + Float64, + Int64, + Int64Type, + Name, + NameType, + PublicKey, + PublicKeyType, + Struct, + TimePoint, + TimePointSec, + UInt128, + UInt128Type, + UInt16, + UInt16Type, + UInt32, + UInt32Type, + UInt64, + UInt64Type, + UInt8, + UInt8Type, + VarUInt, + VarUIntType, +} from '@wharfkit/antelope' +import {ActionOptions, Contract as BaseContract, ContractArgs, PartialBy} from '@wharfkit/contract' +export namespace Eosio { + export const abiBlob = Blob.from( + 'DmVvc2lvOjphYmkvMS4yAhdibG9ja19zaWduaW5nX2F1dGhvcml0eSJ2YXJpYW50X2Jsb2NrX3NpZ25pbmdfYXV0aG9yaXR5X3YwF2Jsb2NrY2hhaW5fcGFyYW1ldGVyc190GGJsb2NrY2hhaW5fcGFyYW1ldGVyc192MWcIYWJpX2hhc2gAAgVvd25lcgRuYW1lBGhhc2gLY2hlY2tzdW0yNTYIYWN0aXZhdGUAAQ5mZWF0dXJlX2RpZ2VzdAtjaGVja3N1bTI1NglhdXRob3JpdHkABAl0aHJlc2hvbGQGdWludDMyBGtleXMMa2V5X3dlaWdodFtdCGFjY291bnRzGXBlcm1pc3Npb25fbGV2ZWxfd2VpZ2h0W10Fd2FpdHMNd2FpdF93ZWlnaHRbXQpiaWRfcmVmdW5kAAIGYmlkZGVyBG5hbWUGYW1vdW50BWFzc2V0B2JpZG5hbWUAAwZiaWRkZXIEbmFtZQduZXduYW1lBG5hbWUDYmlkBWFzc2V0CWJpZHJlZnVuZAACBmJpZGRlcgRuYW1lB25ld25hbWUEbmFtZQxibG9ja19oZWFkZXIACAl0aW1lc3RhbXAGdWludDMyCHByb2R1Y2VyBG5hbWUJY29uZmlybWVkBnVpbnQxNghwcmV2aW91cwtjaGVja3N1bTI1NhF0cmFuc2FjdGlvbl9tcm9vdAtjaGVja3N1bTI1NgxhY3Rpb25fbXJvb3QLY2hlY2tzdW0yNTYQc2NoZWR1bGVfdmVyc2lvbgZ1aW50MzINbmV3X3Byb2R1Y2VycxJwcm9kdWNlcl9zY2hlZHVsZT8RYmxvY2tfaW5mb19yZWNvcmQAAwd2ZXJzaW9uBXVpbnQ4DGJsb2NrX2hlaWdodAZ1aW50MzIPYmxvY2tfdGltZXN0YW1wCnRpbWVfcG9pbnQaYmxvY2tfc2lnbmluZ19hdXRob3JpdHlfdjAAAgl0aHJlc2hvbGQGdWludDMyBGtleXMMa2V5X3dlaWdodFtdFWJsb2NrY2hhaW5fcGFyYW1ldGVycwARE21heF9ibG9ja19uZXRfdXNhZ2UGdWludDY0GnRhcmdldF9ibG9ja19uZXRfdXNhZ2VfcGN0BnVpbnQzMhltYXhfdHJhbnNhY3Rpb25fbmV0X3VzYWdlBnVpbnQzMh5iYXNlX3Blcl90cmFuc2FjdGlvbl9uZXRfdXNhZ2UGdWludDMyEG5ldF91c2FnZV9sZWV3YXkGdWludDMyI2NvbnRleHRfZnJlZV9kaXNjb3VudF9uZXRfdXNhZ2VfbnVtBnVpbnQzMiNjb250ZXh0X2ZyZWVfZGlzY291bnRfbmV0X3VzYWdlX2RlbgZ1aW50MzITbWF4X2Jsb2NrX2NwdV91c2FnZQZ1aW50MzIadGFyZ2V0X2Jsb2NrX2NwdV91c2FnZV9wY3QGdWludDMyGW1heF90cmFuc2FjdGlvbl9jcHVfdXNhZ2UGdWludDMyGW1pbl90cmFuc2FjdGlvbl9jcHVfdXNhZ2UGdWludDMyGG1heF90cmFuc2FjdGlvbl9saWZldGltZQZ1aW50MzIeZGVmZXJyZWRfdHJ4X2V4cGlyYXRpb25fd2luZG93BnVpbnQzMhVtYXhfdHJhbnNhY3Rpb25fZGVsYXkGdWludDMyFm1heF9pbmxpbmVfYWN0aW9uX3NpemUGdWludDMyF21heF9pbmxpbmVfYWN0aW9uX2RlcHRoBnVpbnQxNhNtYXhfYXV0aG9yaXR5X2RlcHRoBnVpbnQxNhhibG9ja2NoYWluX3BhcmFtZXRlcnNfdjEVYmxvY2tjaGFpbl9wYXJhbWV0ZXJzARxtYXhfYWN0aW9uX3JldHVybl92YWx1ZV9zaXplB3VpbnQzMiQGYnV5cmFtAAMFcGF5ZXIEbmFtZQhyZWNlaXZlcgRuYW1lBXF1YW50BWFzc2V0C2J1eXJhbWJ5dGVzAAMFcGF5ZXIEbmFtZQhyZWNlaXZlcgRuYW1lBWJ5dGVzBnVpbnQzMgZidXlyZXgAAgRmcm9tBG5hbWUGYW1vdW50BWFzc2V0C2NhbmNlbGRlbGF5AAIOY2FuY2VsaW5nX2F1dGgQcGVybWlzc2lvbl9sZXZlbAZ0cnhfaWQLY2hlY2tzdW0yNTYKY2ZncG93ZXJ1cAABBGFyZ3MOcG93ZXJ1cF9jb25maWcMY2xhaW1yZXdhcmRzAAEFb3duZXIEbmFtZQhjbG9zZXJleAABBW93bmVyBG5hbWUMY25jbHJleG9yZGVyAAEFb3duZXIEbmFtZQljb25uZWN0b3IAAgdiYWxhbmNlBWFzc2V0BndlaWdodAdmbG9hdDY0C2NvbnNvbGlkYXRlAAEFb3duZXIEbmFtZQpkZWZjcHVsb2FuAAMEZnJvbQRuYW1lCGxvYW5fbnVtBnVpbnQ2NAZhbW91bnQFYXNzZXQKZGVmbmV0bG9hbgADBGZyb20EbmFtZQhsb2FuX251bQZ1aW50NjQGYW1vdW50BWFzc2V0CmRlbGVnYXRlYncABQRmcm9tBG5hbWUIcmVjZWl2ZXIEbmFtZRJzdGFrZV9uZXRfcXVhbnRpdHkFYXNzZXQSc3Rha2VfY3B1X3F1YW50aXR5BWFzc2V0CHRyYW5zZmVyBGJvb2wTZGVsZWdhdGVkX2JhbmR3aWR0aAAEBGZyb20EbmFtZQJ0bwRuYW1lCm5ldF93ZWlnaHQFYXNzZXQKY3B1X3dlaWdodAVhc3NldApkZWxldGVhdXRoAAMHYWNjb3VudARuYW1lCnBlcm1pc3Npb24EbmFtZQ1hdXRob3JpemVkX2J5BW5hbWUkB2RlcG9zaXQAAgVvd25lcgRuYW1lBmFtb3VudAVhc3NldBJlb3Npb19nbG9iYWxfc3RhdGUVYmxvY2tjaGFpbl9wYXJhbWV0ZXJzDQxtYXhfcmFtX3NpemUGdWludDY0GHRvdGFsX3JhbV9ieXRlc19yZXNlcnZlZAZ1aW50NjQPdG90YWxfcmFtX3N0YWtlBWludDY0HWxhc3RfcHJvZHVjZXJfc2NoZWR1bGVfdXBkYXRlFGJsb2NrX3RpbWVzdGFtcF90eXBlGGxhc3RfcGVydm90ZV9idWNrZXRfZmlsbAp0aW1lX3BvaW50DnBlcnZvdGVfYnVja2V0BWludDY0D3BlcmJsb2NrX2J1Y2tldAVpbnQ2NBN0b3RhbF91bnBhaWRfYmxvY2tzBnVpbnQzMhV0b3RhbF9hY3RpdmF0ZWRfc3Rha2UFaW50NjQbdGhyZXNoX2FjdGl2YXRlZF9zdGFrZV90aW1lCnRpbWVfcG9pbnQbbGFzdF9wcm9kdWNlcl9zY2hlZHVsZV9zaXplBnVpbnQxNhp0b3RhbF9wcm9kdWNlcl92b3RlX3dlaWdodAdmbG9hdDY0D2xhc3RfbmFtZV9jbG9zZRRibG9ja190aW1lc3RhbXBfdHlwZRNlb3Npb19nbG9iYWxfc3RhdGUyAAURbmV3X3JhbV9wZXJfYmxvY2sGdWludDE2EWxhc3RfcmFtX2luY3JlYXNlFGJsb2NrX3RpbWVzdGFtcF90eXBlDmxhc3RfYmxvY2tfbnVtFGJsb2NrX3RpbWVzdGFtcF90eXBlHHRvdGFsX3Byb2R1Y2VyX3ZvdGVwYXlfc2hhcmUHZmxvYXQ2NAhyZXZpc2lvbgV1aW50OBNlb3Npb19nbG9iYWxfc3RhdGUzAAIWbGFzdF92cGF5X3N0YXRlX3VwZGF0ZQp0aW1lX3BvaW50HHRvdGFsX3ZwYXlfc2hhcmVfY2hhbmdlX3JhdGUHZmxvYXQ2NBNlb3Npb19nbG9iYWxfc3RhdGU0AAMPY29udGludW91c19yYXRlB2Zsb2F0NjQUaW5mbGF0aW9uX3BheV9mYWN0b3IFaW50NjQOdm90ZXBheV9mYWN0b3IFaW50NjQOZXhjaGFuZ2Vfc3RhdGUAAwZzdXBwbHkFYXNzZXQEYmFzZQljb25uZWN0b3IFcXVvdGUJY29ubmVjdG9yC2Z1bmRjcHVsb2FuAAMEZnJvbQRuYW1lCGxvYW5fbnVtBnVpbnQ2NAdwYXltZW50BWFzc2V0C2Z1bmRuZXRsb2FuAAMEZnJvbQRuYW1lCGxvYW5fbnVtBnVpbnQ2NAdwYXltZW50BWFzc2V0BGluaXQAAgd2ZXJzaW9uCXZhcnVpbnQzMgRjb3JlBnN5bWJvbAprZXlfd2VpZ2h0AAIDa2V5CnB1YmxpY19rZXkGd2VpZ2h0BnVpbnQxNgxsaW1pdGF1dGhjaGcAAwdhY2NvdW50BG5hbWULYWxsb3dfcGVybXMGbmFtZVtdDmRpc2FsbG93X3Blcm1zBm5hbWVbXQhsaW5rYXV0aAAFB2FjY291bnQEbmFtZQRjb2RlBG5hbWUEdHlwZQRuYW1lC3JlcXVpcmVtZW50BG5hbWUNYXV0aG9yaXplZF9ieQVuYW1lJAttdmZyc2F2aW5ncwACBW93bmVyBG5hbWUDcmV4BWFzc2V0C212dG9zYXZpbmdzAAIFb3duZXIEbmFtZQNyZXgFYXNzZXQIbmFtZV9iaWQABAduZXduYW1lBG5hbWULaGlnaF9iaWRkZXIEbmFtZQhoaWdoX2JpZAVpbnQ2NA1sYXN0X2JpZF90aW1lCnRpbWVfcG9pbnQKbmV3YWNjb3VudAAEB2NyZWF0b3IEbmFtZQRuYW1lBG5hbWUFb3duZXIJYXV0aG9yaXR5BmFjdGl2ZQlhdXRob3JpdHkHb25ibG9jawABBmhlYWRlcgxibG9ja19oZWFkZXIHb25lcnJvcgACCXNlbmRlcl9pZAd1aW50MTI4CHNlbnRfdHJ4BWJ5dGVzGXBhaXJfdGltZV9wb2ludF9zZWNfaW50NjQAAgVmaXJzdA50aW1lX3BvaW50X3NlYwZzZWNvbmQFaW50NjQQcGVybWlzc2lvbl9sZXZlbAACBWFjdG9yBG5hbWUKcGVybWlzc2lvbgRuYW1lF3Blcm1pc3Npb25fbGV2ZWxfd2VpZ2h0AAIKcGVybWlzc2lvbhBwZXJtaXNzaW9uX2xldmVsBndlaWdodAZ1aW50MTYHcG93ZXJ1cAAGBXBheWVyBG5hbWUIcmVjZWl2ZXIEbmFtZQRkYXlzBnVpbnQzMghuZXRfZnJhYwVpbnQ2NAhjcHVfZnJhYwVpbnQ2NAttYXhfcGF5bWVudAVhc3NldA5wb3dlcnVwX2NvbmZpZwAEA25ldBdwb3dlcnVwX2NvbmZpZ19yZXNvdXJjZQNjcHUXcG93ZXJ1cF9jb25maWdfcmVzb3VyY2UMcG93ZXJ1cF9kYXlzB3VpbnQzMj8PbWluX3Bvd2VydXBfZmVlBmFzc2V0Pxdwb3dlcnVwX2NvbmZpZ19yZXNvdXJjZQAIFGN1cnJlbnRfd2VpZ2h0X3JhdGlvBmludDY0PxN0YXJnZXRfd2VpZ2h0X3JhdGlvBmludDY0PxRhc3N1bWVkX3N0YWtlX3dlaWdodAZpbnQ2ND8QdGFyZ2V0X3RpbWVzdGFtcA90aW1lX3BvaW50X3NlYz8IZXhwb25lbnQIZmxvYXQ2ND8KZGVjYXlfc2Vjcwd1aW50MzI/CW1pbl9wcmljZQZhc3NldD8JbWF4X3ByaWNlBmFzc2V0Pw1wb3dlcnVwX29yZGVyAAYHdmVyc2lvbgV1aW50OAJpZAZ1aW50NjQFb3duZXIEbmFtZQpuZXRfd2VpZ2h0BWludDY0CmNwdV93ZWlnaHQFaW50NjQHZXhwaXJlcw50aW1lX3BvaW50X3NlYw1wb3dlcnVwX3N0YXRlAAUHdmVyc2lvbgV1aW50OANuZXQWcG93ZXJ1cF9zdGF0ZV9yZXNvdXJjZQNjcHUWcG93ZXJ1cF9zdGF0ZV9yZXNvdXJjZQxwb3dlcnVwX2RheXMGdWludDMyD21pbl9wb3dlcnVwX2ZlZQVhc3NldBZwb3dlcnVwX3N0YXRlX3Jlc291cmNlAA8HdmVyc2lvbgV1aW50OAZ3ZWlnaHQFaW50NjQMd2VpZ2h0X3JhdGlvBWludDY0FGFzc3VtZWRfc3Rha2Vfd2VpZ2h0BWludDY0FGluaXRpYWxfd2VpZ2h0X3JhdGlvBWludDY0E3RhcmdldF93ZWlnaHRfcmF0aW8FaW50NjQRaW5pdGlhbF90aW1lc3RhbXAOdGltZV9wb2ludF9zZWMQdGFyZ2V0X3RpbWVzdGFtcA50aW1lX3BvaW50X3NlYwhleHBvbmVudAdmbG9hdDY0CmRlY2F5X3NlY3MGdWludDMyCW1pbl9wcmljZQVhc3NldAltYXhfcHJpY2UFYXNzZXQLdXRpbGl6YXRpb24FaW50NjQUYWRqdXN0ZWRfdXRpbGl6YXRpb24FaW50NjQVdXRpbGl6YXRpb25fdGltZXN0YW1wDnRpbWVfcG9pbnRfc2VjC3Bvd2VydXBleGVjAAIEdXNlcgRuYW1lA21heAZ1aW50MTYNcHJvZHVjZXJfaW5mbwAJBW93bmVyBG5hbWULdG90YWxfdm90ZXMHZmxvYXQ2NAxwcm9kdWNlcl9rZXkKcHVibGljX2tleQlpc19hY3RpdmUEYm9vbAN1cmwGc3RyaW5nDXVucGFpZF9ibG9ja3MGdWludDMyD2xhc3RfY2xhaW1fdGltZQp0aW1lX3BvaW50CGxvY2F0aW9uBnVpbnQxNhJwcm9kdWNlcl9hdXRob3JpdHkYYmxvY2tfc2lnbmluZ19hdXRob3JpdHkkDnByb2R1Y2VyX2luZm8yAAMFb3duZXIEbmFtZQ12b3RlcGF5X3NoYXJlB2Zsb2F0NjQZbGFzdF92b3RlcGF5X3NoYXJlX3VwZGF0ZQp0aW1lX3BvaW50DHByb2R1Y2VyX2tleQACDXByb2R1Y2VyX25hbWUEbmFtZRFibG9ja19zaWduaW5nX2tleQpwdWJsaWNfa2V5EXByb2R1Y2VyX3NjaGVkdWxlAAIHdmVyc2lvbgZ1aW50MzIJcHJvZHVjZXJzDnByb2R1Y2VyX2tleVtdBnJlZnVuZAABBW93bmVyBG5hbWUOcmVmdW5kX3JlcXVlc3QABAVvd25lcgRuYW1lDHJlcXVlc3RfdGltZQ50aW1lX3BvaW50X3NlYwpuZXRfYW1vdW50BWFzc2V0CmNwdV9hbW91bnQFYXNzZXQLcmVncHJvZHVjZXIABAhwcm9kdWNlcgRuYW1lDHByb2R1Y2VyX2tleQpwdWJsaWNfa2V5A3VybAZzdHJpbmcIbG9jYXRpb24GdWludDE2DHJlZ3Byb2R1Y2VyMgAECHByb2R1Y2VyBG5hbWUScHJvZHVjZXJfYXV0aG9yaXR5F2Jsb2NrX3NpZ25pbmdfYXV0aG9yaXR5A3VybAZzdHJpbmcIbG9jYXRpb24GdWludDE2CHJlZ3Byb3h5AAIFcHJveHkEbmFtZQdpc3Byb3h5BGJvb2wHcmVudGNwdQAEBGZyb20EbmFtZQhyZWNlaXZlcgRuYW1lDGxvYW5fcGF5bWVudAVhc3NldAlsb2FuX2Z1bmQFYXNzZXQHcmVudG5ldAAEBGZyb20EbmFtZQhyZWNlaXZlcgRuYW1lDGxvYW5fcGF5bWVudAVhc3NldAlsb2FuX2Z1bmQFYXNzZXQLcmV4X2JhbGFuY2UABgd2ZXJzaW9uBXVpbnQ4BW93bmVyBG5hbWUKdm90ZV9zdGFrZQVhc3NldAtyZXhfYmFsYW5jZQVhc3NldAttYXR1cmVkX3JleAVpbnQ2NA5yZXhfbWF0dXJpdGllcxtwYWlyX3RpbWVfcG9pbnRfc2VjX2ludDY0W10IcmV4X2Z1bmQAAwd2ZXJzaW9uBXVpbnQ4BW93bmVyBG5hbWUHYmFsYW5jZQVhc3NldAhyZXhfbG9hbgAIB3ZlcnNpb24FdWludDgEZnJvbQRuYW1lCHJlY2VpdmVyBG5hbWUHcGF5bWVudAVhc3NldAdiYWxhbmNlBWFzc2V0DHRvdGFsX3N0YWtlZAVhc3NldAhsb2FuX251bQZ1aW50NjQKZXhwaXJhdGlvbgp0aW1lX3BvaW50CXJleF9vcmRlcgAHB3ZlcnNpb24FdWludDgFb3duZXIEbmFtZQ1yZXhfcmVxdWVzdGVkBWFzc2V0CHByb2NlZWRzBWFzc2V0DHN0YWtlX2NoYW5nZQVhc3NldApvcmRlcl90aW1lCnRpbWVfcG9pbnQHaXNfb3BlbgRib29sCHJleF9wb29sAAgHdmVyc2lvbgV1aW50OAp0b3RhbF9sZW50BWFzc2V0DHRvdGFsX3VubGVudAVhc3NldAp0b3RhbF9yZW50BWFzc2V0DnRvdGFsX2xlbmRhYmxlBWFzc2V0CXRvdGFsX3JleAVhc3NldBBuYW1lYmlkX3Byb2NlZWRzBWFzc2V0CGxvYW5fbnVtBnVpbnQ2NBJyZXhfcmV0dXJuX2J1Y2tldHMAAgd2ZXJzaW9uBXVpbnQ4DnJldHVybl9idWNrZXRzG3BhaXJfdGltZV9wb2ludF9zZWNfaW50NjRbXQ9yZXhfcmV0dXJuX3Bvb2wABwd2ZXJzaW9uBXVpbnQ4Dmxhc3RfZGlzdF90aW1lDnRpbWVfcG9pbnRfc2VjE3BlbmRpbmdfYnVja2V0X3RpbWUOdGltZV9wb2ludF9zZWMSb2xkZXN0X2J1Y2tldF90aW1lDnRpbWVfcG9pbnRfc2VjF3BlbmRpbmdfYnVja2V0X3Byb2NlZWRzBWludDY0GGN1cnJlbnRfcmF0ZV9vZl9pbmNyZWFzZQVpbnQ2NAhwcm9jZWVkcwVpbnQ2NAdyZXhleGVjAAIEdXNlcgRuYW1lA21heAZ1aW50MTYLcm12cHJvZHVjZXIAAQhwcm9kdWNlcgRuYW1lB3NlbGxyYW0AAgdhY2NvdW50BG5hbWUFYnl0ZXMFaW50NjQHc2VsbHJleAACBGZyb20EbmFtZQNyZXgFYXNzZXQGc2V0YWJpAAMHYWNjb3VudARuYW1lA2FiaQVieXRlcwRtZW1vB3N0cmluZyQKc2V0YWNjdGNwdQACB2FjY291bnQEbmFtZQpjcHVfd2VpZ2h0BmludDY0PwpzZXRhY2N0bmV0AAIHYWNjb3VudARuYW1lCm5ldF93ZWlnaHQGaW50NjQ/CnNldGFjY3RyYW0AAgdhY2NvdW50BG5hbWUJcmFtX2J5dGVzBmludDY0PwpzZXRhbGltaXRzAAQHYWNjb3VudARuYW1lCXJhbV9ieXRlcwVpbnQ2NApuZXRfd2VpZ2h0BWludDY0CmNwdV93ZWlnaHQFaW50NjQHc2V0Y29kZQAFB2FjY291bnQEbmFtZQZ2bXR5cGUFdWludDgJdm12ZXJzaW9uBXVpbnQ4BGNvZGUFYnl0ZXMEbWVtbwdzdHJpbmckDHNldGluZmxhdGlvbgADC2FubnVhbF9yYXRlBWludDY0FGluZmxhdGlvbl9wYXlfZmFjdG9yBWludDY0DnZvdGVwYXlfZmFjdG9yBWludDY0CXNldHBhcmFtcwABBnBhcmFtcxdibG9ja2NoYWluX3BhcmFtZXRlcnNfdAdzZXRwcml2AAIHYWNjb3VudARuYW1lB2lzX3ByaXYFdWludDgGc2V0cmFtAAEMbWF4X3JhbV9zaXplBnVpbnQ2NApzZXRyYW1yYXRlAAEPYnl0ZXNfcGVyX2Jsb2NrBnVpbnQxNgZzZXRyZXgAAQdiYWxhbmNlBWFzc2V0DHVuZGVsZWdhdGVidwAEBGZyb20EbmFtZQhyZWNlaXZlcgRuYW1lFHVuc3Rha2VfbmV0X3F1YW50aXR5BWFzc2V0FHVuc3Rha2VfY3B1X3F1YW50aXR5BWFzc2V0CnVubGlua2F1dGgABAdhY2NvdW50BG5hbWUEY29kZQRuYW1lBHR5cGUEbmFtZQ1hdXRob3JpemVkX2J5BW5hbWUkCXVucmVncHJvZAABCHByb2R1Y2VyBG5hbWUMdW5zdGFrZXRvcmV4AAQFb3duZXIEbmFtZQhyZWNlaXZlcgRuYW1lCGZyb21fbmV0BWFzc2V0CGZyb21fY3B1BWFzc2V0CnVwZGF0ZWF1dGgABQdhY2NvdW50BG5hbWUKcGVybWlzc2lvbgRuYW1lBnBhcmVudARuYW1lBGF1dGgJYXV0aG9yaXR5DWF1dGhvcml6ZWRfYnkFbmFtZSQJdXBkYXRlcmV4AAEFb3duZXIEbmFtZQx1cGR0cmV2aXNpb24AAQhyZXZpc2lvbgV1aW50OA51c2VyX3Jlc291cmNlcwAEBW93bmVyBG5hbWUKbmV0X3dlaWdodAVhc3NldApjcHVfd2VpZ2h0BWFzc2V0CXJhbV9ieXRlcwVpbnQ2NAx2b3RlcHJvZHVjZXIAAwV2b3RlcgRuYW1lBXByb3h5BG5hbWUJcHJvZHVjZXJzBm5hbWVbXQp2b3Rlcl9pbmZvAAoFb3duZXIEbmFtZQVwcm94eQRuYW1lCXByb2R1Y2VycwZuYW1lW10Gc3Rha2VkBWludDY0EGxhc3Rfdm90ZV93ZWlnaHQHZmxvYXQ2NBNwcm94aWVkX3ZvdGVfd2VpZ2h0B2Zsb2F0NjQIaXNfcHJveHkEYm9vbAZmbGFnczEGdWludDMyCXJlc2VydmVkMgZ1aW50MzIJcmVzZXJ2ZWQzBWFzc2V0CnZvdGV1cGRhdGUAAQp2b3Rlcl9uYW1lBG5hbWULd2FpdF93ZWlnaHQAAgh3YWl0X3NlYwZ1aW50MzIGd2VpZ2h0BnVpbnQxNgd3YXNtY2ZnAAEIc2V0dGluZ3MEbmFtZQh3aXRoZHJhdwACBW93bmVyBG5hbWUGYW1vdW50BWFzc2V0EWxpbWl0X2F1dGhfY2hhbmdlAAQHdmVyc2lvbgV1aW50OAdhY2NvdW50BG5hbWULYWxsb3dfcGVybXMGbmFtZVtdDmRpc2FsbG93X3Blcm1zBm5hbWVbXT4AAAAqm+0yMghhY3RpdmF0ZYgDLS0tCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogQWN0aXZhdGUgUHJvdG9jb2wgRmVhdHVyZQpzdW1tYXJ5OiAnQWN0aXZhdGUgcHJvdG9jb2wgZmVhdHVyZSB7e25vd3JhcCBmZWF0dXJlX2RpZ2VzdH19JwppY29uOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZW9zbmV0d29ya2ZvdW5kYXRpb24vZW9zLXN5c3RlbS1jb250cmFjdHMvbWFpbi9jb250cmFjdHMvaWNvbnMvYWRtaW4ucG5nIzliZjFjZWM2NjQ4NjNiZDZhYWFjMGY4MTRiMjM1Zjg3OTlmYjAyYzg1MGU5YWE1ZGEzNGU4YTAwNGJkNjUxOGUKLS0tCgp7eyRhY3Rpb24uYWNjb3VudH19IGFjdGl2YXRlcyB0aGUgcHJvdG9jb2wgZmVhdHVyZSB3aXRoIGEgZGlnZXN0IG9mIHt7ZmVhdHVyZV9kaWdlc3R9fS4AAABASTOTOwdiaWRuYW1lqQ4tLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBCaWQgT24gYSBQcmVtaXVtIEFjY291bnQgTmFtZQpzdW1tYXJ5OiAne3tub3dyYXAgYmlkZGVyfX0gYmlkcyBvbiB0aGUgcHJlbWl1bSBhY2NvdW50IG5hbWUge3tub3dyYXAgbmV3bmFtZX19JwppY29uOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZW9zbmV0d29ya2ZvdW5kYXRpb24vZW9zLXN5c3RlbS1jb250cmFjdHMvbWFpbi9jb250cmFjdHMvaWNvbnMvYWNjb3VudC5wbmcjM2Q1NWEyZmMzYTVjMjBiNDU2ZjU2NTdmYWY2NjZiYzI1ZmZkMDZmNDgzNmM1ZTgyNTZmNzQxMTQ5YjBiMjk0ZgotLS0KCnt7YmlkZGVyfX0gYmlkcyB7e2JpZH19IG9uIGFuIGF1Y3Rpb24gdG8gb3duIHRoZSBwcmVtaXVtIGFjY291bnQgbmFtZSB7e25ld25hbWV9fS4KCnt7YmlkZGVyfX0gdHJhbnNmZXJzIHt7YmlkfX0gdG8gdGhlIHN5c3RlbSB0byBjb3ZlciB0aGUgY29zdCBvZiB0aGUgYmlkLCB3aGljaCB3aWxsIGJlIHJldHVybmVkIHRvIHt7YmlkZGVyfX0gb25seSBpZiB7e2JpZGRlcn19IGlzIGxhdGVyIG91dGJpZCBpbiB0aGUgYXVjdGlvbiBmb3Ige3tuZXduYW1lfX0gYnkgYW5vdGhlciBhY2NvdW50LgoKSWYgdGhlIGF1Y3Rpb24gZm9yIHt7bmV3bmFtZX19IGNsb3NlcyB3aXRoIHt7YmlkZGVyfX0gcmVtYWluaW5nIGFzIHRoZSBoaWdoZXN0IGJpZGRlciwge3tiaWRkZXJ9fSB3aWxsIGJlIGF1dGhvcml6ZWQgdG8gY3JlYXRlIHRoZSBhY2NvdW50IHdpdGggbmFtZSB7e25ld25hbWV9fS4KCiMjIEJpZCByZWZ1bmQgYmVoYXZpb3IKCklmIHt7YmlkZGVyfX3igJlzIGJpZCBvbiB7e25ld25hbWV9fSBpcyBsYXRlciBvdXRiaWQgYnkgYW5vdGhlciBhY2NvdW50LCB7e2JpZGRlcn19IHdpbGwgYmUgYWJsZSB0byBjbGFpbSBiYWNrIHRoZSB0cmFuc2ZlcnJlZCBhbW91bnQgb2Yge3tiaWR9fS4gVGhlIHN5c3RlbSB3aWxsIGF0dGVtcHQgdG8gYXV0b21hdGljYWxseSBkbyB0aGlzIG9uIGJlaGFsZiBvZiB7e2JpZGRlcn19LCBidXQgdGhlIGF1dG9tYXRpYyByZWZ1bmQgbWF5IG9jY2FzaW9uYWxseSBmYWlsIHdoaWNoIHdpbGwgdGhlbiByZXF1aXJlIHt7YmlkZGVyfX0gdG8gbWFudWFsbHkgY2xhaW0gdGhlIHJlZnVuZCB3aXRoIHRoZSBiaWRyZWZ1bmQgYWN0aW9uLgoKIyMgQXVjdGlvbiBjbG9zZSBjcml0ZXJpYQoKVGhlIHN5c3RlbSBzaG91bGQgYXV0b21hdGljYWxseSBjbG9zZSB0aGUgYXVjdGlvbiBmb3Ige3tuZXduYW1lfX0gaWYgaXQgc2F0aXNmaWVzIHRoZSBjb25kaXRpb24gdGhhdCBvdmVyIGEgcGVyaW9kIG9mIHR3byBtaW51dGVzIHRoZSBmb2xsb3dpbmcgdHdvIHByb3BlcnRpZXMgY29udGludW91c2x5IGhvbGQ6CgotIG5vIG9uZSBoYXMgYmlkIG9uIHt7bmV3bmFtZX19IHdpdGhpbiB0aGUgbGFzdCAyNCBob3VyczsKLSBhbmQsIHRoZSB2YWx1ZSBvZiB0aGUgbGF0ZXN0IGJpZCBvbiB7e25ld25hbWV9fSBpcyBncmVhdGVyIHRoYW4gdGhlIHZhbHVlIG9mIHRoZSBiaWRzIG9uIGVhY2ggb2YgdGhlIG90aGVyIG9wZW4gYXVjdGlvbnMuCgpCZSBhd2FyZSB0aGF0IHRoZSBjb25kaXRpb24gdG8gY2xvc2UgdGhlIGF1Y3Rpb24gZGVzY3JpYmVkIGFib3ZlIGFyZSBzdWZmaWNpZW50IGJ1dCBub3QgbmVjZXNzYXJ5LiBUaGUgYXVjdGlvbiBmb3Ige3tuZXduYW1lfX0gY2Fubm90IGNsb3NlIHVubGVzcyBib3RoIG9mIHRoZSBwcm9wZXJ0aWVzIGFyZSBzaW11bHRhbmVvdXNseSBzYXRpc2ZpZWQsIGJ1dCBpdCBtYXkgYmUgY2xvc2VkIHdpdGhvdXQgcmVxdWlyaW5nIHRoZSBwcm9wZXJ0aWVzIHRvIGhvbGQgZm9yIGEgcGVyaW9kIG9mIDIgbWludXRlcy4AAEhTL3WTOwliaWRyZWZ1bmT0Ai0tLQpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IENsYWltIFJlZnVuZCBvbiBOYW1lIEJpZApzdW1tYXJ5OiAnQ2xhaW0gcmVmdW5kIG9uIHt7bm93cmFwIG5ld25hbWV9fSBiaWQnCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9lb3NuZXR3b3JrZm91bmRhdGlvbi9lb3Mtc3lzdGVtLWNvbnRyYWN0cy9tYWluL2NvbnRyYWN0cy9pY29ucy9hY2NvdW50LnBuZyMzZDU1YTJmYzNhNWMyMGI0NTZmNTY1N2ZhZjY2NmJjMjVmZmQwNmY0ODM2YzVlODI1NmY3NDExNDliMGIyOTRmCi0tLQoKe3tiaWRkZXJ9fSBjbGFpbXMgcmVmdW5kIG9uIHt7bmV3bmFtZX19IGJpZCBhZnRlciBiZWluZyBvdXRiaWQgYnkgc29tZW9uZSBlbHNlLgAAAABIc70+BmJ1eXJhbfoDLS0tCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogQnV5IFJBTQpzdW1tYXJ5OiAne3tub3dyYXAgcGF5ZXJ9fSBidXlzIFJBTSBvbiBiZWhhbGYgb2Yge3tub3dyYXAgcmVjZWl2ZXJ9fSBieSBwYXlpbmcge3tub3dyYXAgcXVhbnR9fScKaWNvbjogaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Vvc25ldHdvcmtmb3VuZGF0aW9uL2Vvcy1zeXN0ZW0tY29udHJhY3RzL21haW4vY29udHJhY3RzL2ljb25zL3Jlc291cmNlLnBuZyMzODMwZjFjZThjYjA3Zjc3NTdkYmNmMzgzYjFlYzFiMTE5MTRhYzM0YTFmOWQ4YjA2NWYwNzYwMGZhOWRhYzE5Ci0tLQoKe3twYXllcn19IGJ1eXMgUkFNIG9uIGJlaGFsZiBvZiB7e3JlY2VpdmVyfX0gYnkgcGF5aW5nIHt7cXVhbnR9fS4gVGhpcyB0cmFuc2FjdGlvbiB3aWxsIGluY3VyIGEgMC41JSBmZWUgb3V0IG9mIHt7cXVhbnR9fSBhbmQgdGhlIGFtb3VudCBvZiBSQU0gZGVsaXZlcmVkIHdpbGwgZGVwZW5kIG9uIG1hcmtldCByYXRlcy4AsMr+SHO9PgtidXlyYW1ieXRlc4EELS0tCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogQnV5IFJBTQpzdW1tYXJ5OiAne3tub3dyYXAgcGF5ZXJ9fSBidXlzIHt7bm93cmFwIGJ5dGVzfX0gYnl0ZXMgb2YgUkFNIG9uIGJlaGFsZiBvZiB7e25vd3JhcCByZWNlaXZlcn19JwppY29uOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZW9zbmV0d29ya2ZvdW5kYXRpb24vZW9zLXN5c3RlbS1jb250cmFjdHMvbWFpbi9jb250cmFjdHMvaWNvbnMvcmVzb3VyY2UucG5nIzM4MzBmMWNlOGNiMDdmNzc1N2RiY2YzODNiMWVjMWIxMTkxNGFjMzRhMWY5ZDhiMDY1ZjA3NjAwZmE5ZGFjMTkKLS0tCgp7e3BheWVyfX0gYnV5cyBhcHByb3hpbWF0ZWx5IHt7Ynl0ZXN9fSBieXRlcyBvZiBSQU0gb24gYmVoYWxmIG9mIHt7cmVjZWl2ZXJ9fSBieSBwYXlpbmcgbWFya2V0IHJhdGVzIGZvciBSQU0uIFRoaXMgdHJhbnNhY3Rpb24gd2lsbCBpbmN1ciBhIDAuNSUgZmVlIGFuZCB0aGUgY29zdCB3aWxsIGRlcGVuZCBvbiBtYXJrZXQgcmF0ZXMuAAAAAHR1vT4GYnV5cmV41wYtLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBCdXkgUkVYIFRva2VucwpzdW1tYXJ5OiAne3tub3dyYXAgZnJvbX19IGJ1eXMgUkVYIHRva2VucyBpbiBleGNoYW5nZSBmb3Ige3tub3dyYXAgYW1vdW50fX0gYW5kIHRoZWlyIHZvdGUgc3Rha2UgaW5jcmVhc2VzIGJ5IHt7bm93cmFwIGFtb3VudH19JwppY29uOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZW9zbmV0d29ya2ZvdW5kYXRpb24vZW9zLXN5c3RlbS1jb250cmFjdHMvbWFpbi9jb250cmFjdHMvaWNvbnMvcmV4LnBuZyNkMjI5ODM3ZmE2MmE0NjRiOWM3MWUwNjA2MGFhODYxNzlhZGYwYjNmNGUzYjhjNGY5NzAyZjRmNGIwYzM0MGE4Ci0tLQoKe3thbW91bnR9fSBpcyB0YWtlbiBvdXQgb2Yge3tmcm9tfX3igJlzIFJFWCBmdW5kIGFuZCB1c2VkIHRvIHB1cmNoYXNlIFJFWCB0b2tlbnMgYXQgdGhlIGN1cnJlbnQgbWFya2V0IGV4Y2hhbmdlIHJhdGUuIEluIG9yZGVyIGZvciB0aGUgYWN0aW9uIHRvIHN1Y2NlZWQsIHt7ZnJvbX19IG11c3QgaGF2ZSB2b3RlZCBmb3IgYSBwcm94eSBvciBhdCBsZWFzdCAyMSBibG9jayBwcm9kdWNlcnMuIHt7YW1vdW50fX0gaXMgYWRkZWQgdG8ge3tmcm9tfX3igJlzIHZvdGUgc3Rha2UuCgpBIHNlbGwgb3JkZXIgb2YgdGhlIHB1cmNoYXNlZCBhbW91bnQgY2FuIG9ubHkgYmUgaW5pdGlhdGVkIGFmdGVyIHdhaXRpbmcgZm9yIHRoZSBtYXR1cml0eSBwZXJpb2Qgb2YgNCB0byA1IGRheXMgdG8gcGFzcy4gRXZlbiB0aGVuLCBkZXBlbmRpbmcgb24gdGhlIG1hcmtldCBjb25kaXRpb25zLCB0aGUgaW5pdGlhdGVkIHNlbGwgb3JkZXIgbWF5IG5vdCBiZSBleGVjdXRlZCBpbW1lZGlhdGVseS4AvIkqRYWmQQtjYW5jZWxkZWxheYoDLS0tCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogQ2FuY2VsIERlbGF5ZWQgVHJhbnNhY3Rpb24Kc3VtbWFyeTogJ3t7bm93cmFwIGNhbmNlbGluZ19hdXRoLmFjdG9yfX0gY2FuY2VscyBhIGRlbGF5ZWQgdHJhbnNhY3Rpb24nCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9lb3NuZXR3b3JrZm91bmRhdGlvbi9lb3Mtc3lzdGVtLWNvbnRyYWN0cy9tYWluL2NvbnRyYWN0cy9pY29ucy9hY2NvdW50LnBuZyMzZDU1YTJmYzNhNWMyMGI0NTZmNTY1N2ZhZjY2NmJjMjVmZmQwNmY0ODM2YzVlODI1NmY3NDExNDliMGIyOTRmCi0tLQoKe3tjYW5jZWxpbmdfYXV0aC5hY3Rvcn19IGNhbmNlbHMgdGhlIGRlbGF5ZWQgdHJhbnNhY3Rpb24gd2l0aCBpZCB7e3RyeF9pZH19LgBA1VdxWtlCCmNmZ3Bvd2VydXAAgNM1XF3pTEQMY2xhaW1yZXdhcmRz5wItLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBDbGFpbSBCbG9jayBQcm9kdWNlciBSZXdhcmRzCnN1bW1hcnk6ICd7e25vd3JhcCBvd25lcn19IGNsYWltcyBibG9jayBhbmQgdm90ZSByZXdhcmRzJwppY29uOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZW9zbmV0d29ya2ZvdW5kYXRpb24vZW9zLXN5c3RlbS1jb250cmFjdHMvbWFpbi9jb250cmFjdHMvaWNvbnMvYWRtaW4ucG5nIzliZjFjZWM2NjQ4NjNiZDZhYWFjMGY4MTRiMjM1Zjg3OTlmYjAyYzg1MGU5YWE1ZGEzNGU4YTAwNGJkNjUxOGUKLS0tCgp7e293bmVyfX0gY2xhaW1zIGJsb2NrIGFuZCB2b3RlIHJld2FyZHMgZnJvbSB0aGUgc3lzdGVtLgAAAF1dhWlECGNsb3NlcmV4lAQtLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBDbGVhbnVwIFVudXNlZCBSRVggRGF0YQpzdW1tYXJ5OiAnRGVsZXRlIFJFWCByZWxhdGVkIERCIGVudHJpZXMgYW5kIGZyZWUgYXNzb2NpYXRlZCBSQU0nCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9lb3NuZXR3b3JrZm91bmRhdGlvbi9lb3Mtc3lzdGVtLWNvbnRyYWN0cy9tYWluL2NvbnRyYWN0cy9pY29ucy9yZXgucG5nI2QyMjk4MzdmYTYyYTQ2NGI5YzcxZTA2MDYwYWE4NjE3OWFkZjBiM2Y0ZTNiOGM0Zjk3MDJmNGY0YjBjMzQwYTgKLS0tCgpEZWxldGUgUkVYIHJlbGF0ZWQgREIgZW50cmllcyBhbmQgZnJlZSBhc3NvY2lhdGVkIFJBTSBmb3Ige3tvd25lcn19LgoKVG8gZnVsbHkgZGVsZXRlIGFsbCBSRVggcmVsYXRlZCBEQiBlbnRyaWVzLCB7e293bmVyfX0gbXVzdCBlbnN1cmUgdGhhdCB0aGVpciBSRVggYmFsYW5jZSBhbmQgUkVYIGZ1bmQgYW1vdW50cyBhcmUgYm90aCB6ZXJvIGFuZCB0aGV5IGhhdmUgbm8gb3V0c3RhbmRpbmcgbG9hbnMucFW6tKsb0UQMY25jbHJleG9yZGVy6wItLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBDYW5jZWwgU2NoZWR1bGVkIFJFWCBTZWxsIE9yZGVyCnN1bW1hcnk6ICd7e25vd3JhcCBvd25lcn19IGNhbmNlbHMgYSBzY2hlZHVsZWQgc2VsbCBvcmRlciBpZiBub3QgeWV0IGZpbGxlZCcKaWNvbjogaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Vvc25ldHdvcmtmb3VuZGF0aW9uL2Vvcy1zeXN0ZW0tY29udHJhY3RzL21haW4vY29udHJhY3RzL2ljb25zL3JleC5wbmcjZDIyOTgzN2ZhNjJhNDY0YjljNzFlMDYwNjBhYTg2MTc5YWRmMGIzZjRlM2I4YzRmOTcwMmY0ZjRiMGMzNDBhOAotLS0KCnt7b3duZXJ9fSBjYW5jZWxzIHRoZWlyIG9wZW4gc2VsbCBvcmRlci4AVDbJRYonRQtjb25zb2xpZGF0ZaYDLS0tCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogQ29uc29saWRhdGUgUkVYIE1hdHVyaXR5IEJ1Y2tldHMgSW50byBPbmUKc3VtbWFyeTogJ0NvbnNvbGlkYXRlIFJFWCBtYXR1cml0eSBidWNrZXRzIGludG8gb25lJwppY29uOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZW9zbmV0d29ya2ZvdW5kYXRpb24vZW9zLXN5c3RlbS1jb250cmFjdHMvbWFpbi9jb250cmFjdHMvaWNvbnMvcmV4LnBuZyNkMjI5ODM3ZmE2MmE0NjRiOWM3MWUwNjA2MGFhODYxNzlhZGYwYjNmNGUzYjhjNGY5NzAyZjRmNGIwYzM0MGE4Ci0tLQoKQ29uc29saWRhdGUgUkVYIG1hdHVyaXR5IGJ1Y2tldHMgaW50byBvbmUgYnVja2V0IHRoYXQge3tvd25lcn19IHdpbGwgbm90IGJlIGFibGUgdG8gc2VsbCB1bnRpbCA0IHRvIDUgZGF5cyBsYXRlci4AwDQ06oqWSgpkZWZjcHVsb2Fu3gMtLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBXaXRoZHJhdyBmcm9tIHRoZSBGdW5kIG9mIGEgU3BlY2lmaWMgQ1BVIExvYW4Kc3VtbWFyeTogJ3t7bm93cmFwIGZyb219fSB0cmFuc2ZlcnMge3tub3dyYXAgYW1vdW50fX0gZnJvbSB0aGUgZnVuZCBvZiBDUFUgbG9hbiBudW1iZXIge3tub3dyYXAgbG9hbl9udW19fSBiYWNrIHRvIFJFWCBmdW5kJwppY29uOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZW9zbmV0d29ya2ZvdW5kYXRpb24vZW9zLXN5c3RlbS1jb250cmFjdHMvbWFpbi9jb250cmFjdHMvaWNvbnMvcmV4LnBuZyNkMjI5ODM3ZmE2MmE0NjRiOWM3MWUwNjA2MGFhODYxNzlhZGYwYjNmNGUzYjhjNGY5NzAyZjRmNGIwYzM0MGE4Ci0tLQoKe3tmcm9tfX0gdHJhbnNmZXJzIHt7YW1vdW50fX0gZnJvbSB0aGUgZnVuZCBvZiBDUFUgbG9hbiBudW1iZXIge3tsb2FuX251bX19IGJhY2sgdG8gUkVYIGZ1bmQuAMA0NGY1l0oKZGVmbmV0bG9hbt4DLS0tCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogV2l0aGRyYXcgZnJvbSB0aGUgRnVuZCBvZiBhIFNwZWNpZmljIE5FVCBMb2FuCnN1bW1hcnk6ICd7e25vd3JhcCBmcm9tfX0gdHJhbnNmZXJzIHt7bm93cmFwIGFtb3VudH19IGZyb20gdGhlIGZ1bmQgb2YgTkVUIGxvYW4gbnVtYmVyIHt7bm93cmFwIGxvYW5fbnVtfX0gYmFjayB0byBSRVggZnVuZCcKaWNvbjogaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Vvc25ldHdvcmtmb3VuZGF0aW9uL2Vvcy1zeXN0ZW0tY29udHJhY3RzL21haW4vY29udHJhY3RzL2ljb25zL3JleC5wbmcjZDIyOTgzN2ZhNjJhNDY0YjljNzFlMDYwNjBhYTg2MTc5YWRmMGIzZjRlM2I4YzRmOTcwMmY0ZjRiMGMzNDBhOAotLS0KCnt7ZnJvbX19IHRyYW5zZmVycyB7e2Ftb3VudH19IGZyb20gdGhlIGZ1bmQgb2YgTkVUIGxvYW4gbnVtYmVyIHt7bG9hbl9udW19fSBiYWNrIHRvIFJFWCBmdW5kLgAAPyobpqJKCmRlbGVnYXRlYnfzBi0tLQpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IFN0YWtlIFRva2VucyBmb3IgTkVUIGFuZC9vciBDUFUKc3VtbWFyeTogJ1N0YWtlIHRva2VucyBmb3IgTkVUIGFuZC9vciBDUFUgYW5kIG9wdGlvbmFsbHkgdHJhbnNmZXIgb3duZXJzaGlwJwppY29uOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZW9zbmV0d29ya2ZvdW5kYXRpb24vZW9zLXN5c3RlbS1jb250cmFjdHMvbWFpbi9jb250cmFjdHMvaWNvbnMvcmVzb3VyY2UucG5nIzM4MzBmMWNlOGNiMDdmNzc1N2RiY2YzODNiMWVjMWIxMTkxNGFjMzRhMWY5ZDhiMDY1ZjA3NjAwZmE5ZGFjMTkKLS0tCgp7eyNpZiB0cmFuc2Zlcn19IHt7ZnJvbX19IHN0YWtlcyBvbiBiZWhhbGYgb2Yge3tyZWNlaXZlcn19IHt7c3Rha2VfbmV0X3F1YW50aXR5fX0gZm9yIE5FVCBiYW5kd2lkdGggYW5kIHt7c3Rha2VfY3B1X3F1YW50aXR5fX0gZm9yIENQVSBiYW5kd2lkdGguCgpTdGFrZWQgdG9rZW5zIHdpbGwgYWxzbyBiZSB0cmFuc2ZlcnJlZCB0byB7e3JlY2VpdmVyfX0uIFRoZSBzdW0gb2YgdGhlc2UgdHdvIHF1YW50aXRpZXMgd2lsbCBiZSBkZWR1Y3RlZCBmcm9tIHt7ZnJvbX194oCZcyBsaXF1aWQgYmFsYW5jZSBhbmQgYWRkIHRvIHRoZSB2b3RlIHdlaWdodCBvZiB7e3JlY2VpdmVyfX0uCnt7ZWxzZX19Cnt7ZnJvbX19IHN0YWtlcyB0byBzZWxmIGFuZCBkZWxlZ2F0ZXMgdG8ge3tyZWNlaXZlcn19IHt7c3Rha2VfbmV0X3F1YW50aXR5fX0gZm9yIE5FVCBiYW5kd2lkdGggYW5kIHt7c3Rha2VfY3B1X3F1YW50aXR5fX0gZm9yIENQVSBiYW5kd2lkdGguCgpUaGUgc3VtIG9mIHRoZXNlIHR3byBxdWFudGl0aWVzIGFkZCB0byB0aGUgdm90ZSB3ZWlnaHQgb2Yge3tmcm9tfX0uCnt7L2lmfX0AQMvaqKyiSgpkZWxldGVhdXRo9QItLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBEZWxldGUgQWNjb3VudCBQZXJtaXNzaW9uCnN1bW1hcnk6ICdEZWxldGUgdGhlIHt7bm93cmFwIHBlcm1pc3Npb259fSBwZXJtaXNzaW9uIG9mIHt7bm93cmFwIGFjY291bnR9fScKaWNvbjogaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Vvc25ldHdvcmtmb3VuZGF0aW9uL2Vvcy1zeXN0ZW0tY29udHJhY3RzL21haW4vY29udHJhY3RzL2ljb25zL2FjY291bnQucG5nIzNkNTVhMmZjM2E1YzIwYjQ1NmY1NjU3ZmFmNjY2YmMyNWZmZDA2ZjQ4MzZjNWU4MjU2Zjc0MTE0OWIwYjI5NGYKLS0tCgpEZWxldGUgdGhlIHt7cGVybWlzc2lvbn19IHBlcm1pc3Npb24gb2Yge3thY2NvdW50fX0uAAAAIDtMq0oHZGVwb3NpdIgELS0tCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogRGVwb3NpdCBJbnRvIFJFWCBGdW5kCnN1bW1hcnk6ICdBZGQgdG8ge3tub3dyYXAgb3duZXJ9feKAmXMgUkVYIGZ1bmQgYnkgdHJhbnNmZXJyaW5nIHt7bm93cmFwIGFtb3VudH19IGZyb20ge3tub3dyYXAgb3duZXJ9feKAmXMgbGlxdWlkIGJhbGFuY2UnCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9lb3NuZXR3b3JrZm91bmRhdGlvbi9lb3Mtc3lzdGVtLWNvbnRyYWN0cy9tYWluL2NvbnRyYWN0cy9pY29ucy9yZXgucG5nI2QyMjk4MzdmYTYyYTQ2NGI5YzcxZTA2MDYwYWE4NjE3OWFkZjBiM2Y0ZTNiOGM0Zjk3MDJmNGY0YjBjMzQwYTgKLS0tCgpUcmFuc2ZlciB7e2Ftb3VudH19IGZyb20ge3tvd25lcn194oCZcyBsaXF1aWQgYmFsYW5jZSB0byB7e293bmVyfX3igJlzIFJFWCBmdW5kLiBBbGwgcHJvY2VlZHMgYW5kIGV4cGVuc2VzIHJlbGF0ZWQgdG8gUkVYIGFyZSBhZGRlZCB0byBvciB0YWtlbiBvdXQgb2YgdGhpcyBmdW5kLgCmoVFXlKZeC2Z1bmRjcHVsb2Fu/AMtLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBEZXBvc2l0IGludG8gdGhlIEZ1bmQgb2YgYSBTcGVjaWZpYyBDUFUgTG9hbgpzdW1tYXJ5OiAne3tub3dyYXAgZnJvbX19IGZ1bmRzIGEgQ1BVIGxvYW4nCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9lb3NuZXR3b3JrZm91bmRhdGlvbi9lb3Mtc3lzdGVtLWNvbnRyYWN0cy9tYWluL2NvbnRyYWN0cy9pY29ucy9yZXgucG5nI2QyMjk4MzdmYTYyYTQ2NGI5YzcxZTA2MDYwYWE4NjE3OWFkZjBiM2Y0ZTNiOGM0Zjk3MDJmNGY0YjBjMzQwYTgKLS0tCgp7e2Zyb219fSB0cmFuc2ZlcnMge3twYXltZW50fX0gZnJvbSBSRVggZnVuZCB0byB0aGUgZnVuZCBvZiBDUFUgbG9hbiBudW1iZXIge3tsb2FuX251bX19IGluIG9yZGVyIHRvIGJlIHVzZWQgaW4gbG9hbiByZW5ld2FsIGF0IGV4cGlyeS4ge3tmcm9tfX0gY2FuIHdpdGhkcmF3IHRoZSB0b3RhbCBiYWxhbmNlIG9mIHRoZSBsb2FuIGZ1bmQgYXQgYW55IHRpbWUuAKahMauZpl4LZnVuZG5ldGxvYW78Ay0tLQpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IERlcG9zaXQgaW50byB0aGUgRnVuZCBvZiBhIFNwZWNpZmljIE5FVCBMb2FuCnN1bW1hcnk6ICd7e25vd3JhcCBmcm9tfX0gZnVuZHMgYSBORVQgbG9hbicKaWNvbjogaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Vvc25ldHdvcmtmb3VuZGF0aW9uL2Vvcy1zeXN0ZW0tY29udHJhY3RzL21haW4vY29udHJhY3RzL2ljb25zL3JleC5wbmcjZDIyOTgzN2ZhNjJhNDY0YjljNzFlMDYwNjBhYTg2MTc5YWRmMGIzZjRlM2I4YzRmOTcwMmY0ZjRiMGMzNDBhOAotLS0KCnt7ZnJvbX19IHRyYW5zZmVycyB7e3BheW1lbnR9fSBmcm9tIFJFWCBmdW5kIHRvIHRoZSBmdW5kIG9mIE5FVCBsb2FuIG51bWJlciB7e2xvYW5fbnVtfX0gaW4gb3JkZXIgdG8gYmUgdXNlZCBpbiBsb2FuIHJlbmV3YWwgYXQgZXhwaXJ5LiB7e2Zyb219fSBjYW4gd2l0aGRyYXcgdGhlIHRvdGFsIGJhbGFuY2Ugb2YgdGhlIGxvYW4gZnVuZCBhdCBhbnkgdGltZS4AAAAAAJDddARpbml04wItLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBJbml0aWFsaXplIFN5c3RlbSBDb250cmFjdApzdW1tYXJ5OiAnSW5pdGlhbGl6ZSBzeXN0ZW0gY29udHJhY3QnCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9lb3NuZXR3b3JrZm91bmRhdGlvbi9lb3Mtc3lzdGVtLWNvbnRyYWN0cy9tYWluL2NvbnRyYWN0cy9pY29ucy9hZG1pbi5wbmcjOWJmMWNlYzY2NDg2M2JkNmFhYWMwZjgxNGIyMzVmODc5OWZiMDJjODUwZTlhYTVkYTM0ZThhMDA0YmQ2NTE4ZQotLS0KCkluaXRpYWxpemUgc3lzdGVtIGNvbnRyYWN0LiBUaGUgY29yZSB0b2tlbiBzeW1ib2wgd2lsbCBiZSBzZXQgdG8ge3tjb3JlfX0uwBpqWZvspIsMbGltaXRhdXRoY2hnAAAAAC1rA6eLCGxpbmthdXRonQUtLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBMaW5rIEFjdGlvbiB0byBQZXJtaXNzaW9uCnN1bW1hcnk6ICd7e25vd3JhcCBhY2NvdW50fX0gc2V0cyB0aGUgbWluaW11bSByZXF1aXJlZCBwZXJtaXNzaW9uIGZvciB0aGUge3sjaWYgdHlwZX19e3tub3dyYXAgdHlwZX19IGFjdGlvbiBvZiB0aGV7ey9pZn19IHt7bm93cmFwIGNvZGV9fSBjb250cmFjdCB0byB7e25vd3JhcCByZXF1aXJlbWVudH19JwppY29uOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZW9zbmV0d29ya2ZvdW5kYXRpb24vZW9zLXN5c3RlbS1jb250cmFjdHMvbWFpbi9jb250cmFjdHMvaWNvbnMvYWNjb3VudC5wbmcjM2Q1NWEyZmMzYTVjMjBiNDU2ZjU2NTdmYWY2NjZiYzI1ZmZkMDZmNDgzNmM1ZTgyNTZmNzQxMTQ5YjBiMjk0ZgotLS0KCnt7YWNjb3VudH19IHNldHMgdGhlIG1pbmltdW0gcmVxdWlyZWQgcGVybWlzc2lvbiBmb3IgdGhlIHt7I2lmIHR5cGV9fXt7dHlwZX19IGFjdGlvbiBvZiB0aGV7ey9pZn19IHt7Y29kZX19IGNvbnRyYWN0IHRvIHt7cmVxdWlyZW1lbnR9fS4KCnt7I2lmIHR5cGV9fXt7ZWxzZX19QW55IGxpbmtzIGV4cGxpY2l0bHkgYXNzb2NpYXRlZCB0byBzcGVjaWZpYyBhY3Rpb25zIG9mIHt7Y29kZX19IHdpbGwgdGFrZSBwcmVjZWRlbmNlLnt7L2lmfX0AMJtuG3zXlgttdmZyc2F2aW5nc5wDLS0tCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogVW5sb2NrIFJFWCBUb2tlbnMKc3VtbWFyeTogJ3t7bm93cmFwIG93bmVyfX0gdW5sb2NrcyBSRVggVG9rZW5zJwppY29uOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZW9zbmV0d29ya2ZvdW5kYXRpb24vZW9zLXN5c3RlbS1jb250cmFjdHMvbWFpbi9jb250cmFjdHMvaWNvbnMvcmV4LnBuZyNkMjI5ODM3ZmE2MmE0NjRiOWM3MWUwNjA2MGFhODYxNzlhZGYwYjNmNGUzYjhjNGY5NzAyZjRmNGIwYzM0MGE4Ci0tLQoKe3tvd25lcn19IHVubG9ja3Mge3tyZXh9fSBieSBtb3ZpbmcgaXQgb3V0IG9mIHRoZSBSRVggc2F2aW5ncyBidWNrZXQuIFRoZSB1bmxvY2tlZCBSRVggdG9rZW5zIGNhbm5vdCBiZSBzb2xkIHVudGlsIDQgdG8gNSBkYXlzIGxhdGVyLgAwm24bTPOWC212dG9zYXZpbmdzugMtLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBMb2NrIFJFWCBUb2tlbnMKc3VtbWFyeTogJ3t7bm93cmFwIG93bmVyfX0gbG9ja3MgUkVYIFRva2VucycKaWNvbjogaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Vvc25ldHdvcmtmb3VuZGF0aW9uL2Vvcy1zeXN0ZW0tY29udHJhY3RzL21haW4vY29udHJhY3RzL2ljb25zL3JleC5wbmcjZDIyOTgzN2ZhNjJhNDY0YjljNzFlMDYwNjBhYTg2MTc5YWRmMGIzZjRlM2I4YzRmOTcwMmY0ZjRiMGMzNDBhOAotLS0KCnt7b3duZXJ9fSBsb2NrcyB7e3JleH19IGJ5IG1vdmluZyBpdCBpbnRvIHRoZSBSRVggc2F2aW5ncyBidWNrZXQuIFRoZSBsb2NrZWQgUkVYIHRva2VucyBjYW5ub3QgYmUgc29sZCBkaXJlY3RseSBhbmQgd2lsbCBoYXZlIHRvIGJlIHVubG9ja2VkIGV4cGxpY2l0bHkgYmVmb3JlIHNlbGxpbmcuAECemiJkuJoKbmV3YWNjb3VudIAELS0tCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogQ3JlYXRlIE5ldyBBY2NvdW50CnN1bW1hcnk6ICd7e25vd3JhcCBjcmVhdG9yfX0gY3JlYXRlcyBhIG5ldyBhY2NvdW50IHdpdGggdGhlIG5hbWUge3tub3dyYXAgbmFtZX19JwppY29uOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZW9zbmV0d29ya2ZvdW5kYXRpb24vZW9zLXN5c3RlbS1jb250cmFjdHMvbWFpbi9jb250cmFjdHMvaWNvbnMvYWNjb3VudC5wbmcjM2Q1NWEyZmMzYTVjMjBiNDU2ZjU2NTdmYWY2NjZiYzI1ZmZkMDZmNDgzNmM1ZTgyNTZmNzQxMTQ5YjBiMjk0ZgotLS0KCnt7Y3JlYXRvcn19IGNyZWF0ZXMgYSBuZXcgYWNjb3VudCB3aXRoIHRoZSBuYW1lIHt7bmFtZX19IGFuZCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb25zOgoKb3duZXIgcGVybWlzc2lvbiB3aXRoIGF1dGhvcml0eToKe3t0b19qc29uIG93bmVyfX0KCmFjdGl2ZSBwZXJtaXNzaW9uIHdpdGggYXV0aG9yaXR5Ogp7e3RvX2pzb24gYWN0aXZlfX0AAAAAIhrPpAdvbmJsb2NrAAAAAODSe9WkB29uZXJyb3IAAAAAoOqrOK0HcG93ZXJ1cNQCLS0tCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogUG93ZXJ1cCByZXNvdXJjZXMKc3VtbWFyeTogJ1VzZXIgbWF5IHBvd2VydXAgdG8gcmVzZXJ2ZSByZXNvdXJjZXMnCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9lb3NuZXR3b3JrZm91bmRhdGlvbi9lb3Mtc3lzdGVtLWNvbnRyYWN0cy9tYWluL2NvbnRyYWN0cy9pY29ucy9yZXNvdXJjZS5wbmcjMzgzMGYxY2U4Y2IwN2Y3NzU3ZGJjZjM4M2IxZWMxYjExOTE0YWMzNGExZjlkOGIwNjVmMDc2MDBmYTlkYWMxOQotLS0KClVzZXJzIG1heSB1c2UgdGhlIHBvd2VydXAgYWN0aW9uIHRvIHJlc2VydmUgcmVzb3VyY2VzLgCQ6qrqqzitC3Bvd2VydXBleGVjAAAAAACkqZe6BnJlZnVuZIcDLS0tCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogQ2xhaW0gVW5zdGFrZWQgVG9rZW5zCnN1bW1hcnk6ICdSZXR1cm4gcHJldmlvdXNseSB1bnN0YWtlZCB0b2tlbnMgdG8ge3tub3dyYXAgb3duZXJ9fScKaWNvbjogaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Vvc25ldHdvcmtmb3VuZGF0aW9uL2Vvcy1zeXN0ZW0tY29udHJhY3RzL21haW4vY29udHJhY3RzL2ljb25zL2FjY291bnQucG5nIzNkNTVhMmZjM2E1YzIwYjQ1NmY1NjU3ZmFmNjY2YmMyNWZmZDA2ZjQ4MzZjNWU4MjU2Zjc0MTE0OWIwYjI5NGYKLS0tCgpSZXR1cm4gcHJldmlvdXNseSB1bnN0YWtlZCB0b2tlbnMgdG8ge3tvd25lcn19IGFmdGVyIHRoZSB1bnN0YWtpbmcgcGVyaW9kIGhhcyBlbGFwc2VkLgCuQjrRW5m6C3JlZ3Byb2R1Y2VymQQtLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBSZWdpc3RlciBhcyBhIEJsb2NrIFByb2R1Y2VyIENhbmRpZGF0ZQpzdW1tYXJ5OiAnUmVnaXN0ZXIge3tub3dyYXAgcHJvZHVjZXJ9fSBhY2NvdW50IGFzIGEgYmxvY2sgcHJvZHVjZXIgY2FuZGlkYXRlJwppY29uOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZW9zbmV0d29ya2ZvdW5kYXRpb24vZW9zLXN5c3RlbS1jb250cmFjdHMvbWFpbi9jb250cmFjdHMvaWNvbnMvdm90aW5nLnBuZyNkYjI4Y2QzZGI2ZTYyZDQ1MDlhZjM2NDRjZTdkMzc3MzI5NDgyYTE0YmI0YmZhY2EyYWE1ZjE0MDBkOGU4YTg0Ci0tLQoKUmVnaXN0ZXIge3twcm9kdWNlcn19IGFjY291bnQgYXMgYSBibG9jayBwcm9kdWNlciBjYW5kaWRhdGUuCgpVUkw6IHt7dXJsfX0KTG9jYXRpb24gY29kZToge3tsb2NhdGlvbn19CkJsb2NrIHNpZ25pbmcga2V5OiB7e3Byb2R1Y2VyX2tleX19CgojIyBCbG9jayBQcm9kdWNlciBBZ3JlZW1lbnQKe3skY2xhdXNlcy5CbG9ja1Byb2R1Y2VyQWdyZWVtZW50fX0grkI60VuZugxyZWdwcm9kdWNlcjKtBC0tLQpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IFJlZ2lzdGVyIGFzIGEgQmxvY2sgUHJvZHVjZXIgQ2FuZGlkYXRlCnN1bW1hcnk6ICdSZWdpc3RlciB7e25vd3JhcCBwcm9kdWNlcn19IGFjY291bnQgYXMgYSBibG9jayBwcm9kdWNlciBjYW5kaWRhdGUnCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9lb3NuZXR3b3JrZm91bmRhdGlvbi9lb3Mtc3lzdGVtLWNvbnRyYWN0cy9tYWluL2NvbnRyYWN0cy9pY29ucy92b3RpbmcucG5nI2RiMjhjZDNkYjZlNjJkNDUwOWFmMzY0NGNlN2QzNzczMjk0ODJhMTRiYjRiZmFjYTJhYTVmMTQwMGQ4ZThhODQKLS0tCgpSZWdpc3RlciB7e3Byb2R1Y2VyfX0gYWNjb3VudCBhcyBhIGJsb2NrIHByb2R1Y2VyIGNhbmRpZGF0ZS4KClVSTDoge3t1cmx9fQpMb2NhdGlvbiBjb2RlOiB7e2xvY2F0aW9ufX0KQmxvY2sgc2lnbmluZyBhdXRob3JpdHk6Cnt7dG9fanNvbiBwcm9kdWNlcl9hdXRob3JpdHl9fQoKIyMgQmxvY2sgUHJvZHVjZXIgQWdyZWVtZW50Cnt7JGNsYXVzZXMuQmxvY2tQcm9kdWNlckFncmVlbWVudH19AAAAvtNbmboIcmVncHJveHmjBC0tLQpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IFJlZ2lzdGVyL3VucmVnaXN0ZXIgYXMgYSBQcm94eQpzdW1tYXJ5OiAnUmVnaXN0ZXIvdW5yZWdpc3RlciB7e25vd3JhcCBwcm94eX19IGFzIGEgcHJveHkgYWNjb3VudCcKaWNvbjogaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Vvc25ldHdvcmtmb3VuZGF0aW9uL2Vvcy1zeXN0ZW0tY29udHJhY3RzL21haW4vY29udHJhY3RzL2ljb25zL3ZvdGluZy5wbmcjZGIyOGNkM2RiNmU2MmQ0NTA5YWYzNjQ0Y2U3ZDM3NzMyOTQ4MmExNGJiNGJmYWNhMmFhNWYxNDAwZDhlOGE4NAotLS0KCnt7I2lmIGlzcHJveHl9fQp7e3Byb3h5fX0gcmVnaXN0ZXJzIGFzIGEgcHJveHkgdGhhdCBjYW4gdm90ZSBvbiBiZWhhbGYgb2YgYWNjb3VudHMgdGhhdCBhcHBvaW50IGl0IGFzIHRoZWlyIHByb3h5Lgp7e2Vsc2V9fQp7e3Byb3h5fX0gdW5yZWdpc3RlcnMgYXMgYSBwcm94eSB0aGF0IGNhbiB2b3RlIG9uIGJlaGFsZiBvZiBhY2NvdW50cyB0aGF0IGFwcG9pbnQgaXQgYXMgdGhlaXIgcHJveHkuCnt7L2lmfX0AAABAV5SnugdyZW50Y3B13AktLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBSZW50IENQVSBCYW5kd2lkdGggZm9yIDMwIERheXMKc3VtbWFyeTogJ3t7bm93cmFwIGZyb219fSBwYXlzIHt7bm93cmFwIGxvYW5fcGF5bWVudH19IHRvIHJlbnQgQ1BVIGJhbmR3aWR0aCBmb3Ige3tub3dyYXAgcmVjZWl2ZXJ9fScKaWNvbjogaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Vvc25ldHdvcmtmb3VuZGF0aW9uL2Vvcy1zeXN0ZW0tY29udHJhY3RzL21haW4vY29udHJhY3RzL2ljb25zL3JleC5wbmcjZDIyOTgzN2ZhNjJhNDY0YjljNzFlMDYwNjBhYTg2MTc5YWRmMGIzZjRlM2I4YzRmOTcwMmY0ZjRiMGMzNDBhOAotLS0KCnt7ZnJvbX19IHBheXMge3tsb2FuX3BheW1lbnR9fSB0byByZW50IENQVSBiYW5kd2lkdGggb24gYmVoYWxmIG9mIHt7cmVjZWl2ZXJ9fSBmb3IgYSBwZXJpb2Qgb2YgMzAgZGF5cy4KCnt7bG9hbl9wYXltZW50fX0gaXMgdGFrZW4gb3V0IG9mIHt7ZnJvbX194oCZcyBSRVggZnVuZC4gVGhlIG1hcmtldCBwcmljZSBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgdG9rZW5zIHRvIGJlIHN0YWtlZCB0byB7e3JlY2VpdmVyfX3igJlzIENQVSByZXNvdXJjZXMuIEluIGFkZGl0aW9uLCB7e2Zyb219fSBwcm92aWRlcyB7e2xvYW5fZnVuZH19LCB3aGljaCBpcyBhbHNvIHRha2VuIG91dCBvZiB7e2Zyb219feKAmXMgUkVYIGZ1bmQsIHRvIGJlIHVzZWQgZm9yIGF1dG9tYXRpYyByZW5ld2FsIG9mIHRoZSBsb2FuLgoKQXQgZXhwaXJhdGlvbiwgaWYgdGhlIGxvYW4gaGFzIGxlc3MgZnVuZHMgdGhhbiB7e2xvYW5fcGF5bWVudH19LCBpdCBpcyBjbG9zZWQgYW5kIGxlbnQgdG9rZW5zIHRoYXQgaGF2ZSBiZWVuIHN0YWtlZCBhcmUgdGFrZW4gb3V0IG9mIHt7cmVjZWl2ZXJ9feKAmXMgQ1BVIGJhbmR3aWR0aC4gT3RoZXJ3aXNlLCBpdCBpcyByZW5ld2VkIGF0IHRoZSBtYXJrZXQgcHJpY2UgYXQgdGhlIHRpbWUgb2YgcmVuZXdhbCwgdGhhdCBpcywgdGhlIG51bWJlciBvZiBzdGFrZWQgdG9rZW5zIGlzIHJlY2FsY3VsYXRlZCBhbmQge3tyZWNlaXZlcn194oCZcyBDUFUgYmFuZHdpZHRoIGlzIHVwZGF0ZWQgYWNjb3JkaW5nbHkuIHt7ZnJvbX19IGNhbiBmdW5kIG9yIGRlZnVuZCBhIGxvYW4gYXQgYW55IHRpbWUgYmVmb3JlIGV4cGlyYXRpb24uIFdoZW4gdGhlIGxvYW4gaXMgY2xvc2VkLCB7e2Zyb219fSBpcyByZWZ1bmRlZCBhbnkgdG9rZW5zIHJlbWFpbmluZyBpbiB0aGUgbG9hbiBmdW5kLgAAACCrmae6B3JlbnRuZXToCS0tLQpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IFJlbnQgTkVUIEJhbmR3aWR0aCBmb3IgMzAgRGF5cwpzdW1tYXJ5OiAne3tub3dyYXAgZnJvbX19IHBheXMge3tub3dyYXAgbG9hbl9wYXltZW50fX0gdG8gcmVudCBORVQgYmFuZHdpZHRoIGZvciB7e25vd3JhcCByZWNlaXZlcn19JwppY29uOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZW9zbmV0d29ya2ZvdW5kYXRpb24vZW9zLXN5c3RlbS1jb250cmFjdHMvbWFpbi9jb250cmFjdHMvaWNvbnMvcmV4LnBuZyNkMjI5ODM3ZmE2MmE0NjRiOWM3MWUwNjA2MGFhODYxNzlhZGYwYjNmNGUzYjhjNGY5NzAyZjRmNGIwYzM0MGE4Ci0tLQoKe3tmcm9tfX0gcGF5cyB7e2xvYW5fcGF5bWVudH19IHRvIHJlbnQgTkVUIGJhbmR3aWR0aCBvbiBiZWhhbGYgb2Yge3tyZWNlaXZlcn19IGZvciBhIHBlcmlvZCBvZiAzMCBkYXlzLgoKe3tsb2FuX3BheW1lbnR9fSBpcyB0YWtlbiBvdXQgb2Yge3tmcm9tfX3igJlzIFJFWCBmdW5kLiBUaGUgbWFya2V0IHByaWNlIGRldGVybWluZXMgdGhlIG51bWJlciBvZiB0b2tlbnMgdG8gYmUgc3Rha2VkIHRvIHt7cmVjZWl2ZXJ9feKAmXMgTkVUIHJlc291cmNlcyBmb3IgMzAgZGF5cy4gSW4gYWRkaXRpb24sIHt7ZnJvbX19IHByb3ZpZGVzIHt7bG9hbl9mdW5kfX0sIHdoaWNoIGlzIGFsc28gdGFrZW4gb3V0IG9mIHt7ZnJvbX194oCZcyBSRVggZnVuZCwgdG8gYmUgdXNlZCBmb3IgYXV0b21hdGljIHJlbmV3YWwgb2YgdGhlIGxvYW4uCgpBdCBleHBpcmF0aW9uLCBpZiB0aGUgbG9hbiBoYXMgbGVzcyBmdW5kcyB0aGFuIHt7bG9hbl9wYXltZW50fX0sIGl0IGlzIGNsb3NlZCBhbmQgbGVudCB0b2tlbnMgdGhhdCBoYXZlIGJlZW4gc3Rha2VkIGFyZSB0YWtlbiBvdXQgb2Yge3tyZWNlaXZlcn194oCZcyBORVQgYmFuZHdpZHRoLiBPdGhlcndpc2UsIGl0IGlzIHJlbmV3ZWQgYXQgdGhlIG1hcmtldCBwcmljZSBhdCB0aGUgdGltZSBvZiByZW5ld2FsLCB0aGF0IGlzLCB0aGUgbnVtYmVyIG9mIHN0YWtlZCB0b2tlbnMgaXMgcmVjYWxjdWxhdGVkIGFuZCB7e3JlY2VpdmVyfX3igJlzIE5FVCBiYW5kd2lkdGggaXMgdXBkYXRlZCBhY2NvcmRpbmdseS4ge3tmcm9tfX0gY2FuIGZ1bmQgb3IgZGVmdW5kIGEgbG9hbiBhdCBhbnkgdGltZSBiZWZvcmUgZXhwaXJhdGlvbi4gV2hlbiB0aGUgbG9hbiBpcyBjbG9zZWQsIHt7ZnJvbX19IGlzIHJlZnVuZGVkIGFueSB0b2tlbnMgcmVtYWluaW5nIGluIHRoZSBsb2FuIGZ1bmQuAAAAAKmuuroHcmV4ZXhlY6IDLS0tCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogUGVyZm9ybSBSRVggTWFpbnRlbmFuY2UKc3VtbWFyeTogJ1Byb2Nlc3Mgc2VsbCBvcmRlcnMgYW5kIGV4cGlyZWQgbG9hbnMnCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9lb3NuZXR3b3JrZm91bmRhdGlvbi9lb3Mtc3lzdGVtLWNvbnRyYWN0cy9tYWluL2NvbnRyYWN0cy9pY29ucy9yZXgucG5nI2QyMjk4MzdmYTYyYTQ2NGI5YzcxZTA2MDYwYWE4NjE3OWFkZjBiM2Y0ZTNiOGM0Zjk3MDJmNGY0YjBjMzQwYTgKLS0tCgpQZXJmb3JtcyBSRVggbWFpbnRlbmFuY2UgYnkgcHJvY2Vzc2luZyBhIG1heGltdW0gb2Yge3ttYXh9fSBSRVggc2VsbCBvcmRlcnMgYW5kIGV4cGlyZWQgbG9hbnMuIEFueSBhY2NvdW50IGNhbiBleGVjdXRlIHRoaXMgYWN0aW9uLgCuQjrRW7e8C3JtdnByb2R1Y2VyggUtLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBGb3JjaWJseSBVbnJlZ2lzdGVyIGEgQmxvY2sgUHJvZHVjZXIgQ2FuZGlkYXRlCnN1bW1hcnk6ICd7e25vd3JhcCBwcm9kdWNlcn19IGlzIHVucmVnaXN0ZXJlZCBhcyBhIGJsb2NrIHByb2R1Y2VyIGNhbmRpZGF0ZScKaWNvbjogaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Vvc25ldHdvcmtmb3VuZGF0aW9uL2Vvcy1zeXN0ZW0tY29udHJhY3RzL21haW4vY29udHJhY3RzL2ljb25zL2FkbWluLnBuZyM5YmYxY2VjNjY0ODYzYmQ2YWFhYzBmODE0YjIzNWY4Nzk5ZmIwMmM4NTBlOWFhNWRhMzRlOGEwMDRiZDY1MThlCi0tLQoKe3skYWN0aW9uLmFjY291bnR9fSB1bnJlZ2lzdGVycyB7e3Byb2R1Y2VyfX0gYXMgYSBibG9jayBwcm9kdWNlciBjYW5kaWRhdGUuIHt7cHJvZHVjZXJ9fSBhY2NvdW50IHdpbGwgcmV0YWluIGl0cyB2b3RlcyBhbmQgdGhvc2Ugdm90ZXMgY2FuIGNoYW5nZSBiYXNlZCBvbiB2b3RlciBzdGFrZSBjaGFuZ2VzIG9yIHZvdGVzIHJlbW92ZWQgZnJvbSB7e3Byb2R1Y2VyfX0uIEhvd2V2ZXIgbmV3IHZvdGVycyB3aWxsIG5vdCBiZSBhYmxlIHRvIHZvdGUgZm9yIHt7cHJvZHVjZXJ9fSB3aGlsZSBpdCByZW1haW5zIHVucmVnaXN0ZXJlZC4AAABAmhujwgdzZWxscmFtxQMtLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBTZWxsIFJBTSBGcm9tIEFjY291bnQKc3VtbWFyeTogJ1NlbGwgdW51c2VkIFJBTSBmcm9tIHt7bm93cmFwIGFjY291bnR9fScKaWNvbjogaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Vvc25ldHdvcmtmb3VuZGF0aW9uL2Vvcy1zeXN0ZW0tY29udHJhY3RzL21haW4vY29udHJhY3RzL2ljb25zL3Jlc291cmNlLnBuZyMzODMwZjFjZThjYjA3Zjc3NTdkYmNmMzgzYjFlYzFiMTE5MTRhYzM0YTFmOWQ4YjA2NWYwNzYwMGZhOWRhYzE5Ci0tLQoKU2VsbCB7e2J5dGVzfX0gYnl0ZXMgb2YgdW51c2VkIFJBTSBmcm9tIGFjY291bnQge3thY2NvdW50fX0gYXQgbWFya2V0IHByaWNlLiBUaGlzIHRyYW5zYWN0aW9uIHdpbGwgaW5jdXIgYSAwLjUlIGZlZSBvbiB0aGUgcHJvY2VlZHMgd2hpY2ggZGVwZW5kIG9uIG1hcmtldCByYXRlcy4AAACgqxujwgdzZWxscmV4qQotLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBTZWxsIFJFWCBUb2tlbnMgaW4gRXhjaGFuZ2UgZm9yIEVPUwpzdW1tYXJ5OiAne3tub3dyYXAgZnJvbX19IHNlbGxzIHt7bm93cmFwIHJleH19IHRva2VucycKaWNvbjogaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Vvc25ldHdvcmtmb3VuZGF0aW9uL2Vvcy1zeXN0ZW0tY29udHJhY3RzL21haW4vY29udHJhY3RzL2ljb25zL3JleC5wbmcjZDIyOTgzN2ZhNjJhNDY0YjljNzFlMDYwNjBhYTg2MTc5YWRmMGIzZjRlM2I4YzRmOTcwMmY0ZjRiMGMzNDBhOAotLS0KCnt7ZnJvbX19IGluaXRpYXRlcyBhIHNlbGwgb3JkZXIgdG8gc2VsbCB7e3JleH19IHRva2VucyBhdCB0aGUgbWFya2V0IGV4Y2hhbmdlIHJhdGUgZHVyaW5nIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSBvcmRlciBpcyB1bHRpbWF0ZWx5IGV4ZWN1dGVkLiBJZiB7e2Zyb219fSBhbHJlYWR5IGhhcyBhbiBvcGVuIHNlbGwgb3JkZXIgaW4gdGhlIHNlbGwgcXVldWUsIHt7cmV4fX0gd2lsbCBiZSBhZGRlZCB0byB0aGUgYW1vdW50IG9mIHRoZSBzZWxsIG9yZGVyIHdpdGhvdXQgY2hhbmdlIHRoZSBwb3NpdGlvbiBvZiB0aGUgc2VsbCBvcmRlciB3aXRoaW4gdGhlIHF1ZXVlLiBPbmNlIHRoZSBzZWxsIG9yZGVyIGlzIGV4ZWN1dGVkLCBwcm9jZWVkcyBhcmUgYWRkZWQgdG8ge3tmcm9tfX3igJlzIFJFWCBmdW5kLCB0aGUgdmFsdWUgb2Ygc29sZCBSRVggdG9rZW5zIGlzIGRlZHVjdGVkIGZyb20ge3tmcm9tfX3igJlzIHZvdGUgc3Rha2UsIGFuZCB2b3RlcyBhcmUgdXBkYXRlZCBhY2NvcmRpbmdseS4KCkRlcGVuZGluZyBvbiB0aGUgbWFya2V0IGNvbmRpdGlvbnMsIGl0IG1heSBub3QgYmUgcG9zc2libGUgdG8gZmlsbCB0aGUgZW50aXJlIHNlbGwgb3JkZXIgaW1tZWRpYXRlbHkuIEluIHN1Y2ggYSBjYXNlLCB0aGUgc2VsbCBvcmRlciBpcyBhZGRlZCB0byB0aGUgYmFjayBvZiBhIHNlbGwgcXVldWUuIEEgc2VsbCBvcmRlciBhdCB0aGUgZnJvbnQgb2YgdGhlIHNlbGwgcXVldWUgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGV4ZWN1dGVkIHdoZW4gdGhlIG1hcmtldCBjb25kaXRpb25zIGFsbG93IGZvciB0aGUgZW50aXJlIG9yZGVyIHRvIGJlIGZpbGxlZC4gUmVnYXJkbGVzcyBvZiB0aGUgbWFya2V0IGNvbmRpdGlvbnMsIHRoZSBzeXN0ZW0gaXMgZGVzaWduZWQgdG8gZXhlY3V0ZSB0aGlzIHNlbGwgb3JkZXIgd2l0aGluIDMwIGRheXMuIHt7ZnJvbX19IGNhbiBjYW5jZWwgdGhlIG9yZGVyIGF0IGFueSB0aW1lIGJlZm9yZSBpdCBpcyBmaWxsZWQgdXNpbmcgdGhlIGNuY2xyZXhvcmRlciBhY3Rpb24uAAAAALhjssIGc2V0YWJp8wItLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBEZXBsb3kgQ29udHJhY3QgQUJJCnN1bW1hcnk6ICdEZXBsb3kgY29udHJhY3QgQUJJIG9uIGFjY291bnQge3tub3dyYXAgYWNjb3VudH19JwppY29uOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZW9zbmV0d29ya2ZvdW5kYXRpb24vZW9zLXN5c3RlbS1jb250cmFjdHMvbWFpbi9jb250cmFjdHMvaWNvbnMvYWNjb3VudC5wbmcjM2Q1NWEyZmMzYTVjMjBiNDU2ZjU2NTdmYWY2NjZiYzI1ZmZkMDZmNDgzNmM1ZTgyNTZmNzQxMTQ5YjBiMjk0ZgotLS0KCkRlcGxveSB0aGUgQUJJIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250cmFjdCBvbiBhY2NvdW50IHt7YWNjb3VudH19LgCArigjZLLCCnNldGFjY3RjcHWeBi0tLQpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IEV4cGxpY2l0bHkgTWFuYWdlIHRoZSBDUFUgUXVvdGEgb2YgQWNjb3VudApzdW1tYXJ5OiAnRXhwbGljaXRseSBtYW5hZ2UgdGhlIENQVSBiYW5kd2lkdGggcXVvdGEgb2YgYWNjb3VudCB7e25vd3JhcCBhY2NvdW50fX0nCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9lb3NuZXR3b3JrZm91bmRhdGlvbi9lb3Mtc3lzdGVtLWNvbnRyYWN0cy9tYWluL2NvbnRyYWN0cy9pY29ucy9hZG1pbi5wbmcjOWJmMWNlYzY2NDg2M2JkNmFhYWMwZjgxNGIyMzVmODc5OWZiMDJjODUwZTlhYTVkYTM0ZThhMDA0YmQ2NTE4ZQotLS0KCnt7I2lmX2hhc192YWx1ZSBjcHVfd2VpZ2h0fX0KRXhwbGljaXRseSBtYW5hZ2UgdGhlIENQVSBiYW5kd2lkdGggcXVvdGEgb2YgYWNjb3VudCB7e2FjY291bnR9fSBieSBwaW5uaW5nIGl0IHRvIGEgd2VpZ2h0IG9mIHt7Y3B1X3dlaWdodH19LgoKe3thY2NvdW50fX0gY2FuIHN0YWtlIGFuZCB1bnN0YWtlLCBob3dldmVyLCBpdCB3aWxsIG5vdCBjaGFuZ2UgdGhlaXIgQ1BVIGJhbmR3aWR0aCBxdW90YSBhcyBsb25nIGFzIGl0IHJlbWFpbnMgcGlubmVkLgp7e2Vsc2V9fQpVbnBpbiB0aGUgQ1BVIGJhbmR3aWR0aCBxdW90YSBvZiBhY2NvdW50IHt7YWNjb3VudH19LiBUaGUgQ1BVIGJhbmR3aWR0aCBxdW90YSBvZiB7e2FjY291bnR9fSB3aWxsIGJlIGRyaXZlbiBieSB0aGUgY3VycmVudCB0b2tlbnMgc3Rha2VkIGZvciBDUFUgYmFuZHdpZHRoIGJ5IHt7YWNjb3VudH19Lgp7ey9pZl9oYXNfdmFsdWV9fQBAVjMjZLLCCnNldGFjY3RuZXSiBi0tLQpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IEV4cGxpY2l0bHkgTWFuYWdlIHRoZSBORVQgUXVvdGEgb2YgQWNjb3VudApzdW1tYXJ5OiAnRXhwbGljaXRseSBtYW5hZ2UgdGhlIE5FVCBiYW5kd2lkdGggcXVvdGEgb2YgYWNjb3VudCB7e25vd3JhcCBhY2NvdW50fX0nCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9lb3NuZXR3b3JrZm91bmRhdGlvbi9lb3Mtc3lzdGVtLWNvbnRyYWN0cy9tYWluL2NvbnRyYWN0cy9pY29ucy9hZG1pbi5wbmcjOWJmMWNlYzY2NDg2M2JkNmFhYWMwZjgxNGIyMzVmODc5OWZiMDJjODUwZTlhYTVkYTM0ZThhMDA0YmQ2NTE4ZQotLS0KCnt7I2lmX2hhc192YWx1ZSBuZXRfd2VpZ2h0fX0KRXhwbGljaXRseSBtYW5hZ2UgdGhlIG5ldHdvcmsgYmFuZHdpZHRoIHF1b3RhIG9mIGFjY291bnQge3thY2NvdW50fX0gYnkgcGlubmluZyBpdCB0byBhIHdlaWdodCBvZiB7e25ldF93ZWlnaHR9fS4KCnt7YWNjb3VudH19IGNhbiBzdGFrZSBhbmQgdW5zdGFrZSwgaG93ZXZlciwgaXQgd2lsbCBub3QgY2hhbmdlIHRoZWlyIE5FVCBiYW5kd2lkdGggcXVvdGEgYXMgbG9uZyBhcyBpdCByZW1haW5zIHBpbm5lZC4Ke3tlbHNlfX0KVW5waW4gdGhlIE5FVCBiYW5kd2lkdGggcXVvdGEgb2YgYWNjb3VudCB7e2FjY291bnR9fS4gVGhlIE5FVCBiYW5kd2lkdGggcXVvdGEgb2Yge3thY2NvdW50fX0gd2lsbCBiZSBkcml2ZW4gYnkgdGhlIGN1cnJlbnQgdG9rZW5zIHN0YWtlZCBmb3IgTkVUIGJhbmR3aWR0aCBieSB7e2FjY291bnR9fS4Ke3svaWZfaGFzX3ZhbHVlfX0AgDQ3I2SywgpzZXRhY2N0cmFt0AUtLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBFeHBsaWNpdGx5IE1hbmFnZSB0aGUgUkFNIFF1b3RhIG9mIEFjY291bnQKc3VtbWFyeTogJ0V4cGxpY2l0bHkgbWFuYWdlIHRoZSBSQU0gcXVvdGEgb2YgYWNjb3VudCB7e25vd3JhcCBhY2NvdW50fX0nCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9lb3NuZXR3b3JrZm91bmRhdGlvbi9lb3Mtc3lzdGVtLWNvbnRyYWN0cy9tYWluL2NvbnRyYWN0cy9pY29ucy9hZG1pbi5wbmcjOWJmMWNlYzY2NDg2M2JkNmFhYWMwZjgxNGIyMzVmODc5OWZiMDJjODUwZTlhYTVkYTM0ZThhMDA0YmQ2NTE4ZQotLS0KCnt7I2lmX2hhc192YWx1ZSByYW1fYnl0ZXN9fQpFeHBsaWNpdGx5IG1hbmFnZSB0aGUgUkFNIHF1b3RhIG9mIGFjY291bnQge3thY2NvdW50fX0gYnkgcGlubmluZyBpdCB0byB7e3JhbV9ieXRlc319IGJ5dGVzLgoKe3thY2NvdW50fX0gY2FuIGJ1eSBhbmQgc2VsbCBSQU0sIGhvd2V2ZXIsIGl0IHdpbGwgbm90IGNoYW5nZSB0aGVpciBSQU0gcXVvdGEgYXMgbG9uZyBhcyBpdCByZW1haW5zIHBpbm5lZC4Ke3tlbHNlfX0KVW5waW4gdGhlIFJBTSBxdW90YSBvZiBhY2NvdW50IHt7YWNjb3VudH19LiBUaGUgUkFNIHF1b3RhIG9mIHt7YWNjb3VudH19IHdpbGwgYmUgZHJpdmVuIGJ5IHRoZSBjdXJyZW50IFJBTSBob2xkaW5ncyBvZiB7e2FjY291bnR9fS4Ke3svaWZfaGFzX3ZhbHVlfX0AAM5OumiywgpzZXRhbGltaXRz9gMtLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBBZGp1c3QgUmVzb3VyY2UgTGltaXRzIG9mIEFjY291bnQKc3VtbWFyeTogJ0FkanVzdCByZXNvdXJjZSBsaW1pdHMgb2YgYWNjb3VudCB7e25vd3JhcCBhY2NvdW50fX0nCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9lb3NuZXR3b3JrZm91bmRhdGlvbi9lb3Mtc3lzdGVtLWNvbnRyYWN0cy9tYWluL2NvbnRyYWN0cy9pY29ucy9hZG1pbi5wbmcjOWJmMWNlYzY2NDg2M2JkNmFhYWMwZjgxNGIyMzVmODc5OWZiMDJjODUwZTlhYTVkYTM0ZThhMDA0YmQ2NTE4ZQotLS0KCnt7JGFjdGlvbi5hY2NvdW50fX0gdXBkYXRlcyB7e2FjY291bnR9feKAmXMgcmVzb3VyY2UgbGltaXRzIHRvIGhhdmUgYSBSQU0gcXVvdGEgb2Yge3tyYW1fYnl0ZXN9fSBieXRlcywgYSBORVQgYmFuZHdpZHRoIHF1b3RhIG9mIHt7bmV0X3dlaWdodH19IGFuZCBhIENQVSBiYW5kd2lkdGggcXVvdGEgb2Yge3tjcHVfd2VpZ2h0fX0uAAAAQCWKssIHc2V0Y29kZeYCLS0tCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogRGVwbG95IENvbnRyYWN0IENvZGUKc3VtbWFyeTogJ0RlcGxveSBjb250cmFjdCBjb2RlIG9uIGFjY291bnQge3tub3dyYXAgYWNjb3VudH19JwppY29uOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZW9zbmV0d29ya2ZvdW5kYXRpb24vZW9zLXN5c3RlbS1jb250cmFjdHMvbWFpbi9jb250cmFjdHMvaWNvbnMvYWNjb3VudC5wbmcjM2Q1NWEyZmMzYTVjMjBiNDU2ZjU2NTdmYWY2NjZiYzI1ZmZkMDZmNDgzNmM1ZTgyNTZmNzQxMTQ5YjBiMjk0ZgotLS0KCkRlcGxveSBjb21waWxlZCBjb250cmFjdCBjb2RlIHRvIHRoZSBhY2NvdW50IHt7YWNjb3VudH19LjCpyyau6bLCDHNldGluZmxhdGlvbusELS0tCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogU2V0IEluZmxhdGlvbiBQYXJhbWV0ZXJzCnN1bW1hcnk6ICdTZXQgaW5mbGF0aW9uIHBhcmFtZXRlcnMnCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9lb3NuZXR3b3JrZm91bmRhdGlvbi9lb3Mtc3lzdGVtLWNvbnRyYWN0cy9tYWluL2NvbnRyYWN0cy9pY29ucy9hZG1pbi5wbmcjOWJmMWNlYzY2NDg2M2JkNmFhYWMwZjgxNGIyMzVmODc5OWZiMDJjODUwZTlhYTVkYTM0ZThhMDA0YmQ2NTE4ZQotLS0KCnt7JGFjdGlvbi5hY2NvdW50fX0gc2V0cyB0aGUgaW5mbGF0aW9uIHBhcmFtZXRlcnMgYXMgZm9sbG93czoKCiogQW5udWFsIGluZmxhdGlvbiByYXRlIChpbiB1bml0cyBvZiBhIGh1bmRyZWR0aCBvZiBhIHBlcmNlbnQpOiB7e2FubnVhbF9yYXRlfX0KKiBGcmFjdGlvbiBvZiBpbmZsYXRpb24gdXNlZCB0byByZXdhcmQgYmxvY2sgcHJvZHVjZXJzOiAxMDAwMC97e2luZmxhdGlvbl9wYXlfZmFjdG9yfX0KKiBGcmFjdGlvbiBvZiBibG9jayBwcm9kdWNlciByZXdhcmRzIHRvIGJlIGRpc3RyaWJ1dGVkIHByb3BvcnRpb25hbCB0byBibG9ja3MgcHJvZHVjZWQ6IDEwMDAwL3t7dm90ZXBheV9mYWN0b3J9fQAAwNJcU7PCCXNldHBhcmFtc9ACLS0tCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogU2V0IFN5c3RlbSBQYXJhbWV0ZXJzCnN1bW1hcnk6ICdTZXQgU3lzdGVtIFBhcmFtZXRlcnMnCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9lb3NuZXR3b3JrZm91bmRhdGlvbi9lb3Mtc3lzdGVtLWNvbnRyYWN0cy9tYWluL2NvbnRyYWN0cy9pY29ucy9hZG1pbi5wbmcjOWJmMWNlYzY2NDg2M2JkNmFhYWMwZjgxNGIyMzVmODc5OWZiMDJjODUwZTlhYTVkYTM0ZThhMDA0YmQ2NTE4ZQotLS0KCnt7JGFjdGlvbi5hY2NvdW50fX0gc2V0cyBzeXN0ZW0gcGFyYW1ldGVycyB0bzoKe3t0b19qc29uIHBhcmFtc319AAAAYLtbs8IHc2V0cHJpdo0ELS0tCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogTWFrZSBhbiBBY2NvdW50IFByaXZpbGVnZWQgb3IgVW5wcml2aWxlZ2VkCnN1bW1hcnk6ICd7eyNpZiBpc19wcml2fX1NYWtlIHt7bm93cmFwIGFjY291bnR9fSBwcml2aWxlZ2Vke3tlbHNlfX1SZW1vdmUgcHJpdmlsZWdlZCBzdGF0dXMgb2Yge3tub3dyYXAgYWNjb3VudH19e3svaWZ9fScKaWNvbjogaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Vvc25ldHdvcmtmb3VuZGF0aW9uL2Vvcy1zeXN0ZW0tY29udHJhY3RzL21haW4vY29udHJhY3RzL2ljb25zL2FkbWluLnBuZyM5YmYxY2VjNjY0ODYzYmQ2YWFhYzBmODE0YjIzNWY4Nzk5ZmIwMmM4NTBlOWFhNWRhMzRlOGEwMDRiZDY1MThlCi0tLQoKe3sjaWYgaXNfcHJpdn19Cnt7JGFjdGlvbi5hY2NvdW50fX0gbWFrZXMge3thY2NvdW50fX0gcHJpdmlsZWdlZC4Ke3tlbHNlfX0Ke3skYWN0aW9uLmFjY291bnR9fSByZW1vdmVzIHByaXZpbGVnZWQgc3RhdHVzIG9mIHt7YWNjb3VudH19Lgp7ey9pZn19AAAAAEhzs8IGc2V0cmFt5gItLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBDb25maWd1cmUgdGhlIEF2YWlsYWJsZSBSQU0Kc3VtbWFyeTogJ0NvbmZpZ3VyZSB0aGUgYXZhaWxhYmxlIFJBTScKaWNvbjogaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Vvc25ldHdvcmtmb3VuZGF0aW9uL2Vvcy1zeXN0ZW0tY29udHJhY3RzL21haW4vY29udHJhY3RzL2ljb25zL2FkbWluLnBuZyM5YmYxY2VjNjY0ODYzYmQ2YWFhYzBmODE0YjIzNWY4Nzk5ZmIwMmM4NTBlOWFhNWRhMzRlOGEwMDRiZDY1MThlCi0tLQoKe3skYWN0aW9uLmFjY291bnR9fSBjb25maWd1cmVzIHRoZSBhdmFpbGFibGUgUkFNIHRvIHt7bWF4X3JhbV9zaXplfX0gYnl0ZXMuAIDK5kpzs8IKc2V0cmFtcmF0ZYUDLS0tCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogU2V0IHRoZSBSYXRlIG9mIEluY3JlYXNlIG9mIFJBTQpzdW1tYXJ5OiAnU2V0IHRoZSByYXRlIG9mIGluY3JlYXNlIG9mIFJBTSBwZXIgYmxvY2snCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9lb3NuZXR3b3JrZm91bmRhdGlvbi9lb3Mtc3lzdGVtLWNvbnRyYWN0cy9tYWluL2NvbnRyYWN0cy9pY29ucy9hZG1pbi5wbmcjOWJmMWNlYzY2NDg2M2JkNmFhYWMwZjgxNGIyMzVmODc5OWZiMDJjODUwZTlhYTVkYTM0ZThhMDA0YmQ2NTE4ZQotLS0KCnt7JGFjdGlvbi5hY2NvdW50fX0gc2V0cyB0aGUgcmF0ZSBvZiBpbmNyZWFzZSBvZiBSQU0gdG8ge3tieXRlc19wZXJfYmxvY2t9fSBieXRlcy9ibG9jay4AAAAAdHWzwgZzZXRyZXi3Ay0tLQpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IEFkanVzdCBSRVggUG9vbCBWaXJ0dWFsIEJhbGFuY2UKc3VtbWFyeTogJ0FkanVzdCBSRVggUG9vbCBWaXJ0dWFsIEJhbGFuY2UnCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9lb3NuZXR3b3JrZm91bmRhdGlvbi9lb3Mtc3lzdGVtLWNvbnRyYWN0cy9tYWluL2NvbnRyYWN0cy9pY29ucy9hZG1pbi5wbmcjOWJmMWNlYzY2NDg2M2JkNmFhYWMwZjgxNGIyMzVmODc5OWZiMDJjODUwZTlhYTVkYTM0ZThhMDA0YmQ2NTE4ZQotLS0KCnt7JGFjdGlvbi5hY2NvdW50fX0gYWRqdXN0cyBSRVggbG9hbiByYXRlIGJ5IHNldHRpbmcgUkVYIHBvb2wgdmlydHVhbCBiYWxhbmNlIHRvIHt7YmFsYW5jZX19LiBObyB0b2tlbiB0cmFuc2ZlciBvciBpc3N1ZSBpcyBleGVjdXRlZCBpbiB0aGlzIGFjdGlvbi7Aj8qGqajS1Ax1bmRlbGVnYXRlYnehBy0tLQpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IFVuc3Rha2UgVG9rZW5zIGZvciBORVQgYW5kL29yIENQVQpzdW1tYXJ5OiAnVW5zdGFrZSB0b2tlbnMgZm9yIE5FVCBhbmQvb3IgQ1BVIGZyb20ge3tub3dyYXAgcmVjZWl2ZXJ9fScKaWNvbjogaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Vvc25ldHdvcmtmb3VuZGF0aW9uL2Vvcy1zeXN0ZW0tY29udHJhY3RzL21haW4vY29udHJhY3RzL2ljb25zL3Jlc291cmNlLnBuZyMzODMwZjFjZThjYjA3Zjc3NTdkYmNmMzgzYjFlYzFiMTE5MTRhYzM0YTFmOWQ4YjA2NWYwNzYwMGZhOWRhYzE5Ci0tLQoKe3tmcm9tfX0gdW5zdGFrZXMgZnJvbSB7e3JlY2VpdmVyfX0ge3t1bnN0YWtlX25ldF9xdWFudGl0eX19IGZvciBORVQgYmFuZHdpZHRoIGFuZCB7e3Vuc3Rha2VfY3B1X3F1YW50aXR5fX0gZm9yIENQVSBiYW5kd2lkdGguCgpUaGUgc3VtIG9mIHRoZXNlIHR3byBxdWFudGl0aWVzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSB2b3RlIHdlaWdodCBvZiB7e3JlY2VpdmVyfX0gYW5kIHdpbGwgYmUgbWFkZSBhdmFpbGFibGUgdG8ge3tmcm9tfX0gYWZ0ZXIgYW4gdW5pbnRlcnJ1cHRlZCAzIGRheSBwZXJpb2Qgd2l0aG91dCBmdXJ0aGVyIHVuc3Rha2luZyBieSB7e2Zyb219fS4gQWZ0ZXIgdGhlIHVuaW50ZXJydXB0ZWQgMyBkYXkgcGVyaW9kIHBhc3NlcywgdGhlIHN5c3RlbSB3aWxsIGF0dGVtcHQgdG8gYXV0b21hdGljYWxseSByZXR1cm4gdGhlIGZ1bmRzIHRvIHt7ZnJvbX194oCZcyByZWd1bGFyIHRva2VuIGJhbGFuY2UuIEhvd2V2ZXIsIHRoaXMgYXV0b21hdGljIHJlZnVuZCBtYXkgb2NjYXNpb25hbGx5IGZhaWwgd2hpY2ggd2lsbCB0aGVuIHJlcXVpcmUge3tmcm9tfX0gdG8gbWFudWFsbHkgY2xhaW0gdGhlIGZ1bmRzIHdpdGggdGhlIHJlZnVuZCBhY3Rpb24uAEDL2sDp4tQKdW5saW5rYXV0aJEFLS0tCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogVW5saW5rIEFjdGlvbiBmcm9tIFBlcm1pc3Npb24Kc3VtbWFyeTogJ3t7bm93cmFwIGFjY291bnR9fSB1bnNldHMgdGhlIG1pbmltdW0gcmVxdWlyZWQgcGVybWlzc2lvbiBmb3IgdGhlIHt7I2lmIHR5cGV9fXt7bm93cmFwIHR5cGV9fSBhY3Rpb24gb2YgdGhle3svaWZ9fSB7e25vd3JhcCBjb2RlfX0gY29udHJhY3QnCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9lb3NuZXR3b3JrZm91bmRhdGlvbi9lb3Mtc3lzdGVtLWNvbnRyYWN0cy9tYWluL2NvbnRyYWN0cy9pY29ucy9hY2NvdW50LnBuZyMzZDU1YTJmYzNhNWMyMGI0NTZmNTY1N2ZhZjY2NmJjMjVmZmQwNmY0ODM2YzVlODI1NmY3NDExNDliMGIyOTRmCi0tLQoKe3thY2NvdW50fX0gcmVtb3ZlcyB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiB0aGUge3sjaWYgdHlwZX19e3t0eXBlfX0gYWN0aW9uIG9mIHRoZXt7L2lmfX0ge3tjb2RlfX0gY29udHJhY3QgYW5kIGl0cyBtaW5pbXVtIHJlcXVpcmVkIHBlcm1pc3Npb24uCgp7eyNpZiB0eXBlfX17e2Vsc2V9fVRoaXMgd2lsbCBub3QgcmVtb3ZlIGFueSBsaW5rcyBleHBsaWNpdGx5IGFzc29jaWF0ZWQgdG8gc3BlY2lmaWMgYWN0aW9ucyBvZiB7e2NvZGV9fS57ey9pZn19AABI9Fam7tQJdW5yZWdwcm9k5QQtLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBVbnJlZ2lzdGVyIGFzIGEgQmxvY2sgUHJvZHVjZXIgQ2FuZGlkYXRlCnN1bW1hcnk6ICd7e25vd3JhcCBwcm9kdWNlcn19IHVucmVnaXN0ZXJzIGFzIGEgYmxvY2sgcHJvZHVjZXIgY2FuZGlkYXRlJwppY29uOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZW9zbmV0d29ya2ZvdW5kYXRpb24vZW9zLXN5c3RlbS1jb250cmFjdHMvbWFpbi9jb250cmFjdHMvaWNvbnMvdm90aW5nLnBuZyNkYjI4Y2QzZGI2ZTYyZDQ1MDlhZjM2NDRjZTdkMzc3MzI5NDgyYTE0YmI0YmZhY2EyYWE1ZjE0MDBkOGU4YTg0Ci0tLQoKe3twcm9kdWNlcn19IHVucmVnaXN0ZXJzIGFzIGEgYmxvY2sgcHJvZHVjZXIgY2FuZGlkYXRlLiB7e3Byb2R1Y2VyfX0gYWNjb3VudCB3aWxsIHJldGFpbiBpdHMgdm90ZXMgYW5kIHRob3NlIHZvdGVzIGNhbiBjaGFuZ2UgYmFzZWQgb24gdm90ZXIgc3Rha2UgY2hhbmdlcyBvciB2b3RlcyByZW1vdmVkIGZyb20ge3twcm9kdWNlcn19LiBIb3dldmVyIG5ldyB2b3RlcnMgd2lsbCBub3QgYmUgYWJsZSB0byB2b3RlIGZvciB7e3Byb2R1Y2VyfX0gd2hpbGUgaXQgcmVtYWlucyB1bnJlZ2lzdGVyZWQu0NWlWUGT8dQMdW5zdGFrZXRvcmV44wYtLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBCdXkgUkVYIFRva2VucyBVc2luZyBTdGFrZWQgVG9rZW5zCnN1bW1hcnk6ICd7e25vd3JhcCBvd25lcn19IGJ1eXMgUkVYIHRva2VucyBpbiBleGNoYW5nZSBmb3IgdG9rZW5zIGN1cnJlbnRseSBzdGFrZWQgdG8gTkVUIGFuZC9vciBDUFUnCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9lb3NuZXR3b3JrZm91bmRhdGlvbi9lb3Mtc3lzdGVtLWNvbnRyYWN0cy9tYWluL2NvbnRyYWN0cy9pY29ucy9yZXgucG5nI2QyMjk4MzdmYTYyYTQ2NGI5YzcxZTA2MDYwYWE4NjE3OWFkZjBiM2Y0ZTNiOGM0Zjk3MDJmNGY0YjBjMzQwYTgKLS0tCgp7e2Zyb21fbmV0fX0gYW5kIHt7ZnJvbV9jcHV9fSBhcmUgd2l0aGRyYXduIGZyb20ge3tyZWNlaXZlcn194oCZcyBORVQgYW5kIENQVSBiYW5kd2lkdGhzIHJlc3BlY3RpdmVseS4gVGhlc2UgZnVuZHMgYXJlIHVzZWQgdG8gcHVyY2hhc2UgUkVYIHRva2VucyBhdCB0aGUgY3VycmVudCBtYXJrZXQgZXhjaGFuZ2UgcmF0ZS4gSW4gb3JkZXIgZm9yIHRoZSBhY3Rpb24gdG8gc3VjY2VlZCwge3tvd25lcn19IG11c3QgaGF2ZSB2b3RlZCBmb3IgYSBwcm94eSBvciBhdCBsZWFzdCAyMSBibG9jayBwcm9kdWNlcnMuCgpBIHNlbGwgb3JkZXIgb2YgdGhlIHB1cmNoYXNlZCBhbW91bnQgY2FuIG9ubHkgYmUgaW5pdGlhdGVkIGFmdGVyIHdhaXRpbmcgZm9yIHRoZSBtYXR1cml0eSBwZXJpb2Qgb2YgNCB0byA1IGRheXMgdG8gcGFzcy4gRXZlbiB0aGVuLCBkZXBlbmRpbmcgb24gdGhlIG1hcmtldCBjb25kaXRpb25zLCB0aGUgaW5pdGlhdGVkIHNlbGwgb3JkZXIgbWF5IG5vdCBiZSBleGVjdXRlZCBpbW1lZGlhdGVseS4AQMvaqGxS1Qp1cGRhdGVhdXRo7QMtLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBNb2RpZnkgQWNjb3VudCBQZXJtaXNzaW9uCnN1bW1hcnk6ICdBZGQgb3IgdXBkYXRlIHRoZSB7e25vd3JhcCBwZXJtaXNzaW9ufX0gcGVybWlzc2lvbiBvZiB7e25vd3JhcCBhY2NvdW50fX0nCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9lb3NuZXR3b3JrZm91bmRhdGlvbi9lb3Mtc3lzdGVtLWNvbnRyYWN0cy9tYWluL2NvbnRyYWN0cy9pY29ucy9hY2NvdW50LnBuZyMzZDU1YTJmYzNhNWMyMGI0NTZmNTY1N2ZhZjY2NmJjMjVmZmQwNmY0ODM2YzVlODI1NmY3NDExNDliMGIyOTRmCi0tLQoKTW9kaWZ5LCBhbmQgY3JlYXRlIGlmIG5lY2Vzc2FyeSwgdGhlIHt7cGVybWlzc2lvbn19IHBlcm1pc3Npb24gb2Yge3thY2NvdW50fX0gdG8gaGF2ZSBhIHBhcmVudCBwZXJtaXNzaW9uIG9mIHt7cGFyZW50fX0gYW5kIHRoZSBmb2xsb3dpbmcgYXV0aG9yaXR5Ogp7e3RvX2pzb24gYXV0aH19AADo6qpsUtUJdXBkYXRlcmV4gQMtLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBVcGRhdGUgUkVYIE93bmVyIFZvdGUgV2VpZ2h0CnN1bW1hcnk6ICdVcGRhdGUgdm90ZSB3ZWlnaHQgdG8gY3VycmVudCB2YWx1ZSBvZiBoZWxkIFJFWCB0b2tlbnMnCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9lb3NuZXR3b3JrZm91bmRhdGlvbi9lb3Mtc3lzdGVtLWNvbnRyYWN0cy9tYWluL2NvbnRyYWN0cy9pY29ucy9yZXgucG5nI2QyMjk4MzdmYTYyYTQ2NGI5YzcxZTA2MDYwYWE4NjE3OWFkZjBiM2Y0ZTNiOGM0Zjk3MDJmNGY0YjBjMzQwYTgKLS0tCgpVcGRhdGUgdm90ZSB3ZWlnaHQgb2Yge3tvd25lcn19IGFjY291bnQgdG8gY3VycmVudCB2YWx1ZSBvZiBoZWxkIFJFWCB0b2tlbnMuMKnDbqubU9UMdXBkdHJldmlzaW9uggMtLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBVcGRhdGUgU3lzdGVtIENvbnRyYWN0IFJldmlzaW9uIE51bWJlcgpzdW1tYXJ5OiAnVXBkYXRlIHN5c3RlbSBjb250cmFjdCByZXZpc2lvbiBudW1iZXInCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9lb3NuZXR3b3JrZm91bmRhdGlvbi9lb3Mtc3lzdGVtLWNvbnRyYWN0cy9tYWluL2NvbnRyYWN0cy9pY29ucy9hZG1pbi5wbmcjOWJmMWNlYzY2NDg2M2JkNmFhYWMwZjgxNGIyMzVmODc5OWZiMDJjODUwZTlhYTVkYTM0ZThhMDA0YmQ2NTE4ZQotLS0KCnt7JGFjdGlvbi5hY2NvdW50fX0gYWR2YW5jZXMgdGhlIHN5c3RlbSBjb250cmFjdCByZXZpc2lvbiBudW1iZXIgdG8ge3tyZXZpc2lvbn19LnAV0oneqjLdDHZvdGVwcm9kdWNlcq0GLS0tCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogVm90ZSBmb3IgQmxvY2sgUHJvZHVjZXJzCnN1bW1hcnk6ICd7e25vd3JhcCB2b3Rlcn19IHZvdGVzIGZvciB7eyNpZiBwcm94eX19dGhlIHByb3h5IHt7bm93cmFwIHByb3h5fX17e2Vsc2V9fXVwIHRvIDMwIGJsb2NrIHByb2R1Y2VyIGNhbmRpZGF0ZXN7ey9pZn19JwppY29uOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZW9zbmV0d29ya2ZvdW5kYXRpb24vZW9zLXN5c3RlbS1jb250cmFjdHMvbWFpbi9jb250cmFjdHMvaWNvbnMvdm90aW5nLnBuZyNkYjI4Y2QzZGI2ZTYyZDQ1MDlhZjM2NDRjZTdkMzc3MzI5NDgyYTE0YmI0YmZhY2EyYWE1ZjE0MDBkOGU4YTg0Ci0tLQoKe3sjaWYgcHJveHl9fQp7e3ZvdGVyfX0gdm90ZXMgZm9yIHRoZSBwcm94eSB7e3Byb3h5fX0uCkF0IHRoZSB0aW1lIG9mIHZvdGluZyB0aGUgZnVsbCB3ZWlnaHQgb2Ygdm90ZXLigJlzIHN0YWtlZCAoQ1BVICsgTkVUKSB0b2tlbnMgd2lsbCBiZSBjYXN0IHRvd2FyZHMgZWFjaCBvZiB0aGUgcHJvZHVjZXJzIHZvdGVkIGJ5IHt7cHJveHl9fS4Ke3tlbHNlfX0Ke3t2b3Rlcn19IHZvdGVzIGZvciB0aGUgZm9sbG93aW5nIGJsb2NrIHByb2R1Y2VyIGNhbmRpZGF0ZXM6Cgp7eyNlYWNoIHByb2R1Y2Vyc319CiAgKyB7e3RoaXN9fQp7ey9lYWNofX0KCkF0IHRoZSB0aW1lIG9mIHZvdGluZyB0aGUgZnVsbCB3ZWlnaHQgb2Ygdm90ZXLigJlzIHN0YWtlZCAoQ1BVICsgTkVUKSB0b2tlbnMgd2lsbCBiZSBjYXN0IHRvd2FyZHMgZWFjaCBvZiB0aGUgYWJvdmUgcHJvZHVjZXJzLgp7ey9pZn19AIDKJlWtMt0Kdm90ZXVwZGF0ZQAAAACALSSx4Qd3YXNtY2ZnAAAAANzc1LLjCHdpdGhkcmF3yQMtLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBXaXRoZHJhdyBmcm9tIFJFWCBGdW5kCnN1bW1hcnk6ICdXaXRoZHJhdyB7e25vd3JhcCBhbW91bnR9fSBmcm9tIHt7bm93cmFwIG93bmVyfX3igJlzIFJFWCBmdW5kIGJ5IHRyYW5zZmVycmluZyB0byB7e293bmVyfX3igJlzIGxpcXVpZCBiYWxhbmNlJwppY29uOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZW9zbmV0d29ya2ZvdW5kYXRpb24vZW9zLXN5c3RlbS1jb250cmFjdHMvbWFpbi9jb250cmFjdHMvaWNvbnMvcmV4LnBuZyNkMjI5ODM3ZmE2MmE0NjRiOWM3MWUwNjA2MGFhODYxNzlhZGYwYjNmNGUzYjhjNGY5NzAyZjRmNGIwYzM0MGE4Ci0tLQoKV2l0aGRyYXdzIHt7YW1vdW50fX0gZnJvbSB7e293bmVyfX3igJlzIFJFWCBmdW5kIGFuZCB0cmFuc2ZlciB0aGVtIHRvIHt7b3duZXJ9feKAmXMgbGlxdWlkIGJhbGFuY2UuGgAAAKBh09wxA2k2NAAACGFiaV9oYXNoAABOUy91kzsDaTY0AAAKYmlkX3JlZnVuZAAAoGs6iGg8A2k2NAAAEWJsb2NrX2luZm9fcmVjb3JkAAAAYBoadUUDaTY0AAAIcmV4X2xvYW4AAAAgTXOiSgNpNjQAABNkZWxlZ2F0ZWRfYmFuZHdpZHRoAAAAAERzaGQDaTY0AAASZW9zaW9fZ2xvYmFsX3N0YXRlAAAAQERzaGQDaTY0AAATZW9zaW9fZ2xvYmFsX3N0YXRlMgAAAGBEc2hkA2k2NAAAE2Vvc2lvX2dsb2JhbF9zdGF0ZTMAAACARHNoZANpNjQAABNlb3Npb19nbG9iYWxfc3RhdGU0AAAAOLmjpJkDaTY0AAAIbmFtZV9iaWQAAABgGhqzmgNpNjQAAAhyZXhfbG9hbgCuSpeCqjmtA2k2NAAADXBvd2VydXBfb3JkZXIAVDYZg6o5rQNpNjQAAA1wb3dlcnVwX3N0YXRlAADAVyGd6K0DaTY0AAANcHJvZHVjZXJfaW5mbwCAwFchneitA2k2NAAADnByb2R1Y2VyX2luZm8yAADICl4jpbkDaTY0AAAOZXhjaGFuZ2Vfc3RhdGUAAAAAp6mXugNpNjQAAA5yZWZ1bmRfcmVxdWVzdAAAzgoifbK6A2k2NAAAEnJleF9yZXR1cm5fYnVja2V0cwAAAABEc7q6A2k2NAAAC3JleF9iYWxhbmNlAAAAIE29uroDaTY0AAAIcmV4X2Z1bmQAAAAgUlq7ugNpNjQAAAhyZXhfcG9vbAAAAEorbbu6A2k2NAAACXJleF9vcmRlcgBApLRmdbu6A2k2NAAAD3JleF9yZXR1cm5fcG9vbAAAAACrexXWA2k2NAAADnVzZXJfcmVzb3VyY2VzAAAAAOCrMt0DaTY0AAAKdm90ZXJfaW5mb8Aaalmb7KSLA2k2NAAAEWxpbWl0X2F1dGhfY2hhbmdlAg1Vc2VyQWdyZWVtZW507H8jIEVPUyBVc2VyIEFncmVlbWVudAoKIyMgRGVmaW5pdGlvbnMKCiBBbGwgY2FwaXRhbGl6ZWQsIGl0YWxpY2l6ZWQsIG9yIGlubGluZSBjb2RlIHRlcm1zIGluICpUaGUgRU9TIFVzZXIgQWdyZWVtZW50KiB3aWxsIGJlIGdpdmVuIHRoZSBzYW1lIGVmZmVjdCBhbmQgbWVhbmluZyBhcyBpbiAqRGVmaW5pdGlvbnMqLgoKKiBFT1MgVXNlciBBZ3JlZW1lbnQ6IFRoaXMgZG9jdW1lbnQgKCpFVUEqKQoKKiBDaGFpbiBJRDogYGNoYWluX2lkYOKAii3igIphY2EzNzZmMjA2YjhmYzI1YTZlZDQ0ZGJkYzY2NTQ3YzM2YzZjMzNlM2ExMTlmZmJlYWVmOTQzNjQyZjBlOTA2CgoqIFVzZXI6IEFueSBwZXJzb24gb3Igb3JnYW5pemF0aW9uIG9mIHBlcnNvbnMgd2hvIG1haW50YWluKHMpIGRpcmVjdCBvciBpbmRpcmVjdCBvd25lcnNoaXAgb2YgYW4gRU9TIGFjY291bnQsIG9yIEVPUy1iYXNlZCBwcm9wZXJ0eSBjb25uZWN0ZWQgdG8gYW4gRU9TIGFjY291bnQuCgoqIE93bmVyc2hpcDogRGlyZWN0IG9yIGluZGlyZWN0IGFjY2VzcyB0byBhbiBFT1MgYWNjb3VudCB0aHJvdWdoIG9uZSBvciBtb3JlIHZhbGlkIHBlcm1pc3Npb25zIGNoZWNrcy4gT3duZXJzaGlwIG1heSBiZSBwYXJ0aWFsbHkgc2hhcmVkIGJldHdlZW4gVXNlcnMgdGhyb3VnaCB0aGUgdXNlIG9mIG11bHRpLXNpZ25hdHVyZSBwZXJtaXNzaW9ucy4KCiogQmxvY2sgUHJvZHVjZXI6IFVzZXJzIHdobyBoYXZlIGNhbGxlZCBgcmVncHJvZHVjZXJgIGFuZCByZWNlaXZlIHJld2FyZHMgZnJvbSBlb3Npby52cGF5LgoKKiBgZW9zaW8ucHJvZHNgOiBBbiBFT1MgYWNjb3VudCB3aXRoIGEgZHluYW1pYyBwZXJtaXNzaW9ucyBzdHJ1Y3R1cmUgdGhhdCBjYW4gYXNzdW1lIHRoZSBwcml2aWxlZ2VzIG9mIHRoZSBgZW9zaW9gIGFjY291bnQgd2hlbiAxNS8yMSBCbG9jayBQcm9kdWNlcnMgYWdyZWUgdG8gZG8gc28uCgoqIE5ldHdvcmsgRnVuZHM6IFRva2VucyBjb250YWluZWQgd2l0aGluIHRoZSBmb2xsb3dpbmcgYWNjb3VudHM6IGBlb3Npby5uYW1lc2AsIGBlb3Npby5yYW1mZWVgLCBgZW9zaW8uc2F2aW5nYC4KCiogR292ZXJuaW5nIERvY3VtZW50czogKnJlZ3Byb2R1Y2VyKiBpcyBjb25zaWRlcmVkIGEgZ292ZXJuaW5nIGRvY3VtZW50LgoKKiBPbi1DaGFpbjogQW55IHRyYW5zYWN0aW9uLCBzbWFydCBjb250cmFjdCwgb3IgUmljYXJkaWFuIGNvbnRyYWN0IHdoaWNoIGlzIGxvY2F0ZWQgd2l0aGluIGEgYmxvY2sgdGhhdCBpcyBpcnJldmVyc2libGUgYW5kIGFwcGVuZGVkIHRvIHRoZSBFT1MgYmxvY2tjaGFpbiBgY2hhaW5faWRgLgoKKiBFT1MtYmFzZWQgUHJvcGVydHk6IEFueXRoaW5nIHRoYXQgcmVxdWlyZXMgYSB2YWxpZCBwZXJtaXNzaW9uIGluIG9yZGVyIHRvIGRpcmVjdGx5IG1hbmlwdWxhdGUsIGFsdGVyLCB0cmFuc2ZlciwgaW5mbHVlbmNlLCBvciBvdGhlcndpc2UgZWZmZWN0IG9uIHRoZSBFT1MgQmxvY2tjaGFpbgoKKiBDYWxsOiBUbyBzdWJtaXQgYW4gYWN0aW9uIHRvIHRoZSBFT1MgQmxvY2tjaGFpbiBgY2hhaW5faWRgLgoKKiBBdXRob3JpemF0aW9ucyAmIFBlcm1pc3Npb25zOiBQZXJtaXNzaW9ucyBhcmUgYXJiaXRyYXJ5IG5hbWVzIHVzZWQgdG8gZGVmaW5lIHRoZSByZXF1aXJlbWVudHMgZm9yIGEgdHJhbnNhY3Rpb24gc2VudCBvbiBiZWhhbGYgb2YgdGhhdCBwZXJtaXNzaW9uLiBQZXJtaXNzaW9ucyBjYW4gYmUgYXNzaWduZWQgZm9yIGF1dGhvcml0eSBvdmVyIHNwZWNpZmljIGNvbnRyYWN0IGFjdGlvbnMuCgoqIFJpY2FyZGlhbiBDb250cmFjdDogQSBjb250cmFjdCB0aGF0IHBsYWNlcyB0aGUgZGVmaW5pbmcgZWxlbWVudHMgb2YgYSBsZWdhbCBhZ3JlZW1lbnQgaW4gYSBmb3JtYXQgdGhhdCBjYW4gYmUgZXhwcmVzc2VkIGFuZCBleGVjdXRlZCBpbiBzb2Z0d2FyZS4KCiMjIEFydGljbGUgSSAt4oCKIFVzZXIgQWNrbm93bGVkZ2VtZW50IG9mIFJpc2tzCklmIFVzZXIgbG9zZXMgYWNjZXNzIHRvIHRoZWlyIEVPUyBhY2NvdW50IG9uIGBjaGFpbl9pZGAgYW5kIGhhcyBub3QgdGFrZW4gYXBwcm9wcmlhdGUgbWVhc3VyZXMgdG8gc2VjdXJlIGFjY2VzcyB0byB0aGVpciBFT1MgYWNjb3VudCBieSBvdGhlciBtZWFucywgdGhlIFVzZXIgYWNrbm93bGVkZ2VzIGFuZCBhZ3JlZXMgdGhhdCB0aGF0IEVPUyBhY2NvdW50IHdpbGwgYmVjb21lIGluYWNjZXNzaWJsZS4gVXNlcnMgYWNrbm93bGVkZ2UgdGhhdCB0aGUgVXNlciBoYXMgYW4gYWRlcXVhdGUgdW5kZXJzdGFuZGluZyBvZiB0aGUgcmlza3MsIHVzYWdlIGFuZCBpbnRyaWNhY2llcyBvZiBjcnlwdG9ncmFwaGljIHRva2VucyBhbmQgYmxvY2tjaGFpbi1iYXNlZCBzb2Z0d2FyZS4gVGhlIFVzZXIgYWNrbm93bGVkZ2VzIGFuZCBhZ3JlZXMgdGhhdCB0aGUgVXNlciBpcyB1c2luZyB0aGUgRU9TIGJsb2NrY2hhaW4gYXQgdGhlaXIgc29sZSByaXNrLgoKIyMgQXJ0aWNsZSBJSeKAii3igIpTcGVjaWFsIFVzZXIgVHlwZXMKVXNlcnMgd2hvIGNhbGwgYHJlZ3Byb2R1Y2VyYCBhZ3JlZSB0bywgYW5kIGFyZSBib3VuZCBieSwgdGhlICpyZWdwcm9kdWNlciogUmljYXJkaWFuIENvbnRyYWN0LgoKIyMgQXJ0aWNsZSBJSUnigIot4oCKQ29uc2VudCBvZiB0aGUgRVVBClRoZSBuYXR1cmUgb2YgdGhlICpFT1MgVXNlciBBZ3JlZW1lbnQqIGlzIHN1Y2ggdGhhdCBpdCBzZXJ2ZXMgYXMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgY3VycmVudCBFT1MgTWFpbm5ldCBnb3Zlcm5hbmNlIGZ1bmN0aW9ucyB0aGF0IGFyZSBpbiBwbGFjZS4gVGhlc2UgZnVuY3Rpb25zLCBlbmZvcmNlZCBieSBjb2RlLCBkbyBub3QgcmVxdWlyZSB0aGUgY29uc2VudCBvZiBVc2VycyBhcyB0aGVzZSBmdW5jdGlvbnMgYXJlIGluaGVyZW50IGFuZCBzeXN0ZW1pYyB0byB0aGUgRU9TIE1haW5uZXQgaXRzZWxmLgoKIyMgQXJ0aWNsZSBJVuKAii3igIpHb3Zlcm5pbmcgRG9jdW1lbnRzCkFueSBtb2RpZmljYXRpb25zIHRvIHRoZSAqRVVBKiBhbmQgKmdvdmVybmluZyBkb2N1bWVudHMqIG1heSBiZSBtYWRlIGJ5IGBlb3Npby5wcm9kc2AuIEl0IGlzIGFkbW9uaXNoZWQgdGhhdCBhIHN0YXRlbWVudCBiZSBjcmFmdGVkIGFuZCBpc3N1ZWQgdGhyb3VnaCBgZW9zaW8ucHJvZHNgIHZpYSBlb3Npby5mb3J1bSByZWZlcmVuZHVtIGNvbnRyYWN0IGRlc2NyaWJpbmcgc3VjaCBhIG1vZGlmaWNhdGlvbiBpbiBhZHZhbmNlLgoKIyMgQXJ0aWNsZSBW4oCKLeKAik5hdGl2ZSBVbml0IG9mIFZhbHVlClRoZSBuYXRpdmUgdW5pdCBvZiB2YWx1ZSBvbiBFT1MgY2hhaW5faWQgc2hhbGwgYmUgdGhlIEVPUyB0b2tlbiBhcyBkZWZpbmVkIGFuZCBjcmVhdGVkIGJ5IHRoZSBgZW9zaW8udG9rZW5gIHNtYXJ0IGNvbnRyYWN0LgoKIyMgQXJ0aWNsZSBWSeKAii3igIpNYWludGFpbmluZyB0aGUgRU9TIGJsb2NrY2hhaW4KYGVvc2lvLnByb2RzYCB3aWxsIG1haW50YWluIHRoZSBhY3RpdmUgYmxvY2tjaGFpbiBjb2RlYmFzZSB3aGljaCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGVtZW50YXRpb24gb2YgYWxsIG1vZGlmaWNhdGlvbnMgb2YgYWxsIGZlYXR1cmVzLCBvcHRpbWl6YXRpb25zLCBhbmQgdXBncmFkZXM6IHByZXNlbnQgYW5kIGZ1dHVyZS4KCiMjIEFydGljbGUgVklJ4oCKLeKAik5ldHdvcmsgRnVuZHMKSXQgaXMgYWRtb25pc2hlZCB0aGF0IGFueSBhbHRlcmluZyBvZiB0aGUgc3RhdGUgb2YgYW55IHRva2VucyBjb250YWluZWQgd2l0aGluIG5ldHdvcmsgZnVuZCBhY2NvdW50cywgb3IgYWx0ZXJpbmcgYW55IHByZS1leGlzdGluZyBjb2RlIHRoYXQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBnb3Zlcm5zIHRoZSBhbGxvY2F0aW9uLCBmdWxmaWxsbWVudCwgb3IgZGlzdHJpYnV0aW9uIG9mIGFueSAqbmV0d29yayBmdW5kcyogYmUgcHJlY2VkZWQgYnkgYSBzdGF0ZW1lbnQgY3JhZnRlZCBhbmQgaXNzdWVkIGJ5IGBlb3Npby5wcm9kc2AgdG8gdGhlICplb3Npby5mb3J1bSogcmVmZXJlbmR1bSBzeXN0ZW0gY29udHJhY3QgZGVzY3JpYmluZyB0aGUgZWZmZWN0IGluIGFkdmFuY2UuCgojIyBBcnRpY2xlIFZJSUnigIot4oCKRnJlZWRvbSBvZiBBY2NvdW50IENyZWF0aW9uCkFueSBjdXJyZW50IG9yIGZ1dHVyZSBVc2VyIGlzIGFibGUgdG8gY3JlYXRlIGFuIEVPUyBBY2NvdW50IHdpdGhvdXQgdGhlIHBlcm1pc3Npb24gYnkgYW55IG90aGVyIFVzZXIuIGBlb3Npby5wcm9kc2AgbWF5IG5ldmVyIGFmZmVjdCBhbiBFT1MgVXNlciBBY2NvdW50KHMpIHdpdGhvdXQgdmFsaWQgcGVybWlzc2lvbihzKSB3aGljaCBoYXZlIGJlZW4gc2hhcmVkIHdpdGggYGVvc2lvLnByb2RzYCBieSBhbiBFT1MgYWNjb3VudC4gYGVvc2lvLnByb2RzYCBtYXkgY2hhcmdlIGEgZmVlIGZvciBhbnkgYWN0aW9ucyB0aGF0IGFyZSByZXF1ZXN0ZWQgYnkgb3RoZXIgVXNlcnMgcGVydGFpbmluZyB0byBhbiBFT1MgYWNjb3VudCB3aGVyZSBwZXJtaXNzaW9ucyBhcmUgc2hhcmVkLgoKIyMgQXJ0aWNsZSBJWOKAii3igIpObyBGaWR1Y2lhcnkKTm8gVXNlciBzaGFsbCBoYXZlIGEgZmlkdWNpYXJ5IHB1cnBvc2UgdG8gc3VwcG9ydCB0aGUgdmFsdWUgb2YgdGhlIEVPUyB0b2tlbi4gTm8gVXNlciBjYW4gYXV0aG9yaXplIGFueW9uZSB0byBob2xkIGFzc2V0cywgYm9ycm93LCBzcGVhaywgY29udHJhY3Qgb24gYmVoYWxmIG9mIG90aGVyIEVPUyBVc2VycyBvciB0aGUgRU9TIGJsb2NrY2hhaW4gYGNoYWluX2lkYCBjb2xsZWN0aXZlbHkuIFRoaXMgRU9TIGJsb2NrY2hhaW4gc2hhbGwgaGF2ZSBubyBvd25lcnMsIG1hbmFnZXJzLCBvciBmaWR1Y2lhcmllcy4KCiMjIEFydGljbGUgWOKAii3igIpVc2VyIFNlY3VyaXR5CkFsbCBpdGVtcyBwZXJ0YWluaW5nIHRvIHBlcnNvbmFsIGFjY291bnQgc2VjdXJpdHksIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHNhZmVrZWVwaW5nIG9mIHByaXZhdGUga2V5cywgaXMgc29sZWx5IHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgVXNlciB0byBzZWN1cmUuCgojIyBBcnRpY2xlIFhJIC0gYGVvc2lvLnByb2RzYCBMaW1pdGVkIExpYWJpbGl0eQpUaGUgVXNlciBhY2tub3dsZWRnZXMgYW5kIGFncmVlcyB0aGF0LCB0byB0aGUgZnVsbGVzdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFueSBhcHBsaWNhYmxlIGxhdywgdGhpcyBkaXNjbGFpbWVyIG9mIGxpYWJpbGl0eSBhcHBsaWVzIHRvIGFueSBhbmQgYWxsIGRhbWFnZXMgb3IgaW5qdXJ5IHdoYXRzb2V2ZXIgY2F1c2VkIGJ5IG9yIHJlbGF0ZWQgdG8gcmlza3Mgb2YsIHVzZSBvZiwgb3IgaW5hYmlsaXR5IHRvIHVzZSwgdGhlIEVPUyB0b2tlbiBvciB0aGUgRU9TIGJsb2NrY2hhaW4gYGNoYWluX2lkYCB1bmRlciBhbnkgY2F1c2Ugb2YgYWN0aW9uIHdoYXRzb2V2ZXIgb2YgYW55IGtpbmQgaW4gYW55IGp1cmlzZGljdGlvbiwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFjdGlvbnMgZm9yIGJyZWFjaCBvZiB3YXJyYW50eSwgYnJlYWNoIG9mIGNvbnRyYWN0IG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSBhbmQgdGhhdCBgZW9zaW8ucHJvZHNgLCBub3IgdGhlIGluZGl2aWR1YWwgcGVybWlzc2lvbnMgdGhhdCBvcGVyYXRlIGl0LCBzaGFsbCBub3QgYmUgbGlhYmxlIGZvciBhbnkgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBmb3IgbG9zcyBvZiBwcm9maXRzLCBnb29kd2lsbCBvciBkYXRhLgoKIyBFT1Mg7IKs7Jqp7J6QIOuPmeydmOyEnAoKIyMg7KCV7J2YCgpFT1Mg7IKs7Jqp7J6QIOuPmeydmOyEnOydmCDrqqjrk6Ag64yA66y47J6QLCDquLDsmrjsnoQg6ry0LCDrmJDripQg7J2465287J24IOy9lOuTnCDsmqnslrTripQg7KCV7J2Y7JeQ7ISc7JmAIOuPmeydvO2VnCDtmqjqs7zsmYAg7J2Y66+46rCAIOu2gOyXrOuQqeuLiOuLpC4KCi0gICBFT1Mg7IKs7Jqp7J6QIOuPmeydmOyEnDog67O4IOusuOyEnCAoRVVBKQotICAg7LK07J24IElEOiBjaGFpbl9pZOKAii0tLeKAimFjYTM3NmYyMDZiOGZjMjVhNmVkNDRkYmRjNjY1NDdjMzZjNmMzM2UzYTExOWZmYmVhZWY5NDM2NDJmMGU5MDYKLSAgIOyCrOyaqeyekDogRU9TIOqzhOygleydhCDsp4HsoJEg65iQ64qUIOqwhOygkeyggeycvOuhnCDshozsnKDtlZjqsbDrgpggRU9TIOqzhOygleyXkCDsl7DqsrDrkJwgRU9TIOq4sOuwmCDsho3shLHsnYQg7Jyg7KeA7ZWY6rGw64KYIOq0gOumrO2VmOuKlCDsgqzrnowsIOyhsOyngSwg65iQ64qUIOyhsOyngeydmCDrqqjrk6Ag7IKs656MLgotICAg7IaM7Jyg6raMOiDtlZjrgpgg7J207IOB7J2YIOycoO2aqO2VnCDsgqzsmqnqtoztlZwg7ZmV7J247J2EIO2Gte2VtCBFT1Mg6rOE7KCV7JeQIOyngeygkSDrmJDripQg6rCE7KCR7KCB7Jy866GcIOygkeq3vO2VqeuLiOuLpC4g7IaM7Jyg6raM7J2AIOuLpOykkSDshJzrqoXqtoztlZzsnYQg7IKs7Jqp7ZWY7JesIOyCrOyaqeyekOqwhOyXkCDrtoDrtoTsoIHsnLzroZwg6rO17JygIOuQoCDsiJgg7J6I7Iq164uI64ukLgotICAg67iU66GdIO2UhOuhnOuTgOyEnDogcmVncHJvZHVjZXLrpbwg7Iuk7ZaJ7ZWY6rOgIGVvc2lvLnZwYXnroZzrtoDthLAg67O07IOB7J2EIOuwm+uKlCDsgqzsmqnsnpAuCi0gICBlb3Npby5wcm9kczogMTUvMjEg67iU66GdIO2UhOuhnOuTgOyEnOuTpOydtCDrj5nsnZgg7ZWgIOuVjCBlb3NpbyDqs4TsoJXsnZgg6raM7ZWc7J2EIOqwgOyniCDsiJgg7J6I64qUIOuPmeyggSDqtoztlZwg6rWs7KGw66W8IOqwgOynhCBFT1Mg6rOE7KCVLgotICAg64Sk7Yq47JuM7YGsIOyekOq4iDog64uk7J2MIOqzhOygleyXkCDtj6ztlagg65CcIO2GoO2BsDogZW9zaW8ubmFtZXMsIGVvc2lvLnJhbWZlZSwgZW9zaW8uc2F2aW5nLgotICAg6rSA66asIOusuOyEnDogcmVncHJvZHVjZXLripQg6rSA66asIOusuOyEnOuhnCDqsITso7zrkKnri4jri6QuCi0gICDsmKjssrTsnbg6IEVPUyDruJTroZ3ssrTsnbggY2hhaW5faWTsl5Ag67mE6rCA7Jet7KCB7J2066mwIOy2lOqwgCDtlaAg7IiYIOyeiOuKlCDruJTroZ0g64K07JeQIOychOy5mO2VnCDrqqjrk6Ag6rGw656YLCDsiqTrp4jtirgg6rOE7JW9IOuYkOuKlCDrpqzsubTrpbTrlJTslYgg6rOE7JW9LgotICAgRU9TIOq4sOuwmCDsho3shLE6IEVPUyDruJTroZ3ssrTsnbjsnYQg7KeB7KCRIOyhsOyekSwg67OA6rK9LCDsoITshqEsIOyYge2WpSDrmJDripQg64us66asIOyggeyaqe2VmOq4sCDsnITtlbQg7Jyg7Zqo7ZWcIOyCrOyaqSDqtoztlZzsnbQg7ZWE7JqU7ZWcIOuqqOuToCDqsoMKLSAgIOy9nDogRU9TIOu4lOuhneyytOyduCBjaGFpbl9pZOyXkCDsnpHsl4XsnYQg7Iug7LKt7ZWY64qUIOqygy4KLSAgIO2XiOqwgCDrsI8g6raM7ZWcOiAn7ZeI6rCAJ+uKlCDtlbTri7kg6raM7ZWc7J2EIOuMgOyLoO2VmOyXrCDsoITshqHrkJjripQg7Yq4656c7J6t7IWY7J2YIOyalOq1rOyCrO2VreydhCDsoJXsnZjtlZjripQg642wIOyCrOyaqeuQqeuLiOuLpC4gJ+q2jO2VnCfsnYAg7Yq57KCVIOqzhOyVvSDsobDsuZjsl5Ag64yA7ZWcIOq2jO2VnOydhCDrtoDsl6ztlanri4jri6QuCi0gICDrpqzsubTrpbTrlJTslYgg6rOE7JW9OiDtlanrspXsoIEg6rOE7JW97J2YIOygleydmCDsmpTshozrpbwg7IaM7ZSE7Yq47Juo7Ja066GcIO2RnO2YhO2VmOqzoCDsi6TtlontlaAg7IiYIOyeiOuKlCDtmJXsi53snLzroZwg67Cw7LmY7ZWY64qUIOqzhOyVvS4KCiMjIOygnCAx7KGw4oCKLS0t4oCK7JyE7ZeY7JeQIOuMgO2VnCDsgqzsmqnsnpDrk6TsnZgg7J247KeACgrsgqzsmqnsnpDqsIAgY2hhaW5faWTsl5DshJwgRU9TIOqzhOygleyXkCDrjIDtlZwg7KCR6re8IOq2jO2VnOydhCDsnoPqs6AsIOuLpOuluCDrsKnrspXsnLzroZwgRU9TIOqzhOygleyXkCDrjIDtlZwg7KCR6re87J2EIOuztO2YuO2VmOq4sCDsnITtlbQg7KCB7KCI7ZWcIOyhsOy5mOulvCDst6jtlZjsp4Ag7JWK64qUIOqyveyasOyXkOuKlCBFT1Mg6rOE7KCV7JeQIOygkeq3vO2VoCDsiJgg7JeG6rKMIOuQnOuLpOuKlCDqsoPsnYQg7J247KCV7ZWY6rOgIOuPmeydmO2VqeuLiOuLpC4g7IKs7Jqp7J6Q64qUIOyVlO2YuO2ZlCDthqDtgbDqs7wg67iU66Gd7LK07J24IOq4sOuwmCDshoztlITtirjsm6jslrTsnZgg7JyE7ZeYLCDsgqzsmqnrspUsIOq3uOumrOqzoCDrs7XsnqHshLHsl5Ag64yA7ZW0IOy2qeu2hO2eiCDsnbTtlbTtlZjqs6Ag7J6I7J2M7J2EIOyduOygle2VqeuLiOuLpC4g7IKs7Jqp7J6Q64qUIEVPUyDruJTroZ3ssrTsnbjsnZgg7IKs7Jqp7JeQIOuMgO2VnCDsoITsoIHsnbgg7LGF7J6E7J2EIOynhOuLpOuKlCDqsoPsl5Ag7J247KCV7ZWY6rOgIOuPmeydmO2VqeuLiOuLpC4KCiMjIOygnCAy7KGw4oCKLS0t4oCK7Yq567OE7ZWcIOyCrOyaqeyekCDsnKDtmJUKCnJlZ3Byb2R1Y2Vy66W8IOyLpO2Wie2VmOuKlCDsgqzsmqnsnpDripQgcmVncHJvZHVjZXIg66as7Lm066W065SU7JWIIOqzhOyVveyXkCDrj5nsnZjtlZjqs6AsIOydtOyXkCDqtazsho3rkKnri4jri6QuCgojIyDsoJwgM+yhsOKAii0tLeKAikVVQeydmCDrj5nsnZgKCkVPUyDsgqzsmqnsnpAg64+Z7J2Y7ISc64qUIO2YhOyerCDsi5ztlonspJHsnbggRU9TIOuplOyduOuEtyDqsbDrsoTrhIzsiqTsl5Ag64yA7ZWcIOyEpOuqheycvOuhnCDsgqzsmqnrkKnri4jri6QuIOy9lOuTnOyXkCDsnZjtlbQg7Iuc7ZaJ65CY64qUIOydtOufrO2VnCDquLDriqXsnYAgRU9TIOuplOyduOuEtyDsnpDssrTsnZgg7LK06rOE7KCB7J206rOgIOqzoOycoO2VnCDquLDriqXsnbTrr4DroZwg7IKs7Jqp7J6Q7J2YIOuPmeydmOulvCDtlYTsmpTroZwg7ZWY7KeAIOyViuyKteuLiOuLpC4KCiMjIOygnCA07KGw4oCKLS0t4oCK6rSA66asIOusuOyEnAoKRVVB7JmAIOq0gOumrCDrrLjshJzripQgZW9zaW8ucHJvZHPrpbwg7Ya17ZW0IOyImOygleydtCDqsIDriqXtlanri4jri6QuIO2KueyglSDrs4Dqsr3sgqztla3snYQg7IKs7KCE7JeQIOyEpOuqhe2VmOuKlCBlb3Npby5mb3J1bSDtiKztkZwg6rOE7JW97J2EIO2Gte2VtCBlb3Npby5wcm9kc+qwgCDshLHrqoXshJzrpbwg7J6R7ISx7ZWY6rOgIOuwnOq4ie2VoCDqsoPsnYQg6raM6rOg7ZWp64uI64ukLgoKIyMg7KCcIDXsobDigIotLS3igIrqsIDsuZjsnZgg6riw67O4IOuLqOychAoKRU9TIGNoYWluX2lk7J2YIOq4sOuzuCDri6jsnITripQgZW9zaW8udG9rZW4g7Iqk66eI7Yq4IOqzhOyVveyXkCDsnZjtlbQg7KCV7J2Y65CY6rOgIOyekeyEseuQnCBFT1Mg7Yag7YGw7J6F64uI64ukLgoKIyMg7KCcIDbsobDigIotLS3igIpFT1Mg67iU66Gd7LK07J24IOycoOyngAoKZW9zaW8ucHJvZHPripQg66qo65OgIOq4sOuKpSwg7LWc7KCB7ZmULCDqt7jrpqzqs6Ag7JeF6re466CI7J2065Oc7J2YIO2YhOyerOyZgCDrr7jrnpjsnZgg66qo65OgIOyImOygleyCrO2VreydhCDqtaztmITtlZjripQg6rKD7J2EIO2PrO2VqO2VmOuQmCwg7J207JeQIOq1re2VnOuQmOyngCDslYrripQg7Zmc7ISx7ZmU65CcIOu4lOuhneyytOyduCDsvZTrk5zrsqDsnbTsiqTrpbwg7Jyg7KeA7ZWp64uI64ukCgojIyDsoJwgN+yhsOKAii0tLeKAiuuEpO2KuOybjO2BrCDsnpDquIgKCuuEpO2KuOybjO2BrCDsnpDquIgg6rOE7KCV7JeQIO2PrO2VqOuQnCDthqDtgbDsnZgg7IOB7YOc66W8IOuzgOqyve2VmOqxsOuCmCwg64Sk7Yq47JuM7YGsIOyekOq4iOydmCDrsLDrtoQsIOydtO2WiSwg65iQ64qUIOuwsO2PrOulvCDsp4Ev6rCE7KCR7KCB7Jy866GcIOq0gOumrO2VmOuKlCDquLDsobQg7L2U65Oc66W8IOuzgOqyve2VmOuKlCDqsr3smrDsl5DripQgZW9zaW8ucHJvZHPrpbwgZW9zaW8uZm9ydW0g7LSdIO2IrO2RnCDsi5zsiqTthZwg6rOE7JW97JeQIOy2lOqwgO2VmOyXrCDsgqzsoITsl5Ag7Lap67aE7ZWcIOyEpOuqheydtCDsnbTro6jslrTsoLjslbwg7ZWp64uI64ukLgoKIyMg7KCcIDjsobDigIotLS3igIrqs4TsoJUg7IOd7ISx7J2YIOyekOycoAoK7ZiE7J6sLCDrmJDripQg66+4656Y7J2YIOyCrOyaqeyekOuKlCDri6Trpbgg7IKs7Jqp7J6Q7J2YIO2XiOqwgCDsl4bsnbQgRU9TIOqzhOygleydhCDrp4zrk6Qg7IiYIOyeiOyKteuLiOuLpC4gZW9zaW8ucHJvZHPripQgRU9TIOqzhOygleyXkCDsnZjtlbQg6rO17Jyg65CcIOycoO2aqO2VnCDtl4jqsIAg7JeG7J2064qUIEVPUyDsgqzsmqnsnpAg6rOE7KCV7JeQIOyYge2WpeydhCDspIQg7IiYIOyXhuyKteuLiOuLpC4gZW9zaW8ucHJvZHPripQg6raM7ZWc7J20IOqzteycoOuQmOuKlCBFT1Mg6rOE7KCV6rO8IOq0gOugqO2VmOyXrCDri6Trpbgg7IKs7Jqp7J6Q6rCAIOyalOyyre2VnCDrqqjrk6Ag7J6R7JeF7JeQIOuMgO2VtCDsmpTquIjsnYQg67aA6rO87ZWgIOyImCDsnojsirXri4jri6QuCgojIyDsoJwgOeyhsOKAii0tLeKAiuyLoO2DgSDrtojqsIAKCuyCrOyaqeyekOuKlCBFT1Mg7Yag7YGw7J2YIOqwgOy5mOulvCDrkrfrsJvsuajtlaAg7IiYIOyeiOuKlCDsi6Dtg4Eg66qp7KCB7J2EIOqwgOyguOyEnOuKlCDslYjrkKnri4jri6QuIOyCrOyaqeyekOuKlCBFT1Mg7IKs7Jqp7J6QIOuYkOuKlCBFT1Mg67iU66Gd7LK07J24IGNoYWluX2lk66W8IOuMgO2RnO2VmOyXrCDriITqtazsl5Dqsozrj4Qg7J6Q7IKw7J2EIOuztOycoO2VmOqxsOuCmCwg64yA7Jes7ZWY6rGw64KYLCDsnpDsgrDsl5Ag64yA7ZW0IOyWmOq4sO2VmOqxsOuCmCwg6rOE7JW97J2EIOunuuydhCDqtoztlZzsnYQg67aA7Jes7ZWgIOyImCDsl4bsirXri4jri6QuIEVPUyDruJTroZ3ssrTsnbjsl5DripQg7IaM7Jyg7J6QLCDqtIDrpqzsnpAsIOq3uOumrOqzoCDsiJjtg4HsnpDqsIAg7JeG7Ja07JW8IO2VqeuLiOuLpC4KCiMjIOygnCAxMOyhsOKAii0tLeKAiuyCrOyaqeyekCDrs7TslYgKCuu5hOqzteqwnCDtgqTsnZgg67O06rSA7J2EIO2PrO2VqO2VmOuQmCwg7J207JeQIOq1re2VnOuQmOyngCDslYrripQg6rCc7J24IOqzhOyijCDrs7TslYjqs7wg6rSA66Co65CcIOuqqOuToCDtla3rqqnrk6Qg65iQ7ZWcIOyghOyggeycvOuhnCDsgqzsmqnsnpDqsIAg7JWI7KCE7ZWY6rKMIOuztOq0gO2VtOyVvCDtlanri4jri6QuCgojIyDsoJwgMTHsobDigIotLS3igIplb3Npby5wcm9kcyDsnKDtlZzssYXsnoQKCuyCrOyaqeyekOuKlCDrspXrpaDsnbQg7ZeI7Jqp7ZWY64qUIO2VnOuPhCDrgrTsl5DshJwgRU9TIO2GoO2BsOydmCDsnITtl5gsIOyCrOyaqSwg65iQ64qUIOyCrOyaqSDrtojqsIDroZwg7J247ZW0IOuwnOyDne2VmOuKlCDrqqjrk6Ag7IaQ7ZW07JeQIOuMgO2VtCDssYXsnoTsnZgg66m07LGFIOyhsO2VreydtCDsoIHsmqnrkJzri6TripQg6rKD7J2EIOyduOygle2VmOqzoCwg64+Z7J2Y7ZWp64uI64ukLiDqs4Tslb0g7JyE67CYLCDrtojrspUg7ZaJ7JyELCDqt7jrpqzqs6Ag7JyE67CYIO2WieychCAo6rSA66asIO2DnOunjCDtj6ztlagp7JmAIGVvc2lvLnByb2RzIOuYkOuKlCDsnbTrpbwg7Jq07JiB7ZWY64qUIOqwnOuzhCDsgqzsmqkg6raM7ZWc7J2EIO2PrO2VqO2VmOuQmCwg7J207JeQIOq1re2VnO2VmOyngCDslYrqs6Ag66qo65OgIOq0gO2VoCDsp4Dsl63sl5DshJzsnZgg66qo65OgIOyiheulmOydmCDsgqzsnKDroZwg7J247ZWcIEVPUyDruJTroZ3ssrTsnbggY2hhaW5faWQg7J207J21LCDsmIHsl4XqtowsIOuYkOuKlCDrjbDsnbTthLDsnZgg7IaQ7Iuk7J2EIO2PrO2VqO2VmOyXrCDqsITsoJHsoIEsIOyasOuwnOyggSwg7Yq57IiY7ZWcLCDrjIDtkZzsoIEsIOq3uOumrOqzoCDtjIzsg53soIHsnbgg7IaQ7ZW07JeQIOuMgO2VnCDssYXsnoTsnYQg7KeA7KeAIOyViuyKteuLiOuLpC4KCiMgRU9T55So5oi35Y2P6K6uCgojIyAqKuWumuS5iSoqCgpFT1PnlKjmiLfljY/orq7kuK3nmoTmiYDmnInlpKflhpnvvIzmlpzkvZPmiJblhoXogZTku6PnoIHmnK/or63lsIblhbfmnInkuI7ku6XkuIvlrprkuYnnm7jlkIznmoTmlYjmnpzlkozlkKvkuYnjgIIKCi0gRU9T55So5oi35Y2P6K6u77ya5Y2z5pys5paH5qGj77yIRVVB77yJCgotIOmTvuS4iklEOiBjaGFpbl9pZCAtIGFjYTM3NmYyMDZiOGZjMjVhNmVkNDRkYmRjNjY1NDdjMzZjNmMzM2UzYTExOWZmYmVhZWY5NDM2NDJmMGU5MDYKCi0g55So5oi377ya5Lu75oSP5ruh6Laz5LiL5YiX6KaB5rGC55qE5Liq5Lq65oiW57uE57uH77ya55u05o6l5oiW6ICF6Ze05o6l5oul5pyJRU9T6LSm5oi35oiW5LiORU9T6LSm5oi35YWz6IGU55qE5Z+65LqORU9T5Y+R6KGM55qE6LSi5Lqn44CCCgotIOaJgOacieadg++8muebtOaOpeaIluiAhemXtOaOpemAmui/h+S4gOS4quaIluWkmuS4quacieaViOeahOadg+mZkOajgOafpeiuv+mXruS4gOS4qkVPU+i0puaIt+OAguaJgOacieadg+WPr+S7pemAmui/h+Wkmuetvuadg+mZkOiuuOWPr+WcqOeUqOaIt+mXtOWFseS6q+OAggoKLSDmiafooYzkuoZyZWdwcm9kdWNl77yM5bm25LiU5LuOZW9zaW8udnBheemihuWPluaUtuWFpeeahOeUqOaIt+OAggoKLSBlb3Npby5wcm9kczrlhbfmnInliqjmgIHmnYPpmZDnu5PmnoTnmoRFT1PluJDmiLfvvIzlvZMxNS8yMSBCbG9jayBQcm9kdWNlcnPlkIzmhI/ml7bvvIzor6XluJDmiLflj6/ku6Xmib/mi4Vlb3Npb+W4kOaIt+eahOadg+mZkOOAggoKLSDnvZHnu5zotYTkuqfvvJrljIXlkKvlnKjku6XkuIvotKbmiLfkuK3nmoTku6PluIHvvJplb3Npby5uYW1lc+OAgWVvc2lvLnJhbWZlZeOAgSAgZW9zaW8uc2F2aW5n44CCCgotIOayu+eQhuaWh+aho++8mnJlZ3Byb2R1Y2Vy5piv5rK755CG5paH5qGj44CCCgotIOS7u+S9leS6pOaYk+OAgeaZuuiDveWQiOe6puaIluiAheadjuWYieWbvuWQiOe6pu+8jOWug+S7rOW3sue7j+S9jeS6juS4gOS4quWMuuWdl+S4re+8jOW5tuS4lOi/meS4quWMuuWdl+aYr+S4jeWPr+mAhui9rOeahOOAgeW3sumZhOWKoOWIsOWQjeS4umNoYWluX2lk55qERU9T5Yy65Z2X6ZO+5Lit44CCCgotIOWfuuS6jkVPU+i1hOS6p++8muS7u+S9lemcgOimgeacieaViOiuuOWPr+adpeaTjeS9nOOAgeaUueWPmOOAgei9rOenu+OAgeW9seWTjeaIluiAhei/m+ihjOWFtuS7luaTjeS9nOeahOS4nOilv+OAggoKLSDmiafooYzvvJrlnKjlkI3kuLpjaGFpbl9pZOeahEVPU+WMuuWdl+mTvuS4reaPkOS6pOS4gOS4quihjOWKqOOAggoKLSDmjojmnYPlkozmnYPpmZDvvJrmnYPpmZDvvIhQZXJtaXNzaW9uc++8ieaYr+eUqOadpeWumuS5ieS7o+ihqOivpeadg+mZkOWPkemAgeeahOS6pOaYk+eahOimgeaxgueahOS7u+aEj+WQjeWtl+OAguWPr+S7pee7meeJueWumueahOWQiOe6puaTjeS9nOeahOaOiOadg++8iEF1dGhvcml6YXRpb25z77yJ5YiG6YWN5p2D6ZmQ77yIUGVybWlzc2lvbnPvvInjgIIKCi0g5p2O5ZiJ5Zu+5ZCI57qm77ya5bCG5rOV5b6L5Y2P6K6u5Lit55qE5a6a5LmJ6KaB57Sg5Lul6IO95Zyo6L2v5Lu25Lit6KGo6L6+5ZKM5omn6KGM55qE5qC85byP6KGo6L6+55qE5ZCI57qm44CCCgojIyAqKuadoeasvuS4gCoqKirnlKgqKioq5oi36aOO6Zmp56Gu6K6kKioKCuWmguaenOeUqOaIt+S4ouWksei0puaIt+iuv+mXruadg+mZkOaIluiAheayoeaciemHh+WPluWQiOmAgueahOaWueW8j+S/neaKpOi0puaIt+iuv+mXruadg+mZkO+8jOeUqOaIt+W6lOefpeaCieW5tuWQjOaEj++8jEVPU+i0puaIt+WwhuaXoOazleiuv+mXruOAgueUqOaIt+W6lOehruiupOeUqOaIt+WvueWKoOWvhuS7o+W4geWSjOWMuuWdl+mTvui9r+S7tueahOmjjumZqeOAgeeUqOazleWSjOWkjeadguaAp+acieWFheWIhuS6huino+OAgueUqOaIt+aJv+iupOW5tuWQjOaEj+eUqOaIt+iHquihjOaJv+aLheS9v+eUqEVPU+WMuuWdl+mTvueahOmjjumZqeOAggoKIyMgKirmnaHmrL7kuowqKioq54m55q6K55SoKioqKuaIt+exu+WeiyoqCgrmiafooYxyZWdwcm9kdWNl77yM5ZCM5oSP5bm25LiU5Y+XcmVncHJvZHVjZXLmnY7lmInlm77lkIjnuqbnuqbmnZ/nmoTnlKjmiLfjgIIKCiMjICoq5p2h5qy+5LiJKioqKuWQjOaEjyoqKipFT1MqKioq55SoKioqKuaIt+WNj+iurioqCgpFT1PnlKjmiLfljY/orq7nmoTlrp7otKjmmK/lr7nlvZPliY1FT1PkuLvnvZHmsrvnkIblip/og73nmoTmj4/ov7DjgILnlLHku6PnoIHlvLrliLbmiafooYznmoTlip/og73kuI3pnIDopoHnlKjmiLfnmoTlkIzmhI/vvIzlm6DkuLrov5nkupvlip/og73mmK9FT1PkuLvnvZHns7vnu5/oh6rluKbnmoTjgIIKCiMjICoq5p2h5qy+5ZubKiogLSAqKuayu+eQhuaWh+ahoyoqCgplb3Npby5wcm9kc+WPr+S7peWvuUVPU+eUqOaIt+WNj+iuruWSjOayu+eQhuaWh+aho+i/m+ihjOS7u+S9leS/ruaUueOAguS4peato+aPkOmGku+8jOaPkOWJjeeUqGVvc2lvLmZvcnVt5YWs5oqV5ZCI57qm77yM6YCa6L+HZW9zaW8ucHJvZHPnvJblhpnjgIHlj5HluIPkuIDkuKrlo7DmmI7mnaXmj4/ov7DpgqPkuKrkv67mlLnjgIIKCiMjICoq5p2h5qy+5LqUKioqKuWOn+eUn+S7tyoqKirlgLzljZXkvY0qKgoKRU9T5YWs6ZO+5LiK55qE5Y6f55Sf5Lu35YC85Y2V5L2N5bqU5Li6ZW9zaW8udG9rZW7mmbrog73lkIjnuqblrprkuYnlkozliJvlu7rnmoRFT1PpgJror4HjgIIKCiMjICoq5p2h5qy+5YWtKioqKue7tOaKpCoqKipFT1MqKioq5Yy6KioqKuWdl+mTvioqCgrml6DorrrnjrDlnKjmiJblsIbmnaXlsIbmnaXvvIxlb3Npby5wcm9kc+Wwhue7tOaKpOa0u+i3g+eahOWMuuWdl+mTvuS7o+eggeW6k++8jOWMheaLrOS9huS4jemZkOS6juaJgOacieWKn+iDveOAgeS8mOWMluOAgeWNh+e6p+eahOaJgOacieS/ruaUueOAgeWunueOsOOAggoKIyMg5p2h5qy+5LiDIC0gKioqKuWumioqKirkuYkqKioqRU9TKioqKue9kee7nOi1hOS6pwoK5pu05pS5572R57uc6LWE5Lqn6LSm5oi35Lit55qE5Lu75L2V5Luj5biB55qE54q25oCB77yM5pu05pS55Lu75L2V546w5a2Y55qE55u05o6l5oiW6Ze05o6l566h55CG5Lu75L2V572R57uc6LWE5Lqn55qE5YiG6YWN44CB5a6e546w5oiW5YiG5Y+R55qE5Luj56CB77yM6ZyA6KaB5LqL5YWI55SoZW9zaW8ucHJvZHPlnKhlb3Npby5mb3J1beWFrOaKleWQiOe6puS4iue8luWGmeWSjOWPkeW4g+aViOaenOaPj+i/sOeahOWjsOaYjuOAggoKIyMgKirmnaHmrL7lhast5Yib5bu66LSm5oi36Ieq55SxKioKCuS7u+S9leeOsOWcqOaIluWwhuadpeeahOeUqOaIt+mDveWPr+S7peWcqOacque7j+S7u+S9leWFtuS7lueUqOaIt+iuuOWPr+eahOaDheWGteS4i+WIm+W7ukVPU+W4kOaIt+OAgiAg5aaC5L2V5rKh5pyJ5pS25YiwRU9T5biQ5oi355qE5pyJ5pWI6K645Y+v77yIcGVybWlzc2lvbu+8ie+8jGVvc2lvLnByb2Rz5rC46L+c5LiN5Lya5b2x5ZONRU9T55So5oi35biQ5oi344CCICDlr7nkuo7lhbHkuqvmnYPpmZDnmoRFT1PluJDmiLfnmoTlhbbku5bnlKjmiLfor7fmsYLnmoTku7vkvZXmk43kvZzvvIxlb3Npby5wcm9kc+WPr+iDveS8muaUtuWPlui0ueeUqOOAggoKIyMgKirmnaHmrL7kuZ3msqHmnInlj5fmiZjkuroqKgoK5rKh5pyJ55So5oi35om/5ouF5L+h5omY6LSj5Lu75p2l57u05oyBRU9T5Luj5biB55qE5Lu35YC844CC5rKh5pyJ55So5oi35Y+v5Lul5Luj6KGoRU9T55So5oi35oiW6ICF5Luj6KGo5ZCN5Li6Y2hhaW5fSUTnmoRFT1PljLrlnZfpk77mjojmnYPku7vkvZXkurrlhbHlkIzmjIHmnInotYTkuqfjgIHlgJ/mrL7jgIHlj5HoqIDmiJblrprlkIjlkIzjgILmraTljLrlnZfpk77kuI3lrZjlnKjmi6XmnInogIXjgIHnrqHnkIbogIXmiJbogIXlj5fmiZjkurrjgIIKCiMjICoq5p2h5qy+5Y2B5Liq5Lq65a6J5YWoKioKCuaJgOacieacieWFs+S4quS6uui0puaIt+WuieWFqOeahOS6i+mhue+8jOWMheaLrOS9huS4jemZkOS6juengemSpeeahOWuieWFqOS/neWtmO+8jOmDveeUseeUqOaIt+iHquW3sei0n+i0o+OAggoKIyMgKirmnaHmrL7ljYHkuIAgZW9zaW8ucHJvZHPnmoTmnInpmZDotKPku7sqKgoK55So5oi35bqU55+l5oKJ5ZKM5ZCM5oSP77yM5Zyo5Lu75L2V6YCC55So5rOV5b6L5YWB6K6455qE5pyA5aSn6IyD5Zu05YaF77yM5pys5YWN6LSj5aOw5piO6YCC55So5LqO5LiORU9T5Luj5biB6aOO6Zmp77yM5L2/55So5oiW5peg5rOV5L2/55SoRU9T5Luj5biB5pyJ5YWz5oiW5a+86Ie055qE5Lu75L2V5oiW5omA5pyJ5o2f5a6z5oiW5Lyk5a6z77yM5Lmf6YCC55So5LqO5Lu75L2V5Y+45rOV566h6L6W5Yy65YaF55qE5Lu75L2V5Lu75L2V6KGM5Li65LiL55qERU9T5Yy65Z2X6ZO+Y2hhaW5faWTvvIzljIXmi6zkvYbkuI3pmZDkuo7ov53lj43mi4Xkv53jgIHov53lj43lkIjlkIzmiJbkvrXmnYPooYzkuLrvvIjljIXmi6znlo/lv73vvInjgIJlb3Npby5wcm9kc+S7peWPiuaTjeS9nOWug+eahOS4quS6uuadg+mZkOWvueS6juS7u+S9lemXtOaOpeeahO+8jOWBtueEtueahO+8jOeJueauiueahO+8jOekuuS+i+aAp+eahOaIluWQjuaenOaAp+eahOaNn+Wus++8jOWMheaLrOWIqea2puaNn+Wkse+8jOWVhuiqieaIluaVsOaNru+8jOS4jeaJv+aLheS7u+S9lei0o+S7u+OAghZCbG9ja1Byb2R1Y2VyQWdyZWVtZW50xmwjIyMgMS4gVGhlIGludGVudCBvZiByZWdwcm9kdWNlcgoKVGhlIGludGVudCBvZiB0aGUgYHJlZ3Byb2R1Y2VyYCBhY3Rpb24gaXMgdG8gcmVnaXN0ZXIgYSBibG9jayBwcm9kdWNlciBjYW5kaWRhY3kuIFRoaXMgY29udHJhY3QgaXMgY29uc2lkZXJlZCBhIGdvdmVybmluZyBkb2N1bWVudCBhcyBkZWZpbmVkIGJ5IHRoZSBFT1MgVXNlciBBZ3JlZW1lbnQgKEVVQSkuCgpyZWdwcm9kdWNlcuydmCDrqqnsoIEKCmByZWdwcm9kdWNlcmAg7J6R7JeF7J2YIOuqqeyggeydgCDruJTroZ3sg53sgrDsnpAg7J6F7ZuE67O0IOuTseuhneydhCDtlZjripQg6rKD7J6F64uI64ukLiDsnbQg6rOE7JW97J2AIEVPUyDsgqzsmqnsnpAg6rOE7JW97IScIChFVUEp7JeQIOygleydmOuQnCDrsJTsmYAg6rCZ7J20IOq0gOumrCDrrLjshJzroZwg6rCE7KO865Cp64uI64ukLgoKcmVncHJvZHVjZXIg55qE55uu55qECgpgcmVncHJvZHVjZXJg5pON5L2c55qE55uu55qE5piv5rOo5YaM5oiQ5Li65Ye65Z2X6IqC54K55YCZ6YCJ6ICF44CC5qC55o2uIEVPUyDnlKjmiLfljY/orq4oRVVBKeeahOWumuS5ie+8jOacrOWQiOe6puWxnuS6juayu+eQhuaWh+acrChnb3Zlcm5pbmcgZG9jdW1lbnQpCgojIyMgMi4gTm9taW5hdGlvbgoKSSwge3sgcHJvZHVjZXIgfX0sIGhlcmVieSBub21pbmF0ZSBteXNlbGYgZm9yIGNvbnNpZGVyYXRpb24gYXMgYSBibG9jayBwcm9kdWNlciBjYW5kaWRhdGUuIFRoaXMgbm9taW5hdGlvbiBpbmNsdWRlcyBhZ3JlZW1lbnQgdG8gdGhlIHRlcm1zIG9mIHRoaXMgY29udHJhY3QgYnkgbXkgYmxvY2sgcHJvZHVjZXIgY2FuZGlkYXRlIGVudGl0eSwgaW5jbHVkaW5nIGFsbCBvZiBpdHMgc2hhcmVob2xkZXJzLCBvd25lcnMsIGVtcGxveWVlcywgc3RhZmYsIG1lbWJlcnMsIGFuZCBhbnkgaW5kaXZpZHVhbCB3b3JraW5nIGluIG9mZmljaWFsLCBkaXJlY3QsIG9yIGFmZmlsaWF0ZWQgY2FwYWNpdHkgZm9yIG15IEJsb2NrIFByb2R1Y2VyIGVudGl0eS4KCuyngOuqhQoK64KYLCB7eyBwcm9kdWNlciB9feuKlCDruJTroZ3tlITroZzrk4DshJwg7ZuE67O066GcIOqzoOugpOuQmOuPhOuhnSDsnpDsi6DsnYQg7KeA66qF7ZWp64uI64ukLiDsnbQg7KeA66qF7JeQ64qUIOu4lOuhne2UhOuhnOuTgOyEnO2ajOyCrOydmCDrqqjrk6Ag7KO87KO8LCDshozsnKDsnpAsIOyngeybkCwg66mk67KELCDtmozsm5Ag67CPIOqzteyLneyduOybkCwg7KeB7KCRIOuYkOuKlCDqs4Tsl7Tsgqzsl5DshJwg7J287ZWY64qUIOuqqOuToCDqsJzsnbjsnYQg7Y+s7ZWo7ZWcIOu4lOuhne2UhOuhnOuTgOyEnCDtmozsgqzqsIAg6rOE7JW9IOyhsOqxtOyXkCDrjIDtlbQg64+Z7J2Y7ZWo7J2EIOyduOygle2VqeuLiOuLpC4KCuaPkOWQjQoK5pys5Lq677yMe3sgcHJvZHVjZXIgfX3vvIznibnmraTmj5DlkI3mnKzkurrkuLrlh7rlnZfoioLngrnlgJnpgInkurrjgILmnKzmj5DlkI3ljIXmi6zkuobmnKzlh7rlnZfoioLngrnlgJnpgInkurrlrp7kvZPlr7nmnKzlkIjnuqbkuK3miYDmnInmnaHmrL7nmoTmmI7noa7lkIzmhI/vvIzljIXlkKvlhbbmiYDmnInogIXjgIHpm4flkZjjgIHlkZjlt6XjgIHmiJDlkZjvvIzku6Xlj4rku7vkvZXku6XmraPlvI/mlrnlvI/jgIHnm7TmjqXmiJbpmYTlsZ7mlrnlvI/kuLrmnKzlh7rlnZfoioLngrnlrp7kvZPlt6XkvZznmoTkuKrkurrjgIIKCiMjIyAzLiBSZXNpZ25hdGlvbiBhbmQgUmVtb3ZhbCBmb3IgSW5hYmlsaXR5IHRvIFBlcmZvcm0gT2JsaWdhdGlvbnMuCgpJZiBJLCB7eyBwcm9kdWNlciB9fSwgYW0gdW5hYmxlIHRvIHBlcmZvcm0gYW55IG9mIHRoZSBvYmxpZ2F0aW9ucyBzdGlwdWxhdGVkIGluIHRoaXMgY29udHJhY3QsIEkgd2lsbCByZXNpZ24gbXkgcG9zaXRpb24gYnkgY2FsbGluZyB0aGUgYHVucmVncHJvZGAgYWN0aW9uLgoKSWYgSSwge3sgcHJvZHVjZXIgfX0sIGZhaWwgdG8gcmVzaWduIHdoZW4gdW5hYmxlIHRvIHBlcmZvcm0gc2FpZCBvYmxpZ2F0aW9ucywgSSB1bmRlcnN0YW5kIHRoYXQgcHJvY2VkdXJlcyBlbnVtZXJhdGVkIGluIHRoaXMgY29udHJhY3Qgc2hhbGwgYmUgZW5hY3RlZC4KCuydmOustOydmCDrtojsnbTtlonsl5Ag64yA7ZWcIOyCrOyehCDrsI8g7LKg7ZqMCgp7eyBwcm9kdWNlciB9feqwgCDrs7gg6rOE7JW97ISc7JeQIOuqheyLnOuQnCDsnZjrrLTrpbwg7IiY7ZaJIO2VoCDsiJgg7JeG64qUIOqyveyasCwg7IOd7IKw7J6QIO2CpOulvCBudWxsIOuhnCDtlajsnLzroZzsjagg67O47J247J2YIOyngOychOulvCDsgqzsnoTtlanri4jri6QuCgrrp4zslb0g64K06rCAIHt7cHJvZHVjZXJ9feydmCDsnZjrrLTrpbwg7J207ZaJIO2VoCDsiJgg7JeG7J2EIOuVjCDsgqzsnoTtlZjsp4Ag7JWK64qU64uk66m0LCDrgpjripQg67O4IOqzhOyVveyXkCDsl7TqsbDrkJwg7KCI7LCo6rCAIOynke2WieuQqOydhCDrj5nsnZjtlanri4jri6QuCgrlm6DkuI3og73lsaXooYzkuYnliqHogIzpgIDlh7rmiJbooqvlj5bmtojlh7rlnZfotYTmoLwKCuWmguaenOaIke+8jHt7IHByb2R1Y2VyIH1977yM5LiN6IO95bGl6KGM5pys5ZCI57qm5Lit5omA6KeE5a6a55qE5omA5pyJ5LmJ5Yqh77yM5oiR5bCG5L2/55SoIGB1bnJlZ3Byb2RgIOaTjeS9nOadpeiHquaIkemAgOWHuu+8iHJlc2lnbu+8ieOAggoK5aaC5p6c5oiRIHt7IHByb2R1Y2VyIH19LCDlnKjml6Dms5XlsaXooYzkuIrov7DkuYnliqHml7bmnKrog73pgIDlh7oocmVzaWduKe+8jOaIkeefpeaZk+acrOWQiOe6puWwhuS8muaMieeFp+aJgOacieWIl+S4vueahOeoi+W6j+WvueaIkeWunuihjOWItuijgeaIluWkhOe9mueoi+W6j+OAggoKIyMjIDQuIEVPUyBBY2NvdW50cwoKQmxvY2sgUHJvZHVjZXJzIG1heSBuZXZlciBhZmZlY3QgYW4gYWNjb3VudCBvbiB0aGUgRU9TIGJsb2NrY2hhaW4sIGV4Y2VwdCBmb3IgdGhlIHJlYXNvbnMgc3BlY2lmaWNhbGx5IGNpdGVkIGluIHRoaXMgY29udHJhY3QgdGhhdCBwZXJ0YWluIHRvIEJsb2NrIFByb2R1Y2VyIGFjY291bnRzLiBVc2VyIGFjY291bnRzIGNhbiBvbmx5IGJlIGFmZmVjdGVkIG9uIHRoZSBiYXNpcyBvZiBBcnRpY2xlIFZJSUkgaW4gdGhlIEVPUyBVc2VyIEFncmVlbWVudC4KCkVPUyDqs4TsoJUKCuu4lOuhne2UhOuhnOuTgOyEnOuKlCDrs7gg6rOE7JW97JeQ7IScIO2VtOuLue2VmOuKlCDruJTroZ3tlITroZzrk4DshJzsnZgg6rOE7KCVIOywqOuLqOyXkCDqtIDroKjtlZjsl6wg7Yq567OE7Z6IIOyWuOq4ie2VnCDsnbTsnKDrpbwg7KCc7Jm47ZWY6rOg64qUIEVPUyDruJTroZ3ssrTsnbjsnZgg6rOE7KCV7JeQIOqysOy9lCDsmIHtlqXsnYQg66+47LmY7KeAIOyViuyKteuLiOuLpC4g7IKs7Jqp7J6QIOqzhOygleydgCBFT1Mg7IKs7Jqp7J6QIOqzhOyVveyEnOydmCA47KGw7JeQIOq3vOqxsO2VoCDrlYzrp4wg7JiB7Zal7J2EIOuwm+ydhCDsiJgg7J6I7Iq164uI64ukLgoKRU9TIOi0puWPtwoK5Ye65Z2X6IqC54K55rC46L+c5LiN5Lya5a+5IEVPUyDljLrlnZfpk77kuIrnmoTluJDmiLfpgKDmiJDlvbHlk43vvIzpmaTpnZ7mmK/mnKzlkIjnuqbkuK3nibnliKvmj5DliLDkuI7lh7rlnZfoioLngrnluJDmiLfmnInlhbPnmoTljp/lm6DjgILlj6rmnInln7rkuo4gRU9T55So5oi35Y2P6K6u5Lit55qE56ys5YWr5p2h55qE5oOF5b2i5LiL77yM55So5oi355qE6LSm5Y+35omN5Lya5Y+X5Yiw5b2x5ZONLgoKIyMjIDUuIFByb2R1Y2VyIEtleQoKSSwge3sgcHJvZHVjZXIgfX0sIHdpbGwgc2lnbiBibG9ja3Mgd2l0aCB7eyBwcm9kdWNlcl9rZXkgfX0KCklmIEksIHt7IHByb2R1Y2VyIH19IHN1c3BlY3QgbXkga2V5IGhhcyBiZWVuIGNvbXByb21pc2VkIEkgd2lsbCBhbGVydCB0aGUgb3RoZXIgQmxvY2sgUHJvZHVjZXJzIGltbWVkaWF0ZWx5LgoKSSwge3sgcHJvZHVjZXIgfX0sIGFja25vd2xlZGdlIHRoYXQgYW55IGFuZCBhbGwgYWN0aW9ucyBleGVjdXRlZCB3aXRoIG15IHt7IHByb2R1Y2VyX2tleSB9fSBpcyBteSByZXNwb25zaWJpbGl0eSwgcmVnYXJkbGVzcyBvZiB0aGUgYWNjb3VudCBiZWluZyBjb21wcm9taXNlZC4KCu2UhOuhnOuTgOyEnCDtgqQKCuuCmCwge3sgcHJvZHVjZXIgfX3ripQge3sgcHJvZHVjZXIgXyBrZXkgfX0g66GcIOu4lOuhneyXkCDshJzrqoUg7ZWgIOqyg+yeheuLiOuLpC4K66eM7JW9IOuCtCwge3twcm9kdWNlcn19IOqwgCDrs7jsnbjsnZgg7YKk6rCAIOyGkOyDgeuQmOyXiOuLpOqzoCDsnZjsi6zrkJjrqbQg7KaJ7IucIOuLpOuluCDruJTroZ3tlITroZzrk4DshJzsl5Dqsowg7JWM66Ck7KSEIOqyg+yeheuLiOuLpC4K64KYLCB7e3Byb2R1Y2VyfX3ripQgRU9TIOu4lOuhneyytOyduOyXkOyEnCDrs7jsnbjsnZgg67iU66Gd7ZSE66Gc65OA7IScIOqzhOygleydtCDsi6TtlontlZjripQg66qo65OgIOyekeyXheyXkCDrjIDtlbQsIOqzhOyglSDsnbTsg4Eg7Jyg66y07JmAIOq0gOugqCDsl4bsnbQsIOyxheyehOydtCDsnojsnYzsnYQg7J247KCV7ZWp64uI64ukLgoK5Ye65Z2X6IqC54K55YWs6ZKlCgog5oiRLCB7eyBwcm9kdWNlciB9fSwg5bCG5L2/55SoIHt7IHByb2R1Y2VyX2tleSB9fSDlr7nljLrlnZfnrb7lkI3jgIIK5aaC5p6c5oiRLCB7eyBwcm9kdWNlciB9fSwg5oCA55aR5oiR55qE5a+G6ZKl5bey6KKr5rOE6Zyy77yM5oiR5bCG56uL5Y2z6YCa55+l5YW25LuW6IqC54K544CCCuaIke+8jHt7IHByb2R1Y2VyIH1977yM5om/6K6k5oiR55qE5Ye65Z2X6IqC54K55biQ5oi35ZyoRU9T5Yy65Z2X6ZO+5LiK5omA5omn6KGM55qE5Lu75L2V5pON5L2c6YO95piv5oiR55qE6LSj5Lu777yM5peg6K666K+l5biQ5oi35piv5ZCm6KKr55uX44CCCgojIyMgNi4gQVBJIEVuZHBvaW50cwoKSWYgSSwge3sgcHJvZHVjZXIgfX0sIHF1YWxpZnkgZm9yLCBhbmQgY2hvb3NlIHRvIGNsYWltIHJld2FyZHMgZHVlIHRvIHZvdGVzIHJlY2VpdmVkLCBhbmQvb3IgYmxvY2tzIHByb2R1Y2VkLCBJLCB7eyBwcm9kdWNlciB9fSwgd2lsbCBwcm92aWRlIGZ1bmN0aW9uaW5nIGFuZCBxdWVyeWFibGUgcHVibGljIFAyUCBhbmQgQVBJIGVuZHBvaW50cyB0byBtYWludGFpbiBzeW5jaHJvbml6YXRpb24gd2l0aCB0aGUgYmxvY2tjaGFpbiBhbmQgc3VibWl0IHRyYW5zYWN0aW9ucyB0byBiZSBpbmNsdWRlZC4gQVBJIGVuZHBvaW50cyBtdXN0IGJlIHVwZGF0ZWQgdG8gYSByZWNlbnQgZnVuY3Rpb25hbCB2ZXJzaW9uIHRoYXQgZG9lcyBub3QgaGF2ZSBrbm93biBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMuCgpJLCB7eyBwcm9kdWNlciB9fSwgaGVyZWJ5IGFja25vd2xlZGdlIHRoYXQgaWYgSSBhbSB1bmFibGUgdG8gZG8gc28gd2l0aGluIDMwIG1pbnV0ZXMgb2YgYmVpbmcgYWxlcnRlZCBieSBhbm90aGVyIGJsb2NrIHByb2R1Y2VyIGNhbmRpZGF0ZSwgSSBjYW4gYmUgcmVtb3ZlZCBieSB1c2Ugb2YgdGhlIGBybXZwcm9kdWNlcmAgYWN0aW9uLgoKQVBJIOyXlOuTnO2PrOyduO2KuAoK66eM7JW9IOuCtCwge3sgcHJvZHVjZXIgfX0g6rCAIO2IrO2RnOulvCDrsJvslYQg67iU66GdIOuztOyDgeydhCDssq3qtaztlaAg7IiYIOyeiOuKlCDsnpDqsqnsnYQg7Ja77Jy866m0LCDrgpgge3sgcHJvZHVjZXIgfX3ripQg7J6R64+ZIOuwjyDsv7zrpqwg6rCA64ql7ZWcIOqzteqwnCBQMlAg67CPIEFQSSDsl5Trk5ztj6zsnbjtirjrpbwg67iU66Gd7LK07J246rO87J2YIOuPmeq4sO2ZlCDrsI8g7Yq4656c7J6t7IWY7J2EIOygnOy2nO2VoCDsiJgg7J6I6rKMIOycoOyngOq0gOumrO2VqeuLiOuLpC4gQVBJIOyXlOuTnO2PrOyduO2KuOuKlCDslYzroKTsp4Qg67O07JWIIOy3qOyVveyEseydtCDsl4bripQg7LWc7Iug67KE7KCE7Jy866GcIOyXheuNsOydtO2KuO2VtOyVvCDtlanri4jri6QuCgrrgpgsIHt7IHByb2R1Y2VyIH19IOuKlCDri6TrpbggYmxvY2sgcHJvZHVjZXIgY2FuZGlkYXRlIOqwgCDqsr3qs6Ag4oCL4oCL7ZWcIO2bhCwgMzDrtoQg7J2064K07JeQIOuwlOuhnOyeoeydhCDsiJgg7JeG64uk66m0IGBybXZwcm9kdWNlcmAg7KGw7LmY66W8IO2Gte2VtCDsnpDqsqnsnbQg7KCc6rGwIOuQoCDsiJgg7J6I7J2M7J2EIOyduOygle2VqeuLiOuLpC4KCkFQSSDnq6/ngrkKCuWmguaenOaIke+8jHt7IHByb2R1Y2VyIH19IOeUseS6juW+l+WIsOaKleelqOWSjC/miJblh7rlnZfnmoTljp/lm6DvvIznrKblkIjpooblj5blpZblirHnmoTmnaHku7blubbpgInmi6nmjqXlj5flpZblirHvvIzpgqPkuYjmiJHvvIwge3sgcHJvZHVjZXIgfX3vvIzlsIbmj5Dkvpvlip/og73mraPluLjnmoTlhazlhbEgUDJQIOWSjCBBUEkg56uv54K55p2l57u05oqk5LiO5Yy65Z2X6ZO+55qE5ZCM5q2l77yM5bm25o+Q5Lqk6KaB5omT5YyF5YWl5Z2X55qE5LqL5Yqh44CCQVBJIOerr+eCueW/hemhu+abtOaWsOWIsOacgOaWsOeahOWPr+eUqOeJiOacrO+8jOW5tuS4lOivpeeJiOacrOayoeacieW3suefpeeahOWuieWFqOa8j+a0ngoK5oiR77yMe3twcm9kdWNlcn1977yM5Zyo5q2k56Gu6K6k77yM5aaC5p6c5oiR5Zyo5pS25Yiw5Y+m5LiA5LiqIGJsb2NrIHByb2R1Y2VyIGNhbmRpZGF0ZeeahOitpuWRiuWQjjMw5YiG6ZKf5YaF5LuN5LiN6IO956ym5ZCI5LiK6L+w6KaB5rGC77yM5Y+v5Lul5L2/55SoYHJtdnByb2R1Y2VyYOaTjeS9nOenu+mZpOaIkeeahOi0puaIt+OAggoKIyMjIDcuIEV4ZWN1dGlvbiB0aW1lCgpJLCB7eyBwcm9kdWNlciB9fSwgd2lsbCBkZXBsb3kgYW5kIHJ1biBuZXR3b3JrIGluZnJhc3RydWN0dXJlIGNhcGFibGUgb2YgbWFpbnRhaW5pbmcgMm1zIG9yIGxlc3MgQ1BVIGV4ZWN1dGlvbiB0aW1lcy4KCkksIHt7IHByb2R1Y2VyIH19LCBoZXJlYnkgYWNrbm93bGVkZ2UgdGhhdCBpZiBJIGFtIHVuYWJsZSB0byBkbyBzbyB3aXRoaW4gMzAgbWludXRlcyBvZiBiZWluZyBhbGVydGVkIGJ5IGFub3RoZXIgYmxvY2sgcHJvZHVjZXIgY2FuZGlkYXRlLCBJIGNhbiBiZSByZW1vdmVkIGJ5IHVzZSBvZiB0aGUgYHJtdnByb2R1Y2VyYCBhY3Rpb24uCgrsi6Ttlokg7Iuc6rCECgrrgpgsIHt7IHByb2R1Y2VyIH1964qUIDJtcyDrmJDripQg6re4IOydtO2VmOydmCBDUFUg7Iuk7ZaJIOyLnOqwhOydhCDsnKDsp4DtlaAg7IiYIOyeiOuKlCDrhKTtirjsm4ztgawg7J247ZSE652866W8IOuwsO2PrO2VmOqzoCDsi6Ttlontlanri4jri6QuCgog64KYLCB7eyBwcm9kdWNlciB9fSDripQg64uk66W4IGJsb2NrIHByb2R1Y2VyIGNhbmRpZGF0ZeqwgCDqsr3qs6Ag4oCL4oCL7ZWcIO2bhCwgMzDrtoQg7J2064K07JeQIOuwlOuhnOyeoeydhCDsiJgg7JeG64uk66m0IGBybXZwcm9kdWNlcmAg7KGw7LmY66W8IO2Gte2VtCDsnpDqsqnsnbQg7KCc6rGwIOuQoCDsiJgg7J6I7J2M7J2EIOyduOygle2VqeuLiOuLpC4KCuaJp+ihjOaXtumXtAoK5oiR77yMIHt7IHByb2R1Y2VyIH1977yM5bCG6YOo572y5ZKM6L+Q6KGM572R57uc5Z+656GA6K6+5pa977yM6IO95aSf5bCGIENQVSDmiafooYzml7bpl7Tnu7TmjIHlnKggMm1zIOaIluabtOWwkeeahOawtOW5s+OAggoK5oiR77yMe3sgcHJvZHVjZXIgfX3vvIzlnKjmraTnoa7orqTvvIzlpoLmnpzmiJHlnKjmlLbliLDlj6bkuIDkuKpibG9jayBwcm9kdWNlciBjYW5kaWRhdGXnmoTorablkYrlkI4zMOWIhumSn+WGheS4jeiDveespuWQiOS4iui/sOadoeS7tu+8jOWPr+S7peS9v+eUqCBgcm12cHJvZHVjZXJgIOaTjeS9nOWwhuaIkeenu+mZpOOAggoKIyMjIDguIE9yZGVyaW5nCgpJIHt7IHByb2R1Y2VyIH19IGFncmVlIHRvIHByb2Nlc3MgdHJhbnNhY3Rpb25zIG9uIGEgZmlyc3QtaW4tZmlyc3Qtb3V0IChGSUZPKSBiYXNpcywgYW5kIG5vdCB0byBtYW5pcHVsYXRlIHRoZSBjb250ZW50cyBvZiBibG9ja3MgaW4gb3JkZXIgdG8gZGVyaXZlIHByb2ZpdCBmcm9tIHRoZSBvcmRlciBpbiB3aGljaCB0cmFuc2FjdGlvbnMgYXJlIGluY2x1ZGVkOiB0aGUgaGFzaCBvZiB0aGUgYmxvY2sgdGhhdCBpcyBwcm9kdWNlZC4KCuyDneyCsArrgpgsIHt7IHByb2R1Y2VyIH1964qUIOyEoOyehSDshKDstpzrspUgKEZJRk8pIOuwqeyLneycvOuhnCDqsbDrnpjrpbwg7LKY66as7ZWY6rOgIOqxsOuemOqwgCDruJTroZ3snZgg7ZW07Iuc7JeQIO2PrO2VqOuQmOuKlCDsiJzshJzsl5DshJwg7J207J217J2EIOyWu+ycvOugpOuKlCDrqqnsoIHsnLzroZwg7IOd7IKw7ZWY64qUIOu4lOuhneydmCDrgrTsmqnsnYQg7KGw7J6R7ZWY7KeAIOyViuq4sOuhnCDrj5nsnZjtlanri4jri6QuCgrpobrluo8KCuaIke+8jCB7eyBwcm9kdWNlciB9fSDvvIzlkIzmhI/moLnmja7lhYjov5vlhYjlh7ooRklGTynnmoTmlrnlvI/lpITnkIbkuovliqHvvIzlubbkuJTnu53kuI3kvJrkuLrkuobniZ/liKnogIzliKnnlKjljLrlnZflhoXlrrnjgIHmk43nurXljLrlnZfkuK3kuqTmmJPlpITnkIbnmoTpobrluo/jgIIKCiMjIyA5LiBSYW5kb20gUm90YXRpb24gb2YgU3RhbmRieXMKCkksIHt7IHByb2R1Y2VyIH19LCBhZ3JlZSB0aGF0IGlmIEkgYW0gaW4gYSBwYWlkIHN0YW5kYnkgcG9zaXRpb24sIEkgY2FuIGJlIHJhbmRvbWx5IGNhbGxlZCBpbnRvIGEgcHJvZHVjaW5nIHBvc2l0aW9uLiBVcG9uIGZhaWx1cmUgdG8gcHJvZHVjZSBibG9ja3MsIGNvZGUgbWF5IHNlbGYtZXhlY3V0ZSBwZW5hbHRpZXMgcmVnYXJkaW5nIGZ1dHVyZSB2cGF5IHJld2FyZHMuCgrsnKDquIkg64yA6riwIOu4lOuhne2UhOuhnOuTgOyEnOydmCDrrLTsnpHsnIQg66Gc7YWM7J207IWYCgrrgpgsIHt7IHByb2R1Y2VyIH1964qUIOuzuOyduOydtCDsnKDquIkg64yA6riw7KeB7JeQIOyeiOydhCDrlYwsIOustOyekeychOuhnCDsg53sgrDsp4HsnLzroZwg67aA66aEIOuwm+ydhCDsiJgg7J6I64uk64qUIOqyg+yXkCDrj5nsnZjtlanri4jri6QuIOydtOuVjCDruJTroZ3snYQg7IOd7ISx7ZWY7KeAIOuqu+2VmOuptCDsvZTrk5zripQg7Zal7ZuEIHZwYXkg67O07IOB7JeQIOuMgO2VnCDsspjrsozsnYQg7KeR7ZaJ7ZWgIOyImCDsnojsirXri4jri6QuCgrlpIfpgInoioLngrnpmo/mnLrova7mjaIKCuaIke+8jHt7IHByb2R1Y2VyIH1977yM5ZCM5oSP6Iul5pys6IqC54K55aSE5LqO5pyJ5YG/5aSH6YCJ54q25oCB77yM5Y+v6KKr6ZqP5py66LCD5YWl5Ye65Z2X54q25oCB44CC5aaC5p6c5oiR5peg5rOV5Ye65Z2X77yM5ZCI57qm5Luj56CB5Y+v6IO95Lya6Ieq5Yqo5omn6KGM5bCx5pyq5p2l55qEIHZwYXkg5oql6YWs6L+b6KGM5aSE572a44CCCgojIyMgMTAuIE1pc3NpbmcgVHdvIG9yIE1vcmUgUm91bmRzIG9mIEJsb2NrcwoKSSwge3sgcHJvZHVjZXIgfX0sIGFja25vd2xlZGdlIHRoYXQgaWYgYWZ0ZXIgbWlzc2luZyAyIG9yIG1vcmUgcm91bmRzIG9mIGJsb2NrcyBpbiBzdWNjZXNzaW9uIEkgYW0gdW5hYmxlIHRvIGJlIGNvbnRhY3RlZCB3aXRoaW4gMjAgbWludXRlcywgSSwge3sgcHJvZHVjZXIgfX0sIGFja25vd2xlZGdlIHRoYXQgSSBtYXkgYmUgcmVtb3ZlZCBmcm9tIGEgcHJvZHVjaW5nIHBvc2l0aW9uIGJ5IHVzZSBvZiB0aGUgYHJtdnByb2R1Y2VyYCBhY3Rpb24uCgpJLCB7eyBwcm9kdWNlciB9fSwgYWNrbm93bGVkZ2UgdGhhdCBhZnRlciBtaXNzaW5nIHR3byBvciBtb3JlIHJvdW5kcyBvZiBibG9ja3MgaW4gc3VjY2Vzc2lvbiwgc3RhbmRhcmQgcHJhY3RpY2Ugc3RpcHVsYXRlcyByZW1vdmluZyBteSBwcm9kdWNlciBieSB1c2luZyB0aGUgYHVucmVncHJvZGAgYWN0aW9uIHVudGlsIHRoZSBnaXZlbiBpc3N1ZSBpcyByZXNvbHZlZC4KCuuRkCDrnbzsmrTrk5wg7J207IOB7J2YIOu4lOuhnSDriITrnb0KCuuCmCwge3sgcHJvZHVjZXIgfX3ripQg65GQIOudvOyatOuTnCDsnbTsg4Eg7Jew7IaN7ZWY7JesIOu4lOuhneydhCDriITrnb0g7ZWcIO2bhCwgMjDrtoQg7J2064K07JeQIOyXsOudvSDtlaAg7IiYIOyXhuuLpOuptCB7eyBwcm9kdWNlciB9fSDqsIAgYHJtdnByb2R1Y2VyYCDslaHshZjsnZgg7IKs7Jqp65CY7Ja0IOyDneyCsCDsnITsuZjsl5DshJwg7KCc6rGwIOuQoCDsiJgg7J6I7J2M7J2EIOyduOygle2VqeuLiOuLpC4KCnt7IHByb2R1Y2VyIH1964qUIOuRkCDrnbzsmrTrk5wg7J207IOB7Jy866GcIOu4lOuhneydhCDsl7Dsho3soIHsnLzroZwg64iE65297ZWc64uk66m0LCDso7zslrTsp4Qg66y47KCc6rCAIO2VtOqysCDrkKAg65WM6rmM7KeAIGB1bnJlZ3Byb2RgIOyekeyXheydhCDsgqzsmqntlZjsl6wg67O47J247J20IOyDneyCsCDsnITsuZjsl5DshJwg7KCc6rGw65Co7J20IO2RnOykgCDqtIDtlonsnLzroZwg6rec7KCV65CY7Ja0IOyeiOydjOydhCDsnbjsoJXtlanri4jri6QuCgrkuKTova7miJbmm7TlpJrova7kuKLlnZfnmoTmg4XlvaIKCuaIke+8jHt7IHByb2R1Y2VyIH19LCDnoa7orqTlpoLmnpzov57nu63kuKTova7miJbmm7TlpJrova7kuKLlnZfkuJTml6Dms5XlnKgyMOWIhumSn+WGheiBlOezu+WIsOaIke+8jOaIke+8jHt7IHByb2R1Y2VyIH19LCDlkIzmhI/lj6/og73kvJrnlKggYHJtdnByb2R1Y2VyYCDmk43kvZzlsIbmiJHnp7vpmaTjgIIK5oiR77yMe3sgcHJvZHVjZXIgfX0sIOWmguaenOi/nue7reS4pOi9ruaIluabtOWkmui9ruS4ouWdl++8jOagueaNruagh+WHhuWunui3teS8muWPkei1tyBgdW5yZWdwcm9kYCDmk43kvZzlsIbmiJHnp7vpmaTlh7rlnZfotYTmoLzvvIznm7TliLDpl67popjop6PlhrPjgIIKCiMjIyAxMS4gVXJnZW50IFNlY3VyaXR5IFBhdGNoZXMKCkksIHt7IHByb2R1Y2VyIH19LCBhY2tub3dsZWRnZSB0aGF0IGlmIEkgYW0gbm90IGFibGUgdG8gYmUgY29udGFjdGVkIGluIGFueSBmb3JtIGFmdGVyIGFuIHVyZ2VudCBzZWN1cml0eSBwYXRjaCBpcyBhbm5vdW5jZWQsIEkgbWF5IGJlIHJlbW92ZWQgYnkgdXNlIG9mIHRoZSBgcm12cHJvZHVjZXJgIGFjdGlvbi4KCuq4tOq4iSDrs7TslYgg7Yyo7LmYCuq4tOq4iSDrs7TslYgg7Yyo7LmY6rCAIOuwnO2RnCDrkJwg7ZuELCDslrTrlqQg7ZiV7YOc66Gc65OgIOyXsOudvSDtlaAg7IiYIOyXhuuKlCDqsr3smrAgYHJtdnByb2R1Y2VyYCDsnpHsl4XsnYQg7IKs7Jqp7ZWY7JesIOygnOqxsCDrkKAg7IiYIOyeiOydjOydhCDrgpgsIHt7IHByb2R1Y2VyIH1964qUIOyduOygle2VqeuLiOuLpC4KCue0p+aApeWuieWFqOihpeS4gQoK5oiR77yMe3sgcHJvZHVjZXIgfX3vvIznoa7orqTlpoLmnpzlnKjntKfmgKXlronlhajooaXkuIHlj5HluIPlkI7nlKjku7vkvZXmlrnlvI/pg73ml6Dms5XogZTns7vliLDmiJHvvIzlj6/og73kvJrnlKggYHJtdnByb2R1Y2VyYCDmjIfku6TlsIbmiJHnp7vpmaTjgIIKCiMjIyAxMi4gRGlzY2xvc3VyZSBvZiBFbnRpdHkgYW5kIFNlcnZlciBJbmZvcm1hdGlvbgoKSSwge3sgcHJvZHVjZXIgfX0sIGF0dGVzdCB0aGF0IEkgaGF2ZSBkaXNjbG9zZWQgdGhlIGFwcHJveGltYXRlIGdlb2xvY2F0aW9uIGZvciBteSBtYWluIHByb2R1Y3Rpb24gbm9kZSBhcyBiZWluZyB7eyBsb2NhdGlvbiB9fS4KCuuyleyduCDrsI8g7ISc67KEIOygleuztOydmCDqs7XqsJwKCuuCmCwge3sgcHJvZHVjZXIgfX0g64qUIOyjvCDsg53sgrAg64W465Oc7JeQIOuMgO2VnCDsnITsuZgg7KCV67O066W8IOqzteqwnO2WiOydjOydhCDspp3rqoXtlanri4jri6QuCgrlrp7kvZPlkozmnI3liqHlmajnmoTkv6Hmga/miqvpnLIKCuaIke+8jHt7IHByb2R1Y2VyIH1977yM56Gu6K6k5oiR5bey57uP5oqr6Zyy5LqG5Li75Ye65Z2X6IqC54K55pyN5Yqh5Zmo5Zyw55CG5L2N572u55qE5YeG56Gu5L+h5oGv44CC5YW25Zyw5Z2A5Li6IHt7IGxvY2F0aW9uIH1944CCCgojIyMgMTMuIEVzdGFibGlzaGVzIHRoZSBwZW5hbHR5IGFuZCBwcm9jZWR1cmUgZm9yIHVud2lsbGluZ25lc3MgdG8gY29tcGx5IHdpdGggcGVuYWx0aWVzIG9yIHByb2NlZHVyZXMKCkksIHt7IHByb2R1Y2VyIH19LCBhY2tub3dsZWRnZSB0aGF0IGZhaWxpbmcgdG8gY29tcGx5IHdpdGggcGVuYWx0aWVzIG9yIHByb2NlZHVyZXMgZW5hY3RlZCBhZ2FpbnN0IG1lIHdpbGwgcmVzdWx0IGluIEJsb2NrIFByb2R1Y2VycyBleGVjdXRpbmcgdGhlIGBybXZwcm9kdWNlcmAgY29udHJhY3QgdG8gcmVtb3ZlIG1lLgoKSSwge3sgcHJvZHVjZXIgfX0sIHdpbGwgbm90IGV4ZWN1dGUgdGhlIGByZWdwcm9kdWNlcmAgY29udHJhY3QgdW50aWwgc2VydmluZyBvciBmdWxmaWxsaW5nIHRoZSByZXF1aXJlbWVudHMgZnJvbSBhIHBlbmFsdHkgb3IgcHJvY2VkdXJlIHRoYXQgcmVzdWx0cyBpbiBoYXZpbmcgdGhlIGBybXZwcm9kdWNlcmAgY29udHJhY3QgZXhlY3V0ZWQgdG8gcmVtb3ZlIG1lLgoKSSwge3sgcHJvZHVjZXIgfX0sIGFja25vd2xlZGdlIHRoYXQgaWYgSSBjb250aW51ZSB0byBjYWxsIHRoZSBgcmVncHJvZHVjZXJgIGFjdGlvbiB3aXRob3V0IHNlcnZpbmcgb3IgZnVsZmlsbGluZyB0aGUgcmVxdWlyZW1lbnRzIGZyb20gYnJlYWNoIG9mIGByZWdwcm9kdWNlcmAsIG15IGFjY291bnQga2V5cyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlZ2lzdGVyZWQgQmxvY2sgUHJvZHVjZXIgaW4gcXVlc3Rpb24gbWF5IGJlIG51bGxlZCBieSBCbG9jayBQcm9kdWNlcnMgYnkgdXNpbmcgYGVvc2lvLndyYXBgLgoK7Y6Y64SQ7Yuw66W8IOykgOyImO2VmOyngCDslYrsnYQg6rK97JqwIOuyjOy5mQoK64KYLCB7eyBwcm9kdWNlciB9fSDripQg64KY7JeQ6rKMIOygnOyerOuQnCDsspjrsozsnYQg7KSA7IiY7ZWY7KeAIOyViuycvOuptCDruJTroZ3tlITroZzrk4DshJzrk6TsnbQgYHJtdnByb2R1Y2VyYCDqs4Tslb3snYQg7KeR7ZaJ7ZWY6rKMIOuQoCDqsoPsnbTrnbzqs6Ag7J247KCV7ZWp64uI64ukLiDrgpgsIHt7IHByb2R1Y2VyIH19IOuKlCBgcm12cHJvZHVjZXJgIOqzhOyVveydtCDsp5HtlonrkJzri6TrqbQg7JqU6rWsIOyCrO2VreydhCDstqnsobHrkKAg65WM6rmM7KeAIGByZWdwcm9kdWNlcmAg6rOE7JW97J2EIOydtO2Wie2VmOyngCDslYrsnYQg6rKD7J6F64uI64ukLgpgcmVncHJvZHVjZXJgIOqzhOyVvSDsnITrsJjsnLzroZwg7J247ZWcIOyalOq1rCDsgqztla3snYQg7Lap7KGx7Iuc7YKk7KeAIOyViuqzoCBgcmVncHJvZHVjZXJgIOqzhOyVveydhCDqs4Tsho0g7Zi47Lac7ZWY66m0IO2VtOuLuSDruJTroZ3tlITroZzrk4DshJzsmYAg6rSA66Co65CcIOqzhOyglSDtgqTqsIAgYGVvc2lvLndyYXBgIOydhCDsgqzsmqntlZjsl6wg67iU66Gd7ZSE66Gc65OA7ISc65Ok7JeQIOydmO2VtCDrrLTtmqjtmZQg65CgIOyImCDsnojsnYzsnYQg7J247KCV7ZWp64uI64ukLgoK5a+55LiN5oS/6YG15a6I5aSE572a55qE6KGM5Li65LqI5Lul5aSE572aCgrmiJHvvIx7eyBwcm9kdWNlciB9fe+8jOaJv+iupOiLpeS4jemBteWuiOWvueacrOS6uuWItuijgeeahOWkhOe9mu+8jEJQIOWPr+S7peWunuaWvSBgcm12cHJvZHVjZXJgIOWQiOe6pu+8jOaIkeaOpeWPl+aKleelqOeahOi1hOagvOWwhuiiq+WPlua2iOOAguiLpeaciemSiOWvueaIkeWunuaWvSBgcm12cHJvZHVjZXJgIOWQiOe6pueahOaDheWGteWPkeeUn++8jOaIkSwge3sgcHJvZHVjZXIgfX0g5Zyo6YG15a6IL+WxpeihjOaJgOaUtuWIsOeahOWkhOe9muS5i+WJje+8jOS4jeS8muWGjeasoeaJp+ihjCBgcmVncHJvZHVjZXJgIOWQiOe6puOAggoK5oiR77yMe3sgcHJvZHVjZXIgfX3vvIzlnKjlsaXooYzmg6nnvZrnqIvluo/nmoTopoHmsYLkuYvliY3vvIzkuI3kvJrmiafooYwgYHJlZ3Byb2R1Y2VyYCDlkIjlkIzjgILmiJHnn6XmmZPlpoLkuI3lsaXooYzmraTnqIvluo/vvIwgYHJtdnByb2R1Y2VyYCDlkIjlkIzlsIbkvJrlho3mrKHlsIbmiJHnp7vpmaTjgIIKCuaIkSx7eyBwcm9kdWNlciB9fSwg5om/6K6k5aaC5p6c5rKh5pyJ6YG15a6I5oiW5bGl6KGM5Zug6L+d5Y+NIGByZWdwcm9kdWNlcmAg6ICM5Y+X5Yiw55qE5oOp572a6KaB5rGC5Y2057un57ut6LCD55SoYHJlZ3Byb2R1Y2VyYOaTjeS9nO+8jEJQIOWPr+S7peiwg+eUqCBgZW9zaW8ud3JhcGAg5ZCI57qm5bCG5oiR55So5p2l5rOo5YaM5Ye65Z2X6IqC54K555qE6LSm5Y+35a+G6ZKl6K6+572u5Li65peg5pWI5YC844CCAAABInZhcmlhbnRfYmxvY2tfc2lnbmluZ19hdXRob3JpdHlfdjABGmJsb2NrX3NpZ25pbmdfYXV0aG9yaXR5X3Yw' + ) + export const abi = ABI.from(abiBlob) + export class Contract extends BaseContract { + constructor(args: PartialBy) { + super({ + client: args.client, + abi: abi, + account: Name.from('eosio'), + }) + } + action< + T extends + | 'activate' + | 'bidname' + | 'bidrefund' + | 'buyram' + | 'buyrambytes' + | 'buyrex' + | 'canceldelay' + | 'cfgpowerup' + | 'claimrewards' + | 'closerex' + | 'cnclrexorder' + | 'consolidate' + | 'defcpuloan' + | 'defnetloan' + | 'delegatebw' + | 'deleteauth' + | 'deposit' + | 'fundcpuloan' + | 'fundnetloan' + | 'init' + | 'limitauthchg' + | 'linkauth' + | 'mvfrsavings' + | 'mvtosavings' + | 'newaccount' + | 'onblock' + | 'onerror' + | 'powerup' + | 'powerupexec' + | 'refund' + | 'regproducer' + | 'regproducer2' + | 'regproxy' + | 'rentcpu' + | 'rentnet' + | 'rexexec' + | 'rmvproducer' + | 'sellram' + | 'sellrex' + | 'setabi' + | 'setacctcpu' + | 'setacctnet' + | 'setacctram' + | 'setalimits' + | 'setcode' + | 'setinflation' + | 'setparams' + | 'setpriv' + | 'setram' + | 'setramrate' + | 'setrex' + | 'undelegatebw' + | 'unlinkauth' + | 'unregprod' + | 'unstaketorex' + | 'updateauth' + | 'updaterex' + | 'updtrevision' + | 'voteproducer' + | 'voteupdate' + | 'wasmcfg' + | 'withdraw' + >(name: T, data: ActionNameParams[T], options?: ActionOptions): Action { + return super.action(name, data, options) + } + table< + T extends + | 'abihash' + | 'bidrefunds' + | 'blockinfo' + | 'cpuloan' + | 'delband' + | 'global' + | 'global2' + | 'global3' + | 'global4' + | 'namebids' + | 'netloan' + | 'powup.order' + | 'powup.state' + | 'producers' + | 'producers2' + | 'rammarket' + | 'refunds' + | 'retbuckets' + | 'rexbal' + | 'rexfund' + | 'rexpool' + | 'rexqueue' + | 'rexretpool' + | 'userres' + | 'voters' + | 'limitauthchg' + >(name: T, scope?: NameType) { + return super.table(name, scope, TableMap[name]) + } + } + export interface ActionNameParams { + activate: ActionParams.Activate + bidname: ActionParams.Bidname + bidrefund: ActionParams.Bidrefund + buyram: ActionParams.Buyram + buyrambytes: ActionParams.Buyrambytes + buyrex: ActionParams.Buyrex + canceldelay: ActionParams.Canceldelay + cfgpowerup: ActionParams.Cfgpowerup + claimrewards: ActionParams.Claimrewards + closerex: ActionParams.Closerex + cnclrexorder: ActionParams.Cnclrexorder + consolidate: ActionParams.Consolidate + defcpuloan: ActionParams.Defcpuloan + defnetloan: ActionParams.Defnetloan + delegatebw: ActionParams.Delegatebw + deleteauth: ActionParams.Deleteauth + deposit: ActionParams.Deposit + fundcpuloan: ActionParams.Fundcpuloan + fundnetloan: ActionParams.Fundnetloan + init: ActionParams.Init + limitauthchg: ActionParams.Limitauthchg + linkauth: ActionParams.Linkauth + mvfrsavings: ActionParams.Mvfrsavings + mvtosavings: ActionParams.Mvtosavings + newaccount: ActionParams.Newaccount + onblock: ActionParams.Onblock + onerror: ActionParams.Onerror + powerup: ActionParams.Powerup + powerupexec: ActionParams.Powerupexec + refund: ActionParams.Refund + regproducer: ActionParams.Regproducer + regproducer2: ActionParams.Regproducer2 + regproxy: ActionParams.Regproxy + rentcpu: ActionParams.Rentcpu + rentnet: ActionParams.Rentnet + rexexec: ActionParams.Rexexec + rmvproducer: ActionParams.Rmvproducer + sellram: ActionParams.Sellram + sellrex: ActionParams.Sellrex + setabi: ActionParams.Setabi + setacctcpu: ActionParams.Setacctcpu + setacctnet: ActionParams.Setacctnet + setacctram: ActionParams.Setacctram + setalimits: ActionParams.Setalimits + setcode: ActionParams.Setcode + setinflation: ActionParams.Setinflation + setparams: ActionParams.Setparams + setpriv: ActionParams.Setpriv + setram: ActionParams.Setram + setramrate: ActionParams.Setramrate + setrex: ActionParams.Setrex + undelegatebw: ActionParams.Undelegatebw + unlinkauth: ActionParams.Unlinkauth + unregprod: ActionParams.Unregprod + unstaketorex: ActionParams.Unstaketorex + updateauth: ActionParams.Updateauth + updaterex: ActionParams.Updaterex + updtrevision: ActionParams.Updtrevision + voteproducer: ActionParams.Voteproducer + voteupdate: ActionParams.Voteupdate + wasmcfg: ActionParams.Wasmcfg + withdraw: ActionParams.Withdraw + } + export namespace ActionParams { + export interface Activate { + feature_digest: Checksum256Type + } + export interface Bidname { + bidder: NameType + newname: NameType + bid: AssetType + } + export interface Bidrefund { + bidder: NameType + newname: NameType + } + export interface Buyram { + payer: NameType + receiver: NameType + quant: AssetType + } + export interface Buyrambytes { + payer: NameType + receiver: NameType + bytes: UInt32Type + } + export interface Buyrex { + from: NameType + amount: AssetType + } + export interface Canceldelay { + canceling_auth: Types.PermissionLevel + trx_id: Checksum256Type + } + export interface Cfgpowerup { + args: Types.PowerupConfig + } + export interface Claimrewards { + owner: NameType + } + export interface Closerex { + owner: NameType + } + export interface Cnclrexorder { + owner: NameType + } + export interface Consolidate { + owner: NameType + } + export interface Defcpuloan { + from: NameType + loan_num: UInt64Type + amount: AssetType + } + export interface Defnetloan { + from: NameType + loan_num: UInt64Type + amount: AssetType + } + export interface Delegatebw { + from: NameType + receiver: NameType + stake_net_quantity: AssetType + stake_cpu_quantity: AssetType + transfer: boolean + } + export interface Deleteauth { + account: NameType + permission: NameType + authorized_by: NameType + } + export interface Deposit { + owner: NameType + amount: AssetType + } + export interface Fundcpuloan { + from: NameType + loan_num: UInt64Type + payment: AssetType + } + export interface Fundnetloan { + from: NameType + loan_num: UInt64Type + payment: AssetType + } + export interface Init { + version: VarUIntType + core: Asset.SymbolType + } + export interface Limitauthchg { + account: NameType + allow_perms: NameType[] + disallow_perms: NameType[] + } + export interface Linkauth { + account: NameType + code: NameType + type: NameType + requirement: NameType + authorized_by: NameType + } + export interface Mvfrsavings { + owner: NameType + rex: AssetType + } + export interface Mvtosavings { + owner: NameType + rex: AssetType + } + export interface Newaccount { + creator: NameType + name: NameType + owner: Types.Authority + active: Types.Authority + } + export interface Onblock { + header: Types.BlockHeader + } + export interface Onerror { + sender_id: UInt128Type + sent_trx: BytesType + } + export interface Powerup { + payer: NameType + receiver: NameType + days: UInt32Type + net_frac: Int64Type + cpu_frac: Int64Type + max_payment: AssetType + } + export interface Powerupexec { + user: NameType + max: UInt16Type + } + export interface Refund { + owner: NameType + } + export interface Regproducer { + producer: NameType + producer_key: PublicKeyType + url: string + location: UInt16Type + } + export interface Regproducer2 { + producer: NameType + producer_authority: Types.BlockSigningAuthorityV0 + url: string + location: UInt16Type + } + export interface Regproxy { + proxy: NameType + isproxy: boolean + } + export interface Rentcpu { + from: NameType + receiver: NameType + loan_payment: AssetType + loan_fund: AssetType + } + export interface Rentnet { + from: NameType + receiver: NameType + loan_payment: AssetType + loan_fund: AssetType + } + export interface Rexexec { + user: NameType + max: UInt16Type + } + export interface Rmvproducer { + producer: NameType + } + export interface Sellram { + account: NameType + bytes: Int64Type + } + export interface Sellrex { + from: NameType + rex: AssetType + } + export interface Setabi { + account: NameType + abi: BytesType + memo: string + } + export interface Setacctcpu { + account: NameType + cpu_weight?: Int64Type + } + export interface Setacctnet { + account: NameType + net_weight?: Int64Type + } + export interface Setacctram { + account: NameType + ram_bytes?: Int64Type + } + export interface Setalimits { + account: NameType + ram_bytes: Int64Type + net_weight: Int64Type + cpu_weight: Int64Type + } + export interface Setcode { + account: NameType + vmtype: UInt8Type + vmversion: UInt8Type + code: BytesType + memo: string + } + export interface Setinflation { + annual_rate: Int64Type + inflation_pay_factor: Int64Type + votepay_factor: Int64Type + } + export interface Setparams { + params: Types.BlockchainParametersV1 + } + export interface Setpriv { + account: NameType + is_priv: UInt8Type + } + export interface Setram { + max_ram_size: UInt64Type + } + export interface Setramrate { + bytes_per_block: UInt16Type + } + export interface Setrex { + balance: AssetType + } + export interface Undelegatebw { + from: NameType + receiver: NameType + unstake_net_quantity: AssetType + unstake_cpu_quantity: AssetType + } + export interface Unlinkauth { + account: NameType + code: NameType + type: NameType + authorized_by: NameType + } + export interface Unregprod { + producer: NameType + } + export interface Unstaketorex { + owner: NameType + receiver: NameType + from_net: AssetType + from_cpu: AssetType + } + export interface Updateauth { + account: NameType + permission: NameType + parent: NameType + auth: Types.Authority + authorized_by: NameType + } + export interface Updaterex { + owner: NameType + } + export interface Updtrevision { + revision: UInt8Type + } + export interface Voteproducer { + voter: NameType + proxy: NameType + producers: NameType[] + } + export interface Voteupdate { + voter_name: NameType + } + export interface Wasmcfg { + settings: NameType + } + export interface Withdraw { + owner: NameType + amount: AssetType + } + } + export namespace Types { + @Struct.type('abi_hash') + export class AbiHash extends Struct { + @Struct.field(Name) + owner!: Name + @Struct.field(Checksum256) + hash!: Checksum256 + } + @Struct.type('activate') + export class Activate extends Struct { + @Struct.field(Checksum256) + feature_digest!: Checksum256 + } + @Struct.type('key_weight') + export class KeyWeight extends Struct { + @Struct.field(PublicKey) + key!: PublicKey + @Struct.field(UInt16) + weight!: UInt16 + } + @Struct.type('permission_level') + export class PermissionLevel extends Struct { + @Struct.field(Name) + actor!: Name + @Struct.field(Name) + permission!: Name + } + @Struct.type('permission_level_weight') + export class PermissionLevelWeight extends Struct { + @Struct.field(PermissionLevel) + permission!: PermissionLevel + @Struct.field(UInt16) + weight!: UInt16 + } + @Struct.type('wait_weight') + export class WaitWeight extends Struct { + @Struct.field(UInt32) + wait_sec!: UInt32 + @Struct.field(UInt16) + weight!: UInt16 + } + @Struct.type('authority') + export class Authority extends Struct { + @Struct.field(UInt32) + threshold!: UInt32 + @Struct.field(KeyWeight, {array: true}) + keys!: KeyWeight[] + @Struct.field(PermissionLevelWeight, {array: true}) + accounts!: PermissionLevelWeight[] + @Struct.field(WaitWeight, {array: true}) + waits!: WaitWeight[] + } + @Struct.type('bid_refund') + export class BidRefund extends Struct { + @Struct.field(Name) + bidder!: Name + @Struct.field(Asset) + amount!: Asset + } + @Struct.type('bidname') + export class Bidname extends Struct { + @Struct.field(Name) + bidder!: Name + @Struct.field(Name) + newname!: Name + @Struct.field(Asset) + bid!: Asset + } + @Struct.type('bidrefund') + export class Bidrefund extends Struct { + @Struct.field(Name) + bidder!: Name + @Struct.field(Name) + newname!: Name + } + @Struct.type('producer_key') + export class ProducerKey extends Struct { + @Struct.field(Name) + producer_name!: Name + @Struct.field(PublicKey) + block_signing_key!: PublicKey + } + @Struct.type('producer_schedule') + export class ProducerSchedule extends Struct { + @Struct.field(UInt32) + version!: UInt32 + @Struct.field(ProducerKey, {array: true}) + producers!: ProducerKey[] + } + @Struct.type('block_header') + export class BlockHeader extends Struct { + @Struct.field(UInt32) + timestamp!: UInt32 + @Struct.field(Name) + producer!: Name + @Struct.field(UInt16) + confirmed!: UInt16 + @Struct.field(Checksum256) + previous!: Checksum256 + @Struct.field(Checksum256) + transaction_mroot!: Checksum256 + @Struct.field(Checksum256) + action_mroot!: Checksum256 + @Struct.field(UInt32) + schedule_version!: UInt32 + @Struct.field(ProducerSchedule, {optional: true}) + new_producers?: ProducerSchedule + } + @Struct.type('block_info_record') + export class BlockInfoRecord extends Struct { + @Struct.field(UInt8) + version!: UInt8 + @Struct.field(UInt32) + block_height!: UInt32 + @Struct.field(TimePoint) + block_timestamp!: TimePoint + } + @Struct.type('block_signing_authority_v0') + export class BlockSigningAuthorityV0 extends Struct { + @Struct.field(UInt32) + threshold!: UInt32 + @Struct.field(KeyWeight, {array: true}) + keys!: KeyWeight[] + } + @Struct.type('blockchain_parameters') + export class BlockchainParameters extends Struct { + @Struct.field(UInt64) + max_block_net_usage!: UInt64 + @Struct.field(UInt32) + target_block_net_usage_pct!: UInt32 + @Struct.field(UInt32) + max_transaction_net_usage!: UInt32 + @Struct.field(UInt32) + base_per_transaction_net_usage!: UInt32 + @Struct.field(UInt32) + net_usage_leeway!: UInt32 + @Struct.field(UInt32) + context_free_discount_net_usage_num!: UInt32 + @Struct.field(UInt32) + context_free_discount_net_usage_den!: UInt32 + @Struct.field(UInt32) + max_block_cpu_usage!: UInt32 + @Struct.field(UInt32) + target_block_cpu_usage_pct!: UInt32 + @Struct.field(UInt32) + max_transaction_cpu_usage!: UInt32 + @Struct.field(UInt32) + min_transaction_cpu_usage!: UInt32 + @Struct.field(UInt32) + max_transaction_lifetime!: UInt32 + @Struct.field(UInt32) + deferred_trx_expiration_window!: UInt32 + @Struct.field(UInt32) + max_transaction_delay!: UInt32 + @Struct.field(UInt32) + max_inline_action_size!: UInt32 + @Struct.field(UInt16) + max_inline_action_depth!: UInt16 + @Struct.field(UInt16) + max_authority_depth!: UInt16 + } + @Struct.type('blockchain_parameters_v1') + export class BlockchainParametersV1 extends Struct { + @Struct.field(UInt32) + max_action_return_value_size!: UInt32 + } + @Struct.type('buyram') + export class Buyram extends Struct { + @Struct.field(Name) + payer!: Name + @Struct.field(Name) + receiver!: Name + @Struct.field(Asset) + quant!: Asset + } + @Struct.type('buyrambytes') + export class Buyrambytes extends Struct { + @Struct.field(Name) + payer!: Name + @Struct.field(Name) + receiver!: Name + @Struct.field(UInt32) + bytes!: UInt32 + } + @Struct.type('buyrex') + export class Buyrex extends Struct { + @Struct.field(Name) + from!: Name + @Struct.field(Asset) + amount!: Asset + } + @Struct.type('canceldelay') + export class Canceldelay extends Struct { + @Struct.field(PermissionLevel) + canceling_auth!: PermissionLevel + @Struct.field(Checksum256) + trx_id!: Checksum256 + } + @Struct.type('powerup_config_resource') + export class PowerupConfigResource extends Struct { + @Struct.field(Int64, {optional: true}) + current_weight_ratio?: Int64 + @Struct.field(Int64, {optional: true}) + target_weight_ratio?: Int64 + @Struct.field(Int64, {optional: true}) + assumed_stake_weight?: Int64 + @Struct.field(TimePointSec, {optional: true}) + target_timestamp?: TimePointSec + @Struct.field(Float64, {optional: true}) + exponent?: Float64 + @Struct.field(UInt32, {optional: true}) + decay_secs?: UInt32 + @Struct.field(Asset, {optional: true}) + min_price?: Asset + @Struct.field(Asset, {optional: true}) + max_price?: Asset + } + @Struct.type('powerup_config') + export class PowerupConfig extends Struct { + @Struct.field(PowerupConfigResource) + net!: PowerupConfigResource + @Struct.field(PowerupConfigResource) + cpu!: PowerupConfigResource + @Struct.field(UInt32, {optional: true}) + powerup_days?: UInt32 + @Struct.field(Asset, {optional: true}) + min_powerup_fee?: Asset + } + @Struct.type('cfgpowerup') + export class Cfgpowerup extends Struct { + @Struct.field(PowerupConfig) + args!: PowerupConfig + } + @Struct.type('claimrewards') + export class Claimrewards extends Struct { + @Struct.field(Name) + owner!: Name + } + @Struct.type('closerex') + export class Closerex extends Struct { + @Struct.field(Name) + owner!: Name + } + @Struct.type('cnclrexorder') + export class Cnclrexorder extends Struct { + @Struct.field(Name) + owner!: Name + } + @Struct.type('connector') + export class Connector extends Struct { + @Struct.field(Asset) + balance!: Asset + @Struct.field(Float64) + weight!: Float64 + } + @Struct.type('consolidate') + export class Consolidate extends Struct { + @Struct.field(Name) + owner!: Name + } + @Struct.type('defcpuloan') + export class Defcpuloan extends Struct { + @Struct.field(Name) + from!: Name + @Struct.field(UInt64) + loan_num!: UInt64 + @Struct.field(Asset) + amount!: Asset + } + @Struct.type('defnetloan') + export class Defnetloan extends Struct { + @Struct.field(Name) + from!: Name + @Struct.field(UInt64) + loan_num!: UInt64 + @Struct.field(Asset) + amount!: Asset + } + @Struct.type('delegatebw') + export class Delegatebw extends Struct { + @Struct.field(Name) + from!: Name + @Struct.field(Name) + receiver!: Name + @Struct.field(Asset) + stake_net_quantity!: Asset + @Struct.field(Asset) + stake_cpu_quantity!: Asset + @Struct.field('boolean') + transfer!: boolean + } + @Struct.type('delegated_bandwidth') + export class DelegatedBandwidth extends Struct { + @Struct.field(Name) + from!: Name + @Struct.field(Name) + to!: Name + @Struct.field(Asset) + net_weight!: Asset + @Struct.field(Asset) + cpu_weight!: Asset + } + @Struct.type('deleteauth') + export class Deleteauth extends Struct { + @Struct.field(Name) + account!: Name + @Struct.field(Name) + permission!: Name + @Struct.field(Name) + authorized_by!: Name + } + @Struct.type('deposit') + export class Deposit extends Struct { + @Struct.field(Name) + owner!: Name + @Struct.field(Asset) + amount!: Asset + } + @Struct.type('eosio_global_state') + export class EosioGlobalState extends Struct { + @Struct.field(UInt64) + max_ram_size!: UInt64 + @Struct.field(UInt64) + total_ram_bytes_reserved!: UInt64 + @Struct.field(Int64) + total_ram_stake!: Int64 + @Struct.field(BlockTimestamp) + last_producer_schedule_update!: BlockTimestamp + @Struct.field(TimePoint) + last_pervote_bucket_fill!: TimePoint + @Struct.field(Int64) + pervote_bucket!: Int64 + @Struct.field(Int64) + perblock_bucket!: Int64 + @Struct.field(UInt32) + total_unpaid_blocks!: UInt32 + @Struct.field(Int64) + total_activated_stake!: Int64 + @Struct.field(TimePoint) + thresh_activated_stake_time!: TimePoint + @Struct.field(UInt16) + last_producer_schedule_size!: UInt16 + @Struct.field(Float64) + total_producer_vote_weight!: Float64 + @Struct.field(BlockTimestamp) + last_name_close!: BlockTimestamp + } + @Struct.type('eosio_global_state2') + export class EosioGlobalState2 extends Struct { + @Struct.field(UInt16) + new_ram_per_block!: UInt16 + @Struct.field(BlockTimestamp) + last_ram_increase!: BlockTimestamp + @Struct.field(BlockTimestamp) + last_block_num!: BlockTimestamp + @Struct.field(Float64) + total_producer_votepay_share!: Float64 + @Struct.field(UInt8) + revision!: UInt8 + } + @Struct.type('eosio_global_state3') + export class EosioGlobalState3 extends Struct { + @Struct.field(TimePoint) + last_vpay_state_update!: TimePoint + @Struct.field(Float64) + total_vpay_share_change_rate!: Float64 + } + @Struct.type('eosio_global_state4') + export class EosioGlobalState4 extends Struct { + @Struct.field(Float64) + continuous_rate!: Float64 + @Struct.field(Int64) + inflation_pay_factor!: Int64 + @Struct.field(Int64) + votepay_factor!: Int64 + } + @Struct.type('exchange_state') + export class ExchangeState extends Struct { + @Struct.field(Asset) + supply!: Asset + @Struct.field(Connector) + base!: Connector + @Struct.field(Connector) + quote!: Connector + } + @Struct.type('fundcpuloan') + export class Fundcpuloan extends Struct { + @Struct.field(Name) + from!: Name + @Struct.field(UInt64) + loan_num!: UInt64 + @Struct.field(Asset) + payment!: Asset + } + @Struct.type('fundnetloan') + export class Fundnetloan extends Struct { + @Struct.field(Name) + from!: Name + @Struct.field(UInt64) + loan_num!: UInt64 + @Struct.field(Asset) + payment!: Asset + } + @Struct.type('init') + export class Init extends Struct { + @Struct.field(VarUInt) + version!: VarUInt + @Struct.field(Asset.Symbol) + core!: Asset.Symbol + } + @Struct.type('limitauthchg') + export class Limitauthchg extends Struct { + @Struct.field(Name) + account!: Name + @Struct.field(Name, {array: true}) + allow_perms!: Name[] + @Struct.field(Name, {array: true}) + disallow_perms!: Name[] + } + @Struct.type('linkauth') + export class Linkauth extends Struct { + @Struct.field(Name) + account!: Name + @Struct.field(Name) + code!: Name + @Struct.field(Name) + type!: Name + @Struct.field(Name) + requirement!: Name + @Struct.field(Name) + authorized_by!: Name + } + @Struct.type('mvfrsavings') + export class Mvfrsavings extends Struct { + @Struct.field(Name) + owner!: Name + @Struct.field(Asset) + rex!: Asset + } + @Struct.type('mvtosavings') + export class Mvtosavings extends Struct { + @Struct.field(Name) + owner!: Name + @Struct.field(Asset) + rex!: Asset + } + @Struct.type('name_bid') + export class NameBid extends Struct { + @Struct.field(Name) + newname!: Name + @Struct.field(Name) + high_bidder!: Name + @Struct.field(Int64) + high_bid!: Int64 + @Struct.field(TimePoint) + last_bid_time!: TimePoint + } + @Struct.type('newaccount') + export class Newaccount extends Struct { + @Struct.field(Name) + creator!: Name + @Struct.field(Name) + name!: Name + @Struct.field(Authority) + owner!: Authority + @Struct.field(Authority) + active!: Authority + } + @Struct.type('onblock') + export class Onblock extends Struct { + @Struct.field(BlockHeader) + header!: BlockHeader + } + @Struct.type('onerror') + export class Onerror extends Struct { + @Struct.field(UInt128) + sender_id!: UInt128 + @Struct.field(Bytes) + sent_trx!: Bytes + } + @Struct.type('pair_time_point_sec_int64') + export class PairTimePointSecInt64 extends Struct { + @Struct.field(TimePointSec) + first!: TimePointSec + @Struct.field(Int64) + second!: Int64 + } + @Struct.type('powerup') + export class Powerup extends Struct { + @Struct.field(Name) + payer!: Name + @Struct.field(Name) + receiver!: Name + @Struct.field(UInt32) + days!: UInt32 + @Struct.field(Int64) + net_frac!: Int64 + @Struct.field(Int64) + cpu_frac!: Int64 + @Struct.field(Asset) + max_payment!: Asset + } + @Struct.type('powerup_order') + export class PowerupOrder extends Struct { + @Struct.field(UInt8) + version!: UInt8 + @Struct.field(UInt64) + id!: UInt64 + @Struct.field(Name) + owner!: Name + @Struct.field(Int64) + net_weight!: Int64 + @Struct.field(Int64) + cpu_weight!: Int64 + @Struct.field(TimePointSec) + expires!: TimePointSec + } + @Struct.type('powerup_state_resource') + export class PowerupStateResource extends Struct { + @Struct.field(UInt8) + version!: UInt8 + @Struct.field(Int64) + weight!: Int64 + @Struct.field(Int64) + weight_ratio!: Int64 + @Struct.field(Int64) + assumed_stake_weight!: Int64 + @Struct.field(Int64) + initial_weight_ratio!: Int64 + @Struct.field(Int64) + target_weight_ratio!: Int64 + @Struct.field(TimePointSec) + initial_timestamp!: TimePointSec + @Struct.field(TimePointSec) + target_timestamp!: TimePointSec + @Struct.field(Float64) + exponent!: Float64 + @Struct.field(UInt32) + decay_secs!: UInt32 + @Struct.field(Asset) + min_price!: Asset + @Struct.field(Asset) + max_price!: Asset + @Struct.field(Int64) + utilization!: Int64 + @Struct.field(Int64) + adjusted_utilization!: Int64 + @Struct.field(TimePointSec) + utilization_timestamp!: TimePointSec + } + @Struct.type('powerup_state') + export class PowerupState extends Struct { + @Struct.field(UInt8) + version!: UInt8 + @Struct.field(PowerupStateResource) + net!: PowerupStateResource + @Struct.field(PowerupStateResource) + cpu!: PowerupStateResource + @Struct.field(UInt32) + powerup_days!: UInt32 + @Struct.field(Asset) + min_powerup_fee!: Asset + } + @Struct.type('powerupexec') + export class Powerupexec extends Struct { + @Struct.field(Name) + user!: Name + @Struct.field(UInt16) + max!: UInt16 + } + @Struct.type('producer_info') + export class ProducerInfo extends Struct { + @Struct.field(Name) + owner!: Name + @Struct.field(Float64) + total_votes!: Float64 + @Struct.field(PublicKey) + producer_key!: PublicKey + @Struct.field('boolean') + is_active!: boolean + @Struct.field('string') + url!: string + @Struct.field(UInt32) + unpaid_blocks!: UInt32 + @Struct.field(TimePoint) + last_claim_time!: TimePoint + @Struct.field(UInt16) + location!: UInt16 + @Struct.field(BlockSigningAuthorityV0) + producer_authority!: BlockSigningAuthorityV0 + } + @Struct.type('producer_info2') + export class ProducerInfo2 extends Struct { + @Struct.field(Name) + owner!: Name + @Struct.field(Float64) + votepay_share!: Float64 + @Struct.field(TimePoint) + last_votepay_share_update!: TimePoint + } + @Struct.type('refund') + export class Refund extends Struct { + @Struct.field(Name) + owner!: Name + } + @Struct.type('refund_request') + export class RefundRequest extends Struct { + @Struct.field(Name) + owner!: Name + @Struct.field(TimePointSec) + request_time!: TimePointSec + @Struct.field(Asset) + net_amount!: Asset + @Struct.field(Asset) + cpu_amount!: Asset + } + @Struct.type('regproducer') + export class Regproducer extends Struct { + @Struct.field(Name) + producer!: Name + @Struct.field(PublicKey) + producer_key!: PublicKey + @Struct.field('string') + url!: string + @Struct.field(UInt16) + location!: UInt16 + } + @Struct.type('regproducer2') + export class Regproducer2 extends Struct { + @Struct.field(Name) + producer!: Name + @Struct.field(BlockSigningAuthorityV0) + producer_authority!: BlockSigningAuthorityV0 + @Struct.field('string') + url!: string + @Struct.field(UInt16) + location!: UInt16 + } + @Struct.type('regproxy') + export class Regproxy extends Struct { + @Struct.field(Name) + proxy!: Name + @Struct.field('boolean') + isproxy!: boolean + } + @Struct.type('rentcpu') + export class Rentcpu extends Struct { + @Struct.field(Name) + from!: Name + @Struct.field(Name) + receiver!: Name + @Struct.field(Asset) + loan_payment!: Asset + @Struct.field(Asset) + loan_fund!: Asset + } + @Struct.type('rentnet') + export class Rentnet extends Struct { + @Struct.field(Name) + from!: Name + @Struct.field(Name) + receiver!: Name + @Struct.field(Asset) + loan_payment!: Asset + @Struct.field(Asset) + loan_fund!: Asset + } + @Struct.type('rex_balance') + export class RexBalance extends Struct { + @Struct.field(UInt8) + version!: UInt8 + @Struct.field(Name) + owner!: Name + @Struct.field(Asset) + vote_stake!: Asset + @Struct.field(Asset) + rex_balance!: Asset + @Struct.field(Int64) + matured_rex!: Int64 + @Struct.field(PairTimePointSecInt64, {array: true}) + rex_maturities!: PairTimePointSecInt64[] + } + @Struct.type('rex_fund') + export class RexFund extends Struct { + @Struct.field(UInt8) + version!: UInt8 + @Struct.field(Name) + owner!: Name + @Struct.field(Asset) + balance!: Asset + } + @Struct.type('rex_loan') + export class RexLoan extends Struct { + @Struct.field(UInt8) + version!: UInt8 + @Struct.field(Name) + from!: Name + @Struct.field(Name) + receiver!: Name + @Struct.field(Asset) + payment!: Asset + @Struct.field(Asset) + balance!: Asset + @Struct.field(Asset) + total_staked!: Asset + @Struct.field(UInt64) + loan_num!: UInt64 + @Struct.field(TimePoint) + expiration!: TimePoint + } + @Struct.type('rex_order') + export class RexOrder extends Struct { + @Struct.field(UInt8) + version!: UInt8 + @Struct.field(Name) + owner!: Name + @Struct.field(Asset) + rex_requested!: Asset + @Struct.field(Asset) + proceeds!: Asset + @Struct.field(Asset) + stake_change!: Asset + @Struct.field(TimePoint) + order_time!: TimePoint + @Struct.field('boolean') + is_open!: boolean + } + @Struct.type('rex_pool') + export class RexPool extends Struct { + @Struct.field(UInt8) + version!: UInt8 + @Struct.field(Asset) + total_lent!: Asset + @Struct.field(Asset) + total_unlent!: Asset + @Struct.field(Asset) + total_rent!: Asset + @Struct.field(Asset) + total_lendable!: Asset + @Struct.field(Asset) + total_rex!: Asset + @Struct.field(Asset) + namebid_proceeds!: Asset + @Struct.field(UInt64) + loan_num!: UInt64 + } + @Struct.type('rex_return_buckets') + export class RexReturnBuckets extends Struct { + @Struct.field(UInt8) + version!: UInt8 + @Struct.field(PairTimePointSecInt64, {array: true}) + return_buckets!: PairTimePointSecInt64[] + } + @Struct.type('rex_return_pool') + export class RexReturnPool extends Struct { + @Struct.field(UInt8) + version!: UInt8 + @Struct.field(TimePointSec) + last_dist_time!: TimePointSec + @Struct.field(TimePointSec) + pending_bucket_time!: TimePointSec + @Struct.field(TimePointSec) + oldest_bucket_time!: TimePointSec + @Struct.field(Int64) + pending_bucket_proceeds!: Int64 + @Struct.field(Int64) + current_rate_of_increase!: Int64 + @Struct.field(Int64) + proceeds!: Int64 + } + @Struct.type('rexexec') + export class Rexexec extends Struct { + @Struct.field(Name) + user!: Name + @Struct.field(UInt16) + max!: UInt16 + } + @Struct.type('rmvproducer') + export class Rmvproducer extends Struct { + @Struct.field(Name) + producer!: Name + } + @Struct.type('sellram') + export class Sellram extends Struct { + @Struct.field(Name) + account!: Name + @Struct.field(Int64) + bytes!: Int64 + } + @Struct.type('sellrex') + export class Sellrex extends Struct { + @Struct.field(Name) + from!: Name + @Struct.field(Asset) + rex!: Asset + } + @Struct.type('setabi') + export class Setabi extends Struct { + @Struct.field(Name) + account!: Name + @Struct.field(Bytes) + abi!: Bytes + @Struct.field('string') + memo!: string + } + @Struct.type('setacctcpu') + export class Setacctcpu extends Struct { + @Struct.field(Name) + account!: Name + @Struct.field(Int64, {optional: true}) + cpu_weight?: Int64 + } + @Struct.type('setacctnet') + export class Setacctnet extends Struct { + @Struct.field(Name) + account!: Name + @Struct.field(Int64, {optional: true}) + net_weight?: Int64 + } + @Struct.type('setacctram') + export class Setacctram extends Struct { + @Struct.field(Name) + account!: Name + @Struct.field(Int64, {optional: true}) + ram_bytes?: Int64 + } + @Struct.type('setalimits') + export class Setalimits extends Struct { + @Struct.field(Name) + account!: Name + @Struct.field(Int64) + ram_bytes!: Int64 + @Struct.field(Int64) + net_weight!: Int64 + @Struct.field(Int64) + cpu_weight!: Int64 + } + @Struct.type('setcode') + export class Setcode extends Struct { + @Struct.field(Name) + account!: Name + @Struct.field(UInt8) + vmtype!: UInt8 + @Struct.field(UInt8) + vmversion!: UInt8 + @Struct.field(Bytes) + code!: Bytes + @Struct.field('string') + memo!: string + } + @Struct.type('setinflation') + export class Setinflation extends Struct { + @Struct.field(Int64) + annual_rate!: Int64 + @Struct.field(Int64) + inflation_pay_factor!: Int64 + @Struct.field(Int64) + votepay_factor!: Int64 + } + @Struct.type('setparams') + export class Setparams extends Struct { + @Struct.field(BlockchainParametersV1) + params!: BlockchainParametersV1 + } + @Struct.type('setpriv') + export class Setpriv extends Struct { + @Struct.field(Name) + account!: Name + @Struct.field(UInt8) + is_priv!: UInt8 + } + @Struct.type('setram') + export class Setram extends Struct { + @Struct.field(UInt64) + max_ram_size!: UInt64 + } + @Struct.type('setramrate') + export class Setramrate extends Struct { + @Struct.field(UInt16) + bytes_per_block!: UInt16 + } + @Struct.type('setrex') + export class Setrex extends Struct { + @Struct.field(Asset) + balance!: Asset + } + @Struct.type('undelegatebw') + export class Undelegatebw extends Struct { + @Struct.field(Name) + from!: Name + @Struct.field(Name) + receiver!: Name + @Struct.field(Asset) + unstake_net_quantity!: Asset + @Struct.field(Asset) + unstake_cpu_quantity!: Asset + } + @Struct.type('unlinkauth') + export class Unlinkauth extends Struct { + @Struct.field(Name) + account!: Name + @Struct.field(Name) + code!: Name + @Struct.field(Name) + type!: Name + @Struct.field(Name) + authorized_by!: Name + } + @Struct.type('unregprod') + export class Unregprod extends Struct { + @Struct.field(Name) + producer!: Name + } + @Struct.type('unstaketorex') + export class Unstaketorex extends Struct { + @Struct.field(Name) + owner!: Name + @Struct.field(Name) + receiver!: Name + @Struct.field(Asset) + from_net!: Asset + @Struct.field(Asset) + from_cpu!: Asset + } + @Struct.type('updateauth') + export class Updateauth extends Struct { + @Struct.field(Name) + account!: Name + @Struct.field(Name) + permission!: Name + @Struct.field(Name) + parent!: Name + @Struct.field(Authority) + auth!: Authority + @Struct.field(Name) + authorized_by!: Name + } + @Struct.type('updaterex') + export class Updaterex extends Struct { + @Struct.field(Name) + owner!: Name + } + @Struct.type('updtrevision') + export class Updtrevision extends Struct { + @Struct.field(UInt8) + revision!: UInt8 + } + @Struct.type('user_resources') + export class UserResources extends Struct { + @Struct.field(Name) + owner!: Name + @Struct.field(Asset) + net_weight!: Asset + @Struct.field(Asset) + cpu_weight!: Asset + @Struct.field(Int64) + ram_bytes!: Int64 + } + @Struct.type('voteproducer') + export class Voteproducer extends Struct { + @Struct.field(Name) + voter!: Name + @Struct.field(Name) + proxy!: Name + @Struct.field(Name, {array: true}) + producers!: Name[] + } + @Struct.type('voter_info') + export class VoterInfo extends Struct { + @Struct.field(Name) + owner!: Name + @Struct.field(Name) + proxy!: Name + @Struct.field(Name, {array: true}) + producers!: Name[] + @Struct.field(Int64) + staked!: Int64 + @Struct.field(Float64) + last_vote_weight!: Float64 + @Struct.field(Float64) + proxied_vote_weight!: Float64 + @Struct.field('boolean') + is_proxy!: boolean + @Struct.field(UInt32) + flags1!: UInt32 + @Struct.field(UInt32) + reserved2!: UInt32 + @Struct.field(Asset) + reserved3!: Asset + } + @Struct.type('voteupdate') + export class Voteupdate extends Struct { + @Struct.field(Name) + voter_name!: Name + } + @Struct.type('wasmcfg') + export class Wasmcfg extends Struct { + @Struct.field(Name) + settings!: Name + } + @Struct.type('withdraw') + export class Withdraw extends Struct { + @Struct.field(Name) + owner!: Name + @Struct.field(Asset) + amount!: Asset + } + @Struct.type('limit_auth_change') + export class LimitAuthChange extends Struct { + @Struct.field(UInt8) + version!: UInt8 + @Struct.field(Name) + account!: Name + @Struct.field(Name, {array: true}) + allow_perms!: Name[] + @Struct.field(Name, {array: true}) + disallow_perms!: Name[] + } + } + const TableMap = { + abihash: Types.AbiHash, + bidrefunds: Types.BidRefund, + blockinfo: Types.BlockInfoRecord, + cpuloan: Types.RexLoan, + delband: Types.DelegatedBandwidth, + global: Types.EosioGlobalState, + global2: Types.EosioGlobalState2, + global3: Types.EosioGlobalState3, + global4: Types.EosioGlobalState4, + namebids: Types.NameBid, + netloan: Types.RexLoan, + 'powup.order': Types.PowerupOrder, + 'powup.state': Types.PowerupState, + producers: Types.ProducerInfo, + producers2: Types.ProducerInfo2, + rammarket: Types.ExchangeState, + refunds: Types.RefundRequest, + retbuckets: Types.RexReturnBuckets, + rexbal: Types.RexBalance, + rexfund: Types.RexFund, + rexpool: Types.RexPool, + rexqueue: Types.RexOrder, + rexretpool: Types.RexReturnPool, + userres: Types.UserResources, + voters: Types.VoterInfo, + limitauthchg: Types.LimitAuthChange, + } +} +export default Eosio diff --git a/test/data/contracts/mock-rewards.ts b/test/data/contracts/mock-rewards.gm.ts similarity index 97% rename from test/data/contracts/mock-rewards.ts rename to test/data/contracts/mock-rewards.gm.ts index f1c2d09..446edc9 100644 --- a/test/data/contracts/mock-rewards.ts +++ b/test/data/contracts/mock-rewards.gm.ts @@ -1,4 +1,3 @@ -import {ActionOptions, Contract as BaseContract, ContractArgs, PartialBy} from '@wharfkit/contract' import { ABI, Action, @@ -12,7 +11,8 @@ import { TimePoint, UInt16, UInt16Type, -} from '@wharfkit/session' +} from '@wharfkit/antelope' +import {ActionOptions, Contract as BaseContract, ContractArgs, PartialBy} from '@wharfkit/contract' export namespace RewardsGm { export const abiBlob = Blob.from( 'DmVvc2lvOjphYmkvMS4yAAoHYWRkdXNlcgACB2FjY291bnQEbmFtZQZ3ZWlnaHQGdWludDE2BWNsYWltAAIHYWNjb3VudARuYW1lBmFtb3VudAZhc3NldD8GY29uZmlnAAMMdG9rZW5fc3ltYm9sBnN5bWJvbA5vcmFjbGVfYWNjb3VudARuYW1lDG9yYWNsZV9wYWlycw1vcmFjbGVfcGFpcltdCWNvbmZpZ3VyZQADDHRva2VuX3N5bWJvbAZzeW1ib2wOb3JhY2xlX2FjY291bnQEbmFtZQxvcmFjbGVfcGFpcnMNb3JhY2xlX3BhaXJbXQdkZWx1c2VyAAEHYWNjb3VudARuYW1lC29yYWNsZV9wYWlyAAIEbmFtZQRuYW1lCXByZWNpc2lvbgZ1aW50MTYKcHJpY2VfaW5mbwADBHBhaXIGc3RyaW5nBXByaWNlB2Zsb2F0NjQJdGltZXN0YW1wCnRpbWVfcG9pbnQHcmVjZWlwdAADB2FjY291bnQEbmFtZQZhbW91bnQFYXNzZXQGdGlja2VyDHByaWNlX2luZm9bXQp1cGRhdGV1c2VyAAIHYWNjb3VudARuYW1lBndlaWdodAZ1aW50MTYIdXNlcl9yb3cAAwdhY2NvdW50BG5hbWUGd2VpZ2h0BnVpbnQxNgdiYWxhbmNlBWFzc2V0BgAAAOAqrFMyB2FkZHVzZXKVAi0tLQpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IEFkZCB1c2VyCnN1bW1hcnk6ICdBZGQgbmV3IHVzZXIge3tub3dyYXAgYWNjb3VudH19JwppY29uOiBodHRwczovL2FsbW9zdC5kaWdpdGFsL2ltYWdlcy9taXNjX2ljb24ucG5nIzZmNWVhOTc4YjA0ZDAzZTAxOGIzNzlhMmJhYzRjMTBiNWE4ZmUwY2Q1ZTZlMTVjODg4MjhkYzk4NmJlOTZjZmYKLS0tCgp7e2FjY291bnR9fSBpcyBhZGRlZCB0byB0aGUgcmV3YXJkcyBzaGFyaW5nIGxpc3Qgd2l0aCB3ZWlnaHQge3t3ZWlnaHR9fS4AAAAAAOlMRAVjbGFpbfYCLS0tCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogQ2xhaW0Kc3VtbWFyeTogJ0NsYWltIHJld2FyZHMgZm9yIHt7bm93cmFwIGFjY291bnR9fScKaWNvbjogaHR0cHM6Ly9hbG1vc3QuZGlnaXRhbC9pbWFnZXMvY2xhaW1faWNvbi5wbmcjYmI1OTdmNGFjYzEzMDU5MjU5MTJlMThlN2I0Y2Y3MDhkMWZhZWMyYWE4OGI3YTUzZDg3OTY5ZTA0NTE2OGVjZgotLS0KCnt7I2lmX2hhc192YWx1ZSBhbW91bnR9fQogICAge3thY2NvdW50fX0gY2xhaW1zIHt7YW1vdW50fX0gZnJvbSB0aGVpciByZXdhcmRzIGJhbGFuY2UuCnt7ZWxzZX19CiAgICB7e2FjY291bnR9fSBjbGFpbXMgdGhlaXIgZW50aXJlIHJld2FyZHMgYmFsYW5jZS4Ke3svaWZfaGFzX3ZhbHVlfX0AAFBXM7cmRQljb25maWd1cmUAAAAA4Cqso0oHZGVsdXNlcsQCLS0tCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogRGVsZXRlIHVzZXIKc3VtbWFyeTogJ0RlbGV0ZSB1c2VyIHt7bm93cmFwIGFjY291bnR9fScKaWNvbjogaHR0cHM6Ly9hbG1vc3QuZGlnaXRhbC9pbWFnZXMvbWlzY19pY29uLnBuZyM2ZjVlYTk3OGIwNGQwM2UwMThiMzc5YTJiYWM0YzEwYjVhOGZlMGNkNWU2ZTE1Yzg4ODI4ZGM5ODZiZTk2Y2ZmCi0tLQoKe3thY2NvdW50fX0gaXMgaXMgcmVtb3ZlZCBmcm9tIHRoZSByZXdhcmRzIHNoYXJpbmcgbGlzdC4KClVzZXJzIGNhbiBvbmx5IGJlIHJlbW92ZWQgaWYgdGhlaXIgcmV3YXJkcyBiYWxhbmNlIGlzIHplcm8uAAAAIFenkLoHcmVjZWlwdAAAwFVYq2xS1Qp1cGRhdGV1c2VygAItLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBVcGRhdGUgdXNlcgpzdW1tYXJ5OiAnVXBkYXRlIHVzZXIge3tub3dyYXAgYWNjb3VudH19JwppY29uOiBodHRwczovL2FsbW9zdC5kaWdpdGFsL2ltYWdlcy9taXNjX2ljb24ucG5nIzZmNWVhOTc4YjA0ZDAzZTAxOGIzNzlhMmJhYzRjMTBiNWE4ZmUwY2Q1ZTZlMTVjODg4MjhkYzk4NmJlOTZjZmYKLS0tCgp7e2FjY291bnR9fSBpcyB1cGRhdGVkIHRvIGhhdmUgd2VpZ2h0IHt7d2VpZ2h0fX0uAgAAAAAwtyZFA2k2NAAABmNvbmZpZwAAAAAAfBXWA2k2NAAACHVzZXJfcm93AAAAAA==' @@ -33,8 +33,8 @@ export namespace RewardsGm { ): Action { return super.action(name, data, options) } - table(name: T) { - return super.table(name, TableMap[name]) + table(name: T, scope?: NameType) { + return super.table(name, scope, TableMap[name]) } } export interface ActionNameParams { @@ -55,7 +55,7 @@ export namespace RewardsGm { amount?: AssetType } export interface Configure { - token_symbol: Symbol + token_symbol: Asset.SymbolType oracle_account: NameType oracle_pairs: Types.OraclePair[] } diff --git a/test/data/requests/6cda4eb8b69502e8647161673b5d5646e5ba971c.json b/test/data/requests/6cda4eb8b69502e8647161673b5d5646e5ba971c.json new file mode 100644 index 0000000..d2df375 --- /dev/null +++ b/test/data/requests/6cda4eb8b69502e8647161673b5d5646e5ba971c.json @@ -0,0 +1,17 @@ +{ + "request": { + "path": "https://wax.greymass.com/v1/chain/get_raw_abi", + "params": { + "method": "POST", + "body": "{\"account_name\":\"alcordexmain\"}" + } + }, + "status": 200, + "json": { + "account_name": "alcordexmain", + "code_hash": "944b679346be713e1d73bf0de90c67bdf332f53ecb4e7b019e77b5237bc72f31", + "abi_hash": "17eaee57671692a1b22eda09c2814513da8f179a31aa7299611b03f18bcab558", + "abi": "DmVvc2lvOjphYmkvMS4yAB8HYWNjb3VudAAFB2FjY291bnQEbmFtZQlidXlvcmRlcnMUcGFpcl91aW50NjRfdWludDE2W10Kc2VsbG9yZGVycxRwYWlyX3VpbnQ2NF91aW50MTZbXQxvcmRlcnNfdG90YWwGdWludDE2DG9yZGVyc19saW1pdAZ1aW50MTYDYmFuAAEDYWNjBG5hbWUHYmFubGlzdAABCGFjY291bnRzBm5hbWVbXQhidXltYXRjaAABBnJlY29yZAxtYXRjaF9yZWNvcmQIYnV5b3JkZXIABgJpZAZ1aW50NjQHYWNjb3VudARuYW1lA2JpZAVhc3NldANhc2sFYXNzZXQKdW5pdF9wcmljZQd1aW50MTI4CXRpbWVzdGFtcAZ1aW50MzIKYnV5cmVjZWlwdAACCW1hcmtldF9pZAZ1aW50NjQJYnV5X29yZGVyCGJ1eW9yZGVyCWNhbmNlbGJ1eQADCGV4ZWN1dG9yBG5hbWUJbWFya2V0X2lkBnVpbnQ2NAhvcmRlcl9pZAZ1aW50NjQKY2FuY2Vsc2VsbAADCGV4ZWN1dG9yBG5hbWUJbWFya2V0X2lkBnVpbnQ2NAhvcmRlcl9pZAZ1aW50NjQFY2xlYW4AAwltYXJrZXRfaWQGdWludDY0B21lc3NhZ2UGc3RyaW5nBWxpbWl0BnVpbnQ2NAtjbG9zZW1hcmtldAABCW1hcmtldF9pZAVpbnQ2NAxjb25zdW1lZm9yZHMAAQZhbW91bnQGdWludDY0C2NvbnN1bWVvcmRzAAEGYW1vdW50BnVpbnQ2NA9leHRlbmRlZF9zeW1ib2wAAgNzeW0Gc3ltYm9sCGNvbnRyYWN0BG5hbWUGbWFya2V0AAcCaWQGdWludDY0CmJhc2VfdG9rZW4PZXh0ZW5kZWRfc3ltYm9sC3F1b3RlX3Rva2VuD2V4dGVuZGVkX3N5bWJvbAdtaW5fYnV5BWFzc2V0CG1pbl9zZWxsBWFzc2V0BmZyb3plbgRib29sA2ZlZQV1aW50OAxtYXRjaF9yZWNvcmQACQJpZAZ1aW50NjQGbWFya2V0Bm1hcmtldAZiaWRkZXIEbmFtZQVhc2tlcgRuYW1lFWJpZGRlcl9iYWxhbmNlX2JlZm9yZQVhc3NldANiaWQFYXNzZXQDYXNrBWFzc2V0CnVuaXRfcHJpY2UHdWludDEyOAl0aW1lc3RhbXAGdWludDY0BG5ld3MAAgdtZXNzYWdlBnN0cmluZwJ0bwZuYW1lW10Kb3Blbm1hcmtldAAECGJhc2VfY29uBG5hbWUIYmFzZV9zeW0FYXNzZXQJcXVvdGVfY29uBG5hbWUJcXVvdGVfc3ltBWFzc2V0EnBhaXJfdWludDY0X3VpbnQxNgACA2tleQZ1aW50NjQFdmFsdWUGdWludDE2CXBheWZvcmNwdQAABXJlc2V0AAAJcm1hY2NvdW50AAEDYWNjBG5hbWUJc2VsbG1hdGNoAAEGcmVjb3JkDG1hdGNoX3JlY29yZAlzZWxsb3JkZXIABgJpZAZ1aW50NjQHYWNjb3VudARuYW1lA2JpZAVhc3NldANhc2sFYXNzZXQKdW5pdF9wcmljZQd1aW50MTI4CXRpbWVzdGFtcAZ1aW50MzILc2VsbHJlY2VpcHQAAgltYXJrZXRfaWQGdWludDY0CnNlbGxfb3JkZXIJc2VsbG9yZGVyC3NldGFjY2xpbWl0AAIDYWNjBG5hbWUFbGltaXQGdWludDE2CXNldGZyb3plbgABBmZyb3plbgRib29sB3NldG1mZWUAAgltYXJrZXRfaWQGdWludDY0A2ZlZQV1aW50OApzZXRtZnJvemVuAAIJbWFya2V0X2lkBnVpbnQ2NAZmcm96ZW4EYm9vbAdzZXRtaW5zAAMJbWFya2V0X2lkBnVpbnQ2NAdtaW5fYnV5BWFzc2V0CG1pbl9zZWxsBWFzc2V0CHNldHRpbmdzAAMGZnJvemVuBGJvb2wKZnJlZW9yZGVycwVpbnQxNgtmaXJzdG9yZGVycwZ1aW50MTYEdGVzdAAAFgAAAAAAAKY5A2JhbgAAAAANZSO9PghidXltYXRjaAAAQK5OIXW9PgpidXlyZWNlaXB0AAAA8PpEhaZBCWNhbmNlbGJ1eQAAQIwKR4WmQQpjYW5jZWxzZWxsAAAAAACAaVREBWNsZWFuAACygtdIhWlEC2Nsb3NlbWFya2V0AIDTpUtJjSdFDGNvbnN1bWVmb3JkcwAAcLpUSY0nRQtjb25zdW1lb3JkcwAAAAAAAIC5mgRuZXdzAABAVvAaOVWlCm9wZW5tYXJrZXQAAADQFV26vKkJcGF5Zm9yY3B1AAAAAACArLC6BXJlc2V0AAAAyFNThIy8CXJtYWNjb3VudAAAAGgoGxmjwglzZWxsbWF0Y2gAAHJ1Cqkbo8ILc2VsbHJlY2VpcHQAALKTLiJkssILc2V0YWNjbGltaXQAAACY6tO7ssIJc2V0ZnJvemVuAAAAAECpJbPCB3NldG1mZWUAAMBUn94ls8IKc2V0bWZyb3plbgAAAAAATyezwgdzZXRtaW5zAAAAAAAAkLHKBHRlc3QABgAAACBPTREyA2k2NAAAB2FjY291bnQAAAAAAACmOQNpNjQAAAdiYW5saXN0AAAAV6VLvT4DaTY0AAAIYnV5b3JkZXIAAAAAZwWvkQNpNjQAAAZtYXJrZXQAALgqXRqjwgNpNjQAAAlzZWxsb3JkZXIAAACYTZezwgNpNjQAAAhzZXR0aW5ncwAAAAAAAA===" + }, + "text": "{\"account_name\":\"alcordexmain\",\"code_hash\":\"944b679346be713e1d73bf0de90c67bdf332f53ecb4e7b019e77b5237bc72f31\",\"abi_hash\":\"17eaee57671692a1b22eda09c2814513da8f179a31aa7299611b03f18bcab558\",\"abi\":\"DmVvc2lvOjphYmkvMS4yAB8HYWNjb3VudAAFB2FjY291bnQEbmFtZQlidXlvcmRlcnMUcGFpcl91aW50NjRfdWludDE2W10Kc2VsbG9yZGVycxRwYWlyX3VpbnQ2NF91aW50MTZbXQxvcmRlcnNfdG90YWwGdWludDE2DG9yZGVyc19saW1pdAZ1aW50MTYDYmFuAAEDYWNjBG5hbWUHYmFubGlzdAABCGFjY291bnRzBm5hbWVbXQhidXltYXRjaAABBnJlY29yZAxtYXRjaF9yZWNvcmQIYnV5b3JkZXIABgJpZAZ1aW50NjQHYWNjb3VudARuYW1lA2JpZAVhc3NldANhc2sFYXNzZXQKdW5pdF9wcmljZQd1aW50MTI4CXRpbWVzdGFtcAZ1aW50MzIKYnV5cmVjZWlwdAACCW1hcmtldF9pZAZ1aW50NjQJYnV5X29yZGVyCGJ1eW9yZGVyCWNhbmNlbGJ1eQADCGV4ZWN1dG9yBG5hbWUJbWFya2V0X2lkBnVpbnQ2NAhvcmRlcl9pZAZ1aW50NjQKY2FuY2Vsc2VsbAADCGV4ZWN1dG9yBG5hbWUJbWFya2V0X2lkBnVpbnQ2NAhvcmRlcl9pZAZ1aW50NjQFY2xlYW4AAwltYXJrZXRfaWQGdWludDY0B21lc3NhZ2UGc3RyaW5nBWxpbWl0BnVpbnQ2NAtjbG9zZW1hcmtldAABCW1hcmtldF9pZAVpbnQ2NAxjb25zdW1lZm9yZHMAAQZhbW91bnQGdWludDY0C2NvbnN1bWVvcmRzAAEGYW1vdW50BnVpbnQ2NA9leHRlbmRlZF9zeW1ib2wAAgNzeW0Gc3ltYm9sCGNvbnRyYWN0BG5hbWUGbWFya2V0AAcCaWQGdWludDY0CmJhc2VfdG9rZW4PZXh0ZW5kZWRfc3ltYm9sC3F1b3RlX3Rva2VuD2V4dGVuZGVkX3N5bWJvbAdtaW5fYnV5BWFzc2V0CG1pbl9zZWxsBWFzc2V0BmZyb3plbgRib29sA2ZlZQV1aW50OAxtYXRjaF9yZWNvcmQACQJpZAZ1aW50NjQGbWFya2V0Bm1hcmtldAZiaWRkZXIEbmFtZQVhc2tlcgRuYW1lFWJpZGRlcl9iYWxhbmNlX2JlZm9yZQVhc3NldANiaWQFYXNzZXQDYXNrBWFzc2V0CnVuaXRfcHJpY2UHdWludDEyOAl0aW1lc3RhbXAGdWludDY0BG5ld3MAAgdtZXNzYWdlBnN0cmluZwJ0bwZuYW1lW10Kb3Blbm1hcmtldAAECGJhc2VfY29uBG5hbWUIYmFzZV9zeW0FYXNzZXQJcXVvdGVfY29uBG5hbWUJcXVvdGVfc3ltBWFzc2V0EnBhaXJfdWludDY0X3VpbnQxNgACA2tleQZ1aW50NjQFdmFsdWUGdWludDE2CXBheWZvcmNwdQAABXJlc2V0AAAJcm1hY2NvdW50AAEDYWNjBG5hbWUJc2VsbG1hdGNoAAEGcmVjb3JkDG1hdGNoX3JlY29yZAlzZWxsb3JkZXIABgJpZAZ1aW50NjQHYWNjb3VudARuYW1lA2JpZAVhc3NldANhc2sFYXNzZXQKdW5pdF9wcmljZQd1aW50MTI4CXRpbWVzdGFtcAZ1aW50MzILc2VsbHJlY2VpcHQAAgltYXJrZXRfaWQGdWludDY0CnNlbGxfb3JkZXIJc2VsbG9yZGVyC3NldGFjY2xpbWl0AAIDYWNjBG5hbWUFbGltaXQGdWludDE2CXNldGZyb3plbgABBmZyb3plbgRib29sB3NldG1mZWUAAgltYXJrZXRfaWQGdWludDY0A2ZlZQV1aW50OApzZXRtZnJvemVuAAIJbWFya2V0X2lkBnVpbnQ2NAZmcm96ZW4EYm9vbAdzZXRtaW5zAAMJbWFya2V0X2lkBnVpbnQ2NAdtaW5fYnV5BWFzc2V0CG1pbl9zZWxsBWFzc2V0CHNldHRpbmdzAAMGZnJvemVuBGJvb2wKZnJlZW9yZGVycwVpbnQxNgtmaXJzdG9yZGVycwZ1aW50MTYEdGVzdAAAFgAAAAAAAKY5A2JhbgAAAAANZSO9PghidXltYXRjaAAAQK5OIXW9PgpidXlyZWNlaXB0AAAA8PpEhaZBCWNhbmNlbGJ1eQAAQIwKR4WmQQpjYW5jZWxzZWxsAAAAAACAaVREBWNsZWFuAACygtdIhWlEC2Nsb3NlbWFya2V0AIDTpUtJjSdFDGNvbnN1bWVmb3JkcwAAcLpUSY0nRQtjb25zdW1lb3JkcwAAAAAAAIC5mgRuZXdzAABAVvAaOVWlCm9wZW5tYXJrZXQAAADQFV26vKkJcGF5Zm9yY3B1AAAAAACArLC6BXJlc2V0AAAAyFNThIy8CXJtYWNjb3VudAAAAGgoGxmjwglzZWxsbWF0Y2gAAHJ1Cqkbo8ILc2VsbHJlY2VpcHQAALKTLiJkssILc2V0YWNjbGltaXQAAACY6tO7ssIJc2V0ZnJvemVuAAAAAECpJbPCB3NldG1mZWUAAMBUn94ls8IKc2V0bWZyb3plbgAAAAAATyezwgdzZXRtaW5zAAAAAAAAkLHKBHRlc3QABgAAACBPTREyA2k2NAAAB2FjY291bnQAAAAAAACmOQNpNjQAAAdiYW5saXN0AAAAV6VLvT4DaTY0AAAIYnV5b3JkZXIAAAAAZwWvkQNpNjQAAAZtYXJrZXQAALgqXRqjwgNpNjQAAAlzZWxsb3JkZXIAAACYTZezwgNpNjQAAAhzZXR0aW5ncwAAAAAAAA===\"}" +} \ No newline at end of file diff --git a/test/data/requests/821556beab3147198d2a4b8ff6f22208f19691ab.json b/test/data/requests/821556beab3147198d2a4b8ff6f22208f19691ab.json new file mode 100644 index 0000000..5a0236f --- /dev/null +++ b/test/data/requests/821556beab3147198d2a4b8ff6f22208f19691ab.json @@ -0,0 +1,365 @@ +{ + "request": { + "path": "https://wax.greymass.com/v1/chain/get_table_rows", + "params": { + "method": "POST", + "body": "{\"json\":false,\"limit\":1000,\"table\":\"sellorder\",\"code\":\"alcordexmain\",\"scope\":\"0\",\"key_type\":\"name\"}" + } + }, + "status": 200, + "json": { + "rows": [ + "c002000000000000000000d27070de89204e0000000000000450474c000000000002bcc625000000085741580000000000015ee3120000000000000000000000b56b5a60", + "1a03000000000000000000d27070f3af50c30000000000000450474c00000000806dd5af00000000085741580000000080af2a23000000000000000000000000ef1f6d60", + "0c05000000000000000090860371c7bef0bc2b00000000000450474c00000000003f642126150000085741580000000000015ee312000000000000000000000000d87660", + "810700000000000000009086037522bf409c0000000000000450474c0000000000505c18a30100000857415800000000001417c668000000000000000000000044188060", + "c0090000000000000000308603698b257f335000000000000450474c000000007018b8236e000000085741580000000000e9a435000000000000000000000000f4978d60", + "be0a00000000000000009086036e042c22180100000000000450474c000000000088ffe2161a0000085741580000000000409452a3030000000000000000000039709160", + "930b000000000000000090860374d2d197c60200000000000450474c000000001411e050040000000857415800000000c0b4bc3c00000000000000000000000034849560", + "cc1000000000000000009086038a4c6910270000000000000450474c0000000000743ba40b000000085741580000000000743ba40b00000000000000000000004215b660", + "cd1000000000000000009086038a4c6910270000000000000450474c000000000014e85d0f00000008574158000000000014e85d0f00000000000000000000008315b660", + "ce1000000000000000009086038a4c6910270000000000000450474c0000000000902f5009000000085741580000000000902f500900000000000000000000009a15b660", + "f210000000000000000090860376944790d00300000000000450474c0000000000d426badb6e0000085741580000000000f467306f04000000000000000000000c37b660", + "f3100000000000000000908603769447400d0300000000000450474c000000000040a72b1e24000008574158000000000090fb4ece01000000000000000000006437b660", + "f5100000000000000000908603769447400d0300000000000450474c00000000004cc285cf3c0000085741580000000000b749600a0300000000000000000000eb3db660", + "fe1000000000000000009086038a4c6910270000000000000450474c0000000000e8764817000000085741580000000000e876481700000000000000000000000d5db660", + "ff1000000000000000009086038a4c6910270000000000000450474c0000000000d0ed902e000000085741580000000000d0ed902e0000000000000000000000165db660", + "001100000000000000009086038a4c6910270000000000000450474c000000000088526a7400000008574158000000000088526a7400000000000000000000001e5db660", + "011100000000000000009086038a4c6910270000000000000450474c000000000010a5d4e800000008574158000000000010a5d4e80000000000000000000000235db660", + "021100000000000000009086038a4c6910270000000000000450474c0000000000204aa9d1010000085741580000000000204aa9d10100000000000000000000295db660", + "031100000000000000009086038a4c6910270000000000000450474c000000000030ef7dba02000008574158000000000030ef7dba02000000000000000000002d5db660", + "041100000000000000009086038a4c6910270000000000000450474c000000000098f73e5d01000008574158000000000098f73e5d0100000000000000000000365db660", + "051100000000000000009086038a4c69a0860100000000000450474c000000000070c9b28b0000000857415800000000005847f80d0000000000000000000000855db660", + "5b11000000000000000090860376944710270000000000000450474c00000000004ff977ba0200000857415800000000004ff977ba02000000000000000000002f5db760", + "5e11000000000000000090860376944710270000000000000450474c0000000000409452a3030000085741580000000000409452a303000000000000000000003f5db760", + "8d13000000000000000090860371fe2100710200000000000450474c000000000060f6270e000000085741580000000000667fe2000000000000000000000000d38dbf60", + "8e13000000000000000090860371fe2100710200000000000450474c00000000003060e12400000008574158000000000003164e020000000000000000000000e78dbf60", + "8f13000000000000000090860371fe2100710200000000000450474c000000000060c0c249000000085741580000000000062c9c040000000000000000000000f88dbf60", + "9013000000000000000090860371fe2100710200000000000450474c000000000050b884cc000000085741580000000000854bc80c0000000000000000000000118ebf60", + "9113000000000000000090860371fe2100710200000000000450474c0000000000d03406170100000857415800000000004d6370110000000000000000000000998ebf60", + "551500000000000000009086039742affa280000000000000450474c00000000c0e24fabdc0200000857415800000000006e0372ba020000000000000000000017d3c460", + "9117000000000000000090860371b40216b1ab00000000000450474c0000000040ea4cb6590f0000085741580000000000d6117e0300000000000000000000009cd7c960", + "9217000000000000000090860371b40216b1ab00000000000450474c0000000040ea4cb6590f0000085741580000000000d6117e030000000000000000000000b1d7c960", + "a717000000000000000000d27070de89a0860100000000000450474c00000000c0aff62901000000085741580000000060decb1d00000000000000000000000014fec960", + "3318000000000000000090860376944710270000000000000450474c0000000000e0abb9523e0100085741580000000000e0abb9523e010000000000000000004e63ca60", + "761800000000000000009086036dcd5f20a10700000000000450474c0000000000743ba40b000000085741580000000000ca9a3b000000000000000000000000d7faca60", + "251b00000000000000009086036ec6fc30750000000000000450474c0000000000f0ab75a40d00000857415800000000005039278c0400000000000000000000a019d060", + "271b00000000000000009086036ec6fc75860000000000000450474c0000000080c8832450000000085741580000000000e87648170000000000000000000000151ad060", + "451c0000000000000000908603a75d85c4590800000000000450474c0000000000084fc62800000008574158000000000020bcbe0000000000000000000000001aebd260", + "641c00000000000000009086038b4cc210980200000000000450474c0000000000211165130000000857415800000000001110240100000000000000000000002ec0d360", + "ae1c0000000000000000908603a75d85b8000900000000000450474c00000000b02f00ea080000000857415800000000a06dad26000000000000000000000000a56fd560", + "1520000000000000000030860367cfea5ebf1200000000000450474c0000000097cd53b1050000000857415800000000bd7fdc0b0000000000000000000000005898e160", + "8326000000000000000090860373846edb8d0000000000000450474c00000000007fda1aa9000000085741580000000000d0ed902e0000000000000000000000fb1afb60", + "ca26000000000000000090860376944700a60e00000000000450474c0000000000204148dd00000008574158000000000003164e02000000000000000000000053dbfe60", + "cb26000000000000000090860376944700a60e00000000000450474c0000000000a0b6ccbc010000085741580000000000e721a204000000000000000000000065dbfe60", + "37290000000000000000908603739779da010000000000000450474c000000001068b30100000000085741580000000080cae1230000000000000000000000007ce60d61", + "77290000000000000000908603739779e9010000000000000450474c0000000000c9ad0100000000085741580000000000105522000000000000000000000000cf841061", + "d42a000000000000000090860373977927030000000000000450474c00000000aea7510300000000085741580000000005902029000000000000000000000000548b1561", + "ab2d000000000000000090860374a66c7e040000000000000450474c000000000a406604000000000857415800000000c77a4126000000000000000000000000d9581d61", + "082e000000000000000000d270c0db25f4330000000000000450474c0000000000f26af71e000000085741580000000000e87648170000000000000000000000c3ad1e61", + "002f00000000000000009086036e4f0f6e000000000000000450474c0000000094738f04000000000857415800000000d5f3939e0100000000000000000000005cf62161", + "0b30000000000000000090860373882965000000000000000450474c0000000058687902000000000857415800000000809ff9f4000000000000000000000000247d2361", + "9930000000000000000090860376486101000000000000000450474c0000000040778c020000000008574158000000000034f28e630000000000000000000000d3fb2561", + "3c3100000000000000009086037397795a060000000000000450474c000000002e1e4b0400000000085741580000000083a4671a0000000000000000000000007cd52661", + "77330000000000000000908603a56ca705000000000000000450474c00000000b083020100000000085741580000000000cfa4e3070000000000000000000000e8d92c61", + "353400000000000000009086037fb80517950000000000000450474c0000000076128b1d0200000008574158000000004f48e38d000000000000000000000000116b3161", + "b334000000000000000000d270c0db25ac4e0000000000000450474c000000000076e2bbd803000008574158000000000008c1f1e80100000000000000000000f7493761", + "493b000000000000000090860371ac527e310100000000000450474c000000000084ea6657000000085741580000000000e0052d0b0000000000000000000000d6e28d61", + "0c3f00000000000000009086033280f5b5030000000000000450474c00000000ec34eaca000000000857415800000000245d325a0800000000000000000000001ed89e61", + "4b3f00000000000000009086036f6ece14090200000000000450474c000000009069a224040000000857415800000000409d824f00000000000000000000000061c39f61", + "05450000000000000000908603738334c26a0000000000000450474c00000000000df3a13f000000085741580000000000e876481700000000000000000000009f70bb61", + "3f460000000000000000908603df95c8a00f0000000000000450474c0000000000a0acb903000000085741580000000000902f50090000000000000000000000cb26c361", + "9e460000000000000000908603f8b88e741c0100000000000450474c00000000509aef3e0000000008574158000000004086a408000000000000000000000000f067c361", + "7947000000000000000090860371a761c5eb1b00000000000450474c00000000b035f2e73f0000000857415800000000002f6859000000000000000000000000ca33c461", + "824700000000000000009086036b100b7c350b00000000000450474c0000000054d39060020000000857415800000000b0d148080000000000000000000000003a39c461", + "e6490000000000000000908603769447a0252600000000000450474c0000000000166bf10a000000085741580000000000a7340b0000000000000000000000001dfac561", + "ae4a000000000000000090860374479aa9530100000000000450474c00000000302a8f48000000000857415800000000003b5808000000000000000000000000d465c661", + "c04a0000000000000000908603e5039a007d0000000000000450474c00000000bcccda18000000000857415800000000fb5fc407000000000000000000000000f282c661", + "d54a00000000000000009086037281d3007d0000000000000450474c0000000000cbda18000000000857415800000000705fc4070000000000000000000000009e9dc661", + "c64b00000000000000009086036e2a01f47a0000000000000450474c0000000026af5525000000000857415800000000bd7fdc0b000000000000000000000000210ac861", + "974d000000000000000090860371a0853aa70000000000000450474c000000004093083300000000085741580000000000c2eb0b000000000000000000000000481fca61", + "cc50000000000000000090860379c69622350c00000000000450474c00000000a08049500900000008574158000000000065cd1d0000000000000000000000000ba7cd61", + "e2520000000000000000908603ecdeaa10270000000000000450474c00000000e05dcb0a000000000857415800000000e05dcb0a00000000000000000000000092e5d261", + "245300000000000000003086036981451108c800000000000450474c00000000bb615652240000000857415800000000a3cb17070000000000000000000000003a79d361", + "f85500000000000000a4e100010bbabc86650000000000000450474c00000000e8b4ef2d00000000085741580000000052b4ac110000000000000000000000006db8d861", + "b45a0000000000002084704faa3fb57904010000000000000450474c00000000706d4500000000000857415800000000c0496e0a0000000000000000000000000cb3e061", + "8c5b0000000000000000908603e31a3a92810000000000000450474c0000000080b3241600000000085741580000000000fcac06000000000000000000000000629be261", + "055c0000000000000000908603f6df9972600000000000000450474c000000006a688610000000000857415800000000d068b1060000000000000000000000004490e361", + "105c0000000000000000908603ffa8caf4330000000000000450474c00000000f0e8ce08000000000857415800000000c66b9f0600000000000000000000000003afe361", + "115c00000000000000009086037281d35e4c0000000000000450474c0000000080100d0d00000000085741580000000000fcac06000000000000000000000000deb5e361", + "125c0000000000000000908603f95d57b0540000000000000450474c000000009050600f000000000857415800000000b0a417070000000000000000000000008bb7e361", + "165c0000000000000000908603f95dd778370000000000000450474c00000000707f6709000000000857415800000000c66b9f0600000000000000000000000074dae361", + "185c00000000000000009086038e7635bc3e0000000000000450474c0000000027bcbf0a000000000857415800000000b968b10600000000000000000000000058dce361", + "265c0000000000000000908603f95d9140330000000000000450474c00000000804b300900000000085741580000000060e8000700000000000000000000000073f7e361", + "7b5c00000000000000a4e10001014f0558491a00000000000450474c0000000000fd2dd0040000000857415800000000000e270700000000000000000000000098ece461", + "315d0000000000000000908603f95ca258de0000000000000450474c00000000f8b91826000000000857415800000000d068b10600000000000000000000000019afe661", + "a25d0000000000000000908603aeb878204e0000000000000450474c0000000000725d1700000000085741580000000000b9ae0b000000000000000000000000b4ece661", + "c55d0000000000000000908603f95d91887c0000000000000450474c00000000a0b25b150000000008574158000000004e16b306000000000000000000000000689ae761", + "c75d0000000000000000908603785f67e4520000000000000450474c00000000d4da330e000000000857415800000000d068b1060000000000000000000000005b9ce761", + "c95d0000000000000000908603e5bf2f2c790000000000000450474c0000000027328b14000000000857415800000000c66b9f060000000000000000000000002bb1e761", + "ca5d0000000000000000908603f95b1f9a330000000000000450474c000000001a936c0900000000085741580000000010532207000000000000000000000000ddb1e761", + "cb5d0000000000000000908603e58856363d0000000000000450474c000000005f591d0b00000000085741580000000040cb1707000000000000000000000000c0b2e761", + "cd5d00000000000000009086037281d37e6d0000000000000450474c000000005287f313000000000857415800000000402a1e0700000000000000000000000018b4e761", + "cf5d0000000000000000908603ffa86b86470000000000000450474c000000006c9eec100000000008574158000000001c423e0900000000000000000000000043b5e761", + "d05d0000000000000000908603e504e44cef0000000000000450474c00000000502fe63f000000000857415800000000c0496e0a0000000000000000000000008cb5e761", + "de5d0000000000000000908603f95cf210270000000000000450474c0000000010532207000000000857415800000000105322070000000000000000000000005ff9e761", + "ec5d0000000000000000908603f95b1f36330000000000000450474c000000001ee61f09000000000857415800000000d0c4f506000000000000000000000000db0fe861", + "256000000000000000009086036ff808d8e01c00000000000450474c0000000020674411050000000857415800000000c0c2da06000000000000000000000000cf8fe961", + "266000000000000000009086036ff808d8e01c00000000000450474c000000008024482b060000000857415800000000003b5808000000000000000000000000df8fe961", + "a5630000000000000000908603e504e46e320000000000000450474c000000001003340900000000085741580000000080f3200700000000000000000000000014cfeb61", + "b16f000000000000000090860368add8981a2600000000000450474c00000000c4b43beb06000000085741580000000040cb1707000000000000000000000000a217f761", + "3d78000000000000000000d27070de89a0860100000000000450474c00000000406f493e000000000857415800000000208b3a06000000000000000000000000bc8a0162", + "8a7900000000000000009086036b298829be9600000000000450474c000000004ec5bfea170000000857415800000000e09b320600000000000000000000000089d30262", + "4a7b000000000000000030860356fbcfc7a41100000000000450474c00000000e03a696205000000085741580000000000c2eb0b00000000000000000000000048610962", + "ba7d000000000000000090860374997f400d0300000000000450474c0000000000180d8f000000000857415800000000000e2707000000000000000000000000127c1362", + "117f00000000000000a4e1000113c73c08fe0700000000000450474c0000000000fa606a3f000000085741580000000000b4f135010000000000000000000000aeca1e62", + "5c80000000000000e0aba93ffb6baaa910270000000000000450474c0000000000204aa9d1010000085741580000000000204aa9d10100000000000000000000e01d3262", + "988200000000000000a4e1000106904810270000000000000450474c0000000000e0abb9523e0100085741580000000000e0abb9523e01000000000000000000ab954662", + "23830000000000004069aefe22fa9dabab0a0000000000000450474c00000000e02c471000000000085741580000000000ca9a3b000000000000000000000000e96f4b62", + "4f830000000000000000908603dd3d8b8ac40100000000000450474c0000000020274b7c0000000008574158000000000095ba0a000000000000000000000000434e4e62", + "05850000000000000000908603cbd558204e0000000000000450474c0000000000ef1c0d00000000085741580000000080778e06000000000000000000000000b2976062", + "ba87000000000000000090860371b91557e80c00000000000450474c0000000050453cb1a707000008574158000000000083a92a17000000000000000000000015998d62", + "e18d0000000000000000908603b6d15750c30000000000000450474c0000000000db8b55070000000857415800000000005f8277010000000000000000000000f206c362", + "e28d0000000000000000908603b6d157409c0000000000000450474c00000000005079be13000000085741580000000000549eef0400000000000000000000001407c362", + "e38d0000000000000000908603b6d15750c50000000000000450474c0000000000e80ed871000000085741580000000000c8ba891600000000000000000000007607c362", + "1c8f00000000000000009086037342c3400d0300000000000450474c000000000029f08100000000085741580000000040357f060000000000000000000000005974df62", + "1d8f00000000000000009086037342c350c30000000000000450474c0000000080bd512a00000000085741580000000080bf76080000000000000000000000008674df62", + "129d0000000000000000908603b6d15713b60000000000000450474c0000000030a94cd801000000085741580000000000f15365000000000000000000000000db4f1963", + "08a800000000000000009086037194ccb2a60500000000000450474c00000000b04d1f4b01000000085741580000000080d1f00800000000000000000000000042fc6263", + "6fb300000000000000009086036b0605799d7500000000000450474c0000000014fe60ff1400000008574158000000004047f90600000000000000000000000009c77f63", + "71b300000000000000009086036b0605404b4c00000000000450474c00000000002e597611000000085741580000000080d1f0080000000000000000000000007ac87f63", + "9bcb0000000000000000908603739fefb83f0800000000000450474c000000000006f648ba000000085741580000000000142672030000000000000000000000f9d7af63", + "9ccb0000000000000000908603739fef50c30000000000000450474c0000000000908cd476e20000085741580000000000504ff74a2d0000000000000000000026daaf63", + "9fcb0000000000000000908603739fef2ae20300000000000450474c0000000000b1659150020000085741580000000000e8764817000000000000000000000074dbaf63", + "0cd700000000000000009086038bcbe58bcc0000000000000450474c00000000a1bbad22000000000857415800000000c66b9f06000000000000000000000000853fb663", + "74d80000000000000000908603fedca05b901000000000000450474c000000000d8ef49a0200000008574158000000003be02406000000000000000000000000a008b963", + "c4d800000000000000009086036f502dd70d0300000000000450474c000000006c067e7800000000085741580000000040230506000000000000000000000000d336bc63", + "d4d80000000000000000908603aa52c5167b0000000000000450474c00000000c8f69712000000000857415800000000c09ee60500000000000000000000000034c3bc63", + "e3d800000000000000a4e100010d01f6880d0100000000000450474c000000008090202900000000085741580000000000e1f505000000000000000000000000f738bd63", + "e7d80000000000000000908603fedca0b9a20700000000000450474c00000000deada920010000000857415800000000e0bec4050000000000000000000000002078bd63", + "f9d80000000000000000908603dccdfbf07e0e00000000000450474c0000000080aa9141020000000857415800000000806514060000000000000000000000004053be63", + "0dd90000000000000000908603750d6f10270000000000000450474c00000000605af405000000000857415800000000605af405000000000000000000000000dd61c063", + "13d900000000000000a4e100011faffb92f20200000000000450474c000000002067237300000000085741580000000000e1f5050000000000000000000000007a27c163", + "19d90000000000004082f1d960e3b3c138540f00000000000450474c00000000908bb73e020000000857415800000000e089b805000000000000000000000000a79bc163", + "3ed90000000000000000908603dccdfb40420f00000000000450474c00000000007f3e36020000000857415800000000c095a9050000000000000000000000000e27c363", + "54d90000000000000000908603aa52c5447f0000000000000450474c00000000b0993913000000000857415800000000c09ee605000000000000000000000000d5edc363", + "7ed90000000000000000908603aa52c55e370100000000000450474c000000002827092f000000000857415800000000c09ee605000000000000000000000000448ec563", + "aad90000000000004082f1d960e3b3c1044f1b00000000000450474c00000000703868f5030000000857415800000000c095a905000000000000000000000000cbf3c663", + "d6d9000000000000000090860373ddfcc0e1e400000000000450474c000000000071a92d210000000857415800000000c095a905000000000000000000000000b585c863", + "02da00000000000000009086036cddf3801a0600000000000450474c0000000000667fe2000000000857415800000000c095a905000000000000000000000000a04cca63", + "1ada0000000000000000908603dccdfba0860100000000000450474c000000001c25db33000000000857415800000000b6832f05000000000000000000000000e8ffca63", + "1dda0000000000000000908603734ed640420f00000000000450474c0000000000dc5c2402000000085741580000000000cf7b05000000000000000000000000f90dcb63", + "26da0000000000000000908603aa52c554f60000000000000450474c000000003015b523000000000857415800000000c095a9050000000000000000000000006950cb63", + "2bda00000000000000a4e1000130a89f60ea0000000000000450474c000000001a161d1f000000000857415800000000af832f05000000000000000000000000f7aecb63", + "35da00000000000000a4e10001312a6010270000000000000450474c00000000a0e22705000000000857415800000000a0e22705000000000000000000000000d4eecb63", + "53da00000000000000a4e1000134639d400d0300000000000450474c0000000000f1536500000000085741580000000040ff1005000000000000000000000000637ecd63", + "6eda00000000000000009086036ce042ec290d00000000000450474c000000008492ccac010000000857415800000000306ef8040000000000000000000000006f4acf63", + "7bda0000000000000000908603750d6f10270000000000000450474c0000000000c63e0500000000085741580000000000c63e050000000000000000000000000cd9cf63", + "98da00000000000000009086036e2710a0680600000000000450474c00000000c0de17fd000000000857415800000000e0a9060600000000000000000000000055b3d163", + "c8da000000000000000090860379cce356094300000000000450474c00000000edecfacb080000000857415800000000983d2005000000000000000000000000853bd363", + "cddd00000000000000a4e100011faffbc6e60200000000000450474c000000003866566000000000085741580000000040ff1005000000000000000000000000ef58d563", + "e3de0000000000000000908603a68b58404b4c00000000000450474c00000000008932e509000000085741580000000040ff10050000000000000000000000003d3bd663", + "b6e50000000000000000908603e9f90240420f00000000000450474c00000000804d7353020000000857415800000000605af4050000000000000000000000004e72da63", + "e1e80000000000000000908603750d6f10270000000000000450474c0000000000c63e0500000000085741580000000000c63e05000000000000000000000000f631db63", + "59eb00000000000000a4e10001312a6010270000000000000450474c0000000000d8b80500000000085741580000000000d8b80500000000000000000000000022eddb63", + "d6f300000000000000a4e10001312a6010270000000000000450474c00000000804a5d05000000000857415800000000804a5d05000000000000000000000000bac5e363", + "3df4000000000000000090860371369d70640800000000000450474c000000000057d34701000000085741580000000000e1f505000000000000000000000000a7b0e463", + "67f50000000000000000908603750d6f10270000000000000450474c0000000060b2920500000000085741580000000060b29205000000000000000000000000da3ce563", + "abf500000000000000009086036e271000cd4600000000000450474c00000000009afb820a000000085741580000000020aecc050000000000000000000000002269e663", + "61f60000000000000000908603a8074be0c81000000000000450474c0000000000d31f2402000000085741580000000080a2fb04000000000000000000000000cc22e763", + "25fa00000000000000009086036b138833960400000000000450474c0000000030282bb300000000085741580000000000e1f505000000000000000000000000a9cbe863", + "2dfa00000000000000a4e100011e989042830500000000000450474c00000000f8b658bb000000000857415800000000c0832f0500000000000000000000000039d9e963", + "a6fa0000000000000000908603750d6f10270000000000000450474c0000000060b2920500000000085741580000000060b2920500000000000000000000000027c7eb63", + "2cfb000000000000000090860379cce34b8a1f00000000000450474c00000000ce9a381704000000085741580000000058fb10050000000000000000000000007937f063", + "39fb0000000000000000908603fdf378f8040300000000000450474c00000000a026c474000000000857415800000000c09ee6050000000000000000000000009a28f263", + "3cfb00000000000000a4e10001312a6010270000000000000450474c0000000000cf7b0500000000085741580000000000cf7b05000000000000000000000000e36ff263", + "46fb0000000000000000908603fdf37830f31800000000000450474c0000000000839bce03000000085741580000000000e1f505000000000000000000000000a841f363", + "63fb0000000000000000908603750d6f10270000000000000450474c0000000040dc7e0500000000085741580000000040dc7e05000000000000000000000000d2dcf563", + "65fb00000000000000009086037e518c994f4c00000000000450474c00000000a9fe881b0c0000000857415800000000db9b32060000000000000000000000003117f663", + "a2fb0000000000000000908603750d6f204e0000000000000450474c00000000009ef70a00000000085741580000000000cf7b050000000000000000000000002f76fb63", + "d9fb0000000000000000908603fdf37840420f00000000000450474c00000000001a7118020000000857415800000000804a5d05000000000000000000000000a5c90164", + "e4fb0000000000000000908603a7cb97400d0300000000000450474c000000000094357700000000085741580000000000e1f50500000000000000000000000020800364", + "e6fb0000000000000000908603750d6f10270000000000000450474c0000000080539a0500000000085741580000000080539a05000000000000000000000000fe870364", + "f3fb00000000000000009086036f7904720f0600000000000450474c000000002055bbec00000000085741580000000000e1f50500000000000000000000000084ab0464", + "f8fb000000000000000090860379cce3b6441100000000000450474c00000000448fb37602000000085741580000000060b2920500000000000000000000000058810564", + "1bfc0000000000000000908603aa52c556c30400000000000450474c00000000c80132b8000000000857415800000000c09ee60500000000000000000000000097100a64", + "1cfc00000000000000a4e10001312a6010270000000000000450474c0000000000c63e0500000000085741580000000000c63e050000000000000000000000007b130a64", + "44fc0000000000000000908603750d6f10270000000000000450474c0000000080539a0500000000085741580000000080539a0500000000000000000000000091710c64", + "61fc000000000000000090860371369d80de0f00000000000450474c00000000007eb065020000000857415800000000c09ee605000000000000000000000000eddc0e64", + "86fc0000000000000000908603fdf37864791300000000000450474c00000000a0a3a3ac020000000857415800000000804a5d0500000000000000000000000084e71064", + "98fc0000000000000000908603fdf378fcf00800000000000450474c00000000601b583a010000000857415800000000804a5d05000000000000000000000000ca371264", + "a7fc0000000000000000908603750d6f10270000000000000450474c00000000804a5d05000000000857415800000000804a5d050000000000000000000000001c5e1564", + "ccfc00000000000000009086038bcbe5c1480200000000000450474c0000000028c14d50000000000857415800000000804a5d05000000000000000000000000f0891764", + "f30c0100000000000000908603750d6f60270000000000000450474c0000000000476805000000000857415800000000804a5d05000000000000000000000000a14f1f64", + "cd1201000000000000009086036e2710404b4c00000000000450474c00000000806b33120b0000000857415800000000601cab050000000000000000000000006a292264", + "ed120100000000000000908603fdf378c8ee0c00000000000450474c0000000080642ff901000000085741580000000000e1f50500000000000000000000000053552564", + "ef120100000000000000908603aa52c5c04b0300000000000450474c000000000065757f000000000857415800000000c09ee60500000000000000000000000071bc2564", + "531801000000000000009086036f7904c8d50c00000000000450474c0000000080d45ef501000000085741580000000000e1f5050000000000000000000000003cb92964", + "ac200100000000000000908603750d6f10270000000000000450474c0000000000d8b80500000000085741580000000000d8b80500000000000000000000000088702c64", + "8c2601000000000000a4e10001312a6010270000000000000450474c00000000805cd705000000000857415800000000805cd70500000000000000000000000084793264", + "463001000000000000a4e100010bf83440420f00000000000450474c00000000a89667660200000008574158000000003ae0240600000000000000000000000021a43664", + "5c300100000000000000908603750d6f10270000000000000450474c00000000805cd705000000000857415800000000805cd70500000000000000000000000035913964", + "603001000000000000a4e1000106cc3620f40e00000000000450474c0000000000e84cd301000000085741580000000000b4c404000000000000000000000000c89b3964", + "e2340100000000000000908603fdf37840420f00000000000450474c000000000050d6dc01000000085741580000000000b4c40400000000000000000000000082033c64", + "80390100000000000000908603750d6f10270000000000000450474c000000006086c3050000000008574158000000006086c3050000000000000000000000004e714d64", + "943901000000000000a4e10001312a6010270000000000000450474c000000006086c3050000000008574158000000006086c3050000000000000000000000009aa84e64", + "a8390100000000000000908603a8074b808b0800000000000450474c0000000000406f4001000000085741580000000000d8b805000000000000000000000000b2974f64", + "c739010000000000000090860379cce349420f00000000000450474c000000008b9d95fa01000000085741580000000030d8100500000000000000000000000096045364", + "cf390100000000000000908603750d6f10270000000000000450474c0000000080778e0600000000085741580000000080778e0600000000000000000000000079145464", + "d9390100000000000000908603f60b6fca270900000000000450474c0000000053671b1e010000000857415800000000fbb3c4040000000000000000000000007cf05664", + "e33901000000000000009086036f9b66c86c2000000000000450474c00000000804499f204000000085741580000000000e1f505000000000000000000000000ed305764", + "213a01000000000000a4e1000120fd35975f0300000000000450474c00000000c4d71968000000000857415800000000c071b50400000000000000000000000005105964", + "223a0100000000000000908603736a22404b4c00000000000450474c0000000000888020090000000857415800000000004aac040000000000000000000000001e925964", + "243a01000000000000009086036ce04274ff0e00000000000450474c0000000080404fcb010000000857415800000000004aac04000000000000000000000000d1af5964", + "2a3a0100000000000000908603eb7c6190410600000000000450474c00000000709891bf000000000857415800000000f022ac04000000000000000000000000be255a64", + "483a01000000000000009086036b46e8e9ff0300000000000450474c00000000a32fb57900000000085741580000000018a8a4040000000000000000000000001a045c64", + "673a010000000000000090860373ddfce5ea7101000000000450474c000000002de7ba4d2c000000085741580000000090a9ad04000000000000000000000000b1e25c64", + "6b3a0100000000007093b9d9abcb52a49b5b0600000000000450474c000000007e5ef8c0000000000857415800000000a09ba10400000000000000000000000068ee5c64", + "753a0100000000000000908603a68b5880969800000000000450474c0000000000da7c72180000000857415800000000402c42060000000000000000000000000c205f64", + "7e3a0100000000000000908603750d6f10270000000000000450474c0000000000c63e0500000000085741580000000000c63e05000000000000000000000000d77c5f64", + "813a01000000000000a4e10001064c7574820000000000000450474c0000000000a9ec0f00000000085741580000000000b4c404000000000000000000000000ccd45f64", + "bd3a0100000000007093b9d9abcb52a4f5010500000000000450474c000000005eeafca000000000085741580000000060cce70400000000000000000000000003f96164", + "bf3a01000000000000009086038603c66c530400000000000450474c00000000702c1d8200000000085741580000000040ed9604000000000000000000000000b1216264", + "cc3a0100000000004082f1d960e3b3c1c6bb2d00000000000450474c0000000038aa7eee05000000085741580000000040ff1005000000000000000000000000d5636464", + "f03b0100000000000000908603fdf37840420f00000000000450474c00000000008eead0010000000857415800000000802fa60400000000000000000000000038936964", + "103c0100000000000000908603750d6f10270000000000000450474c0000000000b4c40400000000085741580000000000b4c404000000000000000000000000dddb6c64", + "304401000000000000a4e100011d1e47d75b0200000000000450474c00000000d49e1a45000000000857415800000000c0687804000000000000000000000000d45a7064", + "3e440100000000000000908603993d42fa799900000000000450474c00000000a8e3af322d000000085741580000000040f2800b000000000000000000000000504f7164", + "544401000000000000009086036f228738b00800000000000450474c00000000867f4c160100000008574158000000007638e30400000000000000000000000056657264", + "7044010000000000000000d27070e47e89350100000000000450474c000000000046c323000000000857415800000000eb5e8304000000000000000000000000bcda7464", + "7144010000000000000000d27070e47e60ea0000000000000450474c00000000a0e2141d00000000085741580000000070d0d804000000000000000000000000dbda7464", + "7244010000000000000000d27070e47e50c30000000000000450474c000000004078e719000000000857415800000000404b2e05000000000000000000000000f0da7464", + "7344010000000000000000d27070e47ec8af0000000000000450474c0000000058c1721900000000085741580000000030b9a7050000000000000000000000000ddb7464", + "7444010000000000000000d27070e47e50c30000000000000450474c0000000018056b220000000008574158000000003834e20600000000000000000000000028db7464", + "7544010000000000000000d27070e47e73e20000000000000450474c000000006f01a62f0000000008574158000000001028380800000000000000000000000044db7464", + "89440100000000007093b9d9abcb52a40caa0700000000000450474c00000000e035720d010000000857415800000000804a5d05000000000000000000000000c32e7664", + "92440100000000000000908603750d6f10270000000000000450474c0000000000b4c40400000000085741580000000000b4c404000000000000000000000000d39d7764", + "984401000000000000a4e100011e9890e3df0700000000000450474c00000000464b3cf000000000085741580000000020b6a704000000000000000000000000097b7864", + "c5440100000000000000908603f42c36868b0200000000000450474c00000000c8998f4a000000000857415800000000c06878040000000000000000000000002a8b7b64", + "e0440100000000000000308603692c84171e1200000000000450474c000000007062b7c302000000085741580000000000e1f50500000000000000000000000007b57e64", + "044601000000000000a4e100010bf83440420f00000000000450474c00000000a89667660200000008574158000000003ae024060000000000000000000000004a8d8564", + "0c460100000000000000908603750d6f10270000000000000450474c0000000000bd010500000000085741580000000000bd010500000000000000000000000078ae8564", + "3d46010000000000000090860379cce36e4c2600000000000450474c00000000525cbe94040000000857415800000000f022ac04000000000000000000000000772b8a64", + "594601000000000000009086036b138840420f00000000000450474c0000000000fac6d30100000008574158000000008082ad0400000000000000000000000062a08e64", + "5c460100000000000000908603f2b86560cc0500000000000450474c00000000207de5d600000000085741580000000030b9a70500000000000000000000000068db8f64", + "5d460100000000000000908603f2b865c97b0500000000000450474c00000000ceb03acb00000000085741580000000030b9a705000000000000000000000000bbdb8f64", + "634601000000000000009086036b138840420f00000000000450474c0000000000eb08bf010000000857415800000000c0687804000000000000000000000000ccf98f64", + "684601000000000000a4e100012a1ae9ac282100000000000450474c000000003404aec3030000000857415800000000fd406f0400000000000000000000000098249064", + "79460100000000000000908603fdf37840420f00000000000450474c00000000001a7118020000000857415800000000804a5d0500000000000000000000000012ea9064", + "7b460100000000000000908603defd01be641b00000000000450474c000000006408e91b030000000857415800000000e0f26e04000000000000000000000000260a9164", + "8746010000000000000000d27080bbb580841e00000000000450474c0000000000d6117e030000000857415800000000c06878040000000000000000000000003b8d9164", + "8d460100000000000000908603750d6f10270000000000000450474c0000000000d8b80500000000085741580000000000d8b805000000000000000000000000ecbf9164", + "9446010000000000000000d27080bbb580841e00000000000450474c0000000030fefe6a030000000857415800000000b6fe5f0400000000000000000000000062eb9264", + "9546010000000000000000d27080bbb580841e00000000000450474c00000000f8fefe6a030000000857415800000000b7fe5f0400000000000000000000000075eb9264", + "9646010000000000000000d27080bbb580841e00000000000450474c00000000c0fffe6a030000000857415800000000b8fe5f040000000000000000000000007feb9264", + "af460100000000000000908603ece00208441d00000000000450474c000000008078317704000000085741580000000000e1f505000000000000000000000000e7439464", + "b54601000000000000009086036e1bf72e990500000000000450474c00000000bc188c9e00000000085741580000000020435204000000000000000000000000bd9c9464", + "c3460100000000000000908603fdf37840420f00000000000450474c000000000050d6dc01000000085741580000000000b4c404000000000000000000000000f9799564", + "d94601000000000000a4e100011faffb2a450400000000000450474c00000000908c1f96000000000857415800000000804a5d0500000000000000000000000013399764", + "e14601000000000000009086036e1bf7883a0600000000000450474c0000000000312eaf00000000085741580000000000a24a0400000000000000000000000090cc9764", + "f1460100000000000000908603f8aff6400d0300000000000450474c000000001cd57f57000000000857415800000000dbfd5f04000000000000000000000000fbda9864", + "f44601000000000000009086036e1bf7d2b80000000000000450474c00000000c21e601400000000085741580000000090724e0400000000000000000000000056229964", + "f6460100000000000000908603defd01e09c4100000000000450474c00000000c0d730940700000008574158000000002017830400000000000000000000000009559964", + "fb4601000000000000009086038bae8e66070100000000000450474c0000000078fb2c1e00000000085741580000000040a179040000000000000000000000007a779964", + "fc460100000000000000908603750d6f10270000000000000450474c0000000000c63e0500000000085741580000000000c63e050000000000000000000000005d979964", + "fd4601000000000000009086036ce4e79907d605000000000450474c00000000fa0731a3a30000000857415800000000a0464704000000000000000000000000a89e9964", + "07470100000000000000908603cc8eb7e5440600000000000450474c0000000040f4e8c300000000085741580000000000b4c4040000000000000000000000009bb89964", + "104701000000000000009086036e1bf7b8b50200000000000450474c000000007cb6584c000000000857415800000000488a4c04000000000000000000000000830e9a64", + "1c4701000000000000009086036dde1451050700000000000450474c0000000010ac3f1201000000085741580000000000e1f505000000000000000000000000ec4a9b64", + "234701000000000000a4e1000130a89fb8820100000000000450474c00000000917f412c000000000857415800000000ce64780400000000000000000000000017d69b64", + "2f4701000000000000a4e10001312a6010270000000000000450474c0000000000c63e0500000000085741580000000000c63e0500000000000000000000000009389c64", + "38470100000000000000908603eb7c6130390a00000000000450474c000000008013852701000000085741580000000080266904000000000000000000000000069c9d64", + "3c4701000000000000009086036f228774a61000000000000450474c000000005caf53150200000008574158000000007638e304000000000000000000000000fad89d64", + "4c4701000000000030c661ee787ab259404b4c00000000000450474c00000000807f788e080000000857415800000000608561040000000000000000000000002db29e64", + "60470100000000000000908603750d6f10270000000000000450474c0000000000bd010500000000085741580000000000bd0105000000000000000000000000c601a164", + "6a4701000000000000a4e100011cdcc8e2c40300000000000450474c00000000f86b8868000000000857415800000000c05f3b04000000000000000000000000d197a164", + "6d47010000000000000090860372ada186846d00000000000450474c000000006cafdadb0f0000000857415800000000200fa80500000000000000000000000091eaa164", + "8347010000000000000090860379cce3d8d61100000000000450474c00000000df72a00a020000000857415800000000ce64780400000000000000000000000008b1a364", + "84470100000000002019b86a522abbe1986d0100000000000450474c0000000090c502f60100000008574158000000006062a335000000000000000000000000aa06a464", + "85470100000000002019b86a522abbe150da0000000000000450474c00000000e03d3f60060000000857415800000000608a0e24010000000000000000000000cc06a464", + "8d470100000000000000908603731b88f0b51c00000000000450474c000000005019c716030000000857415800000000b0e53304000000000000000000000000d843a564", + "8f470100000000000000908603739243b8880000000000000450474c00000000e010811500000000085741580000000040e0240600000000000000000000000080a6a664", + "99470100000000000000908603692ba4bb6e9400000000000450474c0000000038de5462140000000857415800000000804a5d050000000000000000000000009742a764", + "9a470100000000000000908603750d6f10270000000000000450474c0000000000c63e0500000000085741580000000000c63e050000000000000000000000009b93a764", + "9b4701000000000000009086036e1bf74cd70c00000000000450474c0000000048f99c5c010000000857415800000000607c2404000000000000000000000000489ba764", + "9d4701000000000000009086036b138840420f00000000000450474c0000000000863ba1010000000857415800000000801d2c04000000000000000000000000e2a3a764", + "ab470100000000000000908603d4d8f200fa0000000000000450474c000000000098151b000000000857415800000000c05f3b040000000000000000000000003d18a964", + "ae470100000000000000908603bad7e4c07a1000000000000450474c000000000090db920f010000085741580000000000ecba830200000000000000000000007b5fa964", + "c547010000000000000090860374d153f0550000000000000450474c0000000030ad1409000000000857415800000000d0ab200400000000000000000000000025c0aa64", + "ce4701000000000000009086036e1bf718270000000000000450474c00000000e0b21d0400000000085741580000000040db1c040000000000000000000000005d2eab64", + "cf4701000000000000009086036b46e834880300000000000450474c000000005c912f5f00000000085741580000000030b41c040000000000000000000000004969ab64", + "d34701000000000000009086036ce0427c321000000000000450474c0000000058bdeeb3010000000857415800000000a0541b04000000000000000000000000fc0aac64", + "d74701000000000000009086036e1bf7442e0300000000000450474c0000000074850a56000000000857415800000000d0ab20040000000000000000000000000545ac64", + "e2470100000000000000908603739243a08c0000000000000450474c00000000c0e3bf140000000008574158000000006086c305000000000000000000000000441aad64", + "e3470100000000000000908603ec1787047c0000000000000450474c00000000600d3f0d000000000857415800000000801d2c04000000000000000000000000512fad64", + "074801000000000000009086036ce0421c871100000000000450474c000000007f1dbdd7010000000857415800000000e4511b04000000000000000000000000b9b1af64", + "16480100000000000000908603da69d220291b00000000000450474c00000000c03294da02000000085741580000000060b81a040000000000000000000000006840b064", + "384801000000000000a4e100011d1e47e0930400000000000450474c0000000000752b7d000000000857415800000000801d2c040000000000000000000000003046b264", + "564801000000000000009086036e1bf779110100000000000450474c00000000c70f1b1d000000000857415800000000f04c2804000000000000000000000000b635b464", + "5a480100000000000000908603b41e46c0e1e400000000000450474c00000000807e69ab190000000857415800000000608561040000000000000000000000004c6eb464", + "65480100000000000000908603750d6f10270000000000000450474c000000008038e3040000000008574158000000008038e3040000000000000000000000004e0fb564", + "72480100000000000000908603ec178756a90600000000000450474c00000000c0925abb00000000085741580000000000a24a040000000000000000000000001ba3b564", + "7d4801000000000000009086036ce0429ce00000000000000450474c0000000028a4991700000000085741580000000060b81a040000000000000000000000007a8fb964", + "a64801000000000000009086036e1bf715270000000000000450474c000000003fac1f0400000000085741580000000030251f0400000000000000000000000080aabc64", + "ab4801000000000000009086036b138840420f00000000000450474c0000000020efb19701000000085741580000000008b313040000000000000000000000006ce8bc64", + "ac48010000000000000090860379cce347cc0800000000000450474c0000000085bcaff6000000000857415800000000964647040000000000000000000000001af1bc64", + "b04801000000000000009086036b224330570500000000000450474c0000000000c39dd000000000085741580000000000e1f505000000000000000000000000b50dbd64", + "be4801000000000000009086036e1bf740420f00000000000450474c0000000000e3598f010000000857415800000000c056fe030000000000000000000000002064bd64", + "bf4801000000000000009086036e1bf740420f00000000000450474c0000000000c44f9501000000085741580000000000990d040000000000000000000000004764bd64", + "c24801000000000000a4e100012b263fe9fb0500000000000450474c00000000e799939e000000000857415800000000e2270b040000000000000000000000000f78bd64", + "cc480100000000000000908603750d6f10270000000000000450474c0000000000c63e0500000000085741580000000000c63e05000000000000000000000000bbf4bd64", + "d64801000000000000009086036ce042744f2300000000000450474c00000000f8e172870300000008574158000000006073e703000000000000000000000000d06bbe64", + "e24801000000000000009086036943927c0e1f00000000000450474c00000000a00e3451030000000857415800000000801d2c04000000000000000000000000ecfbbe64", + "ee4801000000000060303667536836dd7d6a5601000000000450474c0000000093d546b32100000008574158000000001b31d803000000000000000000000000c7efbf64", + "f24801000000000000a4e100012e0f9ae0930400000000000450474c00000000c0ea337b000000000857415800000000a0541b04000000000000000000000000171cc064", + "08490100000000000000908603eed935e8800000000000000450474c00000000405dfb0c0000000008574158000000008014ef030000000000000000000000001c52c264", + "0c490100000000007093b9d9abcb52a4f17b0200000000000450474c0000000052abb14100000000085741580000000020050904000000000000000000000000d467c264", + "0d490100000000007093b9d9abcb52a4dc6e0000000000000450474c00000000f8b5730b000000000857415800000000200509040000000000000000000000003468c264", + "0e4901000000000000009086036dd35518180200000000000450474c000000006b0cc3340000000008574158000000001b31d803000000000000000000000000a37bc264", + "154901000000000000a4e100011d1e47e0930400000000000450474c0000000080a33a7400000000085741580000000040d2df03000000000000000000000000576ac364", + "214901000000000000a4e10001005fe484460700000000000450474c00000000401241c100000000085741580000000000990d04000000000000000000000000728bc664", + "234901000000000000009086037f4027e0c81000000000000450474c000000007454a0d60100000008574158000000009646470400000000000000000000000086b5c664", + "344901000000000000a4e10001294f9049b41700000000000450474c000000001592a4a7020000000857415800000000dbfd5f040000000000000000000000003f10c864", + "5a490100000000000000908603750d6f10270000000000000450474c0000000000d8b80500000000085741580000000000d8b805000000000000000000000000fe1cca64", + "5f4901000000000000a4e1000106cc3680d50400000000000450474c0000000000e29e8d000000000857415800000000c06878040000000000000000000000005879ca64", + "744901000000000000009086036b9809ecc4dc00000000000450474c00000000c042ccaf21000000085741580000000000e1f5050000000000000000000000001845cc64", + "774901000000000000009086037105d2400d0300000000000450474c00000000406c8d52000000000857415800000000d0ab2004000000000000000000000000cfd3cc64", + "7b490100000000002019b86a522abbe120700100000000000450474c00000000a098cb1801000000085741580000000050b7cb1d000000000000000000000000e314cd64", + "7d490100000000000000908603f8aff6400d0300000000000450474c00000000b883915500000000085741580000000096464704000000000000000000000000043ecd64", + "8649010000000000000090860379cce36d420c00000000000450474c000000001e81be570100000008574158000000009646470400000000000000000000000033f8cd64", + "a8490100000000000000908603eb7c61a0680600000000000450474c0000000000943eb400000000085741580000000000a24a040000000000000000000000000feed164", + "c0490100000000000000908603eb7862efca9f01000000000450474c000000005c9c3c3d29000000085741580000000040d2df03000000000000000000000000449cd364", + "c34901000000000000009086036ddeb011360100000000000450474c000000006631272300000000085741580000000060ba6d04000000000000000000000000cffdd364", + "cd4901000000000000a4e100014a990f83640f00000000000450474c000000005851d78c0100000008574158000000008014ef03000000000000000000000000a5f7d464", + "d34901000000000000a4e1000125314670640800000000000450474c00000000b8763be000000000085741580000000008b313040000000000000000000000005e56d564", + "d44901000000000000a4e100010e8927d8290800000000000450474c000000002cea1dda00000000085741580000000008b31304000000000000000000000000a156d564", + "d54901000000000000a4e100012290a2e8500800000000000450474c00000000349d31de00000000085741580000000008b31304000000000000000000000000ee56d564", + "d64901000000000000a4e100012293caa0d90800000000000450474c00000000d08f76ec00000000085741580000000008b313040000000000000000000000003957d564", + "d7490100000000000000908603a6dfd3107a0700000000000450474c000000008844c5c700000000085741580000000008b313040000000000000000000000007157d564", + "d8490100000000000000908603daba2820a10700000000000450474c0000000090f7d8cb00000000085741580000000008b31304000000000000000000000000b557d564", + "d949010000000000000090860397ac4d808b0800000000000450474c00000000c0294fe400000000085741580000000008b31304000000000000000000000000f057d564", + "da4901000000000000009086038d7c6c808b0800000000000450474c00000000c0294fe400000000085741580000000008b313040000000000000000000000003158d564", + "db490100000000000000908603764f6e30c80700000000000450474c0000000098aaeccf00000000085741580000000008b313040000000000000000000000008058d564", + "dc49010000000000000090860389addc70640800000000000450474c00000000b8763be000000000085741580000000008b31304000000000000000000000000d658d564", + "dd49010000000000000090860373fa1cf09c0900000000000450474c00000000f80ed90001000000085741580000000008b313040000000000000000000000002a59d564", + "df490100000000000000908603750d6f10270000000000000450474c00000000805cd705000000000857415800000000805cd705000000000000000000000000b0b3d564", + "084a01000000000000009086036ed39cc0270900000000000450474c00000000004775e800000000085741580000000040d2df03000000000000000000000000ab66d764", + "134a010000000000000090860372c1331b859700000000000450474c00000000489a1f2f100000000857415800000000801d2c0400000000000000000000000076ced764", + "1c4a01000000000000a4e1000136f5249fb12b00000000000450474c00000000e0a594550d000000085741580000000000c2eb0b0000000000000000000000007f71d864", + "704a0100000000000000908603750d6f10270000000000000450474c0000000000cf7b0500000000085741580000000000cf7b0500000000000000000000000016dfe164", + "724a010000000000000090860374653403512502000000000450474c000000004a1af290360000000857415800000000e058e10300000000000000000000000048a2e264", + "744a0100000000000000908603692f13e0930400000000000450474c000000000cc155730000000008574158000000001a31d8030000000000000000000000000090e364", + "754a010000000000406fc626465a9339b35d0200000000000450474c0000000089c79c3b0000000008574158000000001931d8030000000000000000000000003090e364", + "764a0100000000000000908603b3d3cd38400000000000000450474c00000000007845060000000008574158000000000090d0030000000000000000000000004f96e364", + "784a0100000000000000908603753ba5d4300000000000000450474c0000000000b4c4040000000008574158000000000090d003000000000000000000000000fe27e464", + "794a0100000000000000908603753ba5d4300000000000000450474c00000000d0c6d70400000000085741580000000040d2df030000000000000000000000000828e464", + "7b4a0100000000000000908603b17b4aa1af1d00000000000450474c000000003db826e6020000000857415800000000ff8fd003000000000000000000000000274ee464", + "7c4a01000000000000a4e100013ed6aba8d20200000000000450474c00000000db679246000000000857415800000000fe8fd0030000000000000000000000008451e464", + "7e4a010000000000000090860375b01ea9330100000000000450474c00000000af69cf1d000000000857415800000000d6eec80300000000000000000000000036ace464", + "7f4a01000000000000a4e100014138ad4dabe600000000000450474c00000000f60fad59160000000857415800000000e0eec803000000000000000000000000a4c6e464" + ], + "more": false, + "next_key": "" + }, + "text": "{\"rows\":[\"c002000000000000000000d27070de89204e0000000000000450474c000000000002bcc625000000085741580000000000015ee3120000000000000000000000b56b5a60\",\"1a03000000000000000000d27070f3af50c30000000000000450474c00000000806dd5af00000000085741580000000080af2a23000000000000000000000000ef1f6d60\",\"0c05000000000000000090860371c7bef0bc2b00000000000450474c00000000003f642126150000085741580000000000015ee312000000000000000000000000d87660\",\"810700000000000000009086037522bf409c0000000000000450474c0000000000505c18a30100000857415800000000001417c668000000000000000000000044188060\",\"c0090000000000000000308603698b257f335000000000000450474c000000007018b8236e000000085741580000000000e9a435000000000000000000000000f4978d60\",\"be0a00000000000000009086036e042c22180100000000000450474c000000000088ffe2161a0000085741580000000000409452a3030000000000000000000039709160\",\"930b000000000000000090860374d2d197c60200000000000450474c000000001411e050040000000857415800000000c0b4bc3c00000000000000000000000034849560\",\"cc1000000000000000009086038a4c6910270000000000000450474c0000000000743ba40b000000085741580000000000743ba40b00000000000000000000004215b660\",\"cd1000000000000000009086038a4c6910270000000000000450474c000000000014e85d0f00000008574158000000000014e85d0f00000000000000000000008315b660\",\"ce1000000000000000009086038a4c6910270000000000000450474c0000000000902f5009000000085741580000000000902f500900000000000000000000009a15b660\",\"f210000000000000000090860376944790d00300000000000450474c0000000000d426badb6e0000085741580000000000f467306f04000000000000000000000c37b660\",\"f3100000000000000000908603769447400d0300000000000450474c000000000040a72b1e24000008574158000000000090fb4ece01000000000000000000006437b660\",\"f5100000000000000000908603769447400d0300000000000450474c00000000004cc285cf3c0000085741580000000000b749600a0300000000000000000000eb3db660\",\"fe1000000000000000009086038a4c6910270000000000000450474c0000000000e8764817000000085741580000000000e876481700000000000000000000000d5db660\",\"ff1000000000000000009086038a4c6910270000000000000450474c0000000000d0ed902e000000085741580000000000d0ed902e0000000000000000000000165db660\",\"001100000000000000009086038a4c6910270000000000000450474c000000000088526a7400000008574158000000000088526a7400000000000000000000001e5db660\",\"011100000000000000009086038a4c6910270000000000000450474c000000000010a5d4e800000008574158000000000010a5d4e80000000000000000000000235db660\",\"021100000000000000009086038a4c6910270000000000000450474c0000000000204aa9d1010000085741580000000000204aa9d10100000000000000000000295db660\",\"031100000000000000009086038a4c6910270000000000000450474c000000000030ef7dba02000008574158000000000030ef7dba02000000000000000000002d5db660\",\"041100000000000000009086038a4c6910270000000000000450474c000000000098f73e5d01000008574158000000000098f73e5d0100000000000000000000365db660\",\"051100000000000000009086038a4c69a0860100000000000450474c000000000070c9b28b0000000857415800000000005847f80d0000000000000000000000855db660\",\"5b11000000000000000090860376944710270000000000000450474c00000000004ff977ba0200000857415800000000004ff977ba02000000000000000000002f5db760\",\"5e11000000000000000090860376944710270000000000000450474c0000000000409452a3030000085741580000000000409452a303000000000000000000003f5db760\",\"8d13000000000000000090860371fe2100710200000000000450474c000000000060f6270e000000085741580000000000667fe2000000000000000000000000d38dbf60\",\"8e13000000000000000090860371fe2100710200000000000450474c00000000003060e12400000008574158000000000003164e020000000000000000000000e78dbf60\",\"8f13000000000000000090860371fe2100710200000000000450474c000000000060c0c249000000085741580000000000062c9c040000000000000000000000f88dbf60\",\"9013000000000000000090860371fe2100710200000000000450474c000000000050b884cc000000085741580000000000854bc80c0000000000000000000000118ebf60\",\"9113000000000000000090860371fe2100710200000000000450474c0000000000d03406170100000857415800000000004d6370110000000000000000000000998ebf60\",\"551500000000000000009086039742affa280000000000000450474c00000000c0e24fabdc0200000857415800000000006e0372ba020000000000000000000017d3c460\",\"9117000000000000000090860371b40216b1ab00000000000450474c0000000040ea4cb6590f0000085741580000000000d6117e0300000000000000000000009cd7c960\",\"9217000000000000000090860371b40216b1ab00000000000450474c0000000040ea4cb6590f0000085741580000000000d6117e030000000000000000000000b1d7c960\",\"a717000000000000000000d27070de89a0860100000000000450474c00000000c0aff62901000000085741580000000060decb1d00000000000000000000000014fec960\",\"3318000000000000000090860376944710270000000000000450474c0000000000e0abb9523e0100085741580000000000e0abb9523e010000000000000000004e63ca60\",\"761800000000000000009086036dcd5f20a10700000000000450474c0000000000743ba40b000000085741580000000000ca9a3b000000000000000000000000d7faca60\",\"251b00000000000000009086036ec6fc30750000000000000450474c0000000000f0ab75a40d00000857415800000000005039278c0400000000000000000000a019d060\",\"271b00000000000000009086036ec6fc75860000000000000450474c0000000080c8832450000000085741580000000000e87648170000000000000000000000151ad060\",\"451c0000000000000000908603a75d85c4590800000000000450474c0000000000084fc62800000008574158000000000020bcbe0000000000000000000000001aebd260\",\"641c00000000000000009086038b4cc210980200000000000450474c0000000000211165130000000857415800000000001110240100000000000000000000002ec0d360\",\"ae1c0000000000000000908603a75d85b8000900000000000450474c00000000b02f00ea080000000857415800000000a06dad26000000000000000000000000a56fd560\",\"1520000000000000000030860367cfea5ebf1200000000000450474c0000000097cd53b1050000000857415800000000bd7fdc0b0000000000000000000000005898e160\",\"8326000000000000000090860373846edb8d0000000000000450474c00000000007fda1aa9000000085741580000000000d0ed902e0000000000000000000000fb1afb60\",\"ca26000000000000000090860376944700a60e00000000000450474c0000000000204148dd00000008574158000000000003164e02000000000000000000000053dbfe60\",\"cb26000000000000000090860376944700a60e00000000000450474c0000000000a0b6ccbc010000085741580000000000e721a204000000000000000000000065dbfe60\",\"37290000000000000000908603739779da010000000000000450474c000000001068b30100000000085741580000000080cae1230000000000000000000000007ce60d61\",\"77290000000000000000908603739779e9010000000000000450474c0000000000c9ad0100000000085741580000000000105522000000000000000000000000cf841061\",\"d42a000000000000000090860373977927030000000000000450474c00000000aea7510300000000085741580000000005902029000000000000000000000000548b1561\",\"ab2d000000000000000090860374a66c7e040000000000000450474c000000000a406604000000000857415800000000c77a4126000000000000000000000000d9581d61\",\"082e000000000000000000d270c0db25f4330000000000000450474c0000000000f26af71e000000085741580000000000e87648170000000000000000000000c3ad1e61\",\"002f00000000000000009086036e4f0f6e000000000000000450474c0000000094738f04000000000857415800000000d5f3939e0100000000000000000000005cf62161\",\"0b30000000000000000090860373882965000000000000000450474c0000000058687902000000000857415800000000809ff9f4000000000000000000000000247d2361\",\"9930000000000000000090860376486101000000000000000450474c0000000040778c020000000008574158000000000034f28e630000000000000000000000d3fb2561\",\"3c3100000000000000009086037397795a060000000000000450474c000000002e1e4b0400000000085741580000000083a4671a0000000000000000000000007cd52661\",\"77330000000000000000908603a56ca705000000000000000450474c00000000b083020100000000085741580000000000cfa4e3070000000000000000000000e8d92c61\",\"353400000000000000009086037fb80517950000000000000450474c0000000076128b1d0200000008574158000000004f48e38d000000000000000000000000116b3161\",\"b334000000000000000000d270c0db25ac4e0000000000000450474c000000000076e2bbd803000008574158000000000008c1f1e80100000000000000000000f7493761\",\"493b000000000000000090860371ac527e310100000000000450474c000000000084ea6657000000085741580000000000e0052d0b0000000000000000000000d6e28d61\",\"0c3f00000000000000009086033280f5b5030000000000000450474c00000000ec34eaca000000000857415800000000245d325a0800000000000000000000001ed89e61\",\"4b3f00000000000000009086036f6ece14090200000000000450474c000000009069a224040000000857415800000000409d824f00000000000000000000000061c39f61\",\"05450000000000000000908603738334c26a0000000000000450474c00000000000df3a13f000000085741580000000000e876481700000000000000000000009f70bb61\",\"3f460000000000000000908603df95c8a00f0000000000000450474c0000000000a0acb903000000085741580000000000902f50090000000000000000000000cb26c361\",\"9e460000000000000000908603f8b88e741c0100000000000450474c00000000509aef3e0000000008574158000000004086a408000000000000000000000000f067c361\",\"7947000000000000000090860371a761c5eb1b00000000000450474c00000000b035f2e73f0000000857415800000000002f6859000000000000000000000000ca33c461\",\"824700000000000000009086036b100b7c350b00000000000450474c0000000054d39060020000000857415800000000b0d148080000000000000000000000003a39c461\",\"e6490000000000000000908603769447a0252600000000000450474c0000000000166bf10a000000085741580000000000a7340b0000000000000000000000001dfac561\",\"ae4a000000000000000090860374479aa9530100000000000450474c00000000302a8f48000000000857415800000000003b5808000000000000000000000000d465c661\",\"c04a0000000000000000908603e5039a007d0000000000000450474c00000000bcccda18000000000857415800000000fb5fc407000000000000000000000000f282c661\",\"d54a00000000000000009086037281d3007d0000000000000450474c0000000000cbda18000000000857415800000000705fc4070000000000000000000000009e9dc661\",\"c64b00000000000000009086036e2a01f47a0000000000000450474c0000000026af5525000000000857415800000000bd7fdc0b000000000000000000000000210ac861\",\"974d000000000000000090860371a0853aa70000000000000450474c000000004093083300000000085741580000000000c2eb0b000000000000000000000000481fca61\",\"cc50000000000000000090860379c69622350c00000000000450474c00000000a08049500900000008574158000000000065cd1d0000000000000000000000000ba7cd61\",\"e2520000000000000000908603ecdeaa10270000000000000450474c00000000e05dcb0a000000000857415800000000e05dcb0a00000000000000000000000092e5d261\",\"245300000000000000003086036981451108c800000000000450474c00000000bb615652240000000857415800000000a3cb17070000000000000000000000003a79d361\",\"f85500000000000000a4e100010bbabc86650000000000000450474c00000000e8b4ef2d00000000085741580000000052b4ac110000000000000000000000006db8d861\",\"b45a0000000000002084704faa3fb57904010000000000000450474c00000000706d4500000000000857415800000000c0496e0a0000000000000000000000000cb3e061\",\"8c5b0000000000000000908603e31a3a92810000000000000450474c0000000080b3241600000000085741580000000000fcac06000000000000000000000000629be261\",\"055c0000000000000000908603f6df9972600000000000000450474c000000006a688610000000000857415800000000d068b1060000000000000000000000004490e361\",\"105c0000000000000000908603ffa8caf4330000000000000450474c00000000f0e8ce08000000000857415800000000c66b9f0600000000000000000000000003afe361\",\"115c00000000000000009086037281d35e4c0000000000000450474c0000000080100d0d00000000085741580000000000fcac06000000000000000000000000deb5e361\",\"125c0000000000000000908603f95d57b0540000000000000450474c000000009050600f000000000857415800000000b0a417070000000000000000000000008bb7e361\",\"165c0000000000000000908603f95dd778370000000000000450474c00000000707f6709000000000857415800000000c66b9f0600000000000000000000000074dae361\",\"185c00000000000000009086038e7635bc3e0000000000000450474c0000000027bcbf0a000000000857415800000000b968b10600000000000000000000000058dce361\",\"265c0000000000000000908603f95d9140330000000000000450474c00000000804b300900000000085741580000000060e8000700000000000000000000000073f7e361\",\"7b5c00000000000000a4e10001014f0558491a00000000000450474c0000000000fd2dd0040000000857415800000000000e270700000000000000000000000098ece461\",\"315d0000000000000000908603f95ca258de0000000000000450474c00000000f8b91826000000000857415800000000d068b10600000000000000000000000019afe661\",\"a25d0000000000000000908603aeb878204e0000000000000450474c0000000000725d1700000000085741580000000000b9ae0b000000000000000000000000b4ece661\",\"c55d0000000000000000908603f95d91887c0000000000000450474c00000000a0b25b150000000008574158000000004e16b306000000000000000000000000689ae761\",\"c75d0000000000000000908603785f67e4520000000000000450474c00000000d4da330e000000000857415800000000d068b1060000000000000000000000005b9ce761\",\"c95d0000000000000000908603e5bf2f2c790000000000000450474c0000000027328b14000000000857415800000000c66b9f060000000000000000000000002bb1e761\",\"ca5d0000000000000000908603f95b1f9a330000000000000450474c000000001a936c0900000000085741580000000010532207000000000000000000000000ddb1e761\",\"cb5d0000000000000000908603e58856363d0000000000000450474c000000005f591d0b00000000085741580000000040cb1707000000000000000000000000c0b2e761\",\"cd5d00000000000000009086037281d37e6d0000000000000450474c000000005287f313000000000857415800000000402a1e0700000000000000000000000018b4e761\",\"cf5d0000000000000000908603ffa86b86470000000000000450474c000000006c9eec100000000008574158000000001c423e0900000000000000000000000043b5e761\",\"d05d0000000000000000908603e504e44cef0000000000000450474c00000000502fe63f000000000857415800000000c0496e0a0000000000000000000000008cb5e761\",\"de5d0000000000000000908603f95cf210270000000000000450474c0000000010532207000000000857415800000000105322070000000000000000000000005ff9e761\",\"ec5d0000000000000000908603f95b1f36330000000000000450474c000000001ee61f09000000000857415800000000d0c4f506000000000000000000000000db0fe861\",\"256000000000000000009086036ff808d8e01c00000000000450474c0000000020674411050000000857415800000000c0c2da06000000000000000000000000cf8fe961\",\"266000000000000000009086036ff808d8e01c00000000000450474c000000008024482b060000000857415800000000003b5808000000000000000000000000df8fe961\",\"a5630000000000000000908603e504e46e320000000000000450474c000000001003340900000000085741580000000080f3200700000000000000000000000014cfeb61\",\"b16f000000000000000090860368add8981a2600000000000450474c00000000c4b43beb06000000085741580000000040cb1707000000000000000000000000a217f761\",\"3d78000000000000000000d27070de89a0860100000000000450474c00000000406f493e000000000857415800000000208b3a06000000000000000000000000bc8a0162\",\"8a7900000000000000009086036b298829be9600000000000450474c000000004ec5bfea170000000857415800000000e09b320600000000000000000000000089d30262\",\"4a7b000000000000000030860356fbcfc7a41100000000000450474c00000000e03a696205000000085741580000000000c2eb0b00000000000000000000000048610962\",\"ba7d000000000000000090860374997f400d0300000000000450474c0000000000180d8f000000000857415800000000000e2707000000000000000000000000127c1362\",\"117f00000000000000a4e1000113c73c08fe0700000000000450474c0000000000fa606a3f000000085741580000000000b4f135010000000000000000000000aeca1e62\",\"5c80000000000000e0aba93ffb6baaa910270000000000000450474c0000000000204aa9d1010000085741580000000000204aa9d10100000000000000000000e01d3262\",\"988200000000000000a4e1000106904810270000000000000450474c0000000000e0abb9523e0100085741580000000000e0abb9523e01000000000000000000ab954662\",\"23830000000000004069aefe22fa9dabab0a0000000000000450474c00000000e02c471000000000085741580000000000ca9a3b000000000000000000000000e96f4b62\",\"4f830000000000000000908603dd3d8b8ac40100000000000450474c0000000020274b7c0000000008574158000000000095ba0a000000000000000000000000434e4e62\",\"05850000000000000000908603cbd558204e0000000000000450474c0000000000ef1c0d00000000085741580000000080778e06000000000000000000000000b2976062\",\"ba87000000000000000090860371b91557e80c00000000000450474c0000000050453cb1a707000008574158000000000083a92a17000000000000000000000015998d62\",\"e18d0000000000000000908603b6d15750c30000000000000450474c0000000000db8b55070000000857415800000000005f8277010000000000000000000000f206c362\",\"e28d0000000000000000908603b6d157409c0000000000000450474c00000000005079be13000000085741580000000000549eef0400000000000000000000001407c362\",\"e38d0000000000000000908603b6d15750c50000000000000450474c0000000000e80ed871000000085741580000000000c8ba891600000000000000000000007607c362\",\"1c8f00000000000000009086037342c3400d0300000000000450474c000000000029f08100000000085741580000000040357f060000000000000000000000005974df62\",\"1d8f00000000000000009086037342c350c30000000000000450474c0000000080bd512a00000000085741580000000080bf76080000000000000000000000008674df62\",\"129d0000000000000000908603b6d15713b60000000000000450474c0000000030a94cd801000000085741580000000000f15365000000000000000000000000db4f1963\",\"08a800000000000000009086037194ccb2a60500000000000450474c00000000b04d1f4b01000000085741580000000080d1f00800000000000000000000000042fc6263\",\"6fb300000000000000009086036b0605799d7500000000000450474c0000000014fe60ff1400000008574158000000004047f90600000000000000000000000009c77f63\",\"71b300000000000000009086036b0605404b4c00000000000450474c00000000002e597611000000085741580000000080d1f0080000000000000000000000007ac87f63\",\"9bcb0000000000000000908603739fefb83f0800000000000450474c000000000006f648ba000000085741580000000000142672030000000000000000000000f9d7af63\",\"9ccb0000000000000000908603739fef50c30000000000000450474c0000000000908cd476e20000085741580000000000504ff74a2d0000000000000000000026daaf63\",\"9fcb0000000000000000908603739fef2ae20300000000000450474c0000000000b1659150020000085741580000000000e8764817000000000000000000000074dbaf63\",\"0cd700000000000000009086038bcbe58bcc0000000000000450474c00000000a1bbad22000000000857415800000000c66b9f06000000000000000000000000853fb663\",\"74d80000000000000000908603fedca05b901000000000000450474c000000000d8ef49a0200000008574158000000003be02406000000000000000000000000a008b963\",\"c4d800000000000000009086036f502dd70d0300000000000450474c000000006c067e7800000000085741580000000040230506000000000000000000000000d336bc63\",\"d4d80000000000000000908603aa52c5167b0000000000000450474c00000000c8f69712000000000857415800000000c09ee60500000000000000000000000034c3bc63\",\"e3d800000000000000a4e100010d01f6880d0100000000000450474c000000008090202900000000085741580000000000e1f505000000000000000000000000f738bd63\",\"e7d80000000000000000908603fedca0b9a20700000000000450474c00000000deada920010000000857415800000000e0bec4050000000000000000000000002078bd63\",\"f9d80000000000000000908603dccdfbf07e0e00000000000450474c0000000080aa9141020000000857415800000000806514060000000000000000000000004053be63\",\"0dd90000000000000000908603750d6f10270000000000000450474c00000000605af405000000000857415800000000605af405000000000000000000000000dd61c063\",\"13d900000000000000a4e100011faffb92f20200000000000450474c000000002067237300000000085741580000000000e1f5050000000000000000000000007a27c163\",\"19d90000000000004082f1d960e3b3c138540f00000000000450474c00000000908bb73e020000000857415800000000e089b805000000000000000000000000a79bc163\",\"3ed90000000000000000908603dccdfb40420f00000000000450474c00000000007f3e36020000000857415800000000c095a9050000000000000000000000000e27c363\",\"54d90000000000000000908603aa52c5447f0000000000000450474c00000000b0993913000000000857415800000000c09ee605000000000000000000000000d5edc363\",\"7ed90000000000000000908603aa52c55e370100000000000450474c000000002827092f000000000857415800000000c09ee605000000000000000000000000448ec563\",\"aad90000000000004082f1d960e3b3c1044f1b00000000000450474c00000000703868f5030000000857415800000000c095a905000000000000000000000000cbf3c663\",\"d6d9000000000000000090860373ddfcc0e1e400000000000450474c000000000071a92d210000000857415800000000c095a905000000000000000000000000b585c863\",\"02da00000000000000009086036cddf3801a0600000000000450474c0000000000667fe2000000000857415800000000c095a905000000000000000000000000a04cca63\",\"1ada0000000000000000908603dccdfba0860100000000000450474c000000001c25db33000000000857415800000000b6832f05000000000000000000000000e8ffca63\",\"1dda0000000000000000908603734ed640420f00000000000450474c0000000000dc5c2402000000085741580000000000cf7b05000000000000000000000000f90dcb63\",\"26da0000000000000000908603aa52c554f60000000000000450474c000000003015b523000000000857415800000000c095a9050000000000000000000000006950cb63\",\"2bda00000000000000a4e1000130a89f60ea0000000000000450474c000000001a161d1f000000000857415800000000af832f05000000000000000000000000f7aecb63\",\"35da00000000000000a4e10001312a6010270000000000000450474c00000000a0e22705000000000857415800000000a0e22705000000000000000000000000d4eecb63\",\"53da00000000000000a4e1000134639d400d0300000000000450474c0000000000f1536500000000085741580000000040ff1005000000000000000000000000637ecd63\",\"6eda00000000000000009086036ce042ec290d00000000000450474c000000008492ccac010000000857415800000000306ef8040000000000000000000000006f4acf63\",\"7bda0000000000000000908603750d6f10270000000000000450474c0000000000c63e0500000000085741580000000000c63e050000000000000000000000000cd9cf63\",\"98da00000000000000009086036e2710a0680600000000000450474c00000000c0de17fd000000000857415800000000e0a9060600000000000000000000000055b3d163\",\"c8da000000000000000090860379cce356094300000000000450474c00000000edecfacb080000000857415800000000983d2005000000000000000000000000853bd363\",\"cddd00000000000000a4e100011faffbc6e60200000000000450474c000000003866566000000000085741580000000040ff1005000000000000000000000000ef58d563\",\"e3de0000000000000000908603a68b58404b4c00000000000450474c00000000008932e509000000085741580000000040ff10050000000000000000000000003d3bd663\",\"b6e50000000000000000908603e9f90240420f00000000000450474c00000000804d7353020000000857415800000000605af4050000000000000000000000004e72da63\",\"e1e80000000000000000908603750d6f10270000000000000450474c0000000000c63e0500000000085741580000000000c63e05000000000000000000000000f631db63\",\"59eb00000000000000a4e10001312a6010270000000000000450474c0000000000d8b80500000000085741580000000000d8b80500000000000000000000000022eddb63\",\"d6f300000000000000a4e10001312a6010270000000000000450474c00000000804a5d05000000000857415800000000804a5d05000000000000000000000000bac5e363\",\"3df4000000000000000090860371369d70640800000000000450474c000000000057d34701000000085741580000000000e1f505000000000000000000000000a7b0e463\",\"67f50000000000000000908603750d6f10270000000000000450474c0000000060b2920500000000085741580000000060b29205000000000000000000000000da3ce563\",\"abf500000000000000009086036e271000cd4600000000000450474c00000000009afb820a000000085741580000000020aecc050000000000000000000000002269e663\",\"61f60000000000000000908603a8074be0c81000000000000450474c0000000000d31f2402000000085741580000000080a2fb04000000000000000000000000cc22e763\",\"25fa00000000000000009086036b138833960400000000000450474c0000000030282bb300000000085741580000000000e1f505000000000000000000000000a9cbe863\",\"2dfa00000000000000a4e100011e989042830500000000000450474c00000000f8b658bb000000000857415800000000c0832f0500000000000000000000000039d9e963\",\"a6fa0000000000000000908603750d6f10270000000000000450474c0000000060b2920500000000085741580000000060b2920500000000000000000000000027c7eb63\",\"2cfb000000000000000090860379cce34b8a1f00000000000450474c00000000ce9a381704000000085741580000000058fb10050000000000000000000000007937f063\",\"39fb0000000000000000908603fdf378f8040300000000000450474c00000000a026c474000000000857415800000000c09ee6050000000000000000000000009a28f263\",\"3cfb00000000000000a4e10001312a6010270000000000000450474c0000000000cf7b0500000000085741580000000000cf7b05000000000000000000000000e36ff263\",\"46fb0000000000000000908603fdf37830f31800000000000450474c0000000000839bce03000000085741580000000000e1f505000000000000000000000000a841f363\",\"63fb0000000000000000908603750d6f10270000000000000450474c0000000040dc7e0500000000085741580000000040dc7e05000000000000000000000000d2dcf563\",\"65fb00000000000000009086037e518c994f4c00000000000450474c00000000a9fe881b0c0000000857415800000000db9b32060000000000000000000000003117f663\",\"a2fb0000000000000000908603750d6f204e0000000000000450474c00000000009ef70a00000000085741580000000000cf7b050000000000000000000000002f76fb63\",\"d9fb0000000000000000908603fdf37840420f00000000000450474c00000000001a7118020000000857415800000000804a5d05000000000000000000000000a5c90164\",\"e4fb0000000000000000908603a7cb97400d0300000000000450474c000000000094357700000000085741580000000000e1f50500000000000000000000000020800364\",\"e6fb0000000000000000908603750d6f10270000000000000450474c0000000080539a0500000000085741580000000080539a05000000000000000000000000fe870364\",\"f3fb00000000000000009086036f7904720f0600000000000450474c000000002055bbec00000000085741580000000000e1f50500000000000000000000000084ab0464\",\"f8fb000000000000000090860379cce3b6441100000000000450474c00000000448fb37602000000085741580000000060b2920500000000000000000000000058810564\",\"1bfc0000000000000000908603aa52c556c30400000000000450474c00000000c80132b8000000000857415800000000c09ee60500000000000000000000000097100a64\",\"1cfc00000000000000a4e10001312a6010270000000000000450474c0000000000c63e0500000000085741580000000000c63e050000000000000000000000007b130a64\",\"44fc0000000000000000908603750d6f10270000000000000450474c0000000080539a0500000000085741580000000080539a0500000000000000000000000091710c64\",\"61fc000000000000000090860371369d80de0f00000000000450474c00000000007eb065020000000857415800000000c09ee605000000000000000000000000eddc0e64\",\"86fc0000000000000000908603fdf37864791300000000000450474c00000000a0a3a3ac020000000857415800000000804a5d0500000000000000000000000084e71064\",\"98fc0000000000000000908603fdf378fcf00800000000000450474c00000000601b583a010000000857415800000000804a5d05000000000000000000000000ca371264\",\"a7fc0000000000000000908603750d6f10270000000000000450474c00000000804a5d05000000000857415800000000804a5d050000000000000000000000001c5e1564\",\"ccfc00000000000000009086038bcbe5c1480200000000000450474c0000000028c14d50000000000857415800000000804a5d05000000000000000000000000f0891764\",\"f30c0100000000000000908603750d6f60270000000000000450474c0000000000476805000000000857415800000000804a5d05000000000000000000000000a14f1f64\",\"cd1201000000000000009086036e2710404b4c00000000000450474c00000000806b33120b0000000857415800000000601cab050000000000000000000000006a292264\",\"ed120100000000000000908603fdf378c8ee0c00000000000450474c0000000080642ff901000000085741580000000000e1f50500000000000000000000000053552564\",\"ef120100000000000000908603aa52c5c04b0300000000000450474c000000000065757f000000000857415800000000c09ee60500000000000000000000000071bc2564\",\"531801000000000000009086036f7904c8d50c00000000000450474c0000000080d45ef501000000085741580000000000e1f5050000000000000000000000003cb92964\",\"ac200100000000000000908603750d6f10270000000000000450474c0000000000d8b80500000000085741580000000000d8b80500000000000000000000000088702c64\",\"8c2601000000000000a4e10001312a6010270000000000000450474c00000000805cd705000000000857415800000000805cd70500000000000000000000000084793264\",\"463001000000000000a4e100010bf83440420f00000000000450474c00000000a89667660200000008574158000000003ae0240600000000000000000000000021a43664\",\"5c300100000000000000908603750d6f10270000000000000450474c00000000805cd705000000000857415800000000805cd70500000000000000000000000035913964\",\"603001000000000000a4e1000106cc3620f40e00000000000450474c0000000000e84cd301000000085741580000000000b4c404000000000000000000000000c89b3964\",\"e2340100000000000000908603fdf37840420f00000000000450474c000000000050d6dc01000000085741580000000000b4c40400000000000000000000000082033c64\",\"80390100000000000000908603750d6f10270000000000000450474c000000006086c3050000000008574158000000006086c3050000000000000000000000004e714d64\",\"943901000000000000a4e10001312a6010270000000000000450474c000000006086c3050000000008574158000000006086c3050000000000000000000000009aa84e64\",\"a8390100000000000000908603a8074b808b0800000000000450474c0000000000406f4001000000085741580000000000d8b805000000000000000000000000b2974f64\",\"c739010000000000000090860379cce349420f00000000000450474c000000008b9d95fa01000000085741580000000030d8100500000000000000000000000096045364\",\"cf390100000000000000908603750d6f10270000000000000450474c0000000080778e0600000000085741580000000080778e0600000000000000000000000079145464\",\"d9390100000000000000908603f60b6fca270900000000000450474c0000000053671b1e010000000857415800000000fbb3c4040000000000000000000000007cf05664\",\"e33901000000000000009086036f9b66c86c2000000000000450474c00000000804499f204000000085741580000000000e1f505000000000000000000000000ed305764\",\"213a01000000000000a4e1000120fd35975f0300000000000450474c00000000c4d71968000000000857415800000000c071b50400000000000000000000000005105964\",\"223a0100000000000000908603736a22404b4c00000000000450474c0000000000888020090000000857415800000000004aac040000000000000000000000001e925964\",\"243a01000000000000009086036ce04274ff0e00000000000450474c0000000080404fcb010000000857415800000000004aac04000000000000000000000000d1af5964\",\"2a3a0100000000000000908603eb7c6190410600000000000450474c00000000709891bf000000000857415800000000f022ac04000000000000000000000000be255a64\",\"483a01000000000000009086036b46e8e9ff0300000000000450474c00000000a32fb57900000000085741580000000018a8a4040000000000000000000000001a045c64\",\"673a010000000000000090860373ddfce5ea7101000000000450474c000000002de7ba4d2c000000085741580000000090a9ad04000000000000000000000000b1e25c64\",\"6b3a0100000000007093b9d9abcb52a49b5b0600000000000450474c000000007e5ef8c0000000000857415800000000a09ba10400000000000000000000000068ee5c64\",\"753a0100000000000000908603a68b5880969800000000000450474c0000000000da7c72180000000857415800000000402c42060000000000000000000000000c205f64\",\"7e3a0100000000000000908603750d6f10270000000000000450474c0000000000c63e0500000000085741580000000000c63e05000000000000000000000000d77c5f64\",\"813a01000000000000a4e10001064c7574820000000000000450474c0000000000a9ec0f00000000085741580000000000b4c404000000000000000000000000ccd45f64\",\"bd3a0100000000007093b9d9abcb52a4f5010500000000000450474c000000005eeafca000000000085741580000000060cce70400000000000000000000000003f96164\",\"bf3a01000000000000009086038603c66c530400000000000450474c00000000702c1d8200000000085741580000000040ed9604000000000000000000000000b1216264\",\"cc3a0100000000004082f1d960e3b3c1c6bb2d00000000000450474c0000000038aa7eee05000000085741580000000040ff1005000000000000000000000000d5636464\",\"f03b0100000000000000908603fdf37840420f00000000000450474c00000000008eead0010000000857415800000000802fa60400000000000000000000000038936964\",\"103c0100000000000000908603750d6f10270000000000000450474c0000000000b4c40400000000085741580000000000b4c404000000000000000000000000dddb6c64\",\"304401000000000000a4e100011d1e47d75b0200000000000450474c00000000d49e1a45000000000857415800000000c0687804000000000000000000000000d45a7064\",\"3e440100000000000000908603993d42fa799900000000000450474c00000000a8e3af322d000000085741580000000040f2800b000000000000000000000000504f7164\",\"544401000000000000009086036f228738b00800000000000450474c00000000867f4c160100000008574158000000007638e30400000000000000000000000056657264\",\"7044010000000000000000d27070e47e89350100000000000450474c000000000046c323000000000857415800000000eb5e8304000000000000000000000000bcda7464\",\"7144010000000000000000d27070e47e60ea0000000000000450474c00000000a0e2141d00000000085741580000000070d0d804000000000000000000000000dbda7464\",\"7244010000000000000000d27070e47e50c30000000000000450474c000000004078e719000000000857415800000000404b2e05000000000000000000000000f0da7464\",\"7344010000000000000000d27070e47ec8af0000000000000450474c0000000058c1721900000000085741580000000030b9a7050000000000000000000000000ddb7464\",\"7444010000000000000000d27070e47e50c30000000000000450474c0000000018056b220000000008574158000000003834e20600000000000000000000000028db7464\",\"7544010000000000000000d27070e47e73e20000000000000450474c000000006f01a62f0000000008574158000000001028380800000000000000000000000044db7464\",\"89440100000000007093b9d9abcb52a40caa0700000000000450474c00000000e035720d010000000857415800000000804a5d05000000000000000000000000c32e7664\",\"92440100000000000000908603750d6f10270000000000000450474c0000000000b4c40400000000085741580000000000b4c404000000000000000000000000d39d7764\",\"984401000000000000a4e100011e9890e3df0700000000000450474c00000000464b3cf000000000085741580000000020b6a704000000000000000000000000097b7864\",\"c5440100000000000000908603f42c36868b0200000000000450474c00000000c8998f4a000000000857415800000000c06878040000000000000000000000002a8b7b64\",\"e0440100000000000000308603692c84171e1200000000000450474c000000007062b7c302000000085741580000000000e1f50500000000000000000000000007b57e64\",\"044601000000000000a4e100010bf83440420f00000000000450474c00000000a89667660200000008574158000000003ae024060000000000000000000000004a8d8564\",\"0c460100000000000000908603750d6f10270000000000000450474c0000000000bd010500000000085741580000000000bd010500000000000000000000000078ae8564\",\"3d46010000000000000090860379cce36e4c2600000000000450474c00000000525cbe94040000000857415800000000f022ac04000000000000000000000000772b8a64\",\"594601000000000000009086036b138840420f00000000000450474c0000000000fac6d30100000008574158000000008082ad0400000000000000000000000062a08e64\",\"5c460100000000000000908603f2b86560cc0500000000000450474c00000000207de5d600000000085741580000000030b9a70500000000000000000000000068db8f64\",\"5d460100000000000000908603f2b865c97b0500000000000450474c00000000ceb03acb00000000085741580000000030b9a705000000000000000000000000bbdb8f64\",\"634601000000000000009086036b138840420f00000000000450474c0000000000eb08bf010000000857415800000000c0687804000000000000000000000000ccf98f64\",\"684601000000000000a4e100012a1ae9ac282100000000000450474c000000003404aec3030000000857415800000000fd406f0400000000000000000000000098249064\",\"79460100000000000000908603fdf37840420f00000000000450474c00000000001a7118020000000857415800000000804a5d0500000000000000000000000012ea9064\",\"7b460100000000000000908603defd01be641b00000000000450474c000000006408e91b030000000857415800000000e0f26e04000000000000000000000000260a9164\",\"8746010000000000000000d27080bbb580841e00000000000450474c0000000000d6117e030000000857415800000000c06878040000000000000000000000003b8d9164\",\"8d460100000000000000908603750d6f10270000000000000450474c0000000000d8b80500000000085741580000000000d8b805000000000000000000000000ecbf9164\",\"9446010000000000000000d27080bbb580841e00000000000450474c0000000030fefe6a030000000857415800000000b6fe5f0400000000000000000000000062eb9264\",\"9546010000000000000000d27080bbb580841e00000000000450474c00000000f8fefe6a030000000857415800000000b7fe5f0400000000000000000000000075eb9264\",\"9646010000000000000000d27080bbb580841e00000000000450474c00000000c0fffe6a030000000857415800000000b8fe5f040000000000000000000000007feb9264\",\"af460100000000000000908603ece00208441d00000000000450474c000000008078317704000000085741580000000000e1f505000000000000000000000000e7439464\",\"b54601000000000000009086036e1bf72e990500000000000450474c00000000bc188c9e00000000085741580000000020435204000000000000000000000000bd9c9464\",\"c3460100000000000000908603fdf37840420f00000000000450474c000000000050d6dc01000000085741580000000000b4c404000000000000000000000000f9799564\",\"d94601000000000000a4e100011faffb2a450400000000000450474c00000000908c1f96000000000857415800000000804a5d0500000000000000000000000013399764\",\"e14601000000000000009086036e1bf7883a0600000000000450474c0000000000312eaf00000000085741580000000000a24a0400000000000000000000000090cc9764\",\"f1460100000000000000908603f8aff6400d0300000000000450474c000000001cd57f57000000000857415800000000dbfd5f04000000000000000000000000fbda9864\",\"f44601000000000000009086036e1bf7d2b80000000000000450474c00000000c21e601400000000085741580000000090724e0400000000000000000000000056229964\",\"f6460100000000000000908603defd01e09c4100000000000450474c00000000c0d730940700000008574158000000002017830400000000000000000000000009559964\",\"fb4601000000000000009086038bae8e66070100000000000450474c0000000078fb2c1e00000000085741580000000040a179040000000000000000000000007a779964\",\"fc460100000000000000908603750d6f10270000000000000450474c0000000000c63e0500000000085741580000000000c63e050000000000000000000000005d979964\",\"fd4601000000000000009086036ce4e79907d605000000000450474c00000000fa0731a3a30000000857415800000000a0464704000000000000000000000000a89e9964\",\"07470100000000000000908603cc8eb7e5440600000000000450474c0000000040f4e8c300000000085741580000000000b4c4040000000000000000000000009bb89964\",\"104701000000000000009086036e1bf7b8b50200000000000450474c000000007cb6584c000000000857415800000000488a4c04000000000000000000000000830e9a64\",\"1c4701000000000000009086036dde1451050700000000000450474c0000000010ac3f1201000000085741580000000000e1f505000000000000000000000000ec4a9b64\",\"234701000000000000a4e1000130a89fb8820100000000000450474c00000000917f412c000000000857415800000000ce64780400000000000000000000000017d69b64\",\"2f4701000000000000a4e10001312a6010270000000000000450474c0000000000c63e0500000000085741580000000000c63e0500000000000000000000000009389c64\",\"38470100000000000000908603eb7c6130390a00000000000450474c000000008013852701000000085741580000000080266904000000000000000000000000069c9d64\",\"3c4701000000000000009086036f228774a61000000000000450474c000000005caf53150200000008574158000000007638e304000000000000000000000000fad89d64\",\"4c4701000000000030c661ee787ab259404b4c00000000000450474c00000000807f788e080000000857415800000000608561040000000000000000000000002db29e64\",\"60470100000000000000908603750d6f10270000000000000450474c0000000000bd010500000000085741580000000000bd0105000000000000000000000000c601a164\",\"6a4701000000000000a4e100011cdcc8e2c40300000000000450474c00000000f86b8868000000000857415800000000c05f3b04000000000000000000000000d197a164\",\"6d47010000000000000090860372ada186846d00000000000450474c000000006cafdadb0f0000000857415800000000200fa80500000000000000000000000091eaa164\",\"8347010000000000000090860379cce3d8d61100000000000450474c00000000df72a00a020000000857415800000000ce64780400000000000000000000000008b1a364\",\"84470100000000002019b86a522abbe1986d0100000000000450474c0000000090c502f60100000008574158000000006062a335000000000000000000000000aa06a464\",\"85470100000000002019b86a522abbe150da0000000000000450474c00000000e03d3f60060000000857415800000000608a0e24010000000000000000000000cc06a464\",\"8d470100000000000000908603731b88f0b51c00000000000450474c000000005019c716030000000857415800000000b0e53304000000000000000000000000d843a564\",\"8f470100000000000000908603739243b8880000000000000450474c00000000e010811500000000085741580000000040e0240600000000000000000000000080a6a664\",\"99470100000000000000908603692ba4bb6e9400000000000450474c0000000038de5462140000000857415800000000804a5d050000000000000000000000009742a764\",\"9a470100000000000000908603750d6f10270000000000000450474c0000000000c63e0500000000085741580000000000c63e050000000000000000000000009b93a764\",\"9b4701000000000000009086036e1bf74cd70c00000000000450474c0000000048f99c5c010000000857415800000000607c2404000000000000000000000000489ba764\",\"9d4701000000000000009086036b138840420f00000000000450474c0000000000863ba1010000000857415800000000801d2c04000000000000000000000000e2a3a764\",\"ab470100000000000000908603d4d8f200fa0000000000000450474c000000000098151b000000000857415800000000c05f3b040000000000000000000000003d18a964\",\"ae470100000000000000908603bad7e4c07a1000000000000450474c000000000090db920f010000085741580000000000ecba830200000000000000000000007b5fa964\",\"c547010000000000000090860374d153f0550000000000000450474c0000000030ad1409000000000857415800000000d0ab200400000000000000000000000025c0aa64\",\"ce4701000000000000009086036e1bf718270000000000000450474c00000000e0b21d0400000000085741580000000040db1c040000000000000000000000005d2eab64\",\"cf4701000000000000009086036b46e834880300000000000450474c000000005c912f5f00000000085741580000000030b41c040000000000000000000000004969ab64\",\"d34701000000000000009086036ce0427c321000000000000450474c0000000058bdeeb3010000000857415800000000a0541b04000000000000000000000000fc0aac64\",\"d74701000000000000009086036e1bf7442e0300000000000450474c0000000074850a56000000000857415800000000d0ab20040000000000000000000000000545ac64\",\"e2470100000000000000908603739243a08c0000000000000450474c00000000c0e3bf140000000008574158000000006086c305000000000000000000000000441aad64\",\"e3470100000000000000908603ec1787047c0000000000000450474c00000000600d3f0d000000000857415800000000801d2c04000000000000000000000000512fad64\",\"074801000000000000009086036ce0421c871100000000000450474c000000007f1dbdd7010000000857415800000000e4511b04000000000000000000000000b9b1af64\",\"16480100000000000000908603da69d220291b00000000000450474c00000000c03294da02000000085741580000000060b81a040000000000000000000000006840b064\",\"384801000000000000a4e100011d1e47e0930400000000000450474c0000000000752b7d000000000857415800000000801d2c040000000000000000000000003046b264\",\"564801000000000000009086036e1bf779110100000000000450474c00000000c70f1b1d000000000857415800000000f04c2804000000000000000000000000b635b464\",\"5a480100000000000000908603b41e46c0e1e400000000000450474c00000000807e69ab190000000857415800000000608561040000000000000000000000004c6eb464\",\"65480100000000000000908603750d6f10270000000000000450474c000000008038e3040000000008574158000000008038e3040000000000000000000000004e0fb564\",\"72480100000000000000908603ec178756a90600000000000450474c00000000c0925abb00000000085741580000000000a24a040000000000000000000000001ba3b564\",\"7d4801000000000000009086036ce0429ce00000000000000450474c0000000028a4991700000000085741580000000060b81a040000000000000000000000007a8fb964\",\"a64801000000000000009086036e1bf715270000000000000450474c000000003fac1f0400000000085741580000000030251f0400000000000000000000000080aabc64\",\"ab4801000000000000009086036b138840420f00000000000450474c0000000020efb19701000000085741580000000008b313040000000000000000000000006ce8bc64\",\"ac48010000000000000090860379cce347cc0800000000000450474c0000000085bcaff6000000000857415800000000964647040000000000000000000000001af1bc64\",\"b04801000000000000009086036b224330570500000000000450474c0000000000c39dd000000000085741580000000000e1f505000000000000000000000000b50dbd64\",\"be4801000000000000009086036e1bf740420f00000000000450474c0000000000e3598f010000000857415800000000c056fe030000000000000000000000002064bd64\",\"bf4801000000000000009086036e1bf740420f00000000000450474c0000000000c44f9501000000085741580000000000990d040000000000000000000000004764bd64\",\"c24801000000000000a4e100012b263fe9fb0500000000000450474c00000000e799939e000000000857415800000000e2270b040000000000000000000000000f78bd64\",\"cc480100000000000000908603750d6f10270000000000000450474c0000000000c63e0500000000085741580000000000c63e05000000000000000000000000bbf4bd64\",\"d64801000000000000009086036ce042744f2300000000000450474c00000000f8e172870300000008574158000000006073e703000000000000000000000000d06bbe64\",\"e24801000000000000009086036943927c0e1f00000000000450474c00000000a00e3451030000000857415800000000801d2c04000000000000000000000000ecfbbe64\",\"ee4801000000000060303667536836dd7d6a5601000000000450474c0000000093d546b32100000008574158000000001b31d803000000000000000000000000c7efbf64\",\"f24801000000000000a4e100012e0f9ae0930400000000000450474c00000000c0ea337b000000000857415800000000a0541b04000000000000000000000000171cc064\",\"08490100000000000000908603eed935e8800000000000000450474c00000000405dfb0c0000000008574158000000008014ef030000000000000000000000001c52c264\",\"0c490100000000007093b9d9abcb52a4f17b0200000000000450474c0000000052abb14100000000085741580000000020050904000000000000000000000000d467c264\",\"0d490100000000007093b9d9abcb52a4dc6e0000000000000450474c00000000f8b5730b000000000857415800000000200509040000000000000000000000003468c264\",\"0e4901000000000000009086036dd35518180200000000000450474c000000006b0cc3340000000008574158000000001b31d803000000000000000000000000a37bc264\",\"154901000000000000a4e100011d1e47e0930400000000000450474c0000000080a33a7400000000085741580000000040d2df03000000000000000000000000576ac364\",\"214901000000000000a4e10001005fe484460700000000000450474c00000000401241c100000000085741580000000000990d04000000000000000000000000728bc664\",\"234901000000000000009086037f4027e0c81000000000000450474c000000007454a0d60100000008574158000000009646470400000000000000000000000086b5c664\",\"344901000000000000a4e10001294f9049b41700000000000450474c000000001592a4a7020000000857415800000000dbfd5f040000000000000000000000003f10c864\",\"5a490100000000000000908603750d6f10270000000000000450474c0000000000d8b80500000000085741580000000000d8b805000000000000000000000000fe1cca64\",\"5f4901000000000000a4e1000106cc3680d50400000000000450474c0000000000e29e8d000000000857415800000000c06878040000000000000000000000005879ca64\",\"744901000000000000009086036b9809ecc4dc00000000000450474c00000000c042ccaf21000000085741580000000000e1f5050000000000000000000000001845cc64\",\"774901000000000000009086037105d2400d0300000000000450474c00000000406c8d52000000000857415800000000d0ab2004000000000000000000000000cfd3cc64\",\"7b490100000000002019b86a522abbe120700100000000000450474c00000000a098cb1801000000085741580000000050b7cb1d000000000000000000000000e314cd64\",\"7d490100000000000000908603f8aff6400d0300000000000450474c00000000b883915500000000085741580000000096464704000000000000000000000000043ecd64\",\"8649010000000000000090860379cce36d420c00000000000450474c000000001e81be570100000008574158000000009646470400000000000000000000000033f8cd64\",\"a8490100000000000000908603eb7c61a0680600000000000450474c0000000000943eb400000000085741580000000000a24a040000000000000000000000000feed164\",\"c0490100000000000000908603eb7862efca9f01000000000450474c000000005c9c3c3d29000000085741580000000040d2df03000000000000000000000000449cd364\",\"c34901000000000000009086036ddeb011360100000000000450474c000000006631272300000000085741580000000060ba6d04000000000000000000000000cffdd364\",\"cd4901000000000000a4e100014a990f83640f00000000000450474c000000005851d78c0100000008574158000000008014ef03000000000000000000000000a5f7d464\",\"d34901000000000000a4e1000125314670640800000000000450474c00000000b8763be000000000085741580000000008b313040000000000000000000000005e56d564\",\"d44901000000000000a4e100010e8927d8290800000000000450474c000000002cea1dda00000000085741580000000008b31304000000000000000000000000a156d564\",\"d54901000000000000a4e100012290a2e8500800000000000450474c00000000349d31de00000000085741580000000008b31304000000000000000000000000ee56d564\",\"d64901000000000000a4e100012293caa0d90800000000000450474c00000000d08f76ec00000000085741580000000008b313040000000000000000000000003957d564\",\"d7490100000000000000908603a6dfd3107a0700000000000450474c000000008844c5c700000000085741580000000008b313040000000000000000000000007157d564\",\"d8490100000000000000908603daba2820a10700000000000450474c0000000090f7d8cb00000000085741580000000008b31304000000000000000000000000b557d564\",\"d949010000000000000090860397ac4d808b0800000000000450474c00000000c0294fe400000000085741580000000008b31304000000000000000000000000f057d564\",\"da4901000000000000009086038d7c6c808b0800000000000450474c00000000c0294fe400000000085741580000000008b313040000000000000000000000003158d564\",\"db490100000000000000908603764f6e30c80700000000000450474c0000000098aaeccf00000000085741580000000008b313040000000000000000000000008058d564\",\"dc49010000000000000090860389addc70640800000000000450474c00000000b8763be000000000085741580000000008b31304000000000000000000000000d658d564\",\"dd49010000000000000090860373fa1cf09c0900000000000450474c00000000f80ed90001000000085741580000000008b313040000000000000000000000002a59d564\",\"df490100000000000000908603750d6f10270000000000000450474c00000000805cd705000000000857415800000000805cd705000000000000000000000000b0b3d564\",\"084a01000000000000009086036ed39cc0270900000000000450474c00000000004775e800000000085741580000000040d2df03000000000000000000000000ab66d764\",\"134a010000000000000090860372c1331b859700000000000450474c00000000489a1f2f100000000857415800000000801d2c0400000000000000000000000076ced764\",\"1c4a01000000000000a4e1000136f5249fb12b00000000000450474c00000000e0a594550d000000085741580000000000c2eb0b0000000000000000000000007f71d864\",\"704a0100000000000000908603750d6f10270000000000000450474c0000000000cf7b0500000000085741580000000000cf7b0500000000000000000000000016dfe164\",\"724a010000000000000090860374653403512502000000000450474c000000004a1af290360000000857415800000000e058e10300000000000000000000000048a2e264\",\"744a0100000000000000908603692f13e0930400000000000450474c000000000cc155730000000008574158000000001a31d8030000000000000000000000000090e364\",\"754a010000000000406fc626465a9339b35d0200000000000450474c0000000089c79c3b0000000008574158000000001931d8030000000000000000000000003090e364\",\"764a0100000000000000908603b3d3cd38400000000000000450474c00000000007845060000000008574158000000000090d0030000000000000000000000004f96e364\",\"784a0100000000000000908603753ba5d4300000000000000450474c0000000000b4c4040000000008574158000000000090d003000000000000000000000000fe27e464\",\"794a0100000000000000908603753ba5d4300000000000000450474c00000000d0c6d70400000000085741580000000040d2df030000000000000000000000000828e464\",\"7b4a0100000000000000908603b17b4aa1af1d00000000000450474c000000003db826e6020000000857415800000000ff8fd003000000000000000000000000274ee464\",\"7c4a01000000000000a4e100013ed6aba8d20200000000000450474c00000000db679246000000000857415800000000fe8fd0030000000000000000000000008451e464\",\"7e4a010000000000000090860375b01ea9330100000000000450474c00000000af69cf1d000000000857415800000000d6eec80300000000000000000000000036ace464\",\"7f4a01000000000000a4e100014138ad4dabe600000000000450474c00000000f60fad59160000000857415800000000e0eec803000000000000000000000000a4c6e464\"],\"more\":false,\"next_key\":\"\"}" +} \ No newline at end of file diff --git a/test/data/requests/9195f4150110e252e2d5b4e6b09866e65bbbb177.json b/test/data/requests/9195f4150110e252e2d5b4e6b09866e65bbbb177.json new file mode 100644 index 0000000..0d8e92a --- /dev/null +++ b/test/data/requests/9195f4150110e252e2d5b4e6b09866e65bbbb177.json @@ -0,0 +1,161 @@ +{ + "request": { + "path": "https://wax.greymass.com/v1/chain/get_table_rows", + "params": { + "method": "POST", + "body": "{\"json\":false,\"limit\":1000,\"table\":\"buyorder\",\"code\":\"alcordexmain\",\"scope\":\"0\",\"key_type\":\"name\"}" + } + }, + "status": 200, + "json": { + "rows": [ + "090000000000000000009086031adf558096980000000000085741580000000080969800000000000450474c00000000102700000000000000000000000000003788e65f", + "0a0000000000000000009086036e7c77005a6202000000000857415800000000002d3101000000000450474c00000000204e0000000000000000000000000000f3f8f25f", + "0c0000000000000000009086036e7c77001bb70000000000085741580000000000a3e111000000000450474c00000000900100000000000000000000000000008ef9f25f", + "0d0000000000000000009086036e7c7700a177000000000008574158000000000008af2f000000000450474c0000000062000000000000000000000000000000b7f9f25f", + "0e0000000000000000009086036e7c778096980000000000085741580000000080841e00000000000450474c0000000050c30000000000000000000000000000f3f9f25f", + "5a0000000000000000009086036f75106400000000000000085741580000000010270000000000000450474c000000006400000000000000000000000000000007c81f60", + "d30000000000000000009086036e0ac80080542600000000085741580000000056154701000000000450474c00000000e09304000000000000000000000000002f0c4860", + "ed0000000000000000009086036fcf4200eb9407000000000857415800000000804f1200000000000450474c00000000a02c10000000000000000000000000007f634a60", + "0101000000000000000098d7289094a500c2eb0b00000000085741580000000080841e00000000000450474c0000000040420f000000000000000000000000006d614b60", + "2b01000000000000000098d7289094a500ca9a3b000000000857415800000000127b2d00000000000450474c0000000078313300000000000000000000000000fd5e4f60", + "2c01000000000000000098d7289094a5002f68590000000008574158000000006caa9300000000000450474c00000000b0a61700000000000000000000000000f75f4f60", + "3101000000000000000090860371bbeb00a493d600000000085741580000000080969800000000000450474c0000000080ee3600000000000000000000000000fa784f60", + "6d01000000000000000098d7289094a500ca9a3b0000000008574158000000004f1e2600000000000450474c00000000b8143d00000000000000000000000000ec325560", + "7201000000000000000098d7289094a50065cd1d000000000857415800000000aa9b1200000000000450474c00000000d08f3e00000000000000000000000000c0cc5560", + "7501000000000000000098d7289094a50065cd1d00000000085741580000000027be1100000000000450474c00000000df9c41000000000000000000000000002fe55560", + "ba01000000000000000098d7289094a50065cd1d00000000085741580000000045681000000000000450474c0000000010f44600000000000000000000000000298e6160", + "d601000000000000000090860372b23354cb753008000000085741580000000039633104000000000450474c00000000404b4c000000000000000000000000008bc86460", + "dc01000000000000000090860371feff0065cd1d0000000008574158000000005a2b1300000000000450474c00000000dfba3c0000000000000000000000000052a76760", + "dd0100000000000000009086036d76469862c0d00000000008574158000000004bc15d00000000000450474c00000000a0f9560000000000000000000000000046c56760", + "e101000000000000000098d7289094a50065cd1d000000000857415800000000cdcc0e00000000000450474c00000000b4a84e0000000000000000000000000034296860", + "fc01000000000000000098d7289094a50065cd1d0000000008574158000000002fb70c00000000000450474c00000000ae8d5b00000000000000000000000000f4836b60", + "1302000000000000000098d7289094a500a3e111000000000857415800000000e30a0700000000000450474c00000000992e630000000000000000000000000084866d60", + "2702000000000000000090860373631f1027000000000000085741580000000000e1f505000000000450474c0000000001000000000000000000000000000000f0e26e60", + "3602000000000000000098d7289094a50065cd1d0000000008574158000000006d3f0900000000000450474c000000008be27d00000000000000000000000000dc716f60", + "af02000000000000000098d7289094a50cf20b5a000000000857415800000000d1f41400000000000450474c00000000c0d8a7000000000000000000000000001fc87560", + "c5020000000000000000908603752050210484040000000008574158000000009ef60000000000000450474c00000000ec1ab7000000000000000000000000004b7a7660", + "ff020000000000000000908603728a90001bb70000000000085741580000000000a3e111000000000450474c000000009001000000000000000000000000000096d47760", + "25030000000000000000908603761dbedbe38901000000000857415800000000b09a541a3c0000000450474c00000000010000000000000000000000000000001ef47860", + "3603000000000000000090860371adeb40420f0000000000085741580000000000e40b54020000000450474c0000000001000000000000000000000000000000e49b7960", + "0b040000000000000000908603779ec13464ab0a000000000857415800000000f968b940040000000450474c0000000062000000000000000000000000000000e77f7e60", + "88050000000000000000908603812027c4c9070000000000085741580000000040783930010000000450474c0000000001000000000000000000000000000000b5098a60", + "e70500000000000000009086036ec3446463100a0000000008574158000000001d270500000000000450474c00000000374b4c0000000000000000000000000030f38c60", + "7308000000000000000090860377cc0400e1f505000000000857415800000000d3d7a394000000000450474c0000000091010000000000000000000000000000ee829860", + "7f08000000000000000090860375b974de85d90300000000085741580000000073031902000000000450474c00000000b0470000000000000000000000000000b6d09860", + "dd0800000000000000009086039769cd78000000000000000857415800000000804f1200000000000450474c000000000100000000000000000000000000000019e19a60", + "c909000000000000000090860398862a00f2052a01000000085741580000000000203d88792d00000450474c00000000010000000000000000000000000000006177a160", + "830a00000000000000009086038988c2f7c1e51a00000000085741580000000070c0e8ae1a0400000450474c00000000010000000000000000000000000000001153aa60", + "520b0000000000000000908603a21e488813000000000000085741580000000080f0fa02000000000450474c0000000001000000000000000000000000000000d24dae60", + "420d00000000000000009086037906db00e40b54020000000857415800000000fd2c3101000000000450474c00000000414b4c00000000000000000000000000ab65b360", + "2513000000000000000090860381062ed1060300000000000857415800000000c8280000000000000450474c000000002ae60200000000000000000000000000ce7ac560", + "1b14000000000000000090860383f77744c27b0600000000085741580000000040805442fd0000000450474c00000000010000000000000000000000000000003672c760", + "8214000000000000000090860377ee16d4e5900a00000000085741580000000040a911bc9c0100000450474c00000000010000000000000000000000000000003384c860", + "e6160000000000000000908603a72dc670fff70100000000085741580000000000ad78a2190000000450474c00000000030000000000000000000000000000003318cc60", + "051e000000000000000090860375385600e1f5050000000008574158000000000010a5d4e80000000450474c00000000010000000000000000000000000000005d42ee60", + "642100000000000000009086036e46d0c092830100000000085741580000000038630000000000000450474c0000000080969800000000000000000000000000083f0261", + "d12100000000000000009086036e46d0c0928301000000000857415800000000604f0000000000000450474c0000000020bcbe0000000000000000000000000012a80461", + "78270000000000000000908603a6431a00e1f5050000000008574158000000000010a5d4e80000000450474c00000000010000000000000000000000000000006da22361", + "8e2a0000000000000000908603bc0c5480f0fa020000000008574158000000000088526a740000000450474c00000000010000000000000000000000000000007bf63761", + "8f2a0000000000000000908603bc0c54ef86cc0d000000000857415800000000f0d756051b0200000450474c0000000001000000000000000000000000000000e3f63761", + "c22b00000000000000009086037654464aaef9dd0200000008574158000000000a1b8f00000000000450474c000000001059c800000000000000000000000000945d4c61", + "772e00000000000070289d98cd78948b80ce341d0000000008574158000000000068c2de740400000450474c00000000010000000000000000000000000000007bfd7b61", + "0e2f000000000000000000d270709144803bd64f000000000857415800000000404b4c00000000000450474c0000000060e02800000000000000000000000000c2ec8261", + "ab3600000000000090abbfc8676ca64f8238fe0500000000085741580000000010ab3f0d750000000450474c0000000002000000000000000000000000000000bd58ac61", + "ac3600000000000090abbfc8676ca64f8238fe0500000000085741580000000010ab3f0d750000000450474c0000000002000000000000000000000000000000cf58ac61", + "d2360000000000000000908603ebb60f0065cd1d000000000857415800000000005039278c0400000450474c00000000010000000000000000000000000000001af9ac61", + "94370000000000000000908603754e3f8096980000000000085741580000000000e87648170000000450474c0000000001000000000000000000000000000000f5e4af61", + "95370000000000000000908603754e3f8096980000000000085741580000000080969800000000000450474c0000000010270000000000000000000000000000fee4af61", + "033800000000000000009086038ab30700e1f50500000000085741580000000080969800000000000450474c00000000a08601000000000000000000000000001ecfb161", + "d93900000000000000009086038cb48a809fd50000000000085741580000000070110100000000000450474c0000000080841e00000000000000000000000000f0d7b861", + "55410000000000000000908603dabe1b0065cd1d000000000857415800000000d294b502000000000450474c00000000b0ad01000000000000000000000000005a76c861", + "b541000000000000c0e9bc347ba9ae7a7f7f0d00000000000857415800000000d4260000000000000450474c000000005b940d00000000000000000000000000c209ca61", + "154700000000000000009086037390d5d1060300000000000857415800000000c8280000000000000450474c000000002ae60200000000000000000000000000c015d561", + "d24800000000000000a4e100010a170d6400000000000000085741580000000040420f00000000000450474c00000000010000000000000000000000000000007fd3d961", + "fc610000000000000000908603e2f337a083bd0000000000085741580000000010270000000000000450474c00000000a083bd00000000000000000000000000806afb61", + "ce66000000000000a0dc35f89aeca44b351401000000000008574158000000005056252a000000000450474c00000000010000000000000000000000000000001336ff61", + "ae6800000000000010159ba688a8d834745e0600000000000857415800000000d2260000000000000450474c00000000a06806000000000000000000000000004b1b0462", + "4b6a00000000000000a4e100012762306400000000000000085741580000000040420f00000000000450474c0000000001000000000000000000000000000000c47d0662", + "066b00000000000030f074f91ac9a6835423080000000000085741580000000095260000000000000450474c00000000463d080000000000000000000000000093080b62", + "8a6b00000000000010c4574949a76d347082030000000000085741580000000010270000000000000450474c00000000708203000000000000000000000000005f110f62", + "8b6b00000000000010c4574949a76d3460182300000000000857415800000000a0860100000000000450474c00000000708203000000000000000000000000007d110f62", + "8c6b00000000000010c4574949a76d3400c3180100000000085741580000000000350c00000000000450474c0000000070820300000000000000000000000000c1110f62", + "277a00000000000000009086036de4ee20a1070000000000085741580000000010270000000000000450474c0000000020a1070000000000000000000000000002b66e62", + "2f7d00000000000000003086036ab0e70050d6dc010000000857415800000000cafd6c00000000000450474c00000000ffe5aa00000000000000000000000000c6178862", + "307d00000000000000003086036ab0e700f902950000000008574158000000002a88f400000000000450474c00000000c0cd1700000000000000000000000000e2178862", + "ce9d000000000000104d56f2aa8c1dcf03a7000000000000085741580000000030e57b19000000000450474c0000000001000000000000000000000000000000b2cc0363", + "fed801000000000000009086036e53ec8df7d723000000000857415800000000625a91240e0000000450474c0000000063000000000000000000000000000000037ee263", + "c4dc01000000000000009086037746ad80778e06000000000857415800000000c8e718a3000000000450474c00000000920100000000000000000000000000003d7a0764", + "10dd0100000000000000908603720a590094357700000000085741580000000094780e00000000000450474c0000000004ca410100000000000000000000000092810964", + "12dd010000000000000090860371369d005ed0b2000000000857415800000000c0270900000000000450474c0000000080f0fa02000000000000000000000000f2b70964", + "18dd010000000000000098d7289094a500f2052a010000000857415800000000d6dc3200000000000450474c00000000bee1e40000000000000000000000000063160b64", + "19dd010000000000000098d7289094a500f9029500000000085741580000000036b70c00000000000450474c0000000069c3c9010000000000000000000000007a160b64", + "1add010000000000000098d7289094a50094357700000000085741580000000023df0d00000000000450474c000000007eb14f0100000000000000000000000095160b64", + "1bdd010000000000000098d7289094a500e40b5402000000085741580000000020bcbe00000000000450474c0000000000127a00000000000000000000000000a7160b64", + "1edd010000000000000098d7289094a500f2052a0100000008574158000000003565ad00000000000450474c0000000080234300000000000000000000000000b8160b64", + "20dd010000000000000098d7289094a5005ed0b2000000000857415800000000c88aa900000000000450474c00000000e032290000000000000000000000000031170b64", + "21dd01000000000070efbdf75295b19700e40b54020000000857415800000000203d2e00000000000450474c00000000368af7010000000000000000000000000c1d0b64", + "22dd01000000000070efbdf75295b19700c817a8040000000857415800000000e0257800000000000450474c00000000c0928301000000000000000000000000231d0b64", + "23dd010000000000000098d72870591b00f2052a0100000008574158000000006b6e1900000000000450474c000000007bc3c90100000000000000000000000043240b64", + "24dd010000000000000098d72870591b00286bee0000000008574158000000007a101d00000000000450474c000000003f6f400100000000000000000000000052240b64", + "25dd010000000000000098d72870591b00286bee00000000085741580000000053b01300000000000450474c00000000b605d9010000000000000000000000005c240b64", + "26dd010000000000000098d72870591b005ed0b200000000085741580000000071372500000000000450474c00000000ddaebb000000000000000000000000006b240b64", + "4bdd0100000000000000908603692ba400e8764817000000085741580000000080f0fa02000000000450474c00000000002d310100000000000000000000000079f20b64", + "74dd01000000000000009086037746ad00e1f5050000000008574158000000003ba78a00000000000450474c00000000e2ad010000000000000000000000000004170e64", + "d2dd010000000000000090860373924300c2eb0b0000000008574158000000001d630100000000000450474c0000000097b14f01000000000000000000000000fd991164", + "f8dd0100000000000000908603dfbff33c1028040800000008574158000000007057a69f210300000450474c000000006400000000000000000000000000000050d71364", + "66de010000000000000090860371369d008845c8000000000857415800000000c0270900000000000450474c00000000007e5603000000000000000000000000eb281864", + "f8fa01000000000000009086036dde140042dc06030000000857415800000000a02e6300000000000450474c00000000002d310100000000000000000000000059fd2964", + "030a0200000000000000908603f2ae1800a0acb9030000000857415800000000404b4c00000000000450474c000000000048e80100000000000000000000000080aa3464", + "bf0b020000000000000090860378785a00e40b54020000000857415800000000b7982b00000000000450474c00000000bf0e1602000000000000000000000000423b3564", + "720f02000000000000009086037425f480b18eac010000000857415800000000f8da3600000000000450474c00000000002d31010000000000000000000000003a1e3a64", + "241002000000000000009086037aa10db8f7062a01000000085741580000000040420f00000000000450474c000000001ef3fa020000000000000000000000005d5e4164", + "251002000000000000009086037aa10dc8546cee00000000085741580000000040420f00000000000450474c00000000025d62020000000000000000000000007c5e4164", + "261002000000000000009086037aa10d9c89d1b200000000085741580000000040420f00000000000450474c000000007fc6c901000000000000000000000000955e4164", + "271002000000000000009086037aa10d70c9ad7700000000085741580000000040420f00000000000450474c00000000bc603201000000000000000000000000bb5e4164", + "721b02000000000000009086037746ad39a9b30b00000000085741580000000010d2cc27040000000450474c000000006e000000000000000000000000000000a64c6564", + "781d0200000000000000908603f866dd0092b2e304000000085741580000000080969800000000000450474c00000000406f400100000000000000000000000048fe7664", + "b81e0200000000000000908603d1fe4c8055c82000000000085741580000000090d00300000000000450474c0000000080b14f01000000000000000000000000b92c9264", + "f51e02000000000090ef67d5d25f757483b5010900000000085741580000000000cc8004000000000450474c00000000224e0000000000000000000000000000555d9964", + "2a1f02000000000000009086036dd35588ed37b00100000008574158000000005e1b3700000000000450474c00000000bb603201000000000000000000000000b368a164", + "411f02000000000000009086037342c3578c9620000000000857415800000000ddbf0300000000000450474c00000000ec8153010000000000000000000000000006a364", + "461f0200000000002019b86a522abbe10065cd1d000000000857415800000000903c0900000000000450474c0000000091097e000000000000000000000000001b06a464", + "901f0200000000000000908603f2b8655008499c010000000857415800000000de271e00000000000450474c00000000b80e160200000000000000000000000031d2ab64", + "d01f0200000000000000908603defd0100209db4060000000857415800000000404b4c00000000000450474c0000000000e86e03000000000000000000000000d352b064", + "332002000000000000009086036dd35500f2052a0100000008574158000000006b6e1900000000000450474c000000007bc3c9010000000000000000000000001571bb64", + "342002000000000000009086036dd35500c39dd0000000000857415800000000f8590d00000000000450474c00000000005a62020000000000000000000000003071bb64", + "352002000000000000009086036dd35500f9029500000000085741580000000020a10700000000000450474c0000000080f0fa020000000000000000000000003b71bb64", + "362002000000000000009086036dd355002f685900000000085741580000000058290400000000000450474c000000002e3b47030000000000000000000000004f71bb64", + "372002000000000000009086036dd35500e40b54020000000857415800000000abb96500000000000450474c00000000c0e1e4000000000000000000000000009c71bb64", + "3d2002000000000000009086036b239fee1bbcbf0b0000000857415800000000d23ce101000000000450474c000000000024f400000000000000000000000000f20cbe64", + "49200200000000000000908603f2b865012c82a40000000008574158000000005a080c00000000000450474c00000000b80e160200000000000000000000000071a8be64", + "c1200200000000002019b86a522abbe165c2211a000000000857415800000000bc5d0d00000000000450474c00000000c95e4c000000000000000000000000005038c464", + "a8210200000000000000908603720a59ca58774a020000000857415800000000b751f500000000000450474c0000000040625d000000000000000000000000009468cf64", + "b921020000000000000090860387e24200e40b540200000008574158000000001f3d2e00000000000450474c00000000418af701000000000000000000000000c255d164", + "bb21020000000000000090860379cce300ba1dd2050000000857415800000000acc44100000000000450474c00000000bf0a7503000000000000000000000000df95d164", + "3322020000000000000090860378785a00e40b5402000000085741580000000080841e00000000000450474c0000000080f0fa02000000000000000000000000eda5dc64", + "612202000000000000009086036ce0425008a69b0100000008574158000000007aae1100000000000450474c00000000806c8d030000000000000000000000002976de64", + "672202000000000000009086037dee3400e1f5050000000008574158000000006f420000000000000450474c00000000d63481030000000000000000000000004dc4de64", + "6e220200000000002019b86a522abbe10046c323000000000857415800000000829b0200000000000450474c000000000dc41702000000000000000000000000067adf64", + "912202000000000000009086036ce04276a7459b010000000857415800000000c3a21100000000000450474c0000000020f38e03000000000000000000000000362fe164", + "922202000000000000009086036d305e5cb9300a0000000008574158000000000c730000000000000450474c0000000025c175030000000000000000000000004f59e164", + "a82202000000000000009086036e1bf76039645200000000085741580000000070820300000000000450474c00000000a00d95030000000000000000000000004ee6e264", + "aa2202000000000000009086036d305e800c491100000000085741580000000050c30000000000000450474c000000008002750300000000000000000000000074f3e264", + "af2202000000000000009086037dee34c0d7f40c000000000857415800000000eb8f0000000000000450474c000000009843840300000000000000000000000016fee264", + "b02202000000000000009086036d305e8015861100000000085741580000000050c30000000000000450474c0000000080378103000000000000000000000000ac02e364", + "b8220200000000000000908603b17b4a763c9e0f1a0000000857415800000000cd2a1c01000000000450474c00000000ee1995030000000000000000000000002e3fe364", + "c1220200000000000000908603b3d3cd00e40b540200000008574158000000009d381900000000000450474c0000000010289b03000000000000000000000000d683e364", + "c4220200000000000000908603692f1300b33f71000000000857415800000000c2ca0400000000000450474c00000000d1279b03000000000000000000000000eb8fe364", + "c52202000000000000009086036ce04213b9459b01000000085741580000000011671100000000000450474c0000000011289b03000000000000000000000000529ae364", + "c72202000000000000a4e100013ed6abb39692be0200000008574158000000008cba1d00000000000450474c0000000013289b030000000000000000000000007db4e364", + "cc2202000000000000009086036d305e6c9b0248000000000857415800000000a7050300000000000450474c0000000040c8a203000000000000000000000000551be464", + "cf22020000000000b016bdca9b588510d07d593906000000085741580000000058524600000000000450474c0000000037147503000000000000000000000000daa0e464", + "d0220200000000000000908603720ac400c817a80400000008574158000000005c073200000000000450474c0000000095c9a203000000000000000000000000daace464", + "d2220200000000000000908603b3d3cd00e40b54020000000857415800000000689c1800000000000450474c00000000630bb2030000000000000000000000000dbfe464", + "d322020000000000b016bdca9b58851000902f500900000008574158000000008b8c6500000000000450474c00000000d21d95030000000000000000000000001cc5e464" + ], + "more": false, + "next_key": "" + }, + "text": "{\"rows\":[\"090000000000000000009086031adf558096980000000000085741580000000080969800000000000450474c00000000102700000000000000000000000000003788e65f\",\"0a0000000000000000009086036e7c77005a6202000000000857415800000000002d3101000000000450474c00000000204e0000000000000000000000000000f3f8f25f\",\"0c0000000000000000009086036e7c77001bb70000000000085741580000000000a3e111000000000450474c00000000900100000000000000000000000000008ef9f25f\",\"0d0000000000000000009086036e7c7700a177000000000008574158000000000008af2f000000000450474c0000000062000000000000000000000000000000b7f9f25f\",\"0e0000000000000000009086036e7c778096980000000000085741580000000080841e00000000000450474c0000000050c30000000000000000000000000000f3f9f25f\",\"5a0000000000000000009086036f75106400000000000000085741580000000010270000000000000450474c000000006400000000000000000000000000000007c81f60\",\"d30000000000000000009086036e0ac80080542600000000085741580000000056154701000000000450474c00000000e09304000000000000000000000000002f0c4860\",\"ed0000000000000000009086036fcf4200eb9407000000000857415800000000804f1200000000000450474c00000000a02c10000000000000000000000000007f634a60\",\"0101000000000000000098d7289094a500c2eb0b00000000085741580000000080841e00000000000450474c0000000040420f000000000000000000000000006d614b60\",\"2b01000000000000000098d7289094a500ca9a3b000000000857415800000000127b2d00000000000450474c0000000078313300000000000000000000000000fd5e4f60\",\"2c01000000000000000098d7289094a5002f68590000000008574158000000006caa9300000000000450474c00000000b0a61700000000000000000000000000f75f4f60\",\"3101000000000000000090860371bbeb00a493d600000000085741580000000080969800000000000450474c0000000080ee3600000000000000000000000000fa784f60\",\"6d01000000000000000098d7289094a500ca9a3b0000000008574158000000004f1e2600000000000450474c00000000b8143d00000000000000000000000000ec325560\",\"7201000000000000000098d7289094a50065cd1d000000000857415800000000aa9b1200000000000450474c00000000d08f3e00000000000000000000000000c0cc5560\",\"7501000000000000000098d7289094a50065cd1d00000000085741580000000027be1100000000000450474c00000000df9c41000000000000000000000000002fe55560\",\"ba01000000000000000098d7289094a50065cd1d00000000085741580000000045681000000000000450474c0000000010f44600000000000000000000000000298e6160\",\"d601000000000000000090860372b23354cb753008000000085741580000000039633104000000000450474c00000000404b4c000000000000000000000000008bc86460\",\"dc01000000000000000090860371feff0065cd1d0000000008574158000000005a2b1300000000000450474c00000000dfba3c0000000000000000000000000052a76760\",\"dd0100000000000000009086036d76469862c0d00000000008574158000000004bc15d00000000000450474c00000000a0f9560000000000000000000000000046c56760\",\"e101000000000000000098d7289094a50065cd1d000000000857415800000000cdcc0e00000000000450474c00000000b4a84e0000000000000000000000000034296860\",\"fc01000000000000000098d7289094a50065cd1d0000000008574158000000002fb70c00000000000450474c00000000ae8d5b00000000000000000000000000f4836b60\",\"1302000000000000000098d7289094a500a3e111000000000857415800000000e30a0700000000000450474c00000000992e630000000000000000000000000084866d60\",\"2702000000000000000090860373631f1027000000000000085741580000000000e1f505000000000450474c0000000001000000000000000000000000000000f0e26e60\",\"3602000000000000000098d7289094a50065cd1d0000000008574158000000006d3f0900000000000450474c000000008be27d00000000000000000000000000dc716f60\",\"af02000000000000000098d7289094a50cf20b5a000000000857415800000000d1f41400000000000450474c00000000c0d8a7000000000000000000000000001fc87560\",\"c5020000000000000000908603752050210484040000000008574158000000009ef60000000000000450474c00000000ec1ab7000000000000000000000000004b7a7660\",\"ff020000000000000000908603728a90001bb70000000000085741580000000000a3e111000000000450474c000000009001000000000000000000000000000096d47760\",\"25030000000000000000908603761dbedbe38901000000000857415800000000b09a541a3c0000000450474c00000000010000000000000000000000000000001ef47860\",\"3603000000000000000090860371adeb40420f0000000000085741580000000000e40b54020000000450474c0000000001000000000000000000000000000000e49b7960\",\"0b040000000000000000908603779ec13464ab0a000000000857415800000000f968b940040000000450474c0000000062000000000000000000000000000000e77f7e60\",\"88050000000000000000908603812027c4c9070000000000085741580000000040783930010000000450474c0000000001000000000000000000000000000000b5098a60\",\"e70500000000000000009086036ec3446463100a0000000008574158000000001d270500000000000450474c00000000374b4c0000000000000000000000000030f38c60\",\"7308000000000000000090860377cc0400e1f505000000000857415800000000d3d7a394000000000450474c0000000091010000000000000000000000000000ee829860\",\"7f08000000000000000090860375b974de85d90300000000085741580000000073031902000000000450474c00000000b0470000000000000000000000000000b6d09860\",\"dd0800000000000000009086039769cd78000000000000000857415800000000804f1200000000000450474c000000000100000000000000000000000000000019e19a60\",\"c909000000000000000090860398862a00f2052a01000000085741580000000000203d88792d00000450474c00000000010000000000000000000000000000006177a160\",\"830a00000000000000009086038988c2f7c1e51a00000000085741580000000070c0e8ae1a0400000450474c00000000010000000000000000000000000000001153aa60\",\"520b0000000000000000908603a21e488813000000000000085741580000000080f0fa02000000000450474c0000000001000000000000000000000000000000d24dae60\",\"420d00000000000000009086037906db00e40b54020000000857415800000000fd2c3101000000000450474c00000000414b4c00000000000000000000000000ab65b360\",\"2513000000000000000090860381062ed1060300000000000857415800000000c8280000000000000450474c000000002ae60200000000000000000000000000ce7ac560\",\"1b14000000000000000090860383f77744c27b0600000000085741580000000040805442fd0000000450474c00000000010000000000000000000000000000003672c760\",\"8214000000000000000090860377ee16d4e5900a00000000085741580000000040a911bc9c0100000450474c00000000010000000000000000000000000000003384c860\",\"e6160000000000000000908603a72dc670fff70100000000085741580000000000ad78a2190000000450474c00000000030000000000000000000000000000003318cc60\",\"051e000000000000000090860375385600e1f5050000000008574158000000000010a5d4e80000000450474c00000000010000000000000000000000000000005d42ee60\",\"642100000000000000009086036e46d0c092830100000000085741580000000038630000000000000450474c0000000080969800000000000000000000000000083f0261\",\"d12100000000000000009086036e46d0c0928301000000000857415800000000604f0000000000000450474c0000000020bcbe0000000000000000000000000012a80461\",\"78270000000000000000908603a6431a00e1f5050000000008574158000000000010a5d4e80000000450474c00000000010000000000000000000000000000006da22361\",\"8e2a0000000000000000908603bc0c5480f0fa020000000008574158000000000088526a740000000450474c00000000010000000000000000000000000000007bf63761\",\"8f2a0000000000000000908603bc0c54ef86cc0d000000000857415800000000f0d756051b0200000450474c0000000001000000000000000000000000000000e3f63761\",\"c22b00000000000000009086037654464aaef9dd0200000008574158000000000a1b8f00000000000450474c000000001059c800000000000000000000000000945d4c61\",\"772e00000000000070289d98cd78948b80ce341d0000000008574158000000000068c2de740400000450474c00000000010000000000000000000000000000007bfd7b61\",\"0e2f000000000000000000d270709144803bd64f000000000857415800000000404b4c00000000000450474c0000000060e02800000000000000000000000000c2ec8261\",\"ab3600000000000090abbfc8676ca64f8238fe0500000000085741580000000010ab3f0d750000000450474c0000000002000000000000000000000000000000bd58ac61\",\"ac3600000000000090abbfc8676ca64f8238fe0500000000085741580000000010ab3f0d750000000450474c0000000002000000000000000000000000000000cf58ac61\",\"d2360000000000000000908603ebb60f0065cd1d000000000857415800000000005039278c0400000450474c00000000010000000000000000000000000000001af9ac61\",\"94370000000000000000908603754e3f8096980000000000085741580000000000e87648170000000450474c0000000001000000000000000000000000000000f5e4af61\",\"95370000000000000000908603754e3f8096980000000000085741580000000080969800000000000450474c0000000010270000000000000000000000000000fee4af61\",\"033800000000000000009086038ab30700e1f50500000000085741580000000080969800000000000450474c00000000a08601000000000000000000000000001ecfb161\",\"d93900000000000000009086038cb48a809fd50000000000085741580000000070110100000000000450474c0000000080841e00000000000000000000000000f0d7b861\",\"55410000000000000000908603dabe1b0065cd1d000000000857415800000000d294b502000000000450474c00000000b0ad01000000000000000000000000005a76c861\",\"b541000000000000c0e9bc347ba9ae7a7f7f0d00000000000857415800000000d4260000000000000450474c000000005b940d00000000000000000000000000c209ca61\",\"154700000000000000009086037390d5d1060300000000000857415800000000c8280000000000000450474c000000002ae60200000000000000000000000000c015d561\",\"d24800000000000000a4e100010a170d6400000000000000085741580000000040420f00000000000450474c00000000010000000000000000000000000000007fd3d961\",\"fc610000000000000000908603e2f337a083bd0000000000085741580000000010270000000000000450474c00000000a083bd00000000000000000000000000806afb61\",\"ce66000000000000a0dc35f89aeca44b351401000000000008574158000000005056252a000000000450474c00000000010000000000000000000000000000001336ff61\",\"ae6800000000000010159ba688a8d834745e0600000000000857415800000000d2260000000000000450474c00000000a06806000000000000000000000000004b1b0462\",\"4b6a00000000000000a4e100012762306400000000000000085741580000000040420f00000000000450474c0000000001000000000000000000000000000000c47d0662\",\"066b00000000000030f074f91ac9a6835423080000000000085741580000000095260000000000000450474c00000000463d080000000000000000000000000093080b62\",\"8a6b00000000000010c4574949a76d347082030000000000085741580000000010270000000000000450474c00000000708203000000000000000000000000005f110f62\",\"8b6b00000000000010c4574949a76d3460182300000000000857415800000000a0860100000000000450474c00000000708203000000000000000000000000007d110f62\",\"8c6b00000000000010c4574949a76d3400c3180100000000085741580000000000350c00000000000450474c0000000070820300000000000000000000000000c1110f62\",\"277a00000000000000009086036de4ee20a1070000000000085741580000000010270000000000000450474c0000000020a1070000000000000000000000000002b66e62\",\"2f7d00000000000000003086036ab0e70050d6dc010000000857415800000000cafd6c00000000000450474c00000000ffe5aa00000000000000000000000000c6178862\",\"307d00000000000000003086036ab0e700f902950000000008574158000000002a88f400000000000450474c00000000c0cd1700000000000000000000000000e2178862\",\"ce9d000000000000104d56f2aa8c1dcf03a7000000000000085741580000000030e57b19000000000450474c0000000001000000000000000000000000000000b2cc0363\",\"fed801000000000000009086036e53ec8df7d723000000000857415800000000625a91240e0000000450474c0000000063000000000000000000000000000000037ee263\",\"c4dc01000000000000009086037746ad80778e06000000000857415800000000c8e718a3000000000450474c00000000920100000000000000000000000000003d7a0764\",\"10dd0100000000000000908603720a590094357700000000085741580000000094780e00000000000450474c0000000004ca410100000000000000000000000092810964\",\"12dd010000000000000090860371369d005ed0b2000000000857415800000000c0270900000000000450474c0000000080f0fa02000000000000000000000000f2b70964\",\"18dd010000000000000098d7289094a500f2052a010000000857415800000000d6dc3200000000000450474c00000000bee1e40000000000000000000000000063160b64\",\"19dd010000000000000098d7289094a500f9029500000000085741580000000036b70c00000000000450474c0000000069c3c9010000000000000000000000007a160b64\",\"1add010000000000000098d7289094a50094357700000000085741580000000023df0d00000000000450474c000000007eb14f0100000000000000000000000095160b64\",\"1bdd010000000000000098d7289094a500e40b5402000000085741580000000020bcbe00000000000450474c0000000000127a00000000000000000000000000a7160b64\",\"1edd010000000000000098d7289094a500f2052a0100000008574158000000003565ad00000000000450474c0000000080234300000000000000000000000000b8160b64\",\"20dd010000000000000098d7289094a5005ed0b2000000000857415800000000c88aa900000000000450474c00000000e032290000000000000000000000000031170b64\",\"21dd01000000000070efbdf75295b19700e40b54020000000857415800000000203d2e00000000000450474c00000000368af7010000000000000000000000000c1d0b64\",\"22dd01000000000070efbdf75295b19700c817a8040000000857415800000000e0257800000000000450474c00000000c0928301000000000000000000000000231d0b64\",\"23dd010000000000000098d72870591b00f2052a0100000008574158000000006b6e1900000000000450474c000000007bc3c90100000000000000000000000043240b64\",\"24dd010000000000000098d72870591b00286bee0000000008574158000000007a101d00000000000450474c000000003f6f400100000000000000000000000052240b64\",\"25dd010000000000000098d72870591b00286bee00000000085741580000000053b01300000000000450474c00000000b605d9010000000000000000000000005c240b64\",\"26dd010000000000000098d72870591b005ed0b200000000085741580000000071372500000000000450474c00000000ddaebb000000000000000000000000006b240b64\",\"4bdd0100000000000000908603692ba400e8764817000000085741580000000080f0fa02000000000450474c00000000002d310100000000000000000000000079f20b64\",\"74dd01000000000000009086037746ad00e1f5050000000008574158000000003ba78a00000000000450474c00000000e2ad010000000000000000000000000004170e64\",\"d2dd010000000000000090860373924300c2eb0b0000000008574158000000001d630100000000000450474c0000000097b14f01000000000000000000000000fd991164\",\"f8dd0100000000000000908603dfbff33c1028040800000008574158000000007057a69f210300000450474c000000006400000000000000000000000000000050d71364\",\"66de010000000000000090860371369d008845c8000000000857415800000000c0270900000000000450474c00000000007e5603000000000000000000000000eb281864\",\"f8fa01000000000000009086036dde140042dc06030000000857415800000000a02e6300000000000450474c00000000002d310100000000000000000000000059fd2964\",\"030a0200000000000000908603f2ae1800a0acb9030000000857415800000000404b4c00000000000450474c000000000048e80100000000000000000000000080aa3464\",\"bf0b020000000000000090860378785a00e40b54020000000857415800000000b7982b00000000000450474c00000000bf0e1602000000000000000000000000423b3564\",\"720f02000000000000009086037425f480b18eac010000000857415800000000f8da3600000000000450474c00000000002d31010000000000000000000000003a1e3a64\",\"241002000000000000009086037aa10db8f7062a01000000085741580000000040420f00000000000450474c000000001ef3fa020000000000000000000000005d5e4164\",\"251002000000000000009086037aa10dc8546cee00000000085741580000000040420f00000000000450474c00000000025d62020000000000000000000000007c5e4164\",\"261002000000000000009086037aa10d9c89d1b200000000085741580000000040420f00000000000450474c000000007fc6c901000000000000000000000000955e4164\",\"271002000000000000009086037aa10d70c9ad7700000000085741580000000040420f00000000000450474c00000000bc603201000000000000000000000000bb5e4164\",\"721b02000000000000009086037746ad39a9b30b00000000085741580000000010d2cc27040000000450474c000000006e000000000000000000000000000000a64c6564\",\"781d0200000000000000908603f866dd0092b2e304000000085741580000000080969800000000000450474c00000000406f400100000000000000000000000048fe7664\",\"b81e0200000000000000908603d1fe4c8055c82000000000085741580000000090d00300000000000450474c0000000080b14f01000000000000000000000000b92c9264\",\"f51e02000000000090ef67d5d25f757483b5010900000000085741580000000000cc8004000000000450474c00000000224e0000000000000000000000000000555d9964\",\"2a1f02000000000000009086036dd35588ed37b00100000008574158000000005e1b3700000000000450474c00000000bb603201000000000000000000000000b368a164\",\"411f02000000000000009086037342c3578c9620000000000857415800000000ddbf0300000000000450474c00000000ec8153010000000000000000000000000006a364\",\"461f0200000000002019b86a522abbe10065cd1d000000000857415800000000903c0900000000000450474c0000000091097e000000000000000000000000001b06a464\",\"901f0200000000000000908603f2b8655008499c010000000857415800000000de271e00000000000450474c00000000b80e160200000000000000000000000031d2ab64\",\"d01f0200000000000000908603defd0100209db4060000000857415800000000404b4c00000000000450474c0000000000e86e03000000000000000000000000d352b064\",\"332002000000000000009086036dd35500f2052a0100000008574158000000006b6e1900000000000450474c000000007bc3c9010000000000000000000000001571bb64\",\"342002000000000000009086036dd35500c39dd0000000000857415800000000f8590d00000000000450474c00000000005a62020000000000000000000000003071bb64\",\"352002000000000000009086036dd35500f9029500000000085741580000000020a10700000000000450474c0000000080f0fa020000000000000000000000003b71bb64\",\"362002000000000000009086036dd355002f685900000000085741580000000058290400000000000450474c000000002e3b47030000000000000000000000004f71bb64\",\"372002000000000000009086036dd35500e40b54020000000857415800000000abb96500000000000450474c00000000c0e1e4000000000000000000000000009c71bb64\",\"3d2002000000000000009086036b239fee1bbcbf0b0000000857415800000000d23ce101000000000450474c000000000024f400000000000000000000000000f20cbe64\",\"49200200000000000000908603f2b865012c82a40000000008574158000000005a080c00000000000450474c00000000b80e160200000000000000000000000071a8be64\",\"c1200200000000002019b86a522abbe165c2211a000000000857415800000000bc5d0d00000000000450474c00000000c95e4c000000000000000000000000005038c464\",\"a8210200000000000000908603720a59ca58774a020000000857415800000000b751f500000000000450474c0000000040625d000000000000000000000000009468cf64\",\"b921020000000000000090860387e24200e40b540200000008574158000000001f3d2e00000000000450474c00000000418af701000000000000000000000000c255d164\",\"bb21020000000000000090860379cce300ba1dd2050000000857415800000000acc44100000000000450474c00000000bf0a7503000000000000000000000000df95d164\",\"3322020000000000000090860378785a00e40b5402000000085741580000000080841e00000000000450474c0000000080f0fa02000000000000000000000000eda5dc64\",\"612202000000000000009086036ce0425008a69b0100000008574158000000007aae1100000000000450474c00000000806c8d030000000000000000000000002976de64\",\"672202000000000000009086037dee3400e1f5050000000008574158000000006f420000000000000450474c00000000d63481030000000000000000000000004dc4de64\",\"6e220200000000002019b86a522abbe10046c323000000000857415800000000829b0200000000000450474c000000000dc41702000000000000000000000000067adf64\",\"912202000000000000009086036ce04276a7459b010000000857415800000000c3a21100000000000450474c0000000020f38e03000000000000000000000000362fe164\",\"922202000000000000009086036d305e5cb9300a0000000008574158000000000c730000000000000450474c0000000025c175030000000000000000000000004f59e164\",\"a82202000000000000009086036e1bf76039645200000000085741580000000070820300000000000450474c00000000a00d95030000000000000000000000004ee6e264\",\"aa2202000000000000009086036d305e800c491100000000085741580000000050c30000000000000450474c000000008002750300000000000000000000000074f3e264\",\"af2202000000000000009086037dee34c0d7f40c000000000857415800000000eb8f0000000000000450474c000000009843840300000000000000000000000016fee264\",\"b02202000000000000009086036d305e8015861100000000085741580000000050c30000000000000450474c0000000080378103000000000000000000000000ac02e364\",\"b8220200000000000000908603b17b4a763c9e0f1a0000000857415800000000cd2a1c01000000000450474c00000000ee1995030000000000000000000000002e3fe364\",\"c1220200000000000000908603b3d3cd00e40b540200000008574158000000009d381900000000000450474c0000000010289b03000000000000000000000000d683e364\",\"c4220200000000000000908603692f1300b33f71000000000857415800000000c2ca0400000000000450474c00000000d1279b03000000000000000000000000eb8fe364\",\"c52202000000000000009086036ce04213b9459b01000000085741580000000011671100000000000450474c0000000011289b03000000000000000000000000529ae364\",\"c72202000000000000a4e100013ed6abb39692be0200000008574158000000008cba1d00000000000450474c0000000013289b030000000000000000000000007db4e364\",\"cc2202000000000000009086036d305e6c9b0248000000000857415800000000a7050300000000000450474c0000000040c8a203000000000000000000000000551be464\",\"cf22020000000000b016bdca9b588510d07d593906000000085741580000000058524600000000000450474c0000000037147503000000000000000000000000daa0e464\",\"d0220200000000000000908603720ac400c817a80400000008574158000000005c073200000000000450474c0000000095c9a203000000000000000000000000daace464\",\"d2220200000000000000908603b3d3cd00e40b54020000000857415800000000689c1800000000000450474c00000000630bb2030000000000000000000000000dbfe464\",\"d322020000000000b016bdca9b58851000902f500900000008574158000000008b8c6500000000000450474c00000000d21d95030000000000000000000000001cc5e464\"],\"more\":false,\"next_key\":\"\"}" +} \ No newline at end of file diff --git a/test/data/requests/ac83d654fdb4c4ef32e6909e26c66f73c34f5f3e.json b/test/data/requests/ac83d654fdb4c4ef32e6909e26c66f73c34f5f3e.json new file mode 100644 index 0000000..0b6e113 --- /dev/null +++ b/test/data/requests/ac83d654fdb4c4ef32e6909e26c66f73c34f5f3e.json @@ -0,0 +1,18 @@ +{ + "request": { + "path": "https://jungle4.greymass.com/v1/chain/get_table_rows", + "params": { + "method": "POST", + "body": "{\"table\":\"accounts\",\"code\":\"eosio.token\",\"scope\":\"eosio.token\",\"limit\":1,\"lower_bound\":\"\",\"upper_bound\":\"\",\"index_position\":\"primary\",\"key_type\":\"name\",\"json\":false}" + } + }, + "status": 200, + "json": { + "rows": [ + "811d20000000000004454f5300000000" + ], + "more": true, + "next_key": "76193916147018" + }, + "text": "{\"rows\":[\"811d20000000000004454f5300000000\"],\"more\":true,\"next_key\":\"76193916147018\"}" +} \ No newline at end of file diff --git a/test/data/requests/b1cf0891251fa520755ab314e09cdaac9a7d5b7f.json b/test/data/requests/b1cf0891251fa520755ab314e09cdaac9a7d5b7f.json new file mode 100644 index 0000000..f1cab3d --- /dev/null +++ b/test/data/requests/b1cf0891251fa520755ab314e09cdaac9a7d5b7f.json @@ -0,0 +1,18 @@ +{ + "request": { + "path": "https://jungle4.greymass.com/v1/chain/get_table_rows", + "params": { + "method": "POST", + "body": "{\"table\":\"accounts\",\"code\":\"eosio.token\",\"scope\":\"eosio.token\",\"limit\":1,\"index_position\":\"primary\",\"key_type\":\"name\",\"json\":false}" + } + }, + "status": 200, + "json": { + "rows": [ + "811d20000000000004454f5300000000" + ], + "more": true, + "next_key": "76193916147018" + }, + "text": "{\"rows\":[\"811d20000000000004454f5300000000\"],\"more\":true,\"next_key\":\"76193916147018\"}" +} \ No newline at end of file diff --git a/test/data/requests/f6cb9e791a1f8ba9f62dc3fdfb46fdef3b872052.json b/test/data/requests/f6cb9e791a1f8ba9f62dc3fdfb46fdef3b872052.json new file mode 100644 index 0000000..bd67d93 --- /dev/null +++ b/test/data/requests/f6cb9e791a1f8ba9f62dc3fdfb46fdef3b872052.json @@ -0,0 +1,19 @@ +{ + "request": { + "path": "https://jungle4.greymass.com/v1/chain/get_table_rows", + "params": { + "method": "POST", + "body": "{\"json\":false,\"limit\":1000,\"table\":\"accounts\",\"code\":\"eosio.token\",\"scope\":\"eosio.token\",\"key_type\":\"name\"}" + } + }, + "status": 200, + "json": { + "rows": [ + "811d20000000000004454f5300000000", + "80841e0000000000044a554e474c4500" + ], + "more": false, + "next_key": "" + }, + "text": "{\"rows\":[\"811d20000000000004454f5300000000\",\"80841e0000000000044a554e474c4500\"],\"more\":false,\"next_key\":\"\"}" +} \ No newline at end of file diff --git a/test/tests/codegen.ts b/test/tests/codegen.ts index 96f4898..bdf7c4e 100644 --- a/test/tests/codegen.ts +++ b/test/tests/codegen.ts @@ -4,87 +4,126 @@ import {assert} from 'chai' import fs from 'fs' import {Contract} from 'src/contract' -import * as MockRewardsGm from '$test/data/contracts/mock-rewards' +import Eosio from '$test/data/contracts/mock-eosio' +import EosioMsig from '$test/data/contracts/mock-eosio.msig' +import EosioToken from '$test/data/contracts/mock-eosio.token' +import RewardsGm from '$test/data/contracts/mock-rewards.gm' + import {generateCodegenContract, removeCodegenContracts} from '$test/utils/codegen' -import {runGenericContractTests} from './contract' -;(async function () { - const GeneratedRewardsGm = await generateCodegenContract('rewards.gm') +import {runGenericContractTests} from './helpers/generic' + +const client = makeClient('https://eos.greymass.com') + +interface Code { + mock: string + generated: string +} + +suite('codegen', async function () { + // Contract instances const contracts = { - MockRewardsGm, - GeneratedRewardsGm: GeneratedRewardsGm.import, + eosio: { + mock: Eosio, + generated: null, + }, + 'eosio.msig': { + mock: EosioMsig, + generated: null, + }, + 'eosio.token': { + mock: EosioToken, + generated: null, + }, + 'rewards.gm': { + mock: RewardsGm, + generated: null, + }, } - const files = { - mock: fs.readFileSync('test/data/contracts/mock-rewards.ts').toString('utf-8'), - generated: GeneratedRewardsGm.text, - } + // Source code + const sources: Code[] = [] - const client = makeClient('https://eos.greymass.com') + setup(async function () { + if (!sources.length) { + // loop through files + for (const testCase of Object.keys(contracts)) { + const generated = await generateCodegenContract(testCase) + const mock = fs + .readFileSync(`test/data/contracts/mock-${testCase}.ts`) + .toString('utf-8') + // Push source file in for comparison + sources.push({ + mock, + generated: generated.text, + }) + // Push contract class for testing + contracts[testCase] = generated.import + } + } + }) - suite('codegen', function () { + suite('Generated vs Static', function () { test('Contracts are identical', function () { - assert.equal(files.generated, files.mock) + for (const source of sources) { + assert.equal(source.generated, source.mock) + } }) - Object.keys(contracts).forEach((contractKey) => { - suite(`Testing namespace ${contractKey}`, function () { - // The `RewardsGm` namespace - const testNamespace = contracts[contractKey].RewardsGm - - // The `Contract` instance in the namespace - const testContract = testNamespace.Contract - const testContractInstance = new testContract({client}) - - function assertRewardsContract(contract) { - assert.instanceOf(contract, Contract) - assert.instanceOf(contract.abi, ABI) - assert.isTrue(contract.abi.equals(testNamespace.abi)) - assert.instanceOf(contract.account, Name) - assert.instanceOf(contract.client, APIClient) - } - - suite('Contract', function () { - suite('constructor', function () { - test('default', function () { - const contract = new testContract({client}) - assertRewardsContract(contract) - }) - test('accepted variants', function () { - const c1 = new testContract({client}) - assertRewardsContract(c1) - const c2 = new testContract({client, abi: testNamespace.abi}) - assertRewardsContract(c2) - const c3 = new testContract({client, account: 'teamgreymass'}) - assertRewardsContract(c3) - const c4 = new testContract({ - client, - account: Name.from('teamgreymass'), - }) - assertRewardsContract(c4) - const c5 = new testContract({ - client, + for (const contractKey of Object.keys(contracts)) { + for (const testType of Object.keys(contracts[contractKey])) { + test(`Testing contract ${contractKey} (${testType})`, function () { + const testNamespace = contracts[contractKey].default + const testContract = testNamespace.Contract + const testContractInstance = new testContract({client}) + + // Run generic contract tests + runGenericContractTests(testContractInstance) + + function assertRewardsContract(contract) { + assert.instanceOf(contract, Contract) + assert.instanceOf(contract.abi, ABI) + assert.isTrue(contract.abi.equals(testNamespace.abi)) + assert.instanceOf(contract.account, Name) + assert.instanceOf(contract.client, APIClient) + } + + assertRewardsContract(testContractInstance) + + const c1 = new testContract({client}) + assertRewardsContract(c1) + + const c2 = new testContract({client, abi: testNamespace.abi}) + assertRewardsContract(c2) + + const c3 = new testContract({client, account: 'teamgreymass'}) + assertRewardsContract(c3) + + const c4 = new testContract({ + client, + account: Name.from('teamgreymass'), + }) + assertRewardsContract(c4) + + const c5 = new testContract({ + client, + abi: testNamespace.abi, + account: 'teamgreymass', + }) + assertRewardsContract(c5) + + assert.throws(() => new testContract({abi: testNamespace.abi})) + assert.throws( + () => + new testContract({ abi: testNamespace.abi, account: 'teamgreymass', }) - assertRewardsContract(c5) - }) - test('invalid variants', function () { - assert.throws(() => new testContract({abi: testNamespace.abi})) - assert.throws( - () => - new testContract({ - abi: testNamespace.abi, - account: 'teamgreymass', - }) - ) - assert.throws(() => new testContract({account: 'teamgreymass'})) - }) - }) - runGenericContractTests(testContractInstance) + ) + assert.throws(() => new testContract({account: 'teamgreymass'})) }) - }) - }) - teardown(() => { - removeCodegenContracts() - }) + } + } + }) + teardown(() => { + removeCodegenContracts() }) -})() +}) diff --git a/test/tests/contract.ts b/test/tests/contract.ts index 87ed18e..88a6822 100644 --- a/test/tests/contract.ts +++ b/test/tests/contract.ts @@ -1,10 +1,11 @@ import {makeClient, mockPrivateKey, mockSession} from '@wharfkit/mock-data' import {assert} from 'chai' -import ContractKit, {ActionDataType, Contract, ContractArgs, Table} from '$lib' +import ContractKit, {Contract, ContractArgs, Table} from '$lib' import {ProducerInfo} from '$test/data/structs/eosio' import {ABI, Action, Asset, Name, PrivateKey, Serializer} from '@wharfkit/antelope' import {PlaceholderAuth} from '@wharfkit/signing-request' +import {runGenericContractTests} from './helpers/generic' const mockClient = makeClient('https://jungle4.greymass.com') @@ -68,89 +69,22 @@ const transferData = { memo: 'initial balance', } -// Mocks data for the first action defined in the contract for testing purposes -function getMockParams(contract: Contract): ActionDataType { - switch (String(contract.account)) { - case 'eosio': { - return { - feature_digest: '331f0fae3454c34ed2c5e84aeaf6143ce8e0b0678a6d57c25349363a4d590f41', - } - } - case 'eosio.token': { - return { - owner: 'foo', - symbol: '4,EOS', - } - } - case 'rewards.gm': { - return { - account: 'foo', - weight: 1, - } - } - default: { - throw new Error(`getMockParams not implemented for ${contract.account}`) - } - } -} +const mockKit = new ContractKit({ + client: mockClient, +}) -export function runGenericContractTests(contract: Contract) { - suite('tableNames', function () { - test('contains tables', function () { - assert.isArray(contract.tableNames) - assert.isTrue(contract.tableNames.length > 0) - }) - }) - suite('table', function () { - test('load table using Name', function () { - const tableName = Name.from(contract.tableNames[0]) - const table = contract.table(tableName) - assert.instanceOf(table, Table) - assert.isTrue(table.name.equals(tableName)) - }) - test('load table using string', function () { - const tableName = contract.tableNames[0] - const table = contract.table(tableName) - assert.instanceOf(table, Table) - assert.isTrue(table.name.equals(tableName)) - }) - test('throws on invalid name', function () { - assert.throws(() => contract.table('foo')) - }) - }) - suite('actionNames', function () { - test('contains actions', function () { - assert.isArray(contract.actionNames) - assert.isTrue(contract.actionNames.length > 0) - }) - }) - suite('action', function () { - test('load action using Name', function () { - const actionName = Name.from(contract.actionNames[0]) - const params = getMockParams(contract) - const action = contract.action(actionName, params) - assert.instanceOf(action, Action) - assert.isTrue(action.name.equals(actionName)) - }) - test('load action using string', function () { - const actionName = contract.actionNames[0] - const params = getMockParams(contract) - const action = contract.action(actionName, params) - assert.instanceOf(action, Action) - assert.isTrue(action.name.equals(actionName)) - }) - test('throws on invalid name', function () { - assert.throws(() => contract.action('foo', {})) - }) - }) -} +suite('Contract', async function () { + let systemContract: Contract + let tokenContract: Contract -;(async function () { - const mockKit = new ContractKit({ - client: mockClient, + setup(async function () { + if (!systemContract) { + systemContract = await mockKit.load('eosio') + } + if (!tokenContract) { + tokenContract = await mockKit.load('eosio.token') + } }) - const systemContract = await mockKit.load('eosio') - const tokenContract = await mockKit.load('eosio.token') suite('Contract', () => { suite('construct', function () { @@ -181,7 +115,11 @@ export function runGenericContractTests(contract: Contract) { }) suite('table', function () { test('should accept rowType', async function () { - const table = systemContract.table('producers', ProducerInfo) + const table = systemContract.table( + 'producers', + undefined, + ProducerInfo + ) assert.instanceOf(table, Table) const producer = await table.get('lioninjungle') assert.instanceOf(producer, ProducerInfo) diff --git a/test/tests/helpers/generic.ts b/test/tests/helpers/generic.ts new file mode 100644 index 0000000..306ce10 --- /dev/null +++ b/test/tests/helpers/generic.ts @@ -0,0 +1,87 @@ +import {Action, Name} from '@wharfkit/antelope' +import {assert} from 'chai' + +import {ActionDataType, Contract} from 'src/contract' +import {Table} from 'src/index-module' + +// Mocks data for the first action defined in the contract for testing purposes +export function getMockParams(contract: Contract): ActionDataType { + switch (String(contract.account)) { + case 'eosio': { + return { + feature_digest: '331f0fae3454c34ed2c5e84aeaf6143ce8e0b0678a6d57c25349363a4d590f41', + } + } + case 'eosio.msig': { + return { + proposer: 'foo', + proposal_name: 'bar', + level: { + actor: 'foo', + permission: 'active', + }, + } + } + case 'eosio.token': { + return { + owner: 'foo', + symbol: '4,EOS', + } + } + case 'rewards.gm': { + return { + account: 'foo', + weight: 1, + } + } + default: { + throw new Error(`getMockParams not implemented for ${contract.account}`) + } + } +} + +export function runGenericContractTests(contract: Contract) { + // suite: tableNames + // contains tables + assert.isArray(contract.tableNames) + assert.isTrue(contract.tableNames.length > 0) + + // suite: table + // load table using Name + const tableName = Name.from(contract.tableNames[0]) + const table = contract.table(tableName) + assert.instanceOf(table, Table) + assert.isTrue(table.name.equals(tableName)) + + // load table using string + const tableName2 = contract.tableNames[0] + const table2 = contract.table(tableName2) + assert.instanceOf(table2, Table) + assert.isTrue(table2.name.equals(tableName2)) + + // throws on invalid name + assert.throws(() => contract.table('foo')) + + // suite: actionNames + // contains actions + assert.isArray(contract.actionNames) + assert.isTrue(contract.actionNames.length > 0) + + // suite: action + // load action using Name + const actionName = Name.from(contract.actionNames[0]) + const params = getMockParams(contract) + const action = contract.action(actionName, params) + assert.instanceOf(action, Action) + assert.isTrue(action.name.equals(actionName)) + + // load action using string + const actionName2 = contract.actionNames[0] + const params2 = getMockParams(contract) + const action2 = contract.action(actionName2, params2) + assert.instanceOf(action2, Action) + assert.isTrue(action2.name.equals(actionName2)) + + // throws on invalid name + assert.throws(() => contract.action('foo', {})) +} diff --git a/test/tests/mock.ts b/test/tests/mock.ts index 06903fa..2804eb0 100644 --- a/test/tests/mock.ts +++ b/test/tests/mock.ts @@ -2,7 +2,7 @@ import {Action, Asset, Bytes, Name, PermissionLevel, Serializer, Struct} from '@ import {makeClient} from '@wharfkit/mock-data' import {assert} from 'chai' -import RewardsGm from '$test/data/contracts/mock-rewards' +import RewardsGm from '$test/data/contracts/mock-rewards.gm' import {PlaceholderName, PlaceholderPermission} from '@wharfkit/signing-request' import {Table, TableRowCursor} from 'src/index-module' diff --git a/test/tests/table.ts b/test/tests/table.ts index ae65cb5..bf281ee 100644 --- a/test/tests/table.ts +++ b/test/tests/table.ts @@ -79,6 +79,17 @@ suite('Table', () => { }) assert.instanceOf(table, Table) }) + test('defaultScope', () => { + const table = new Table({ + abi: decentiumorg.abi, + account: decentiumorg.account, + client: mockClient, + name: Name.from('trending'), + defaultScope: 'foo', + }) + assert.instanceOf(table, Table) + assert.equal(table.defaultScope, 'foo') + }) }) suite('cursor', () => { @@ -258,6 +269,26 @@ suite('Table', () => { ) }) }) + + suite('scopes', function () { + test('should work with numeric scopes', async function () { + const testKit = new ContractKit({ + client: makeClient('https://wax.greymass.com'), + }) + + const contract = await testKit.load('alcordexmain') + + const rowsBuyIntScope = await contract.table('buyorder').query({scope: 0}).all() + const rowsSellIntScope = await contract.table('sellorder').query({scope: 0}).all() + assert.equal(rowsBuyIntScope.length, 144) + assert.equal(rowsSellIntScope.length, 348) + + const rowsBuyTxtScope = await contract.table('buyorder').query({scope: '0'}).all() + const rowsSellTxtScope = await contract.table('sellorder').query({scope: '0'}).all() + assert.equal(rowsBuyTxtScope.length, 144) + assert.equal(rowsSellTxtScope.length, 348) + }) + }) }) suite('get', () => { @@ -330,11 +361,20 @@ suite('Table', () => { }) test('should just get first row without params', async function () { - const table = eosio.table('global', EosioGlobalState) + const table = eosio.table('global', undefined, EosioGlobalState) const row = await table.get() assert.instanceOf(row, EosioGlobalState) assert.instanceOf(row.pervote_bucket, Int64) }) + + test('should use scope from table call', async function () { + const contractKit = new ContractKit({ + client: makeClient('https://jungle4.greymass.com'), + }) + const contract = await contractKit.load('eosio.token') + const result = await contract.table('accounts', 'wharfkittest').get() + assert.instanceOf(result.balance, Asset) + }) }) suite('first', () => {