namespace JSON
{
template <typename Tag> struct Literal { };
typedef Literal<struct tag_undefined> Undefined;
typedef Literal<struct tag_false> False;
typedef Literal<struct tag_null> Null;
typedef Literal<struct tag_true> True;
struct Object;
struct Array;
struct String {
std::wstring value;
bool operator==(String const& s) const { return value == s.value; }
};
}
namespace std
{
template <> struct hash<JSON::String>
{
size_t operator()(JSON::String const& s) const {
static std::hash<std::wstring> _hash;
return _hash(s.value);
}
};
}
namespace JSON
{
struct Number { double value; };
typedef boost::variant<
Undefined, // not legal as a JSON result
False,
Null,
True,
boost::recursive_wrapper<Object>,
boost::recursive_wrapper<Array>,
String,
Number
> Value;
struct Object
{
typedef std::unordered_map<String, Value> values_t;
values_t values;
};
struct Array
{
typedef std::deque<Value> values_t;
values_t values;
};
}
bmFtZXNwYWNlIEpTT04KewogICAgdGVtcGxhdGUgPHR5cGVuYW1lIFRhZz4gc3RydWN0IExpdGVyYWwgeyB9OwoKICAgIHR5cGVkZWYgTGl0ZXJhbDxzdHJ1Y3QgdGFnX3VuZGVmaW5lZD4gVW5kZWZpbmVkOwogICAgdHlwZWRlZiBMaXRlcmFsPHN0cnVjdCB0YWdfZmFsc2U+IEZhbHNlOwogICAgdHlwZWRlZiBMaXRlcmFsPHN0cnVjdCB0YWdfbnVsbD4gIE51bGw7CiAgICB0eXBlZGVmIExpdGVyYWw8c3RydWN0IHRhZ190cnVlPiAgVHJ1ZTsKCiAgICBzdHJ1Y3QgT2JqZWN0OwogICAgc3RydWN0IEFycmF5OwoKICAgIHN0cnVjdCBTdHJpbmcgeyAKICAgICAgICBzdGQ6OndzdHJpbmcgdmFsdWU7IAogICAgICAgIGJvb2wgb3BlcmF0b3I9PShTdHJpbmcgY29uc3QmIHMpIGNvbnN0IHsgcmV0dXJuIHZhbHVlID09IHMudmFsdWU7IH0KICAgIH07Cn0KCm5hbWVzcGFjZSBzdGQKewogICAgdGVtcGxhdGUgPD4gc3RydWN0IGhhc2g8SlNPTjo6U3RyaW5nPgogICAgewogICAgICAgIHNpemVfdCBvcGVyYXRvcigpKEpTT046OlN0cmluZyBjb25zdCYgcykgY29uc3QgewogICAgICAgICAgICBzdGF0aWMgc3RkOjpoYXNoPHN0ZDo6d3N0cmluZz4gX2hhc2g7CiAgICAgICAgICAgIHJldHVybiBfaGFzaChzLnZhbHVlKTsKICAgICAgICB9CiAgICB9Owp9CgpuYW1lc3BhY2UgSlNPTgp7CiAgICBzdHJ1Y3QgTnVtYmVyIHsgZG91YmxlIHZhbHVlOyAgICAgIH07CgogICAgdHlwZWRlZiBib29zdDo6dmFyaWFudDwKICAgICAgICAgICAgVW5kZWZpbmVkLCAvLyBub3QgbGVnYWwgYXMgYSBKU09OIHJlc3VsdAogICAgICAgICAgICBGYWxzZSwgCiAgICAgICAgICAgIE51bGwsIAogICAgICAgICAgICBUcnVlLCAKICAgICAgICAgICAgYm9vc3Q6OnJlY3Vyc2l2ZV93cmFwcGVyPE9iamVjdD4sIAogICAgICAgICAgICBib29zdDo6cmVjdXJzaXZlX3dyYXBwZXI8QXJyYXk+LAogICAgICAgICAgICBTdHJpbmcsCiAgICAgICAgICAgIE51bWJlcgogICAgICAgID4gVmFsdWU7CgogICAgc3RydWN0IE9iamVjdAogICAgewogICAgICAgIHR5cGVkZWYgc3RkOjp1bm9yZGVyZWRfbWFwPFN0cmluZywgVmFsdWU+IHZhbHVlc190OwogICAgICAgIHZhbHVlc190IHZhbHVlczsKICAgIH07CgogICAgc3RydWN0IEFycmF5CiAgICB7CiAgICAgICAgdHlwZWRlZiBzdGQ6OmRlcXVlPFZhbHVlPiB2YWx1ZXNfdDsKICAgICAgICB2YWx1ZXNfdCB2YWx1ZXM7CiAgICB9Owp9Cg==