Git Product home page Git Product logo

cpp-play's Introduction

BitShares PLAY (PLAY PDV Net)

BitShares PLAY is a protocal and DAC designed to help coordinate voluntary decentralized game store and peer-to-peer game asset exchange.

Status

The symbol of develop branch is XTS, for testing, please go to folder tests/bdd_tests.

![Gitter](https://badges.gitter.im/Join Chat.svg)

White Paper

http://www.bitsuperlab.com/pdf/BitSharesPlayWhitePaper.pdf

Build Instructions

Different platforms have different steps for handling dependencies, check specific documents for more details:

Additional information is available at BitShares.org and the BitShares Wiki. Community discussion occurs at BitSharesTalk.org.

Building

Different platforms have different build instructions:

Using the RPC server

For many applications, it is useful to execute BitShares commands from scripts. The BitShares client includes RPC server functionality to allow programs to submit JSON-formatted commands and retrieve JSON-formatted results over an HTTP connection. To enable the RPC server, you can edit the rpc section of config.json as follows:

  "rpc": {
    "enable": true,
    "rpc_user": "USERNAME",
    "rpc_password": "PASSWORD",
    "rpc_endpoint": "127.0.0.1:1775",
    "httpd_endpoint": "127.0.0.1:1776",

Here, USERNAME and PASSWORD are authentication credentials which must be presented by a client to gain access to the RPC interface. These parameters may also be specified on the command line, but this is not recommended because some popular multi-user operating systems (Linux in particular) allow command line parameters of running programs to be visible to all users.

After editing the configuration file and (re)starting the BitShares client, you can use any HTTP client to POST a JSON object and read the JSON response. Here is an example using the popular curl command line HTTP client:

curl --user USERNAME:PASSWORD http://127.0.0.1:1776/rpc -X POST -H 'Content-Type: application/json' -d '{"method" : "blockchain_get_account", "params" : ["dev0.theoretical"], "id" : 1}'

The POST request returns a JSON result like this (some data elided for brevity):

{"id":1,"result":{"id":31427,"name":"dev0.theoretical","public_data":{"version":"v0.4.27.1"},"owner_key":"BTS75vj8aaDWFwg7Wd6WinAAqVddUcSRJ1hSMDNayLAbCuxsmoQTf", ...},"meta_data":{"type":"public_account","data":""}}}

Since HTTP basic authentication is used, the authentication credentials are sent over the socket in unencrypted plaintext. For this reason, binding to an interface other than localhost in the configuration file is not recommended. If you wish to access the RPC interface from a remote system, you should establish a secure connection using SSH port forwarding (the -L option in OpenSSH) or a reverse proxy SSL/TLS tunnel (typically supported by general-purpose webservers such as nginx).

Please keep in mind that anyone able to connect to the RPC socket with the correct username and password will be able to access all funds, accounts and private keys in any open wallet (including wallets opened manually or by another RPC client connected to the same bitshares_client instance). Thus, your security procedures should protect the username, password, and socket accordingly (including config.json since it contains the username and password)!

Contributing

The source code can always be found at the BitShares GitHub Repository. There are four main branches:

  • master - official BitShares releases are tagged from here; this should only change for a new release
  • test - for testing
  • develop - all new development happens here; this is what is used for internal BitShares XTS test networks

Some technical documentation is available at the BitShares GitHub Wiki.

Support

Bugs can be reported directly to the BitShares Issue Tracker.

Technical support can be obtained from the BitSharesTalk Technical Support Forum.

License

The BitShares source code is in the public domain under the Unlicense. See the LICENSE for more information.

cpp-play's People

Contributors

abitmore avatar alexchien avatar bytemaster avatar c055 avatar cgafeng avatar clar avatar dbrock avatar dnotestein avatar drltc avatar emfrias avatar fjzqhui avatar gandalf-the-grey avatar grzegorzs avatar hackfisher avatar julian1 avatar mauritsvdvijgh avatar nathanielhourt avatar nikakhov avatar nmushegian avatar onetester avatar pauleu avatar pch957 avatar pmconrad avatar robrigo avatar sidhujag avatar theoreticalbts avatar vikramrajkumar avatar vogel76 avatar xeroc avatar yuvarajgogoi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cpp-play's Issues

I played two dice in the same block, but there are only one jackpot result at last.

For the following example, the block is 151:

2014-09-30T12:19:58 151       test123             test123             0.00000 PLS             play dice                                   327,711.31984 PLS       0.50000 PLS         9e4fdf83
 2014-09-30T12:20:04 151       test123             test123             0.00000 PLS             play dice                                   327,710.81984 PLS       0.50000 PLS         6ace920f
 2014-09-30T12:20:10 152       test123             test123             0.00000 PLS             play dice                                   327,710.31984 PLS       0.50000 PLS         08114a50
 2014-09-30T12:21:40 161       MARKET              test123             17.82 DICE              winjackpot with lucky number: 0             37.62 DICE              0.00000 PLS         [6ddce1]
 2014-09-30T12:21:50 162       MARKET              test123             0.00 DICE               losejackpot with lucky number: 1            37.62 DICE              0.00000 PLS         [7f29cb]

blockchain_get_config exception

blockchain_get_config

Assert Exception
registration_fee > 0: 
    {}
    th_a  chain_interface.cpp:95 get_delegate_registration_fee

    {}
    th_a  common_api_client.cpp:19 blockchain_get_info

    {"command":"config"}
    th_a  cli.cpp:556 execute_command

ld: library not found for -ltcmalloc

Scanning dependencies of target bitcoin
[ 75%] Building CXX object libraries/bitcoin/CMakeFiles/bitcoin.dir/electrum.cpp.o
Linking CXX static library libbitcoin.a
[ 75%] Built target bitcoin
Linking CXX static library libbts_keyhotee.a
[ 75%] Built target bts_keyhotee
Linking C static library libminiupnpc.a
[ 79%] Built target upnpc-static
Scanning dependencies of target bts_api_generator
[ 79%] Building CXX object libraries/api/CMakeFiles/bts_api_generator.dir/bts_api_generator.cpp.o
Linking CXX executable bts_api_generator
ld: library not found for -ltcmalloc
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [libraries/api/bts_api_generator] Error 1
make[1]: *** [libraries/api/CMakeFiles/bts_api_generator.dir/all] Error 2
make: *** [all] Error 2

Add permission/filter to game libraries

For each game, they can only access/modify the game assets(chips) they are binding to.

This is the scenario:

The game developer first create several game chip assets (these chip assets can be traded/buy), e.g. dice, then they create a game binding that asset (need the signature of the asset issuer), each a game have a script or reference id pointing to the rules.

features/basic_transfer.feature failed

And transaction callback should match last transfer # features/step_definitions/basic_wallet_steps.rb:110

      expected: {"from_account"=>"XTS8MXmhWqtvTkpRQPoNNRaV6KHGnRd5eJsEmjc3GDyHxrJarBVXa", "to_account"=>"XTS7Um8eE2P6vxjALnn3iEnGKaCEwasxnS4oKnWnGPWSKMCQ2q9dm", "amount"=>{"amount"=>5000000, "asset_id"=>0}, "memo"=>"", "memo_from_account"=>"XTS8MXmhWqtvTkpRQPoNNRaV6KHGnRd5eJsEmjc3GDyHxrJarBVXa"}
           got: {"from_account"=>"XTS8MXmhWqtvTkpRQPoNNRaV6KHGnRd5eJsEmjc3GDyHxrJarBVXa", "to_account"=>"XTS5Q59LcsnEbJyiscfkwjE6oEGhnGHKBgANmsDqmkUQL8umZjc8W", "amount"=>{"amount"=>5000000, "asset_id"=>0}, "memo"=>"", "memo_from_account"=>nil}

      (compared using ==)

      Diff:
      @@ -1,6 +1,6 @@
       "amount" => {"amount"=>5000000, "asset_id"=>0},
       "from_account" => "XTS8MXmhWqtvTkpRQPoNNRaV6KHGnRd5eJsEmjc3GDyHxrJarBVXa",
       "memo" => "",
      -"memo_from_account" => "XTS8MXmhWqtvTkpRQPoNNRaV6KHGnRd5eJsEmjc3GDyHxrJarBVXa",
      -"to_account" => "XTS7Um8eE2P6vxjALnn3iEnGKaCEwasxnS4oKnWnGPWSKMCQ2q9dm",
      +"memo_from_account" => nil,
      +"to_account" => "XTS5Q59LcsnEbJyiscfkwjE6oEGhnGHKBgANmsDqmkUQL8umZjc8W",
       (RSpec::Expectations::ExpectationNotMetError)
      ./features/step_definitions/basic_wallet_steps.rb:113:in `/^transaction callback should match last transfer$/'
      features/basic_transfer.feature:19:in `And transaction callback should match last transfer'

Bus error (core dumped) on testnet #3

I got this on testnet delegate: Bus error (core dumped)

denny [6:00 PM]
Do you know how to catch the stack?

huafu [6:01 PM]
Bus error?

denny [6:01 PM]
yep

huafu [6:01 PM]
i'll remote to take a look

denny [6:01 PM]
ok, on testnet.bitsuperlab.com

denny [6:01 PM]
was going to upgrade the testnet to #4

huafu [6:02 PM]
crash after new interation?

denny [6:02 PM]
no

denny [6:02 PM]
before I was going to upgrade

dice win condition issue

assume the range=100000000,odds=1,according to existing win condition,seems whatever lucky number is,only the user guess 1,2 has possibility to hit the win condition.

command config error on testnet, get_delegate_registration_fee returns 0

can be reproduced by run testnet.py under acceptance_tests (test branch), and go into delegate client:

maybe we should no give this asset the first delegate registration on BTSX chain was free too.

→ config
10 assert_exception: Assert Exception
registration_fee > 0:
    {}
    th_a  chain_interface.cpp:107 get_delegate_registration_fee

    {}
    th_a  common_api_client.cpp:1082 blockchain_get_info

    {"command":"config"}
    th_a  cli.cpp:579 execute_command

wallet_play_game DICE error

fail on

w->withdraw_to_transaction( chips_to_play,
d_input.from_account_name,
trx,
required_signatures );

Can not buy chips

default (unlocked) >>> wallet_market_buy_chips hackfisher123
quantity: 10
quantity_symbol: DICE
36003 negative_fee: negative fee

    {"fee":[0,-3070671]}
    th_a  transaction_evaluation_state.cpp:94 post_evaluate

    {}
    th_a  transaction_evaluation_state.cpp:140 post_evaluate

    {"trx":{"expiration":"20140926T150348","delegate_slate_id":null,"operations":[{"type":"withdraw_op_type","data":{"balance_id":"XTSGo2W4gzeZ5EeH8ueXxtY616tbjyap4iN","amount":1457024,"claim_input_data":""}},{"type":"buy_chips_type","data":{"amount":{"amount":1000,"asset_id":1},"owner":"XTS56VHe3u794GsPcLnQV825NDqNAJtAM5gq"}}],"signatures":["2020ece254407deb5460e39697feaeb7a3d270cd0d89a97b49c2dc0b12cf7a370e6c23cf535c3abebcf1d33669ea6db009d9eabf0e13f6654df4555bbbf1716d23","1ff142aeda58dfc550ce3947e6f950100957dda63747519a8f9c35f60187f876e11e33f89396b78ccc4b38d41e31a63a5613cd7e07d16999ff9cb90b8f9cf7895f"]}}
    th_a  transaction_evaluation_state.cpp:187 evaluate

    {"trx":{"expiration":"20140926T150348","delegate_slate_id":null,"operations":[{"type":"withdraw_op_type","data":{"balance_id":"XTSGo2W4gzeZ5EeH8ueXxtY616tbjyap4iN","amount":1457024,"claim_input_data":""}},{"type":"buy_chips_type","data":{"amount":{"amount":1000,"asset_id":1},"owner":"XTS56VHe3u794GsPcLnQV825NDqNAJtAM5gq"}}],"signatures":["2020ece254407deb5460e39697feaeb7a3d270cd0d89a97b49c2dc0b12cf7a370e6c23cf535c3abebcf1d33669ea6db009d9eabf0e13f6654df4555bbbf1716d23","1ff142aeda58dfc550ce3947e6f950100957dda63747519a8f9c35f60187f876e11e33f89396b78ccc4b38d41e31a63a5613cd7e07d16999ff9cb90b8f9cf7895f"]}}
    th_a  chain_database.cpp:1348 evaluate_transaction

    {"trx":{"expiration":"20140926T150348","delegate_slate_id":null,"operations":[{"type":"withdraw_op_type","data":{"balance_id":"XTSGo2W4gzeZ5EeH8ueXxtY616tbjyap4iN","amount":1457024,"claim_input_data":""}},{"type":"buy_chips_type","data":{"amount":{"amount":1000,"asset_id":1},"owner":"XTS56VHe3u794GsPcLnQV825NDqNAJtAM5gq"}}],"signatures":["2020ece254407deb5460e39697feaeb7a3d270cd0d89a97b49c2dc0b12cf7a370e6c23cf535c3abebcf1d33669ea6db009d9eabf0e13f6654df4555bbbf1716d23","1ff142aeda58dfc550ce3947e6f950100957dda63747519a8f9c35f60187f876e11e33f89396b78ccc4b38d41e31a63a5613cd7e07d16999ff9cb90b8f9cf7895f"]}}
    th_a  chain_database.cpp:1806 store_pending_transaction

    {}
    th_a  wallet.cpp:2965 cache_transaction

    {"from_account_name":"hackfisher123","real_quantity":10,"quantity_symbol":"DICE","sign":true}
    th_a  wallet.cpp:4824 buy_chips

    {}
    th_a  common_api_client.cpp:1859 wallet_market_buy_chips

    {"command":"wallet_market_buy_chips"}

Write a acceptance test for buy_chips and play_game

create default
wallet_account_create xxx-test
wallet_import_bitcoin xxx xxx-test
balance
wallet_account_register xxx-test
wallet_market_buy_chips hackfisher-test 100 DICE
wallet_play_game DICE {"from_account_name":"xxx-test","amount":10,"odds":2,"guess":1}

voter_key.feature failed

And I update vote for balance B2                                  # features/step_definitions/voter_key.rb:6
      {"condition"=>{"asset_id"=>0, "slate_id"=>0, "type"=>"withdraw_signature_type", "data"=>{"owner"=>"XTSF69guQ1SnJomUCbMNSfotRWedddY8j2g9", "memo"=>nil}}, "balance"=>9950000, "restricted_owner"=>"XTSHEaek86oX5rQLugY4upgBy7vnn7AoswdX", "snapshot_info"=>nil, "deposit_date"=>"2014-12-23T09:50:50", "last_update"=>"2014-12-23T09:50:50"}
      {
        "message": "Assert Exception (10)\neval_state._current_state->now().sec_since_epoch() - last_update_secs >= BTS_BLOCKCHAIN_VOTE_UPDATE_PERIOD_SEC: You cannot update your vote this frequently with only the voting key!\n\n\n\n\n\n\n\n",
        "detail": "10 assert_exception: Assert Exception\neval_state._current_state->now().sec_since_epoch() - last_update_secs >= BTS_BLOCKCHAIN_VOTE_UPDATE_PERIOD_SEC: You cannot update your vote this frequently with only the voting key!\n    {}\n    th_a  balance_operations.cpp:507 evaluate\n\n    {\"*this\":{\"balance_id\":\"XTSFWGfWF1rpeTri75TUFd2oSXobgfSB7P5d\",\"new_restricted_owner\":\"XTSHEaek86oX5rQLugY4upgBy7vnn7AoswdX\",\"new_slate\":972233117553688283}}\n    th_a  balance_operations.cpp:554 evaluate\n\n    {\"op\":{\"type\":\"update_balance_vote_op_type\",\"data\":{\"balance_id\":\"XTSFWGfWF1rpeTri75TUFd2oSXobgfSB7P5d\",\"new_restricted_owner\":\"XTSHEaek86oX5rQLugY4upgBy7vnn7AoswdX\",\"new_slate\":972233117553688283}}}\n    th_a  operation_factory.hpp:52 evaluate\n\n    {\"trx\":{\"expiration\":\"2014-12-23T10:51:00\",\"delegate_slate_id\":null,\"operations\":[{\"type\":\"define_delegate_slate_op_type\",\"data\":{\"slate\":{\"supported_delegates\":[104]}}},{\"type\":\"update_balance_vote_op_type\",\"data\":{\"balance_id\":\"XTSFWGfWF1rpeTri75TUFd2oSXobgfSB7P5d\",\"new_restricted_owner\":\"XTSHEaek86oX5rQLugY4upgBy7vnn7AoswdX\",\"new_slate\":972233117553688283}}],\"signatures\":[\"1f7b123046393afed349f9ee12bc7f0596c2915008b042b59c4b5a2f62d256adec76c31aecde1cb62dba71abdc4ff345a28051e199b589cb332bfe84f7db619ffd\"]}}\n    th_a  transaction_evaluation_state.cpp:236 evaluate\n\n    {\"trx\":{\"expiration\":\"2014-12-23T10:51:00\",\"delegate_slate_id\":null,\"operations\":[{\"type\":\"define_delegate_slate_op_type\",\"data\":{\"slate\":{\"supported_delegates\":[104]}}},{\"type\":\"update_balance_vote_op_type\",\"data\":{\"balance_id\":\"XTSFWGfWF1rpeTri75TUFd2oSXobgfSB7P5d\",\"new_restricted_owner\":\"XTSHEaek86oX5rQLugY4upgBy7vnn7AoswdX\",\"new_slate\":972233117553688283}}],\"signatures\":[\"1f7b123046393afed349f9ee12bc7f0596c2915008b042b59c4b5a2f62d256adec76c31aecde1cb62dba71abdc4ff345a28051e199b589cb332bfe84f7db619ffd\"]}}\n    th_a  chain_database.cpp:1487 evaluate_transaction\n\n    {\"trx\":{\"expiration\":\"2014-12-23T10:51:00\",\"delegate_slate_id\":null,\"operations\":[{\"type\":\"define_delegate_slate_op_type\",\"data\":{\"slate\":{\"supported_delegates\":[104]}}},{\"type\":\"update_balance_vote_op_type\",\"data\":{\"balance_id\":\"XTSFWGfWF1rpeTri75TUFd2oSXobgfSB7P5d\",\"new_restricted_owner\":\"XTSHEaek86oX5rQLugY4upgBy7vnn7AoswdX\",\"new_slate\":972233117553688283}}],\"signatures\":[\"1f7b123046393afed349f9ee12bc7f0596c2915008b042b59c4b5a2f62d256adec76c31aecde1cb62dba71abdc4ff345a28051e199b589cb332bfe84f7db619ffd\"]}}\n    th_a  chain_database.cpp:2192 store_pending_transaction\n\n    {\"transaction_record\":{\"index\":0,\"record_id\":\"0000000000000000000000000000000000000000\",\"block_num\":0,\"is_virtual\":false,\"is_confirmed\":false,\"is_market\":false,\"trx\":{\"expiration\":\"2014-12-23T10:51:00\",\"delegate_slate_id\":null,\"operations\":[{\"type\":\"define_delegate_slate_op_type\",\"data\":{\"slate\":{\"supported_delegates\":[104]}}},{\"type\":\"update_balance_vote_op_type\",\"data\":{\"balance_id\":\"XTSFWGfWF1rpeTri75TUFd2oSXobgfSB7P5d\",\"new_restricted_owner\":\"XTSHEaek86oX5rQLugY4upgBy7vnn7AoswdX\",\"new_slate\":972233117553688283}}],\"signatures\":[\"1f7b123046393afed349f9ee12bc7f0596c2915008b042b59c4b5a2f62d256adec76c31aecde1cb62dba71abdc4ff345a28051e199b589cb332bfe84f7db619ffd\"]},\"ledger_entries\":[{\"from_account\":null,\"to_account\":null,\"amount\":{\"amount\":0,\"asset_id\":0},\"memo\":\"Set balance vote info\",\"memo_from_account\":null}],\"fee\":{\"amount\":50000,\"asset_id\":0},\"created_time\":\"1970-01-01T00:00:00\",\"received_time\":\"1970-01-01T00:00:00\",\"extra_addresses\":[]}}\n    th_a  transaction_ledger.cpp:1225 cache_transaction\n\n    {}\n    th_a  common_api_client.cpp:5504 wallet_balance_set_vote_info",
        "code": 10
      } (BitShares::API::Rpc::Error)
      wallet_balance_set_vote_info XTSFWGfWF1rpeTri75TUFd2oSXobgfSB7P5d
      features/voter_key.feature:26:in `And I update vote for balance B2'

[web_wallet] Failed to lineman build

>> Tasks directory "tasks" not found.

Running "clean:dist" (clean) task

Running "clean:bower" (clean) task

Running "common" task

Running "bower:install" (bower) task
Fatal error: Unable to find suitable version for angular

npm WARN package.json [email protected] No repository field.
npm WARN prefer global [email protected] should be installed with -g

testnet.py block producing bug, net produce time is x seconds ago

→ info
{
  "blockchain_head_block_num": 10,
  "blockchain_head_block_age": "7 minutes old",
  "blockchain_head_block_timestamp": "2014-12-18T07:00:20",
  "blockchain_average_delegate_participation": "20.83 %",
  "blockchain_confirmation_requirement": 192,
  "blockchain_share_supply": "2,000,000,000.00000 XTS",
  "blockchain_blocks_left_in_round": 91,
  "blockchain_next_round_time": "at least 15 minutes in the future",
  "blockchain_next_round_timestamp": "2014-12-18T07:22:00",
  "blockchain_random_seed": "a66cffed22910628e6e303fb848c1b304f0cd925",
  "client_data_dir": "/Users/fisher/superlab/test/tests/acceptance_tests/tmp/delegate",
  "client_version": "dryrun-18-1307-g44624f1-testnet-6",
  "network_num_connections": 2,
  "network_num_connections_max": 200,
  "network_chain_downloader_running": false,
  "network_chain_downloader_blocks_remaining": null,
  "ntp_time": "2014-12-18T07:06:59",
  "ntp_time_error": -0.0049030000000000002,
  "wallet_open": true,
  "wallet_unlocked": true,
  "wallet_unlocked_until": "52 minutes in the future",
  "wallet_unlocked_until_timestamp": "2014-12-18T07:58:52",
  "wallet_last_scanned_block_timestamp": null,
  "wallet_scan_progress": "0.00 %",
  "wallet_block_production_enabled": true,
  "wallet_next_block_production_time": "9 seconds ago",
  "wallet_next_block_production_timestamp": "2014-12-18T07:06:50"
}

Segmentation fault on testnet.rb delegate node. unknow reason

run

./testnet.rb --create
Please be patient, this will take several minutes...
Replaying blockchain... Approximately 0.00% complete.Process 4877 stopped
* thread #1: tid = 0x9cccb9, 0x00007fff97ff7172 libsystem_c.dylib`strlen + 18, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
    frame #0: 0x00007fff97ff7172 libsystem_c.dylib`strlen + 18
libsystem_c.dylib`strlen + 18:
-> 0x7fff97ff7172:  pcmpeqb (%rdi), %xmm0
   0x7fff97ff7176:  pmovmskb %xmm0, %esi
   0x7fff97ff717a:  andq   $0xf, %rcx
   0x7fff97ff717e:  orq    $-0x1, %rax
(lldb) quit

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.