-module(xml_compress). -export([encode/3, decode/3]). % This file was generated by xml_compress_gen % % Rules used: % % [{<<"eu.siacs.conversations.axolotl">>,<<"key">>, % [{<<"prekey">>,[<<"true">>]},{<<"rid">>,[]}], % []}, % {<<"jabber:client">>,<<"message">>, % [{<<"from">>,[j2,{j1}]}, % {<<"id">>,[]}, % {<<"to">>,[j1,j2,{j1}]}, % {<<"type">>,[<<"chat">>,<<"groupchat">>,<<"normal">>]}, % {<<"xml:lang">>,[<<"en">>]}], % []}, % {<<"urn:xmpp:hints">>,<<"store">>,[],[]}, % {<<"jabber:client">>,<<"body">>,[], % [<<73,32,115,101,110,116,32,121,111,117,32,97,110,32,79,77,69,77,79,32,101, % 110,99,114,121,112,116,101,100,32,109,101,115,115,97,103,101,32,98,117, % 116,32,121,111,117,114,32,99,108,105,101,110,116,32,100,111,101,115,110, % 226,128,153,116,32,115,101,101,109,32,116,111,32,115,117,112,112,111, % 114,116,32,116,104,97,116,46,32,70,105,110,100,32,109,111,114,101,32, % 105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,104,116,116, % 112,115,58,47,47,99,111,110,118,101,114,115,97,116,105,111,110,115,46, % 105,109,47,111,109,101,109,111>>]}, % {<<"urn:xmpp:sid:0">>,<<"origin-id">>,[{<<"id">>,[]}],[]}, % {<<"urn:xmpp:chat-markers:0">>,<<"markable">>,[],[]}, % {<<"eu.siacs.conversations.axolotl">>,<<"encrypted">>,[],[]}, % {<<"eu.siacs.conversations.axolotl">>,<<"header">>,[{<<"sid">>,[]}],[]}, % {<<"eu.siacs.conversations.axolotl">>,<<"iv">>,[],[]}, % {<<"eu.siacs.conversations.axolotl">>,<<"payload">>,[],[]}, % {<<"urn:xmpp:eme:0">>,<<"encryption">>, % [{<<"name">>,[<<"OMEMO">>]}, % {<<"namespace">>,[<<"eu.siacs.conversations.axolotl">>]}], % []}, % {<<"urn:xmpp:delay">>,<<"delay">>,[{<<"from">>,[j1]},{<<"stamp">>,[]}],[]}, % {<<"http://jabber.org/protocol/address">>,<<"address">>, % [{<<"jid">>,[{j1}]},{<<"type">>,[<<"ofrom">>]}], % []}, % {<<"http://jabber.org/protocol/address">>,<<"addresses">>,[],[]}, % {<<"urn:xmpp:chat-markers:0">>,<<"displayed">>, % [{<<"id">>,[]},{<<"sender">>,[{j1},{j2}]}], % []}, % {<<"urn:xmpp:mam:tmp">>,<<"archived">>,[{<<"by">>,[]},{<<"id">>,[]}],[]}, % {<<"urn:xmpp:sid:0">>,<<"stanza-id">>,[{<<"by">>,[]},{<<"id">>,[]}],[]}, % {<<"urn:xmpp:receipts">>,<<"request">>,[],[]}, % {<<"urn:xmpp:chat-markers:0">>,<<"received">>,[{<<"id">>,[]}],[]}, % {<<"urn:xmpp:receipts">>,<<"received">>,[{<<"id">>,[]}],[]}, % {<<"http://jabber.org/protocol/chatstates">>,<<"active">>,[],[]}, % {<<"http://jabber.org/protocol/muc#user">>,<<"invite">>, % [{<<"from">>,[{j1}]}], % []}, % {<<"http://jabber.org/protocol/muc#user">>,<<"reason">>,[],[]}, % {<<"http://jabber.org/protocol/muc#user">>,<<"x">>,[],[]}, % {<<"jabber:x:conference">>,<<"x">>,[{<<"jid">>,[j2]}],[]}, % {<<"jabber:client">>,<<"subject">>,[],[]}, % {<<"jabber:client">>,<<"thread">>,[],[]}, % {<<"http://jabber.org/protocol/pubsub#event">>,<<"event">>,[],[]}, % {<<"http://jabber.org/protocol/pubsub#event">>,<<"item">>,[{<<"id">>,[]}],[]}, % {<<"http://jabber.org/protocol/pubsub#event">>,<<"items">>, % [{<<"node">>,[<<"urn:xmpp:mucsub:nodes:messages">>]}], % []}, % {<<"p1:push:custom">>,<<"x">>,[{<<"key">>,[]},{<<"value">>,[]}],[]}, % {<<"p1:pushed">>,<<"x">>,[],[]}, % {<<"urn:xmpp:message-correct:0">>,<<"replace">>,[{<<"id">>,[]}],[]}, % {<<"http://jabber.org/protocol/chatstates">>,<<"composing">>,[],[]}] encode(El, J1, J2) -> encode_child(El, <<"jabber:client">>, J1, J2, byte_size(J1), byte_size(J2), <<1:8>>). encode_attr({<<"xmlns">>, _}, Acc) -> Acc; encode_attr({N, V}, Acc) -> <>. encode_attrs(Attrs, Acc) -> lists:foldl(fun encode_attr/2, Acc, Attrs). encode_el(PNs, Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) -> E1 = if PNs == Ns -> encode_attrs(Attrs, <>); true -> encode_attrs(Attrs, <>) end, E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>. encode_child({xmlel, Name, Attrs, Children}, PNs, J1, J2, J1L, J2L, Pfx) -> case lists:keyfind(<<"xmlns">>, 1, Attrs) of false -> encode(PNs, PNs, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx); {_, Ns} -> encode(PNs, Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) end; encode_child({xmlcdata, Data}, _PNs, _J1, _J2, _J1L, _J2L, Pfx) -> <>. encode_children(Children, PNs, J1, J2, J1L, J2L, Pfx) -> lists:foldl( fun(Child, Acc) -> encode_child(Child, PNs, J1, J2, J1L, J2L, Acc) end, Pfx, Children). encode_string(Data) -> <> = <<(byte_size(Data)):16/unsigned-big-integer>>, case {V1, V2, V3} of {0, 0, V3} -> <>; {0, V2, V3} -> <<(V3 bor 64):8, V2:8, Data/binary>>; _ -> <<(V3 bor 64):8, (V2 bor 64):8, V1:8, Data/binary>> end. encode(PNs, <<"eu.siacs.conversations.axolotl">> = Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) -> case Name of <<"key">> -> E = lists:foldl(fun ({<<"prekey">>, AVal}, Acc) -> case AVal of <<"true">> -> <>; _ -> <> end; ({<<"rid">>, AVal}, Acc) -> <>; (Attr, Acc) -> encode_attr(Attr, Acc) end, <>, Attrs), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; <<"encrypted">> -> E = encode_attrs(Attrs, <>), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; <<"header">> -> E = lists:foldl(fun ({<<"sid">>, AVal}, Acc) -> <>; (Attr, Acc) -> encode_attr(Attr, Acc) end, <>, Attrs), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; <<"iv">> -> E = encode_attrs(Attrs, <>), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; <<"payload">> -> E = encode_attrs(Attrs, <>), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; _ -> encode_el(PNs, Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) end; encode(PNs, <<"jabber:client">> = Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) -> case Name of <<"message">> -> E = lists:foldl(fun ({<<"from">>, AVal}, Acc) -> case AVal of J2 -> <>; <> -> <>; _ -> <> end; ({<<"id">>, AVal}, Acc) -> <>; ({<<"to">>, AVal}, Acc) -> case AVal of J1 -> <>; J2 -> <>; <> -> <>; _ -> <> end; ({<<"type">>, AVal}, Acc) -> case AVal of <<"chat">> -> <>; <<"groupchat">> -> <>; <<"normal">> -> <>; _ -> <> end; ({<<"xml:lang">>, AVal}, Acc) -> case AVal of <<"en">> -> <>; _ -> <> end; (Attr, Acc) -> encode_attr(Attr, Acc) end, <>, Attrs), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; <<"body">> -> E = encode_attrs(Attrs, <>), E2 = lists:foldl(fun ({xmlcdata, <<73,32,115,101,110,116,32,121,111,117,32,97,110,32,79,77,69, 77,79,32,101,110,99,114,121,112,116,101,100,32,109,101,115, 115,97,103,101,32,98,117,116,32,121,111,117,114,32,99,108, 105,101,110,116,32,100,111,101,115,110,226,128,153,116,32, 115,101,101,109,32,116,111,32,115,117,112,112,111,114,116,32, 116,104,97,116,46,32,70,105,110,100,32,109,111,114,101,32, 105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,104, 116,116,112,115,58,47,47,99,111,110,118,101,114,115,97,116, 105,111,110,115,46,105,109,47,111,109,101,109,111>>}, Acc) -> <>; (El, Acc) -> encode_child(El, Ns, J1, J2, J1L, J2L, Acc) end, <>, Children), <>; <<"subject">> -> E = encode_attrs(Attrs, <>), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; <<"thread">> -> E = encode_attrs(Attrs, <>), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; _ -> encode_el(PNs, Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) end; encode(PNs, <<"urn:xmpp:hints">> = Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) -> case Name of <<"store">> -> E = encode_attrs(Attrs, <>), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; _ -> encode_el(PNs, Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) end; encode(PNs, <<"urn:xmpp:sid:0">> = Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) -> case Name of <<"origin-id">> -> E = lists:foldl(fun ({<<"id">>, AVal}, Acc) -> <>; (Attr, Acc) -> encode_attr(Attr, Acc) end, <>, Attrs), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; <<"stanza-id">> -> E = lists:foldl(fun ({<<"by">>, AVal}, Acc) -> <>; ({<<"id">>, AVal}, Acc) -> <>; (Attr, Acc) -> encode_attr(Attr, Acc) end, <>, Attrs), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; _ -> encode_el(PNs, Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) end; encode(PNs, <<"urn:xmpp:chat-markers:0">> = Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) -> case Name of <<"markable">> -> E = encode_attrs(Attrs, <>), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; <<"displayed">> -> E = lists:foldl(fun ({<<"id">>, AVal}, Acc) -> <>; ({<<"sender">>, AVal}, Acc) -> case AVal of <> -> <>; <> -> <>; _ -> <> end; (Attr, Acc) -> encode_attr(Attr, Acc) end, <>, Attrs), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; <<"received">> -> E = lists:foldl(fun ({<<"id">>, AVal}, Acc) -> <>; (Attr, Acc) -> encode_attr(Attr, Acc) end, <>, Attrs), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; _ -> encode_el(PNs, Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) end; encode(PNs, <<"urn:xmpp:eme:0">> = Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) -> case Name of <<"encryption">> -> E = lists:foldl(fun ({<<"name">>, AVal}, Acc) -> case AVal of <<"OMEMO">> -> <>; _ -> <> end; ({<<"namespace">>, AVal}, Acc) -> case AVal of <<"eu.siacs.conversations.axolotl">> -> <>; _ -> <> end; (Attr, Acc) -> encode_attr(Attr, Acc) end, <>, Attrs), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; _ -> encode_el(PNs, Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) end; encode(PNs, <<"urn:xmpp:delay">> = Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) -> case Name of <<"delay">> -> E = lists:foldl(fun ({<<"from">>, AVal}, Acc) -> case AVal of J1 -> <>; _ -> <> end; ({<<"stamp">>, AVal}, Acc) -> <>; (Attr, Acc) -> encode_attr(Attr, Acc) end, <>, Attrs), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; _ -> encode_el(PNs, Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) end; encode(PNs, <<"http://jabber.org/protocol/address">> = Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) -> case Name of <<"address">> -> E = lists:foldl(fun ({<<"jid">>, AVal}, Acc) -> case AVal of <> -> <>; _ -> <> end; ({<<"type">>, AVal}, Acc) -> case AVal of <<"ofrom">> -> <>; _ -> <> end; (Attr, Acc) -> encode_attr(Attr, Acc) end, <>, Attrs), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; <<"addresses">> -> E = encode_attrs(Attrs, <>), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; _ -> encode_el(PNs, Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) end; encode(PNs, <<"urn:xmpp:mam:tmp">> = Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) -> case Name of <<"archived">> -> E = lists:foldl(fun ({<<"by">>, AVal}, Acc) -> <>; ({<<"id">>, AVal}, Acc) -> <>; (Attr, Acc) -> encode_attr(Attr, Acc) end, <>, Attrs), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; _ -> encode_el(PNs, Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) end; encode(PNs, <<"urn:xmpp:receipts">> = Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) -> case Name of <<"request">> -> E = encode_attrs(Attrs, <>), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; <<"received">> -> E = lists:foldl(fun ({<<"id">>, AVal}, Acc) -> <>; (Attr, Acc) -> encode_attr(Attr, Acc) end, <>, Attrs), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; _ -> encode_el(PNs, Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) end; encode(PNs, <<"http://jabber.org/protocol/chatstates">> = Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) -> case Name of <<"active">> -> E = encode_attrs(Attrs, <>), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; <<"composing">> -> E = encode_attrs(Attrs, <>), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; _ -> encode_el(PNs, Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) end; encode(PNs, <<"http://jabber.org/protocol/muc#user">> = Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) -> case Name of <<"invite">> -> E = lists:foldl(fun ({<<"from">>, AVal}, Acc) -> case AVal of <> -> <>; _ -> <> end; (Attr, Acc) -> encode_attr(Attr, Acc) end, <>, Attrs), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; <<"reason">> -> E = encode_attrs(Attrs, <>), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; <<"x">> -> E = encode_attrs(Attrs, <>), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; _ -> encode_el(PNs, Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) end; encode(PNs, <<"jabber:x:conference">> = Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) -> case Name of <<"x">> -> E = lists:foldl(fun ({<<"jid">>, AVal}, Acc) -> case AVal of J2 -> <>; _ -> <> end; (Attr, Acc) -> encode_attr(Attr, Acc) end, <>, Attrs), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; _ -> encode_el(PNs, Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) end; encode(PNs, <<"http://jabber.org/protocol/pubsub#event">> = Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) -> case Name of <<"event">> -> E = encode_attrs(Attrs, <>), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; <<"item">> -> E = lists:foldl(fun ({<<"id">>, AVal}, Acc) -> <>; (Attr, Acc) -> encode_attr(Attr, Acc) end, <>, Attrs), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; <<"items">> -> E = lists:foldl(fun ({<<"node">>, AVal}, Acc) -> case AVal of <<"urn:xmpp:mucsub:nodes:messages">> -> <>; _ -> <> end; (Attr, Acc) -> encode_attr(Attr, Acc) end, <>, Attrs), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; _ -> encode_el(PNs, Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) end; encode(PNs, <<"p1:push:custom">> = Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) -> case Name of <<"x">> -> E = lists:foldl(fun ({<<"key">>, AVal}, Acc) -> <>; ({<<"value">>, AVal}, Acc) -> <>; (Attr, Acc) -> encode_attr(Attr, Acc) end, <>, Attrs), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; _ -> encode_el(PNs, Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) end; encode(PNs, <<"p1:pushed">> = Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) -> case Name of <<"x">> -> E = encode_attrs(Attrs, <>), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; _ -> encode_el(PNs, Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) end; encode(PNs, <<"urn:xmpp:message-correct:0">> = Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) -> case Name of <<"replace">> -> E = lists:foldl(fun ({<<"id">>, AVal}, Acc) -> <>; (Attr, Acc) -> encode_attr(Attr, Acc) end, <>, Attrs), E2 = encode_children(Children, Ns, J1, J2, J1L, J2L, <>), <>; _ -> encode_el(PNs, Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) end; encode(PNs, Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx) -> encode_el(PNs, Ns, Name, Attrs, Children, J1, J2, J1L, J2L, Pfx). decode(<<$<, _/binary>> = Data, _J1, _J2) -> fxml_stream:parse_element(Data); decode(<<1:8, Rest/binary>>, J1, J2) -> {El, _} = decode(Rest, <<"jabber:client">>, J1, J2), El. decode_string(Data) -> case Data of <<0:2, L:6, Str:L/binary, Rest/binary>> -> {Str, Rest}; <<1:2, L1:6, 0:2, L2:6, Rest/binary>> -> L = L2*64 + L1, <> = Rest, {Str, Rest2}; <<1:2, L1:6, 1:2, L2:6, L3:8, Rest/binary>> -> L = (L3*64 + L2)*64 + L1, <> = Rest, {Str, Rest2} end. decode_child(<<1:8, Rest/binary>>, _PNs, _J1, _J2) -> {Text, Rest2} = decode_string(Rest), {{xmlcdata, Text}, Rest2}; decode_child(<<2:8, Rest/binary>>, PNs, J1, J2) -> {Name, Rest2} = decode_string(Rest), {Attrs, Rest3} = decode_attrs(Rest2), {Children, Rest4} = decode_children(Rest3, PNs, J1, J2), {{xmlel, Name, Attrs, Children}, Rest4}; decode_child(<<3:8, Rest/binary>>, PNs, J1, J2) -> {Ns, Rest2} = decode_string(Rest), {Name, Rest3} = decode_string(Rest2), {Attrs, Rest4} = decode_attrs(Rest3), {Children, Rest5} = decode_children(Rest4, Ns, J1, J2), {{xmlel, Name, add_ns(PNs, Ns, Attrs), Children}, Rest5}; decode_child(<<4:8, Rest/binary>>, _PNs, _J1, _J2) -> {stop, Rest}; decode_child(Other, PNs, J1, J2) -> decode(Other, PNs, J1, J2). decode_children(Data, PNs, J1, J2) -> prefix_map(fun(Data2) -> decode(Data2, PNs, J1, J2) end, Data). decode_attr(<<1:8, Rest/binary>>) -> {Name, Rest2} = decode_string(Rest), {Val, Rest3} = decode_string(Rest2), {{Name, Val}, Rest3}; decode_attr(<<2:8, Rest/binary>>) -> {stop, Rest}. decode_attrs(Data) -> prefix_map(fun decode_attr/1, Data). prefix_map(F, Data) -> prefix_map(F, Data, []). prefix_map(F, Data, Acc) -> case F(Data) of {stop, Rest} -> {lists:reverse(Acc), Rest}; {Val, Rest} -> prefix_map(F, Rest, [Val | Acc]) end. add_ns(Ns, Ns, Attrs) -> Attrs; add_ns(_, Ns, Attrs) -> [{<<"xmlns">>, Ns} | Attrs]. decode(<<5:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"eu.siacs.conversations.axolotl">>, {Attrs, Rest2} = prefix_map(fun (<<3:8, Rest3/binary>>) -> {{<<"prekey">>, <<"true">>}, Rest3}; (<<4:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"prekey">>, AVal}, Rest4}; (<<5:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"rid">>, AVal}, Rest4}; (<<2:8, Rest3/binary>>) -> {stop, Rest3}; (Data) -> decode_attr(Data) end, Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"key">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<12:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"eu.siacs.conversations.axolotl">>, {Attrs, Rest2} = decode_attrs(Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"encrypted">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<13:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"eu.siacs.conversations.axolotl">>, {Attrs, Rest2} = prefix_map(fun (<<3:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"sid">>, AVal}, Rest4}; (<<2:8, Rest3/binary>>) -> {stop, Rest3}; (Data) -> decode_attr(Data) end, Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"header">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<14:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"eu.siacs.conversations.axolotl">>, {Attrs, Rest2} = decode_attrs(Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"iv">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<15:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"eu.siacs.conversations.axolotl">>, {Attrs, Rest2} = decode_attrs(Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"payload">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<6:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"jabber:client">>, {Attrs, Rest2} = prefix_map(fun (<<3:8, Rest3/binary>>) -> {{<<"from">>, J2}, Rest3}; (<<4:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"from">>, <>}, Rest4}; (<<5:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"from">>, AVal}, Rest4}; (<<6:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"id">>, AVal}, Rest4}; (<<7:8, Rest3/binary>>) -> {{<<"to">>, J1}, Rest3}; (<<8:8, Rest3/binary>>) -> {{<<"to">>, J2}, Rest3}; (<<9:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"to">>, <>}, Rest4}; (<<10:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"to">>, AVal}, Rest4}; (<<11:8, Rest3/binary>>) -> {{<<"type">>, <<"chat">>}, Rest3}; (<<12:8, Rest3/binary>>) -> {{<<"type">>, <<"groupchat">>}, Rest3}; (<<13:8, Rest3/binary>>) -> {{<<"type">>, <<"normal">>}, Rest3}; (<<14:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"type">>, AVal}, Rest4}; (<<15:8, Rest3/binary>>) -> {{<<"xml:lang">>, <<"en">>}, Rest3}; (<<16:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"xml:lang">>, AVal}, Rest4}; (<<2:8, Rest3/binary>>) -> {stop, Rest3}; (Data) -> decode_attr(Data) end, Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"message">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<8:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"jabber:client">>, {Attrs, Rest2} = decode_attrs(Rest), {Children, Rest6} = prefix_map(fun (<<9:8, Rest5/binary>>) -> {{xmlcdata, <<73,32,115,101,110,116,32,121,111,117,32,97,110,32,79,77,69, 77,79,32,101,110,99,114,121,112,116,101,100,32,109,101,115, 115,97,103,101,32,98,117,116,32,121,111,117,114,32,99,108, 105,101,110,116,32,100,111,101,115,110,226,128,153,116,32, 115,101,101,109,32,116,111,32,115,117,112,112,111,114,116, 32,116,104,97,116,46,32,70,105,110,100,32,109,111,114,101, 32,105,110,102,111,114,109,97,116,105,111,110,32,111,110, 32,104,116,116,112,115,58,47,47,99,111,110,118,101,114,115, 97,116,105,111,110,115,46,105,109,47,111,109,101,109,111>>}, Rest5}; (Other) -> decode_child(Other, Ns, J1, J2) end, Rest2), {{xmlel, <<"body">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<31:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"jabber:client">>, {Attrs, Rest2} = decode_attrs(Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"subject">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<32:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"jabber:client">>, {Attrs, Rest2} = decode_attrs(Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"thread">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<7:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"urn:xmpp:hints">>, {Attrs, Rest2} = decode_attrs(Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"store">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<10:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"urn:xmpp:sid:0">>, {Attrs, Rest2} = prefix_map(fun (<<3:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"id">>, AVal}, Rest4}; (<<2:8, Rest3/binary>>) -> {stop, Rest3}; (Data) -> decode_attr(Data) end, Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"origin-id">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<22:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"urn:xmpp:sid:0">>, {Attrs, Rest2} = prefix_map(fun (<<3:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"by">>, AVal}, Rest4}; (<<4:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"id">>, AVal}, Rest4}; (<<2:8, Rest3/binary>>) -> {stop, Rest3}; (Data) -> decode_attr(Data) end, Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"stanza-id">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<11:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"urn:xmpp:chat-markers:0">>, {Attrs, Rest2} = decode_attrs(Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"markable">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<20:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"urn:xmpp:chat-markers:0">>, {Attrs, Rest2} = prefix_map(fun (<<3:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"id">>, AVal}, Rest4}; (<<4:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"sender">>, <>}, Rest4}; (<<5:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"sender">>, <>}, Rest4}; (<<6:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"sender">>, AVal}, Rest4}; (<<2:8, Rest3/binary>>) -> {stop, Rest3}; (Data) -> decode_attr(Data) end, Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"displayed">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<24:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"urn:xmpp:chat-markers:0">>, {Attrs, Rest2} = prefix_map(fun (<<3:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"id">>, AVal}, Rest4}; (<<2:8, Rest3/binary>>) -> {stop, Rest3}; (Data) -> decode_attr(Data) end, Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"received">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<16:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"urn:xmpp:eme:0">>, {Attrs, Rest2} = prefix_map(fun (<<3:8, Rest3/binary>>) -> {{<<"name">>, <<"OMEMO">>}, Rest3}; (<<4:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"name">>, AVal}, Rest4}; (<<5:8, Rest3/binary>>) -> {{<<"namespace">>, <<"eu.siacs.conversations.axolotl">>}, Rest3}; (<<6:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"namespace">>, AVal}, Rest4}; (<<2:8, Rest3/binary>>) -> {stop, Rest3}; (Data) -> decode_attr(Data) end, Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"encryption">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<17:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"urn:xmpp:delay">>, {Attrs, Rest2} = prefix_map(fun (<<3:8, Rest3/binary>>) -> {{<<"from">>, J1}, Rest3}; (<<4:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"from">>, AVal}, Rest4}; (<<5:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"stamp">>, AVal}, Rest4}; (<<2:8, Rest3/binary>>) -> {stop, Rest3}; (Data) -> decode_attr(Data) end, Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"delay">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<18:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"http://jabber.org/protocol/address">>, {Attrs, Rest2} = prefix_map(fun (<<3:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"jid">>, <>}, Rest4}; (<<4:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"jid">>, AVal}, Rest4}; (<<5:8, Rest3/binary>>) -> {{<<"type">>, <<"ofrom">>}, Rest3}; (<<6:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"type">>, AVal}, Rest4}; (<<2:8, Rest3/binary>>) -> {stop, Rest3}; (Data) -> decode_attr(Data) end, Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"address">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<19:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"http://jabber.org/protocol/address">>, {Attrs, Rest2} = decode_attrs(Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"addresses">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<21:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"urn:xmpp:mam:tmp">>, {Attrs, Rest2} = prefix_map(fun (<<3:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"by">>, AVal}, Rest4}; (<<4:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"id">>, AVal}, Rest4}; (<<2:8, Rest3/binary>>) -> {stop, Rest3}; (Data) -> decode_attr(Data) end, Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"archived">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<23:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"urn:xmpp:receipts">>, {Attrs, Rest2} = decode_attrs(Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"request">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<25:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"urn:xmpp:receipts">>, {Attrs, Rest2} = prefix_map(fun (<<3:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"id">>, AVal}, Rest4}; (<<2:8, Rest3/binary>>) -> {stop, Rest3}; (Data) -> decode_attr(Data) end, Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"received">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<26:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"http://jabber.org/protocol/chatstates">>, {Attrs, Rest2} = decode_attrs(Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"active">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<39:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"http://jabber.org/protocol/chatstates">>, {Attrs, Rest2} = decode_attrs(Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"composing">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<27:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"http://jabber.org/protocol/muc#user">>, {Attrs, Rest2} = prefix_map(fun (<<3:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"from">>, <>}, Rest4}; (<<4:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"from">>, AVal}, Rest4}; (<<2:8, Rest3/binary>>) -> {stop, Rest3}; (Data) -> decode_attr(Data) end, Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"invite">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<28:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"http://jabber.org/protocol/muc#user">>, {Attrs, Rest2} = decode_attrs(Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"reason">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<29:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"http://jabber.org/protocol/muc#user">>, {Attrs, Rest2} = decode_attrs(Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"x">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<30:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"jabber:x:conference">>, {Attrs, Rest2} = prefix_map(fun (<<3:8, Rest3/binary>>) -> {{<<"jid">>, J2}, Rest3}; (<<4:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"jid">>, AVal}, Rest4}; (<<2:8, Rest3/binary>>) -> {stop, Rest3}; (Data) -> decode_attr(Data) end, Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"x">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<33:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"http://jabber.org/protocol/pubsub#event">>, {Attrs, Rest2} = decode_attrs(Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"event">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<34:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"http://jabber.org/protocol/pubsub#event">>, {Attrs, Rest2} = prefix_map(fun (<<3:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"id">>, AVal}, Rest4}; (<<2:8, Rest3/binary>>) -> {stop, Rest3}; (Data) -> decode_attr(Data) end, Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"item">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<35:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"http://jabber.org/protocol/pubsub#event">>, {Attrs, Rest2} = prefix_map(fun (<<3:8, Rest3/binary>>) -> {{<<"node">>, <<"urn:xmpp:mucsub:nodes:messages">>}, Rest3}; (<<4:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"node">>, AVal}, Rest4}; (<<2:8, Rest3/binary>>) -> {stop, Rest3}; (Data) -> decode_attr(Data) end, Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"items">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<36:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"p1:push:custom">>, {Attrs, Rest2} = prefix_map(fun (<<3:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"key">>, AVal}, Rest4}; (<<4:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"value">>, AVal}, Rest4}; (<<2:8, Rest3/binary>>) -> {stop, Rest3}; (Data) -> decode_attr(Data) end, Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"x">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<37:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"p1:pushed">>, {Attrs, Rest2} = decode_attrs(Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"x">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(<<38:8, Rest/binary>>, PNs, J1, J2) -> Ns = <<"urn:xmpp:message-correct:0">>, {Attrs, Rest2} = prefix_map(fun (<<3:8, Rest3/binary>>) -> {AVal, Rest4} = decode_string(Rest3), {{<<"id">>, AVal}, Rest4}; (<<2:8, Rest3/binary>>) -> {stop, Rest3}; (Data) -> decode_attr(Data) end, Rest), {Children, Rest6} = decode_children(Rest2, Ns, J1, J2), {{xmlel, <<"replace">>, add_ns(PNs, Ns, Attrs), Children}, Rest6}; decode(Other, PNs, J1, J2) -> decode_child(Other, PNs, J1, J2).