tweb/public/mtproto.worker.6c4901ee819c...

1 line
1.9 MiB
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"version":3,"file":"mtproto.worker.6c4901ee819c678078d6.chunk.js","mappings":"uBAAIA,ECEIC,EACAC,EACAC,EACAC,ECLJC,E,mCCQG,MAAMC,EAAyE,CAAC,GAAK,CAAC,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,IAAK,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,GAAI,GAAG,CAAC,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,KAAM,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,IAAK,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,MAAO,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,OAAO,MAAO,OAAO,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,MAAO,kBAAkB,MAAO,QAAQ,MAAO,kBAAkB,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,wCAAwC,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,IAAK,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,iBAAiB,KAAM,iBAAiB,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/config/emoji.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/helpers/cleanSearchText.ts","webpack://tweb/./src/helpers/fileName.ts","webpack://tweb/./src/lib/files/idb.ts","webpack://tweb/./src/environment/utils.ts","webpack://tweb/./src/lib/rootScope.ts","webpack://tweb/./src/lib/appManagers/appStateManager.ts","webpack://tweb/./src/helpers/object/setDeepProperty.ts","webpack://tweb/./src/lib/mtproto/transports/http.ts","webpack://tweb/./src/lib/mtproto/transports/websocket.ts","webpack://tweb/./src/helpers/array/randomize.ts","webpack://tweb/./src/lib/mtproto/transports/obfuscation.ts","webpack://tweb/./src/lib/mtproto/transports/abridged.ts","webpack://tweb/./src/helpers/bytes/bytesToHex.ts","webpack://tweb/./src/lib/mtproto/transports/tcpObfuscated.ts","webpack://tweb/./src/lib/mtproto/dcConfigurator.ts","webpack://tweb/./src/lib/mtproto/transports/controller.ts","webpack://tweb/./src/lib/appManagers/utils/storages/resetStoragesPromise.ts","webpack://tweb/./src/lib/appManagers/manager.ts","webpack://tweb/./src/lib/appManagers/utils/storages/loadStorages.ts","webpack://tweb/./src/lib/appManagers/appStoragesManager.ts","webpack://tweb/./src/lib/appManagers/utils/storages/createStorages.ts","webpack://tweb/./src/lib/mtproto/passwordManager.ts","webpack://tweb/./src/lib/mtproto/referenceDatabase.ts","webpack://tweb/./src/helpers/object/safeReplaceObject.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getPeerIdsFromMessage.ts","webpack://tweb/./src/helpers/object/defineNotNumerableProperties.ts","webpack://tweb/./src/lib/appManagers/utils/dialogs/setDialogIndex.ts","webpack://tweb/./src/lib/storages/dialogs.ts","webpack://tweb/./src/lib/storages/filters.ts","webpack://tweb/./src/helpers/applyMixins.ts","webpack://tweb/./src/lib/appManagers/apiUpdatesManager.ts","webpack://tweb/./src/lib/appManagers/appAvatarsManager.ts","webpack://tweb/./src/lib/appManagers/appCallsManager.ts","webpack://tweb/./src/helpers/restrictions.ts","webpack://tweb/./src/lib/appManagers/appChatsManager.ts","webpack://tweb/./src/lib/langPack.ts","webpack://tweb/./src/helpers/date.ts","webpack://tweb/./src/helpers/object/safeReplaceArrayInObject.ts","webpack://tweb/./src/environment/mimeTypeMap.ts","webpack://tweb/./src/lib/appManagers/appDocsManager.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentURL.ts","webpack://tweb/./src/lib/appManagers/appDraftsManager.ts","webpack://tweb/./src/lib/appManagers/appEmojiManager.ts","webpack://tweb/./src/lib/appManagers/appGroupCallsManager.ts","webpack://tweb/./src/lib/appManagers/utils/photos/getPhotoInput.ts","webpack://tweb/./src/lib/appManagers/utils/photos/getPhotoMediaInput.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentMediaInput.ts","webpack://tweb/./src/lib/appManagers/appInlineBotsManager.ts","webpack://tweb/./src/lib/appManagers/appMessagesIdsManager.ts","webpack://tweb/./src/helpers/middleware.ts","webpack://tweb/./src/helpers/string/splitStringByLength.ts","webpack://tweb/./src/lib/appManagers/appTabsManager.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentInput.ts","webpack://tweb/./src/lib/appManagers/appMessagesManager.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentInputFileName.ts","webpack://tweb/./src/helpers/string/convertInputKeyToKey.ts","webpack://tweb/./src/lib/appManagers/appNotificationsManager.ts","webpack://tweb/./src/lib/appManagers/appPeersManager.ts","webpack://tweb/./src/lib/appManagers/appPhotosManager.ts","webpack://tweb/./src/lib/appManagers/appPollsManager.ts","webpack://tweb/./src/lib/appManagers/appPrivacyManager.ts","webpack://tweb/./src/lib/appManagers/appProfileManager.ts","webpack://tweb/./src/helpers/callbackifyAll.ts","webpack://tweb/./src/lib/appManagers/appReactionsManager.ts","webpack://tweb/./src/lib/appManagers/appStickersManager.ts","webpack://tweb/./src/helpers/fixBase64String.ts","webpack://tweb/./src/helpers/cleanUsername.ts","webpack://tweb/./src/lib/appManagers/appUsersManager.ts","webpack://tweb/./src/lib/appManagers/appWebPagesManager.ts","webpack://tweb/./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack://tweb/./src/helpers/string/fileNameRFC.ts","webpack://tweb/./src/lib/files/downloadWriter.ts","webpack://tweb/./src/lib/files/downloadStorage.ts","webpack://tweb/./src/lib/mtproto/apiFileManager.ts","webpack://tweb/./src/helpers/fixFirefoxSvg.ts","webpack://tweb/./src/helpers/blob/readBlobAsUint8Array.ts","webpack://tweb/./src/lib/mtproto/api_methods.ts","webpack://tweb/./src/lib/mtproto/apiManager.ts","webpack://tweb/./src/lib/storages/peers.ts","webpack://tweb/./src/lib/storages/thumbs.ts","webpack://tweb/./src/lib/mtproto/schema.ts","webpack://tweb/./src/helpers/number/intToUint.ts","webpack://tweb/./src/helpers/long/ulongFromInts.ts","webpack://tweb/./src/helpers/bigInt/bigIntConstants.ts","webpack://tweb/./src/helpers/bigInt/bigIntConversion.ts","webpack://tweb/./src/lib/mtproto/tl_utils.ts","webpack://tweb/./src/helpers/gzipUncompress.ts","webpack://tweb/./src/helpers/bytes/addPadding.ts","webpack://tweb/./src/lib/mtproto/networker.ts","webpack://tweb/./src/helpers/long/sortLongsArray.ts","webpack://tweb/./src/helpers/long/longToBytes.ts","webpack://tweb/./src/lib/mtproto/networkerFactory.ts","webpack://tweb/./src/lib/mtproto/rsaKeysManager.ts","webpack://tweb/./src/helpers/bytes/bytesXor.ts","webpack://tweb/./src/lib/mtproto/authorizer.ts","webpack://tweb/./src/lib/mtproto/timeManager.ts","webpack://tweb/./src/lib/appManagers/appWebDocsManager.ts","webpack://tweb/./src/lib/appManagers/appPaymentsManager.ts","webpack://tweb/./src/lib/appManagers/appManagersManager.ts","webpack://tweb/./src/lib/appManagers/createManagers.ts","webpack://tweb/./src/lib/mtproto/mtproto.worker.ts","webpack://tweb/./src/helpers/listenMessagePort.ts","webpack://tweb/./src/lib/mtproto/mtproto_config.ts","webpack://tweb/./src/lib/richTextProcessor/index.ts","webpack://tweb/./src/vendor/emoji/index.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/compat get default export","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/make namespace object","webpack://tweb/webpack/runtime/node module decorator","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\n });\n });\n };\n }\n})();\n","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,211,51,437,570].map(__webpack_require__.e, __webpack_require__)).then(next);\n};","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {EMOJI_VERSION} from '../environment/emojiVersionsSupport';\r\n\r\nexport const EmojiVersions: {[version in EMOJI_VERSION]: {[emoji: string]: number}} = {'14':{'1f6dd':4867, '1f6de':4916, '1f6df':4923, '1f7f0':62832, '1f979':183, '1f9cc':1557, '1fa7b':61332, '1fa7c':61330, '1faa9':51093, '1faaa':61364, '1faab':61189, '1faac':51085, '1fab7':2651, '1fab8':2631, '1fab9':2672, '1faba':2673, '1fac3':1520, '1fac4':1521, '1fac5':1505, '1fad7':3793, '1fad8':3707, '1fad9':3804, '1fae0':111, '1fae1':136, '1fae2':132, '1fae3':133, '1fae4':174, '1fae5':142, '1fae6':1385, '1fae7':61353, '1faf0':1341, '1faf1':1332, '1faf2':1333, '1faf3':1334, '1faf4':1335, '1faf5':1351, '1faf6':1360, '1faf1-1f3fb-200d-1faf2-1f3fc':0, '1faf1-1f3fb-200d-1faf2-1f3fd':0, '1faf1-1f3fb-200d-1faf2-1f3fe':0, '1faf1-1f3fb-200d-1faf2-1f3ff':0, '1faf1-1f3fc-200d-1faf2-1f3fb':0, '1faf1-1f3fc-200d-1faf2-1f3fd':0, '1faf1-1f3fc-200d-1faf2-1f3fe':0, '1faf1-1f3fc-200d-1faf2-1f3ff':0, '1faf1-1f3fd-200d-1faf2-1f3fb':0, '1faf1-1f3fd-200d-1faf2-1f3fc':0, '1faf1-1f3fd-200d-1faf2-1f3fe':0, '1faf1-1f3fd-200d-1faf2-1f3ff':0, '1faf1-1f3fe-200d-1faf2-1f3fb':0, '1faf1-1f3fe-200d-1faf2-1f3fc':0, '1faf1-1f3fe-200d-1faf2-1f3fd':0, '1faf1-1f3fe-200d-1faf2-1f3ff':0, '1faf1-1f3ff-200d-1faf2-1f3fb':0, '1faf1-1f3ff-200d-1faf2-1f3fc':0, '1faf1-1f3ff-200d-1faf2-1f3fd':0, '1faf1-1f3ff-200d-1faf2-1f3fe':0, '1fac3-1f3fb':0, '1fac3-1f3fc':0, '1fac3-1f3fd':0, '1fac3-1f3fe':0, '1fac3-1f3ff':0, '1fac4-1f3fb':0, '1fac4-1f3fc':0, '1fac4-1f3fd':0, '1fac4-1f3fe':0, '1fac4-1f3ff':0, '1fac5-1f3fb':0, '1fac5-1f3fc':0, '1fac5-1f3fd':0, '1fac5-1f3fe':0, '1fac5-1f3ff':0, '1faf0-1f3fb':0, '1faf0-1f3fc':0, '1faf0-1f3fd':0, '1faf0-1f3fe':0, '1faf0-1f3ff':0, '1faf1-1f3fb':0, '1faf1-1f3fc':0, '1faf1-1f3fd':0, '1faf1-1f3fe':0, '1faf1-1f3ff':0, '1faf2-1f3fb':0, '1faf2-1f3fc':0, '1faf2-1f3fd':0, '1faf2-1f3fe':0, '1faf2-1f3ff':0, '1faf3-1f3fb':0, '1faf3-1f3fc':0, '1faf3-1f3fd':0, '1faf3-1f3fe':0, '1faf3-1f3ff':0, '1faf4-1f3fb':0, '1faf4-1f3fc':0, '1faf4-1f3fd':0, '1faf4-1f3fe':0, '1faf4-1f3ff':0, '1faf5-1f3fb':0, '1faf5-1f3fc':0, '1faf5-1f3fd':0, '1faf5-1f3fe':0, '1faf5-1f3ff':0, '1faf6-1f3fb':0, '1faf6-1f3fc':0, '1faf6-1f3fd':0, '1faf6-1f3fe':0, '1faf6-1f3ff':0}, '':{'2049':62835, '2122':62863, '2139':62888, '2194':62764, '2195':62763, '2196':62762, '2197':62756, '2198':62758, '2199':62760, '2328':61194, '2600':4990, '2601':4998, '2602':41013, '2603':41018, '2604':41020, '2611':62851, '2614':41014, '2615':3781, '2618':2667, '2620':1106, '2622':62753, '2623':62754, '2626':62783, '2638':62780, '2639':177, '2648':62788, '2649':62789, '2650':62796, '2651':62797, '2652':62798, '2653':62799, '2660':51095, '2663':51098, '2665':51096, '2666':51097, '2668':4865, '2692':61297, '2693':4922, '2694':61300, '2696':61311, '2697':61319, '2699':61309, '2702':61284, '2705':62850, '2708':4931, '2709':61245, '2712':61259, '2714':62852, '2716':62828, '2721':62779, '2728':51029, '2733':62858, '2734':62859, '2744':41017, '2747':62860, '2753':62836, '2754':62837, '2755':62838, '2757':62839, '2763':1137, '2764':1141, '2795':62829, '2796':62830, '2797':62831, '2934':62767, '2935':62768, '3030':62840, '3297':62912, '3299':62913, '0023-20e3':62864, '002a-20e3':62865, '0030-20e3':62866, '0031-20e3':62867, '0032-20e3':62868, '0033-20e3':62869, '0034-20e3':62870, '0035-20e3':62871, '0036-20e3':62872, '0037-20e3':62873, '0038-20e3':62874, '0039-20e3':62875, '00a9':62861, '00ae':62862, '1f004':51101, '1f0cf':51100, '1f170':62882, '1f171':62884, '1f17e':62893, '1f17f':62895, '1f18e':62883, '1f191':62885, '1f192':62886, '1f193':62887, '1f194':62889, '1f195':62891, '1f196':62892, '1f197':62894, '1f198':62896, '1f199':62897, '1f19a':62898, '1f1e6-1f1e8':71594, '1f1e6-1f1e9':71595, '1f1e6-1f1ea':71596, '1f1e6-1f1eb':71597, '1f1e6-1f1ec':71598, '1f1e6-1f1ee':71599, '1f1e6-1f1f1':71600, '1f1e6-1f1f2':71601, '1f1e6-1f1f4':71602, '1f1e6-1f1f6':71603, '1f1e6-1f1f7':71604, '1f1e6-1f1f8':71605, '1f1e6-1f1f9':71606, '1f1e6-1f1fa':71607, '1f1e6-1f1fc':71608, '1f1e6-1f1fd':71609, '1f1e6-1f1ff':71610, '1f1e7-1f1e6':71611, '1f1e7-1f1e7':71612, '1f1e7-1f1e9':71613, '1f1e7-1f1ea':71614, '1f1e7-1f1eb':71615, '1f1e7-1f1ec':71616, '1f1e7-1f1ed':71617, '1f1e7-1f1ee':71618, '1f1e7-1f1ef':71619, '1f1e7-1f1f1':71620, '1f1e7-1f1f2':71621, '1f1e7-1f1f3':71622, '1f1e7-1f1f4':71623, '1f1e7-1f1f6':71624, '1f1e7-1f1f7':71625, '1f1e7-1f1f8':71626, '1f1e7-1f1f9':71627, '1f1e7-1f1fb':71628, '1f1e7-1f1fc':71629, '1f1e7-1f1fe':71630, '1f1e7-1f1ff':71631, '1f1e8-1f1e6':71632, '1f1e8-1f1e8':71633, '1f1e8-1f1e9':71634, '1f1e8-1f1eb':71635, '1f1e8-1f1ec':71636, '1f1e8-1f1ed':71637, '1f1e8-1f1ee':71638, '1f1e8-1f1f0':71639, '1f1e8-1f1f1':71640, '1f1e8-1f1f2':71641, '1f1e8-1f1f3':71642, '1f1e8-1f1f4':71643, '1f1e8-1f1f5':71644, '1f1e8-1f1f7':71645, '1f1e8-1f1fa':71646, '1f1e8-1f1fb':71647, '1f1e8-1f1fc':71648, '1f1e8-1f1fd':71649, '1f1e8-1f1fe':71650, '1f1e8-1f1ff':71651, '1f1e9-1f1ea':71652, '1f1e9-1f1ec':71653, '1f1e9-1f1ef':71654, '1f1e9-1f1f0':71655, '1f1e9-1f1f2':71656, '1f1e9-1f1f4':71657, '1f1e9-1f1ff':71658, '1f1ea-1f1e6':71659, '1f1ea-1f1e8':71660, '1f1ea-1f1ea':71661, '1f1ea-1f1ec':71662, '1f1ea-1f1ed':71663, '1f1ea-1f1f7':71664, '1f1ea-1f1f8':71665, '1f1ea-1f1f9':71666, '1f1ea-1f1fa':71667, '1f1eb-1f1ee':71668, '1f1eb-1f1ef':71669, '1f1eb-1f1f0':71670, '1f1eb-1f1f2':71671, '1f1eb-1f1f4':71672, '1f1eb-1f1f7':71673, '1f1ec-1f1e6':71674, '1f1ec-1f1e7':71675, '1f1ec-1f1e9':71676, '1f1ec-1f1ea':71677, '1f1ec-1f1eb':71678, '1f1ec-1f1ec':71679, '1f1ec-1f1ed':71680, '1f1ec-1f1ee':71681, '1f1ec-1f1f1':71682, '1f1ec-1f1f2':71683, '1f1ec-1f1f3':71684, '1f1ec-1f1f5':71685, '1f1ec-1f1f6':71686, '1f1ec-1f1f7':71687, '1f1ec-1f1f8':71688, '1f1ec-1f1f9':71689, '1f1ec-1f1fa':71690, '1f1ec-1f1fc':71691, '1f1ec-1f1fe':71692, '1f1ed-1f1f0':71693, '1f1ed-1f1f2':71694, '1f1ed-1f1f3':71695, '1f1ed-1f1f7':71696, '1f1ed-1f1f9':71697, '1f1ed-1f1fa':71698, '1f1ee-1f1e8':71699, '1f1ee-1f1e9':71700, '1f1ee-1f1ea':71701, '1f1ee-1f1f1':71702, '1f1ee-1f1f2':71703, '1f1ee-1f1f3':71704, '1f1ee-1f1f4':71705, '1f1ee-1f1f6':71706, '1f1ee-1f1f7':71707, '1f1ee-1f1f8':71708, '1f1ee-1f1f9':71709, '1f1ef-1f1ea':71710, '1f1ef-1f1f2':71711, '1f1ef-1f1f4':71712, '1f1ef-1f1f5':71713, '1f1f0-1f1ea':71714, '1f1f0-1f1ec':71715, '1f1f0-1f1ed':71716, '1f1f0-1f1ee':71717, '1f1f0-1f1f2':71718, '1f1f0-1f1f3':71719, '1f1f0-1f1f5':71720, '1f1f0-1f1f7':71721, '1f1f0-1f1fc':71722, '1f1f0-1f1fe':71723, '1f1f0-1f1ff':71724, '1f1f1-1f1e6':71725, '1f1f1-1f1e7':71726, '1f1f1-1f1e8':71727, '1f1f1-1f1ee':71728, '1f1f1-1f1f0':71729, '1f1f1-1f1f7':71730, '1f1f1-1f1f8':71731, '1f1f1-1f1f9':71732, '1f1f1-1f1fa':71733, '1f1f1-1f1fb':71734, '1f1f1-1f1fe':71735, '1f1f2-1f1e6':71736, '1f1f2-1f1e8':71737, '1f1f2-1f1e9':71738, '1f1f2-1f1ea':71739, '1f1f2-1f1eb':71740, '1f1f2-1f1ec':71741, '1f1f2-1f1ed':71742, '1f1f2-1f1f0':71743, '1f1f2-1f1f1':71744, '1f1f2-1f1f2':71745, '1f1f2-1f1f3':71746, '1f1f2-1f1f4':71747, '1f1f2-1f1f5':71748, '1f1f2-1f1f6':71749, '1f1f2-1f1f7':71750, '1f1f2-1f1f8':71751, '1f1f2-1f1f9':71752, '1f1f2-1f1fa':71753, '1f1f2-1f1fb':71754, '1f1f2-1f1fc':71755, '1f1f2-1f1fd':71756, '1f1f2-1f1fe':71757, '1f1f2-1f1ff':71758, '1f1f3-1f1e6':71759, '1f1f3-1f1e8':71760, '1f1f3-1f1ea':71761, '1f1f3-1f1eb':71762, '1f1f3-1f1ec':71763, '1f1f3-1f1ee':71764, '1f1f3-1f1f1':71765, '1f1f3-1f1f4':71766, '1f1f3-1f1f5':71767, '1f1f3-1f1f7':71768, '1f1f3-1f1fa':71769, '1f1f3-1f1ff':71770, '1f1f4-1f1f2':71771, '1f1f5-1f1e6':71772, '1f1f5-1f1ea':71773, '1f1f5-1f1eb':71774, '1f1f5-1f1ec':71775, '1f1f5-1f1ed':71776, '1f1f5-1f1f0':71777, '1f1f5-1f1f1':71778, '1f1f5-1f1f2':71779, '1f1f5-1f1f3':71780, '1f1f5-1f1f7':71781, '1f1f5-1f1f8':71782, '1f1f5-1f1f9':71783, '1f1f5-1f1fc':71784, '1f1f5-1f1fe':71785, '1f1f6-1f1e6':71786, '1f1f7-1f1ea':71787, '1f1f7-1f1f4':71788, '1f1f7-1f1f8':71789, '1f1f7-1f1fa':71790, '1f1f7-1f1fc':71791, '1f1f8-1f1e6':71792, '1f1f8-1f1e7':71793, '1f1f8-1f1e8':71794, '1f1f8-1f1e9':71795, '1f1f8-1f1ea':71796, '1f1f8-1f1ec':71797, '1f1f8-1f1ed':71798, '1f1f8-1f1ee':71799, '1f1f8-1f1ef':71800, '1f1f8-1f1f0':71801, '1f1f8-1f1f1':71802, '1f1f8-1f1f2':71803, '1f1f8-1f1f3':71804, '1f1f8-1f1f4':71805, '1f1f8-1f1f7':71806, '1f1f8-1f1f8':71807, '1f1f8-1f1f9':71808, '1f1f8-1f1fb':71809, '1f1f8-1f1fd':71810, '1f1f8-1f1fe':71811, '1f1f8-1f1ff':71812, '1f1f9-1f1e6':71813, '1f1f9-1f1e8':71814, '1f1f9-1f1e9':71815, '1f1f9-1f1eb':71816, '1f1f9-1f1ec':71817, '1f1f9-1f1ed':71818, '1f1f9-1f1ef':71819, '1f1f9-1f1f0':71820, '1f1f9-1f1f1':71821, '1f1f9-1f1f2':71822, '1f1f9-1f1f3':71823, '1f1f9-1f1f4':71824, '1f1f9-1f1f7':71825, '1f1f9-1f1f9':71826, '1f1f9-1f1fb':71827, '1f1f9-1f1fc':71828, '1f1f9-1f1ff':71829, '1f1fa-1f1e6':71830, '1f1fa-1f1ec':71831, '1f1fa-1f1f2':71832, '1f1fa-1f1f3':71833, '1f1fa-1f1f8':71834, '1f1fa-1f1fe':71835, '1f1fa-1f1ff':71836, '1f1fb-1f1e6':71837, '1f1fb-1f1e8':71838, '1f1fb-1f1ea':71839, '1f1fb-1f1ec':71840, '1f1fb-1f1ee':71841, '1f1fb-1f1f3':71842, '1f1fb-1f1fa':71843, '1f1fc-1f1eb':71844, '1f1fc-1f1f8':71845, '1f1fd-1f1f0':71846, '1f1fe-1f1ea':71847, '1f1fe-1f1f9':71848, '1f1ff-1f1e6':71849, '1f1ff-1f1f2':71850, '1f1ff-1f1fc':71851, '1f201':62899, '1f202':62900, '1f21a':62906, '1f22f':62903, '1f232':62907, '1f233':62911, '1f234':62910, '1f235':62915, '1f236':62902, '1f237':62901, '1f238':62909, '1f239':62905, '1f23a':62914, '1f250':62904, '1f251':62908, '1f300':41010, '1f301':4857, '1f302':41012, '1f303':4858, '1f304':4860, '1f305':4861, '1f306':4862, '1f307':4863, '1f308':41011, '1f309':4864, '1f30a':41023, '1f30b':4815, '1f30c':4997, '1f30d':4806, '1f30e':4807, '1f30f':4808, '1f310':4809, '1f311':4977, '1f312':4978, '1f313':4979, '1f314':4980, '1f315':4981, '1f316':4982, '1f317':4983, '1f318':4984, '1f319':4985, '1f31a':4986, '1f31b':4987, '1f31c':4988, '1f31d':4991, '1f31e':4992, '1f31f':4995, '1f320':4996, '1f321':4989, '1f324':41001, '1f325':41002, '1f326':41003, '1f327':41004, '1f328':41005, '1f329':41006, '1f32a':41007, '1f32b':41008, '1f32c':41009, '1f32d':3725, '1f32e':3727, '1f32f':3728, '1f330':3708, '1f331':2659, '1f332':2661, '1f333':2662, '1f334':2663, '1f335':2664, '1f336':3698, '1f337':2658, '1f338':2649, '1f339':2653, '1f33a':2655, '1f33b':2656, '1f33c':2657, '1f33d':3697, '1f33e':2665, '1f33f':2666, '1f340':2668, '1f341':2669, '1f342':2670, '1f343':2671, '1f344':3705, '1f345':3690, '1f346':3694, '1f347':3674, '1f348':3675, '1f349':3676, '1f34a':3677, '1f34b':3678, '1f34c':3679, '1f34d':3680, '1f34e':3682, '1f34f':3683, '1f350':3684, '1f351':3685, '1f352':3686, '1f353':3687, '1f354':3722, '1f355':3724, '1f356':3718, '1f357':3719, '1f358':3744, '1f359':3745, '1f35a':3746, '1f35b':3747, '1f35c':3748, '1f35d':3749, '1f35e':3709, '1f35f':3723, '1f360':3750, '1f361':3756, '1f362':3751, '1f363':3752, '1f364':3753, '1f365':3754, '1f366':3765, '1f367':3766, '1f368':3767, '1f369':3768, '1f36a':3769, '1f36b':3774, '1f36c':3775, '1f36d':3776, '1f36e':3777, '1f36f':3778, '1f370':3771, '1f371':3743, '1f372':3735, '1f373':3733, '1f374':3801, '1f375':3783, '1f376':3784, '1f377':3786, '1f378':3787, '1f379':3788, '1f37a':3789, '1f37b':3790, '1f37c':3779, '1f37d':3800, '1f37e':3785, '1f37f':3739, '1f380':51040, '1f381':51041, '1f382':3770, '1f383':51024, '1f384':51025, '1f385':1527, '1f386':51026, '1f387':51027, '1f388':51030, '1f389':51031, '1f38a':51032, '1f38b':51033, '1f38c':71588, '1f38d':51034, '1f38e':51035, '1f38f':51036, '1f390':51037, '1f391':51038, '1f392':61134, '1f393':61147, '1f396':51045, '1f397':51042, '1f399':61167, '1f39a':61168, '1f39b':61169, '1f39e':61203, '1f39f':51043, '1f3a0':4866, '1f3a1':4868, '1f3a2':4869, '1f3a3':51072, '1f3a4':61170, '1f3a5':61202, '1f3a6':62819, '1f3a7':61171, '1f3a8':51105, '1f3a9':61146, '1f3aa':4871, '1f3ab':51044, '1f3ac':61205, '1f3ad':51103, '1f3ae':51086, '1f3af':51078, '1f3b0':51088, '1f3b1':51081, '1f3b2':51089, '1f3b3':51060, '1f3b4':51102, '1f3b5':61165, '1f3b6':61166, '1f3b7':61173, '1f3b8':61175, '1f3b9':61176, '1f3ba':61177, '1f3bb':61178, '1f3bc':61164, '1f3bd':51074, '1f3be':51058, '1f3bf':51075, '1f3c0':51054, '1f3c1':71586, '1f3c2':1600, '1f3c3-200d-2640':1584, '1f3c3-200d-2642':1583, '1f3c3':1582, '1f3c4-200d-2640':1606, '1f3c4-200d-2642':1605, '1f3c4':1604, '1f3c5':51047, '1f3c6':51046, '1f3c7':1598, '1f3c8':51056, '1f3c9':51057, '1f3ca-200d-2640':1612, '1f3ca-200d-2642':1611, '1f3ca':1610, '1f3cb-200d-2640':1618, '1f3cb-200d-2642':1617, '1f3cb':1616, '1f3cc-200d-2640':1603, '1f3cc-200d-2642':1602, '1f3cc':1601, '1f3cd':4902, '1f3ce':4901, '1f3cf':51061, '1f3d0':51055, '1f3d1':51062, '1f3d2':51063, '1f3d3':51065, '1f3d4':4813, '1f3d5':4817, '1f3d6':4818, '1f3d7':4824, '1f3d8':4829, '1f3d9':4859, '1f3da':4830, '1f3db':4823, '1f3dc':4819, '1f3dd':4820, '1f3de':4821, '1f3df':4822, '1f3e0':4831, '1f3e1':4832, '1f3e2':4833, '1f3e3':4834, '1f3e4':4835, '1f3e5':4836, '1f3e6':4837, '1f3e7':62729, '1f3e8':4838, '1f3e9':4839, '1f3ea':4840, '1f3eb':4841, '1f3ec':4842, '1f3ed':4843, '1f3ee':61216, '1f3ef':4844, '1f3f0':4845, '1f3f3-200d-1f308':71591, '1f3f3-200d-26a7':71592, '1f3f3':71590, '1f3f4-200d-2620':71593, '1f3f4-e0067-e0062-e0065-e006e-e0067-e007f':71852, '1f3f4-e0067-e0062-e0073-e0063-e0074-e007f':71853, '1f3f4-e0067-e0062-e0077-e006c-e0073-e007f':71854, '1f3f4':71589, '1f3f5':2652, '1f3f7':61234, '1f3f8':51066, '1f3f9':61303, '1f3fa':3805, '1f3fb':9525, '1f3fc':9526, '1f3fd':9527, '1f3fe':9528, '1f3ff':9529, '1f400':2576, '1f401':2575, '1f402':2556, '1f403':2557, '1f404':2558, '1f405':2547, '1f406':2548, '1f407':2579, '1f408-200d-2b1b':2544, '1f408':2543, '1f409':2618, '1f40a':2613, '1f40b':2622, '1f40c':2632, '1f40d':2616, '1f40e':2550, '1f40f':2563, '1f410':2565, '1f411':2564, '1f412':2531, '1f413':2596, '1f414':2595, '1f415-200d-1f9ba':2537, '1f415':2535, '1f416':2560, '1f417':2561, '1f418':2570, '1f419':2629, '1f41a':2630, '1f41b':2634, '1f41c':2635, '1f41d':2636, '1f41e':2638, '1f41f':2625, '1f420':2626, '1f421':2627, '1f422':2614, '1f423':2597, '1f424':2598, '1f425':2599, '1f426':2600, '1f427':2601, '1f428':2586, '1f429':2538, '1f42a':2566, '1f42b':2567, '1f42c':2623, '1f42d':2574, '1f42e':2555, '1f42f':2546, '1f430':2578, '1f431':2542, '1f432':2617, '1f433':2621, '1f434':2549, '1f435':2530, '1f436':2534, '1f437':2559, '1f438':2612, '1f439':2577, '1f43a':2539, '1f43b-200d-2744':2585, '1f43b':2584, '1f43c':2587, '1f43d':2562, '1f43e':2593, '1f43f':2580, '1f440':1381, '1f441-200d-1f5e8':1159, '1f441':1382, '1f442':1373, '1f443':1375, '1f444':1384, '1f445':1383, '1f446':1347, '1f447':1349, '1f448':1345, '1f449':1346, '1f44a':1355, '1f44b':1327, '1f44c':1336, '1f44d':1352, '1f44e':1353, '1f44f':1358, '1f450':1361, '1f451':61144, '1f452':61145, '1f453':61110, '1f454':61115, '1f455':61116, '1f456':61117, '1f457':61122, '1f458':61123, '1f459':61128, '1f45a':61129, '1f45b':61130, '1f45c':61131, '1f45d':61132, '1f45e':61136, '1f45f':61137, '1f460':61140, '1f461':61141, '1f462':61143, '1f463':1687, '1f464':1684, '1f465':1685, '1f466':1388, '1f467':1389, '1f468-200d-1f33e':1457, '1f468-200d-1f373':1460, '1f468-200d-1f37c':1524, '1f468-200d-1f393':1448, '1f468-200d-1f3a4':1478, '1f468-200d-1f3a8':1481, '1f468-200d-1f3eb':1451, '1f468-200d-1f3ed':1466, '1f468-200d-1f466-200d-1f466':1674, '1f468-200d-1f466':1673, '1f468-200d-1f467-200d-1f466':1676, '1f468-200d-1f467-200d-1f467':1677, '1f468-200d-1f467':1675, '1f468-200d-1f468-200d-1f466':1663, '1f468-200d-1f468-200d-1f466-200d-1f466':1666, '1f468-200d-1f468-200d-1f467':1664, '1f468-200d-1f468-200d-1f467-200d-1f466':1665, '1f468-200d-1f468-200d-1f467-200d-1f467':1667, '1f468-200d-1f469-200d-1f466':1658, '1f468-200d-1f469-200d-1f466-200d-1f466':1661, '1f468-200d-1f469-200d-1f467':1659, '1f468-200d-1f469-200d-1f467-200d-1f466':1660, '1f468-200d-1f469-200d-1f467-200d-1f467':1662, '1f468-200d-1f4bb':1475, '1f468-200d-1f4bc':1469, '1f468-200d-1f527':1463, '1f468-200d-1f52c':1472, '1f468-200d-1f680':1487, '1f468-200d-1f692':1490, '1f468-200d-1f9af':1574, '1f468-200d-1f9b0':1396, '1f468-200d-1f9b1':1397, '1f468-200d-1f9b2':1399, '1f468-200d-1f9b3':1398, '1f468-200d-1f9bc':1577, '1f468-200d-1f9bd':1580, '1f468-200d-2695':1445, '1f468-200d-2696':1454, '1f468-200d-2708':1484, '1f468-200d-2764-200d-1f468':1655, '1f468-200d-2764-200d-1f48b-200d-1f468':1651, '1f468':1392, '1f469-200d-1f33e':1458, '1f469-200d-1f373':1461, '1f469-200d-1f37c':1523, '1f469-200d-1f393':1449, '1f469-200d-1f3a4':1479, '1f469-200d-1f3a8':1482, '1f469-200d-1f3eb':1452, '1f469-200d-1f3ed':1467, '1f469-200d-1f466-200d-1f466':1679, '1f469-200d-1f466':1678, '1f469-200d-1f467-200d-1f466':1681, '1f469-200d-1f467-200d-1f467':1682, '1f469-200d-1f467':1680, '1f469-200d-1f469-200d-1f466':1668, '1f469-200d-1f469-200d-1f466-200d-1f466':1671, '1f469-200d-1f469-200d-1f467':1669, '1f469-200d-1f469-200d-1f467-200d-1f466':1670, '1f469-200d-1f469-200d-1f467-200d-1f467':1672, '1f469-200d-1f4bb':1476, '1f469-200d-1f4bc':1470, '1f469-200d-1f527':1464, '1f469-200d-1f52c':1473, '1f469-200d-1f680':1488, '1f469-200d-1f692':1491, '1f469-200d-1f9af':1575, '1f469-200d-1f9b0':1401, '1f469-200d-1f9b1':1403, '1f469-200d-1f9b2':1407, '1f469-200d-1f9b3':1405, '1f469-200d-1f9bc':1578, '1f469-200d-1f9bd':1581, '1f469-200d-2695':1446, '1f469-200d-2696':1455, '1f469-200d-2708':1485, '1f469-200d-2764-200d-1f468':1654, '1f469-200d-2764-200d-1f469':1656, '1f469-200d-2764-200d-1f48b-200d-1f468':1650, '1f469-200d-2764-200d-1f48b-200d-1f469':1652, '1f469':1400, '1f46a':1657, '1f46b':1647, '1f46c':1648, '1f46d':1646, '1f46e-200d-2640':1494, '1f46e-200d-2642':1493, '1f46e':1492, '1f46f-200d-2640':1590, '1f46f-200d-2642':1589, '1f46f':1588, '1f470-200d-2640':1518, '1f470-200d-2642':1517, '1f470':1516, '1f471-200d-2640':1409, '1f471-200d-2642':1410, '1f471':1391, '1f472':1511, '1f473-200d-2640':1510, '1f473-200d-2642':1509, '1f473':1508, '1f474':1412, '1f475':1413, '1f476':1386, '1f477-200d-2640':1504, '1f477-200d-2642':1503, '1f477':1502, '1f478':1507, '1f479':1109, '1f47a':1110, '1f47b':1111, '1f47c':1526, '1f47d':1112, '1f47e':1113, '1f47f':1104, '1f480':1105, '1f481-200d-2640':1428, '1f481-200d-2642':1427, '1f481':1426, '1f482-200d-2640':1500, '1f482-200d-2642':1499, '1f482':1498, '1f483':1585, '1f484':61152, '1f485':1366, '1f486-200d-2640':1560, '1f486-200d-2642':1559, '1f486':1558, '1f487-200d-2640':1563, '1f487-200d-2642':1562, '1f487':1561, '1f488':4870, '1f489':61326, '1f48a':61328, '1f48b':1127, '1f48c':1128, '1f48d':61153, '1f48e':61154, '1f48f':1649, '1f490':2648, '1f491':1653, '1f492':4846, '1f493':1133, '1f494':1138, '1f495':1135, '1f496':1131, '1f497':1132, '1f498':1129, '1f499':1145, '1f49a':1144, '1f49b':1143, '1f49c':1146, '1f49d':1130, '1f49e':1134, '1f49f':1136, '1f4a0':62946, '1f4a1':61214, '1f4a2':1151, '1f4a3':1157, '1f4a4':1163, '1f4a5':1152, '1f4a6':1154, '1f4a7':41022, '1f4a8':1155, '1f4a9':1107, '1f4aa':1368, '1f4ab':1153, '1f4ac':1158, '1f4ad':1162, '1f4ae':2650, '1f4af':1150, '1f4b0':61235, '1f4b1':62841, '1f4b2':62842, '1f4b3':61242, '1f4b4':61237, '1f4b5':61238, '1f4b6':61239, '1f4b7':61240, '1f4b8':61241, '1f4b9':61244, '1f4ba':4936, '1f4bb':61191, '1f4bc':61265, '1f4bd':61197, '1f4be':61198, '1f4bf':61199, '1f4c0':61200, '1f4c1':61266, '1f4c2':61267, '1f4c3':61227, '1f4c4':61229, '1f4c5':61269, '1f4c6':61270, '1f4c7':61273, '1f4c8':61274, '1f4c9':61275, '1f4ca':61276, '1f4cb':61277, '1f4cc':61278, '1f4cd':61279, '1f4ce':61280, '1f4cf':61282, '1f4d0':61283, '1f4d1':61232, '1f4d2':61226, '1f4d3':61225, '1f4d4':61218, '1f4d5':61219, '1f4d6':61220, '1f4d7':61221, '1f4d8':61222, '1f4d9':61223, '1f4da':61224, '1f4db':62847, '1f4dc':61228, '1f4dd':61264, '1f4de':61185, '1f4df':61186, '1f4e0':61187, '1f4e1':61325, '1f4e2':61159, '1f4e3':61160, '1f4e4':61249, '1f4e5':61250, '1f4e6':61251, '1f4e7':61246, '1f4e8':61247, '1f4e9':61248, '1f4ea':61253, '1f4eb':61252, '1f4ec':61254, '1f4ed':61255, '1f4ee':61256, '1f4ef':61161, '1f4f0':61230, '1f4f1':61182, '1f4f2':61183, '1f4f3':62823, '1f4f4':62824, '1f4f5':62751, '1f4f6':62822, '1f4f7':61207, '1f4f8':61208, '1f4f9':61209, '1f4fa':61206, '1f4fb':61172, '1f4fc':61210, '1f4fd':61204, '1f4ff':61151, '1f500':62801, '1f501':62802, '1f502':62803, '1f503':62769, '1f504':62770, '1f505':62820, '1f506':62821, '1f507':61155, '1f508':61156, '1f509':61157, '1f50a':61158, '1f50b':61188, '1f50c':61190, '1f50d':61211, '1f50e':61212, '1f50f':61290, '1f510':61291, '1f511':61292, '1f512':61288, '1f513':61289, '1f514':61162, '1f515':61163, '1f516':61233, '1f517':61313, '1f518':62947, '1f519':62771, '1f51a':62772, '1f51b':62773, '1f51c':62774, '1f51d':62775, '1f51e':62752, '1f51f':62876, '1f520':62877, '1f521':62878, '1f522':62879, '1f523':62880, '1f524':62881, '1f525':41021, '1f526':61215, '1f527':61306, '1f528':61294, '1f529':61308, '1f52a':3803, '1f52b':61301, '1f52c':61323, '1f52d':61324, '1f52e':51082, '1f52f':62787, '1f530':62848, '1f531':62846, '1f532':62949, '1f533':62948, '1f534':62916, '1f535':62920, '1f536':62940, '1f537':62941, '1f538':62942, '1f539':62943, '1f53a':62944, '1f53b':62945, '1f53c':62811, '1f53d':62813, '1f549':62778, '1f54a':2602, '1f54b':4854, '1f54c':4850, '1f54d':4852, '1f54e':62786, '1f550':4955, '1f551':4957, '1f552':4959, '1f553':4961, '1f554':4963, '1f555':4965, '1f556':4967, '1f557':4969, '1f558':4971, '1f559':4973, '1f55a':4975, '1f55b':4953, '1f55c':4956, '1f55d':4958, '1f55e':4960, '1f55f':4962, '1f560':4964, '1f561':4966, '1f562':4968, '1f563':4970, '1f564':4972, '1f565':4974, '1f566':4976, '1f567':4954, '1f56f':61213, '1f570':4952, '1f573':1156, '1f574':1587, '1f575-200d-2640':1497, '1f575-200d-2642':1496, '1f575':1495, '1f576':61111, '1f577':2641, '1f578':2642, '1f579':51087, '1f57a':1586, '1f587':61281, '1f58a':61261, '1f58b':61260, '1f58c':61262, '1f58d':61263, '1f590':1329, '1f595':1348, '1f596':1331, '1f5a4':1148, '1f5a5':61192, '1f5a8':61193, '1f5b1':61195, '1f5b2':61196, '1f5bc':51104, '1f5c2':61268, '1f5c3':61285, '1f5c4':61286, '1f5d1':61287, '1f5d2':61271, '1f5d3':61272, '1f5dc':61310, '1f5dd':61293, '1f5de':61231, '1f5e1':61299, '1f5e3':1683, '1f5e8':1160, '1f5ef':1161, '1f5f3':61257, '1f5fa':4810, '1f5fb':4816, '1f5fc':4847, '1f5fd':4848, '1f5fe':4811, '1f5ff':61362, '1f600':11, '1f601':14, '1f602':18, '1f603':12, '1f604':13, '1f605':16, '1f606':15, '1f607':114, '1f608':1103, '1f609':112, '1f60a':113, '1f60b':124, '1f60c':150, '1f60d':116, '1f60e':170, '1f60f':144, '1f610':139, '1f611':140, '1f612':145, '1f613':195, '1f614':151, '1f615':173, '1f616':192, '1f617':119, '1f618':118, '1f619':122, '1f61a':121, '1f61b':125, '1f61c':126, '1f61d':128, '1f61e':194, '1f61f':175, '1f620':1101, '1f621':1100, '1f622':189, '1f623':193, '1f624':199, '1f625':188, '1f626':184, '1f627':185, '1f628':186, '1f629':196, '1f62a':152, '1f62b':197, '1f62c':147, '1f62d':190, '1f62e-200d-1f4a8':148, '1f62e':178, '1f62f':179, '1f630':187, '1f631':191, '1f632':180, '1f633':181, '1f634':154, '1f635-200d-1f4ab':165, '1f635':164, '1f636-200d-1f32b':143, '1f636':141, '1f637':155, '1f638':1116, '1f639':1117, '1f63a':1115, '1f63b':1118, '1f63c':1119, '1f63d':1120, '1f63e':1123, '1f63f':1122, '1f640':1121, '1f641':176, '1f642':19, '1f643':110, '1f644':146, '1f645-200d-2640':1422, '1f645-200d-2642':1421, '1f645':1420, '1f646-200d-2640':1425, '1f646-200d-2642':1424, '1f646':1423, '1f647-200d-2640':1437, '1f647-200d-2642':1436, '1f647':1435, '1f648':1124, '1f649':1125, '1f64a':1126, '1f64b-200d-2640':1431, '1f64b-200d-2642':1430, '1f64b':1429, '1f64c':1359, '1f64d-200d-2640':1416, '1f64d-200d-2642':1415, '1f64d':1414, '1f64e-200d-2640':1419, '1f64e-200d-2642':1418, '1f64e':1417, '1f64f':1364, '1f680':4942, '1f681':4937, '1f682':4872, '1f683':4873, '1f684':4874, '1f685':4875, '1f686':4876, '1f687':4877, '1f688':4878, '1f689':4879, '1f68a':4880, '1f68b':4883, '1f68c':4884, '1f68d':4885, '1f68e':4886, '1f68f':4911, '1f690':4887, '1f691':4888, '1f692':4889, '1f693':4890, '1f694':4891, '1f695':4892, '1f696':4893, '1f697':4894, '1f698':4895, '1f699':4896, '1f69a':4898, '1f69b':4899, '1f69c':4900, '1f69d':4881, '1f69e':4882, '1f69f':4938, '1f6a0':4939, '1f6a1':4940, '1f6a2':4930, '1f6a3-200d-2640':1609, '1f6a3-200d-2642':1608, '1f6a3':1607, '1f6a4':4926, '1f6a5':4918, '1f6a6':4919, '1f6a7':4921, '1f6a8':4917, '1f6a9':71587, '1f6aa':61333, '1f6ab':62745, '1f6ac':61358, '1f6ad':62747, '1f6ae':62730, '1f6af':62748, '1f6b0':62731, '1f6b1':62749, '1f6b2':4907, '1f6b3':62746, '1f6b4-200d-2640':1621, '1f6b4-200d-2642':1620, '1f6b4':1619, '1f6b5-200d-2640':1624, '1f6b5-200d-2642':1623, '1f6b5':1622, '1f6b6-200d-2640':1566, '1f6b6-200d-2642':1565, '1f6b6':1564, '1f6b7':62750, '1f6b8':62743, '1f6b9':62733, '1f6ba':62734, '1f6bb':62735, '1f6bc':62736, '1f6bd':61340, '1f6be':62737, '1f6bf':61342, '1f6c0':1643, '1f6c1':61343, '1f6c2':62738, '1f6c3':62739, '1f6c4':62740, '1f6c5':62741, '1f6cb':61338, '1f6cc':1644, '1f6cd':61133, '1f6ce':4944, '1f6cf':61337, '1f6d0':62776, '1f6d1':4920, '1f6d2':61357, '1f6d5':4851, '1f6d6':4828, '1f6d7':61334, '1f6e0':61298, '1f6e1':61304, '1f6e2':4914, '1f6e3':4912, '1f6e4':4913, '1f6e5':4929, '1f6e9':4932, '1f6eb':4933, '1f6ec':4934, '1f6f0':4941, '1f6f3':4927, '1f6f4':4908, '1f6f5':4903, '1f6f6':4925, '1f6f7':51076, '1f6f8':4943, '1f6f9':4909, '1f6fa':4906, '1f6fb':4897, '1f6fc':4910, '1f7e0':62917, '1f7e1':62918, '1f7e2':62919, '1f7e3':62921, '1f7e4':62922, '1f7e5':62925, '1f7e6':62929, '1f7e7':62926, '1f7e8':62927, '1f7e9':62928, '1f7ea':62930, '1f7eb':62931, '1f90c':1337, '1f90d':1149, '1f90e':1147, '1f90f':1338, '1f910':137, '1f911':129, '1f912':156, '1f913':171, '1f914':135, '1f915':157, '1f916':1114, '1f917':130, '1f918':1343, '1f919':1344, '1f91a':1328, '1f91b':1356, '1f91c':1357, '1f91d':1363, '1f91e':1340, '1f91f':1342, '1f920':167, '1f921':1108, '1f922':158, '1f923':17, '1f924':153, '1f925':149, '1f926-200d-2640':1440, '1f926-200d-2642':1439, '1f926':1438, '1f927':160, '1f928':138, '1f929':117, '1f92a':127, '1f92b':134, '1f92c':1102, '1f92d':131, '1f92e':159, '1f92f':166, '1f930':1519, '1f931':1522, '1f932':1362, '1f933':1367, '1f934':1506, '1f935-200d-2640':1515, '1f935-200d-2642':1514, '1f935':1513, '1f936':1528, '1f937-200d-2640':1443, '1f937-200d-2642':1442, '1f937':1441, '1f938-200d-2640':1627, '1f938-200d-2642':1626, '1f938':1625, '1f939-200d-2640':1639, '1f939-200d-2642':1638, '1f939':1637, '1f93a':1597, '1f93c-200d-2640':1630, '1f93c-200d-2642':1629, '1f93c':1628, '1f93d-200d-2640':1633, '1f93d-200d-2642':1632, '1f93d':1631, '1f93e-200d-2640':1636, '1f93e-200d-2642':1635, '1f93e':1634, '1f93f':51073, '1f940':2654, '1f941':61180, '1f942':3791, '1f943':3792, '1f944':3802, '1f945':51069, '1f947':51048, '1f948':51049, '1f949':51050, '1f94a':51067, '1f94b':51068, '1f94c':51077, '1f94d':51064, '1f94e':51053, '1f94f':51059, '1f950':3710, '1f951':3693, '1f952':3700, '1f953':3721, '1f954':3695, '1f955':3696, '1f956':3711, '1f957':3738, '1f958':3734, '1f959':3730, '1f95a':3732, '1f95b':3780, '1f95c':3706, '1f95d':3689, '1f95e':3715, '1f95f':3757, '1f960':3758, '1f961':3759, '1f962':3799, '1f963':3737, '1f964':3794, '1f965':3692, '1f966':3702, '1f967':3773, '1f968':3713, '1f969':3720, '1f96a':3726, '1f96b':3742, '1f96c':3701, '1f96d':3681, '1f96e':3755, '1f96f':3714, '1f970':115, '1f971':198, '1f972':123, '1f973':168, '1f974':163, '1f975':161, '1f976':162, '1f977':1501, '1f978':169, '1f97a':182, '1f97b':61124, '1f97c':61113, '1f97d':61112, '1f97e':61138, '1f97f':61139, '1f980':3760, '1f981':2545, '1f982':2643, '1f983':2594, '1f984':2551, '1f985':2603, '1f986':2604, '1f987':2583, '1f988':2628, '1f989':2606, '1f98a':2540, '1f98b':2633, '1f98c':2553, '1f98d':2532, '1f98e':2615, '1f98f':2572, '1f990':3762, '1f991':3763, '1f992':2569, '1f993':2552, '1f994':2582, '1f995':2619, '1f996':2620, '1f997':2639, '1f998':2591, '1f999':2568, '1f99a':2610, '1f99b':2573, '1f99c':2611, '1f99d':2541, '1f99e':3761, '1f99f':2644, '1f9a0':2647, '1f9a1':2592, '1f9a2':2605, '1f9a3':2571, '1f9a4':2607, '1f9a5':2588, '1f9a6':2589, '1f9a7':2533, '1f9a8':2590, '1f9a9':2609, '1f9aa':3764, '1f9ab':2581, '1f9ac':2554, '1f9ad':2624, '1f9ae':2536, '1f9af':61312, '1f9b4':1380, '1f9b5':1371, '1f9b6':1372, '1f9b7':1379, '1f9b8-200d-2640':1532, '1f9b8-200d-2642':1531, '1f9b8':1530, '1f9b9-200d-2640':1535, '1f9b9-200d-2642':1534, '1f9b9':1533, '1f9ba':61114, '1f9bb':1374, '1f9bc':4905, '1f9bd':4904, '1f9be':1369, '1f9bf':1370, '1f9c0':3717, '1f9c1':3772, '1f9c2':3741, '1f9c3':3796, '1f9c4':3703, '1f9c5':3704, '1f9c6':3731, '1f9c7':3716, '1f9c8':3740, '1f9c9':3797, '1f9ca':3798, '1f9cb':3795, '1f9cd-200d-2640':1569, '1f9cd-200d-2642':1568, '1f9cd':1567, '1f9ce-200d-2640':1572, '1f9ce-200d-2642':1571, '1f9ce':1570, '1f9cf-200d-2640':1434, '1f9cf-200d-2642':1433, '1f9cf':1432, '1f9d0':172, '1f9d1-200d-1f33e':1456, '1f9d1-200d-1f373':1459, '1f9d1-200d-1f37c':1525, '1f9d1-200d-1f384':1529, '1f9d1-200d-1f393':1447, '1f9d1-200d-1f3a4':1477, '1f9d1-200d-1f3a8':1480, '1f9d1-200d-1f3eb':1450, '1f9d1-200d-1f3ed':1465, '1f9d1-200d-1f4bb':1474, '1f9d1-200d-1f4bc':1468, '1f9d1-200d-1f527':1462, '1f9d1-200d-1f52c':1471, '1f9d1-200d-1f680':1486, '1f9d1-200d-1f692':1489, '1f9d1-200d-1f91d-200d-1f9d1':1645, '1f9d1-200d-1f9af':1573, '1f9d1-200d-1f9b0':1402, '1f9d1-200d-1f9b1':1404, '1f9d1-200d-1f9b2':1408, '1f9d1-200d-1f9b3':1406, '1f9d1-200d-1f9bc':1576, '1f9d1-200d-1f9bd':1579, '1f9d1-200d-2695':1444, '1f9d1-200d-2696':1453, '1f9d1-200d-2708':1483, '1f9d1':1390, '1f9d2':1387, '1f9d3':1411, '1f9d4-200d-2640':1395, '1f9d4-200d-2642':1394, '1f9d4':1393, '1f9d5':1512, '1f9d6-200d-2640':1593, '1f9d6-200d-2642':1592, '1f9d6':1591, '1f9d7-200d-2640':1596, '1f9d7-200d-2642':1595, '1f9d7':1594, '1f9d8-200d-2640':1642, '1f9d8-200d-2642':1641, '1f9d8':1640, '1f9d9-200d-2640':1538, '1f9d9-200d-2642':1537, '1f9d9':1536, '1f9da-200d-2640':1541, '1f9da-200d-2642':1540, '1f9da':1539, '1f9db-200d-2640':1544, '1f9db-200d-2642':1543, '1f9db':1542, '1f9dc-200d-2640':1547, '1f9dc-200d-2642':1546, '1f9dc':1545, '1f9dd-200d-2640':1550, '1f9dd-200d-2642':1549, '1f9dd':1548, '1f9de-200d-2640':1553, '1f9de-200d-2642':1552, '1f9de':1551, '1f9df-200d-2640':1556, '1f9df-200d-2642':1555, '1f9df':1554, '1f9e0':1376, '1f9e1':1142, '1f9e2':61148, '1f9e3':61118, '1f9e4':61119, '1f9e5':61120, '1f9e6':61121, '1f9e7':51039, '1f9e8':51028, '1f9e9':51090, '1f9ea':61320, '1f9eb':61321, '1f9ec':61322, '1f9ed':4812, '1f9ee':61201, '1f9ef':61356, '1f9f0':61316, '1f9f1':4825, '1f9f2':61317, '1f9f3':4945, '1f9f4':61346, '1f9f5':51106, '1f9f6':51108, '1f9f7':61347, '1f9f8':51091, '1f9f9':61348, '1f9fa':61349, '1f9fb':61350, '1f9fc':61352, '1f9fd':61355, '1f9fe':61243, '1f9ff':51084, '1fa70':61142, '1fa71':61125, '1fa72':61126, '1fa73':61127, '1fa74':61135, '1fa78':61327, '1fa79':61329, '1fa7a':61331, '1fa80':51079, '1fa81':51080, '1fa82':4935, '1fa83':61302, '1fa84':51083, '1fa85':51092, '1fa86':51094, '1fa90':4993, '1fa91':61339, '1fa92':61345, '1fa93':61295, '1fa94':61217, '1fa95':61179, '1fa96':61149, '1fa97':61174, '1fa98':61181, '1fa99':61236, '1fa9a':61305, '1fa9b':61307, '1fa9c':61318, '1fa9d':61315, '1fa9e':61335, '1fa9f':61336, '1faa0':61341, '1faa1':51107, '1faa2':51109, '1faa3':61351, '1faa4':61344, '1faa5':61354, '1faa6':61360, '1faa7':61363, '1faa8':4826, '1fab0':2645, '1fab1':2646, '1fab2':2637, '1fab3':2640, '1fab4':2660, '1fab5':4827, '1fab6':2608, '1fac0':1377, '1fac1':1378, '1fac2':1686, '1fad0':3688, '1fad1':3699, '1fad2':3691, '1fad3':3712, '1fad4':3729, '1fad5':3736, '1fad6':3782, '203c':62834, '21a9':62765, '21aa':62766, '231a':4948, '231b':4946, '23cf':62818, '23e9':62805, '23ea':62809, '23eb':62812, '23ec':62814, '23ed':62806, '23ee':62810, '23ef':62807, '23f0':4949, '23f1':4950, '23f2':4951, '23f3':4947, '23f8':62815, '23f9':62816, '23fa':62817, '24c2':62890, '25aa':62938, '25ab':62939, '25b6':62804, '25c0':62808, '25fb':62935, '25fc':62934, '25fd':62937, '25fe':62936, '260e':61184, '261d':1350, '262a':62784, '262e':62785, '262f':62781, '263a':120, '264a':62790, '264b':62791, '264c':62792, '264d':62793, '264e':62794, '264f':62795, '265f':51099, '267b':62844, '267e':62833, '267f':62732, '269b':62777, '269c':62845, '26a0':62742, '26a1':41016, '26a7':62827, '26aa':62924, '26ab':62923, '26b0':61359, '26b1':61361, '26bd':51051, '26be':51052, '26c4':41019, '26c5':4999, '26c8':41000, '26ce':62800, '26cf':61296, '26d1':61150, '26d3':61314, '26d4':62744, '26e9':4853, '26ea':4849, '26f0':4814, '26f1':41015, '26f2':4855, '26f3':51070, '26f4':4928, '26f5':4924, '26f7':1599, '26f8':51071, '26f9-200d-2640':1615, '26f9-200d-2642':1614, '26f9':1613, '26fa':4856, '26fd':4915, '270a':1354, '270b':1330, '270c':1339, '270d':1365, '270f':61258, '271d':62782, '274c':62853, '274e':62854, '2764-200d-1f525':1139, '2764-200d-1fa79':1140, '27a1':62757, '27b0':62855, '27bf':62856, '2b05':62761, '2b06':62755, '2b07':62759, '2b1b':62932, '2b1c':62933, '2b50':4994, '2b55':62849, '303d':62857, '1f385-1f3fb':0, '1f385-1f3fc':0, '1f385-1f3fd':0, '1f385-1f3fe':0, '1f385-1f3ff':0, '1f3c2-1f3fb':0, '1f3c2-1f3fc':0, '1f3c2-1f3fd':0, '1f3c2-1f3fe':0, '1f3c2-1f3ff':0, '1f3c3-1f3fb-200d-2640':0, '1f3c3-1f3fc-200d-2640':0, '1f3c3-1f3fd-200d-2640':0, '1f3c3-1f3fe-200d-2640':0, '1f3c3-1f3ff-200d-2640':0, '1f3c3-1f3fb-200d-2642':0, '1f3c3-1f3fc-200d-2642':0, '1f3c3-1f3fd-200d-2642':0, '1f3c3-1f3fe-200d-2642':0, '1f3c3-1f3ff-200d-2642':0, '1f3c3-1f3fb':0, '1f3c3-1f3fc':0, '1f3c3-1f3fd':0, '1f3c3-1f3fe':0, '1f3c3-1f3ff':0, '1f3c4-1f3fb-200d-2640':0, '1f3c4-1f3fc-200d-2640':0, '1f3c4-1f3fd-200d-2640':0, '1f3c4-1f3fe-200d-2640':0, '1f3c4-1f3ff-200d-2640':0, '1f3c4-1f3fb-200d-2642':0, '1f3c4-1f3fc-200d-2642':0, '1f3c4-1f3fd-200d-2642':0, '1f3c4-1f3fe-200d-2642':0, '1f3c4-1f3ff-200d-2642':0, '1f3c4-1f3fb':0, '1f3c4-1f3fc':0, '1f3c4-1f3fd':0, '1f3c4-1f3fe':0, '1f3c4-1f3ff':0, '1f3c7-1f3fb':0, '1f3c7-1f3fc':0, '1f3c7-1f3fd':0, '1f3c7-1f3fe':0, '1f3c7-1f3ff':0, '1f3ca-1f3fb-200d-2640':0, '1f3ca-1f3fc-200d-2640':0, '1f3ca-1f3fd-200d-2640':0, '1f3ca-1f3fe-200d-2640':0, '1f3ca-1f3ff-200d-2640':0, '1f3ca-1f3fb-200d-2642':0, '1f3ca-1f3fc-200d-2642':0, '1f3ca-1f3fd-200d-2642':0, '1f3ca-1f3fe-200d-2642':0, '1f3ca-1f3ff-200d-2642':0, '1f3ca-1f3fb':0, '1f3ca-1f3fc':0, '1f3ca-1f3fd':0, '1f3ca-1f3fe':0, '1f3ca-1f3ff':0, '1f3cb-1f3fb-200d-2640':0, '1f3cb-1f3fc-200d-2640':0, '1f3cb-1f3fd-200d-2640':0, '1f3cb-1f3fe-200d-2640':0, '1f3cb-1f3ff-200d-2640':0, '1f3cb-1f3fb-200d-2642':0, '1f3cb-1f3fc-200d-2642':0, '1f3cb-1f3fd-200d-2642':0, '1f3cb-1f3fe-200d-2642':0, '1f3cb-1f3ff-200d-2642':0, '1f3cb-1f3fb':0, '1f3cb-1f3fc':0, '1f3cb-1f3fd':0, '1f3cb-1f3fe':0, '1f3cb-1f3ff':0, '1f3cc-1f3fb-200d-2640':0, '1f3cc-1f3fc-200d-2640':0, '1f3cc-1f3fd-200d-2640':0, '1f3cc-1f3fe-200d-2640':0, '1f3cc-1f3ff-200d-2640':0, '1f3cc-1f3fb-200d-2642':0, '1f3cc-1f3fc-200d-2642':0, '1f3cc-1f3fd-200d-2642':0, '1f3cc-1f3fe-200d-2642':0, '1f3cc-1f3ff-200d-2642':0, '1f3cc-1f3fb':0, '1f3cc-1f3fc':0, '1f3cc-1f3fd':0, '1f3cc-1f3fe':0, '1f3cc-1f3ff':0, '1f442-1f3fb':0, '1f442-1f3fc':0, '1f442-1f3fd':0, '1f442-1f3fe':0, '1f442-1f3ff':0, '1f443-1f3fb':0, '1f443-1f3fc':0, '1f443-1f3fd':0, '1f443-1f3fe':0, '1f443-1f3ff':0, '1f446-1f3fb':0, '1f446-1f3fc':0, '1f446-1f3fd':0, '1f446-1f3fe':0, '1f446-1f3ff':0, '1f447-1f3fb':0, '1f447-1f3fc':0, '1f447-1f3fd':0, '1f447-1f3fe':0, '1f447-1f3ff':0, '1f448-1f3fb':0, '1f448-1f3fc':0, '1f448-1f3fd':0, '1f448-1f3fe':0, '1f448-1f3ff':0, '1f449-1f3fb':0, '1f449-1f3fc':0, '1f449-1f3fd':0, '1f449-1f3fe':0, '1f449-1f3ff':0, '1f44a-1f3fb':0, '1f44a-1f3fc':0, '1f44a-1f3fd':0, '1f44a-1f3fe':0, '1f44a-1f3ff':0, '1f44b-1f3fb':0, '1f44b-1f3fc':0, '1f44b-1f3fd':0, '1f44b-1f3fe':0, '1f44b-1f3ff':0, '1f44c-1f3fb':0, '1f44c-1f3fc':0, '1f44c-1f3fd':0, '1f44c-1f3fe':0, '1f44c-1f3ff':0, '1f44d-1f3fb':0, '1f44d-1f3fc':0, '1f44d-1f3fd':0, '1f44d-1f3fe':0, '1f44d-1f3ff':0, '1f44e-1f3fb':0, '1f44e-1f3fc':0, '1f44e-1f3fd':0, '1f44e-1f3fe':0, '1f44e-1f3ff':0, '1f44f-1f3fb':0, '1f44f-1f3fc':0, '1f44f-1f3fd':0, '1f44f-1f3fe':0, '1f44f-1f3ff':0, '1f450-1f3fb':0, '1f450-1f3fc':0, '1f450-1f3fd':0, '1f450-1f3fe':0, '1f450-1f3ff':0, '1f466-1f3fb':0, '1f466-1f3fc':0, '1f466-1f3fd':0, '1f466-1f3fe':0, '1f466-1f3ff':0, '1f467-1f3fb':0, '1f467-1f3fc':0, '1f467-1f3fd':0, '1f467-1f3fe':0, '1f467-1f3ff':0, '1f468-1f3fb-200d-1f33e':0, '1f468-1f3fc-200d-1f33e':0, '1f468-1f3fd-200d-1f33e':0, '1f468-1f3fe-200d-1f33e':0, '1f468-1f3ff-200d-1f33e':0, '1f468-1f3fb-200d-1f373':0, '1f468-1f3fc-200d-1f373':0, '1f468-1f3fd-200d-1f373':0, '1f468-1f3fe-200d-1f373':0, '1f468-1f3ff-200d-1f373':0, '1f468-1f3fb-200d-1f37c':0, '1f468-1f3fc-200d-1f37c':0, '1f468-1f3fd-200d-1f37c':0, '1f468-1f3fe-200d-1f37c':0, '1f468-1f3ff-200d-1f37c':0, '1f468-1f3fb-200d-1f393':0, '1f468-1f3fc-200d-1f393':0, '1f468-1f3fd-200d-1f393':0, '1f468-1f3fe-200d-1f393':0, '1f468-1f3ff-200d-1f393':0, '1f468-1f3fb-200d-1f3a4':0, '1f468-1f3fc-200d-1f3a4':0, '1f468-1f3fd-200d-1f3a4':0, '1f468-1f3fe-200d-1f3a4':0, '1f468-1f3ff-200d-1f3a4':0, '1f468-1f3fb-200d-1f3a8':0, '1f468-1f3fc-200d-1f3a8':0, '1f468-1f3fd-200d-1f3a8':0, '1f468-1f3fe-200d-1f3a8':0, '1f468-1f3ff-200d-1f3a8':0, '1f468-1f3fb-200d-1f3eb':0, '1f468-1f3fc-200d-1f3eb':0, '1f468-1f3fd-200d-1f3eb':0, '1f468-1f3fe-200d-1f3eb':0, '1f468-1f3ff-200d-1f3eb':0, '1f468-1f3fb-200d-1f3ed':0, '1f468-1f3fc-200d-1f3ed':0, '1f468-1f3fd-200d-1f3ed':0, '1f468-1f3fe-200d-1f3ed':0, '1f468-1f3ff-200d-1f3ed':0, '1f468-1f3fb-200d-1f4bb':0, '1f468-1f3fc-200d-1f4bb':0, '1f468-1f3fd-200d-1f4bb':0, '1f468-1f3fe-200d-1f4bb':0, '1f468-1f3ff-200d-1f4bb':0, '1f468-1f3fb-200d-1f4bc':0, '1f468-1f3fc-200d-1f4bc':0, '1f468-1f3fd-200d-1f4bc':0, '1f468-1f3fe-200d-1f4bc':0, '1f468-1f3ff-200d-1f4bc':0, '1f468-1f3fb-200d-1f527':0, '1f468-1f3fc-200d-1f527':0, '1f468-1f3fd-200d-1f527':0, '1f468-1f3fe-200d-1f527':0, '1f468-1f3ff-200d-1f527':0, '1f468-1f3fb-200d-1f52c':0, '1f468-1f3fc-200d-1f52c':0, '1f468-1f3fd-200d-1f52c':0, '1f468-1f3fe-200d-1f52c':0, '1f468-1f3ff-200d-1f52c':0, '1f468-1f3fb-200d-1f680':0, '1f468-1f3fc-200d-1f680':0, '1f468-1f3fd-200d-1f680':0, '1f468-1f3fe-200d-1f680':0, '1f468-1f3ff-200d-1f680':0, '1f468-1f3fb-200d-1f692':0, '1f468-1f3fc-200d-1f692':0, '1f468-1f3fd-200d-1f692':0, '1f468-1f3fe-200d-1f692':0, '1f468-1f3ff-200d-1f692':0, '1f468-1f3fb-200d-1f9af':0, '1f468-1f3fc-200d-1f9af':0, '1f468-1f3fd-200d-1f9af':0, '1f468-1f3fe-200d-1f9af':0, '1f468-1f3ff-200d-1f9af':0, '1f468-1f3fb-200d-1f9b0':0, '1f468-1f3fc-200d-1f9b0':0, '1f468-1f3fd-200d-1f9b0':0, '1f468-1f3fe-200d-1f9b0':0, '1f468-1f3ff-200d-1f9b0':0, '1f468-1f3fb-200d-1f9b1':0, '1f468-1f3fc-200d-1f9b1':0, '1f468-1f3fd-200d-1f9b1':0, '1f468-1f3fe-200d-1f9b1':0, '1f468-1f3ff-200d-1f9b1':0, '1f468-1f3fb-200d-1f9b2':0, '1f468-1f3fc-200d-1f9b2':0, '1f468-1f3fd-200d-1f9b2':0, '1f468-1f3fe-200d-1f9b2':0, '1f468-1f3ff-200d-1f9b2':0, '1f468-1f3fb-200d-1f9b3':0, '1f468-1f3fc-200d-1f9b3':0, '1f468-1f3fd-200d-1f9b3':0, '1f468-1f3fe-200d-1f9b3':0, '1f468-1f3ff-200d-1f9b3':0, '1f468-1f3fb-200d-1f9bc':0, '1f468-1f3fc-200d-1f9bc':0, '1f468-1f3fd-200d-1f9bc':0, '1f468-1f3fe-200d-1f9bc':0, '1f468-1f3ff-200d-1f9bc':0, '1f468-1f3fb-200d-1f9bd':0, '1f468-1f3fc-200d-1f9bd':0, '1f468-1f3fd-200d-1f9bd':0, '1f468-1f3fe-200d-1f9bd':0, '1f468-1f3ff-200d-1f9bd':0, '1f468-1f3fb-200d-2695':0, '1f468-1f3fc-200d-2695':0, '1f468-1f3fd-200d-2695':0, '1f468-1f3fe-200d-2695':0, '1f468-1f3ff-200d-2695':0, '1f468-1f3fb-200d-2696':0, '1f468-1f3fc-200d-2696':0, '1f468-1f3fd-200d-2696':0, '1f468-1f3fe-200d-2696':0, '1f468-1f3ff-200d-2696':0, '1f468-1f3fb-200d-2708':0, '1f468-1f3fc-200d-2708':0, '1f468-1f3fd-200d-2708':0, '1f468-1f3fe-200d-2708':0, '1f468-1f3ff-200d-2708':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fb':0, '1f468-1f3fc':0, '1f468-1f3fd':0, '1f468-1f3fe':0, '1f468-1f3ff':0, '1f469-1f3fb-200d-1f33e':0, '1f469-1f3fc-200d-1f33e':0, '1f469-1f3fd-200d-1f33e':0, '1f469-1f3fe-200d-1f33e':0, '1f469-1f3ff-200d-1f33e':0, '1f469-1f3fb-200d-1f373':0, '1f469-1f3fc-200d-1f373':0, '1f469-1f3fd-200d-1f373':0, '1f469-1f3fe-200d-1f373':0, '1f469-1f3ff-200d-1f373':0, '1f469-1f3fb-200d-1f37c':0, '1f469-1f3fc-200d-1f37c':0, '1f469-1f3fd-200d-1f37c':0, '1f469-1f3fe-200d-1f37c':0, '1f469-1f3ff-200d-1f37c':0, '1f469-1f3fb-200d-1f393':0, '1f469-1f3fc-200d-1f393':0, '1f469-1f3fd-200d-1f393':0, '1f469-1f3fe-200d-1f393':0, '1f469-1f3ff-200d-1f393':0, '1f469-1f3fb-200d-1f3a4':0, '1f469-1f3fc-200d-1f3a4':0, '1f469-1f3fd-200d-1f3a4':0, '1f469-1f3fe-200d-1f3a4':0, '1f469-1f3ff-200d-1f3a4':0, '1f469-1f3fb-200d-1f3a8':0, '1f469-1f3fc-200d-1f3a8':0, '1f469-1f3fd-200d-1f3a8':0, '1f469-1f3fe-200d-1f3a8':0, '1f469-1f3ff-200d-1f3a8':0, '1f469-1f3fb-200d-1f3eb':0, '1f469-1f3fc-200d-1f3eb':0, '1f469-1f3fd-200d-1f3eb':0, '1f469-1f3fe-200d-1f3eb':0, '1f469-1f3ff-200d-1f3eb':0, '1f469-1f3fb-200d-1f3ed':0, '1f469-1f3fc-200d-1f3ed':0, '1f469-1f3fd-200d-1f3ed':0, '1f469-1f3fe-200d-1f3ed':0, '1f469-1f3ff-200d-1f3ed':0, '1f469-1f3fb-200d-1f4bb':0, '1f469-1f3fc-200d-1f4bb':0, '1f469-1f3fd-200d-1f4bb':0, '1f469-1f3fe-200d-1f4bb':0, '1f469-1f3ff-200d-1f4bb':0, '1f469-1f3fb-200d-1f4bc':0, '1f469-1f3fc-200d-1f4bc':0, '1f469-1f3fd-200d-1f4bc':0, '1f469-1f3fe-200d-1f4bc':0, '1f469-1f3ff-200d-1f4bc':0, '1f469-1f3fb-200d-1f527':0, '1f469-1f3fc-200d-1f527':0, '1f469-1f3fd-200d-1f527':0, '1f469-1f3fe-200d-1f527':0, '1f469-1f3ff-200d-1f527':0, '1f469-1f3fb-200d-1f52c':0, '1f469-1f3fc-200d-1f52c':0, '1f469-1f3fd-200d-1f52c':0, '1f469-1f3fe-200d-1f52c':0, '1f469-1f3ff-200d-1f52c':0, '1f469-1f3fb-200d-1f680':0, '1f469-1f3fc-200d-1f680':0, '1f469-1f3fd-200d-1f680':0, '1f469-1f3fe-200d-1f680':0, '1f469-1f3ff-200d-1f680':0, '1f469-1f3fb-200d-1f692':0, '1f469-1f3fc-200d-1f692':0, '1f469-1f3fd-200d-1f692':0, '1f469-1f3fe-200d-1f692':0, '1f469-1f3ff-200d-1f692':0, '1f469-1f3fb-200d-1f9af':0, '1f469-1f3fc-200d-1f9af':0, '1f469-1f3fd-200d-1f9af':0, '1f469-1f3fe-200d-1f9af':0, '1f469-1f3ff-200d-1f9af':0, '1f469-1f3fb-200d-1f9b0':0, '1f469-1f3fc-200d-1f9b0':0, '1f469-1f3fd-200d-1f9b0':0, '1f469-1f3fe-200d-1f9b0':0, '1f469-1f3ff-200d-1f9b0':0, '1f469-1f3fb-200d-1f9b1':0, '1f469-1f3fc-200d-1f9b1':0, '1f469-1f3fd-200d-1f9b1':0, '1f469-1f3fe-200d-1f9b1':0, '1f469-1f3ff-200d-1f9b1':0, '1f469-1f3fb-200d-1f9b2':0, '1f469-1f3fc-200d-1f9b2':0, '1f469-1f3fd-200d-1f9b2':0, '1f469-1f3fe-200d-1f9b2':0, '1f469-1f3ff-200d-1f9b2':0, '1f469-1f3fb-200d-1f9b3':0, '1f469-1f3fc-200d-1f9b3':0, '1f469-1f3fd-200d-1f9b3':0, '1f469-1f3fe-200d-1f9b3':0, '1f469-1f3ff-200d-1f9b3':0, '1f469-1f3fb-200d-1f9bc':0, '1f469-1f3fc-200d-1f9bc':0, '1f469-1f3fd-200d-1f9bc':0, '1f469-1f3fe-200d-1f9bc':0, '1f469-1f3ff-200d-1f9bc':0, '1f469-1f3fb-200d-1f9bd':0, '1f469-1f3fc-200d-1f9bd':0, '1f469-1f3fd-200d-1f9bd':0, '1f469-1f3fe-200d-1f9bd':0, '1f469-1f3ff-200d-1f9bd':0, '1f469-1f3fb-200d-2695':0, '1f469-1f3fc-200d-2695':0, '1f469-1f3fd-200d-2695':0, '1f469-1f3fe-200d-2695':0, '1f469-1f3ff-200d-2695':0, '1f469-1f3fb-200d-2696':0, '1f469-1f3fc-200d-2696':0, '1f469-1f3fd-200d-2696':0, '1f469-1f3fe-200d-2696':0, '1f469-1f3ff-200d-2696':0, '1f469-1f3fb-200d-2708':0, '1f469-1f3fc-200d-2708':0, '1f469-1f3fd-200d-2708':0, '1f469-1f3fe-200d-2708':0, '1f469-1f3ff-200d-2708':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fb':0, '1f469-1f3fc':0, '1f469-1f3fd':0, '1f469-1f3fe':0, '1f469-1f3ff':0, '1f46b-1f3fb':0, '1f46b-1f3fc':0, '1f46b-1f3fd':0, '1f46b-1f3fe':0, '1f46b-1f3ff':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe':0, '1f46c-1f3fb':0, '1f46c-1f3fc':0, '1f46c-1f3fd':0, '1f46c-1f3fe':0, '1f46c-1f3ff':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe':0, '1f46d-1f3fb':0, '1f46d-1f3fc':0, '1f46d-1f3fd':0, '1f46d-1f3fe':0, '1f46d-1f3ff':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe':0, '1f46e-1f3fb-200d-2640':0, '1f46e-1f3fc-200d-2640':0, '1f46e-1f3fd-200d-2640':0, '1f46e-1f3fe-200d-2640':0, '1f46e-1f3ff-200d-2640':0, '1f46e-1f3fb-200d-2642':0, '1f46e-1f3fc-200d-2642':0, '1f46e-1f3fd-200d-2642':0, '1f46e-1f3fe-200d-2642':0, '1f46e-1f3ff-200d-2642':0, '1f46e-1f3fb':0, '1f46e-1f3fc':0, '1f46e-1f3fd':0, '1f46e-1f3fe':0, '1f46e-1f3ff':0, '1f470-1f3fb-200d-2640':0, '1f470-1f3fc-200d-2640':0, '1f470-1f3fd-200d-2640':0, '1f470-1f3fe-200d-2640':0, '1f470-1f3ff-200d-2640':0, '1f470-1f3fb-200d-2642':0, '1f470-1f3fc-200d-2642':0, '1f470-1f3fd-200d-2642':0, '1f470-1f3fe-200d-2642':0, '1f470-1f3ff-200d-2642':0, '1f470-1f3fb':0, '1f470-1f3fc':0, '1f470-1f3fd':0, '1f470-1f3fe':0, '1f470-1f3ff':0, '1f471-1f3fb-200d-2640':0, '1f471-1f3fc-200d-2640':0, '1f471-1f3fd-200d-2640':0, '1f471-1f3fe-200d-2640':0, '1f471-1f3ff-200d-2640':0, '1f471-1f3fb-200d-2642':0, '1f471-1f3fc-200d-2642':0, '1f471-1f3fd-200d-2642':0, '1f471-1f3fe-200d-2642':0, '1f471-1f3ff-200d-2642':0, '1f471-1f3fb':0, '1f471-1f3fc':0, '1f471-1f3fd':0, '1f471-1f3fe':0, '1f471-1f3ff':0, '1f472-1f3fb':0, '1f472-1f3fc':0, '1f472-1f3fd':0, '1f472-1f3fe':0, '1f472-1f3ff':0, '1f473-1f3fb-200d-2640':0, '1f473-1f3fc-200d-2640':0, '1f473-1f3fd-200d-2640':0, '1f473-1f3fe-200d-2640':0, '1f473-1f3ff-200d-2640':0, '1f473-1f3fb-200d-2642':0, '1f473-1f3fc-200d-2642':0, '1f473-1f3fd-200d-2642':0, '1f473-1f3fe-200d-2642':0, '1f473-1f3ff-200d-2642':0, '1f473-1f3fb':0, '1f473-1f3fc':0, '1f473-1f3fd':0, '1f473-1f3fe':0, '1f473-1f3ff':0, '1f474-1f3fb':0, '1f474-1f3fc':0, '1f474-1f3fd':0, '1f474-1f3fe':0, '1f474-1f3ff':0, '1f475-1f3fb':0, '1f475-1f3fc':0, '1f475-1f3fd':0, '1f475-1f3fe':0, '1f475-1f3ff':0, '1f476-1f3fb':0, '1f476-1f3fc':0, '1f476-1f3fd':0, '1f476-1f3fe':0, '1f476-1f3ff':0, '1f477-1f3fb-200d-2640':0, '1f477-1f3fc-200d-2640':0, '1f477-1f3fd-200d-2640':0, '1f477-1f3fe-200d-2640':0, '1f477-1f3ff-200d-2640':0, '1f477-1f3fb-200d-2642':0, '1f477-1f3fc-200d-2642':0, '1f477-1f3fd-200d-2642':0, '1f477-1f3fe-200d-2642':0, '1f477-1f3ff-200d-2642':0, '1f477-1f3fb':0, '1f477-1f3fc':0, '1f477-1f3fd':0, '1f477-1f3fe':0, '1f477-1f3ff':0, '1f478-1f3fb':0, '1f478-1f3fc':0, '1f478-1f3fd':0, '1f478-1f3fe':0, '1f478-1f3ff':0, '1f47c-1f3fb':0, '1f47c-1f3fc':0, '1f47c-1f3fd':0, '1f47c-1f3fe':0, '1f47c-1f3ff':0, '1f481-1f3fb-200d-2640':0, '1f481-1f3fc-200d-2640':0, '1f481-1f3fd-200d-2640':0, '1f481-1f3fe-200d-2640':0, '1f481-1f3ff-200d-2640':0, '1f481-1f3fb-200d-2642':0, '1f481-1f3fc-200d-2642':0, '1f481-1f3fd-200d-2642':0, '1f481-1f3fe-200d-2642':0, '1f481-1f3ff-200d-2642':0, '1f481-1f3fb':0, '1f481-1f3fc':0, '1f481-1f3fd':0, '1f481-1f3fe':0, '1f481-1f3ff':0, '1f482-1f3fb-200d-2640':0, '1f482-1f3fc-200d-2640':0, '1f482-1f3fd-200d-2640':0, '1f482-1f3fe-200d-2640':0, '1f482-1f3ff-200d-2640':0, '1f482-1f3fb-200d-2642':0, '1f482-1f3fc-200d-2642':0, '1f482-1f3fd-200d-2642':0, '1f482-1f3fe-200d-2642':0, '1f482-1f3ff-200d-2642':0, '1f482-1f3fb':0, '1f482-1f3fc':0, '1f482-1f3fd':0, '1f482-1f3fe':0, '1f482-1f3ff':0, '1f483-1f3fb':0, '1f483-1f3fc':0, '1f483-1f3fd':0, '1f483-1f3fe':0, '1f483-1f3ff':0, '1f485-1f3fb':0, '1f485-1f3fc':0, '1f485-1f3fd':0, '1f485-1f3fe':0, '1f485-1f3ff':0, '1f486-1f3fb-200d-2640':0, '1f486-1f3fc-200d-2640':0, '1f486-1f3fd-200d-2640':0, '1f486-1f3fe-200d-2640':0, '1f486-1f3ff-200d-2640':0, '1f486-1f3fb-200d-2642':0, '1f486-1f3fc-200d-2642':0, '1f486-1f3fd-200d-2642':0, '1f486-1f3fe-200d-2642':0, '1f486-1f3ff-200d-2642':0, '1f486-1f3fb':0, '1f486-1f3fc':0, '1f486-1f3fd':0, '1f486-1f3fe':0, '1f486-1f3ff':0, '1f487-1f3fb-200d-2640':0, '1f487-1f3fc-200d-2640':0, '1f487-1f3fd-200d-2640':0, '1f487-1f3fe-200d-2640':0, '1f487-1f3ff-200d-2640':0, '1f487-1f3fb-200d-2642':0, '1f487-1f3fc-200d-2642':0, '1f487-1f3fd-200d-2642':0, '1f487-1f3fe-200d-2642':0, '1f487-1f3ff-200d-2642':0, '1f487-1f3fb':0, '1f487-1f3fc':0, '1f487-1f3fd':0, '1f487-1f3fe':0, '1f487-1f3ff':0, '1f48f-1f3fb':0, '1f48f-1f3fc':0, '1f48f-1f3fd':0, '1f48f-1f3fe':0, '1f48f-1f3ff':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f491-1f3fb':0, '1f491-1f3fc':0, '1f491-1f3fd':0, '1f491-1f3fe':0, '1f491-1f3ff':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe':0, '1f4aa-1f3fb':0, '1f4aa-1f3fc':0, '1f4aa-1f3fd':0, '1f4aa-1f3fe':0, '1f4aa-1f3ff':0, '1f574-1f3fb':0, '1f574-1f3fc':0, '1f574-1f3fd':0, '1f574-1f3fe':0, '1f574-1f3ff':0, '1f575-1f3fb-200d-2640':0, '1f575-1f3fc-200d-2640':0, '1f575-1f3fd-200d-2640':0, '1f575-1f3fe-200d-2640':0, '1f575-1f3ff-200d-2640':0, '1f575-1f3fb-200d-2642':0, '1f575-1f3fc-200d-2642':0, '1f575-1f3fd-200d-2642':0, '1f575-1f3fe-200d-2642':0, '1f575-1f3ff-200d-2642':0, '1f575-1f3fb':0, '1f575-1f3fc':0, '1f575-1f3fd':0, '1f575-1f3fe':0, '1f575-1f3ff':0, '1f57a-1f3fb':0, '1f57a-1f3fc':0, '1f57a-1f3fd':0, '1f57a-1f3fe':0, '1f57a-1f3ff':0, '1f590-1f3fb':0, '1f590-1f3fc':0, '1f590-1f3fd':0, '1f590-1f3fe':0, '1f590-1f3ff':0, '1f595-1f3fb':0, '1f595-1f3fc':0, '1f595-1f3fd':0, '1f595-1f3fe':0, '1f595-1f3ff':0, '1f596-1f3fb':0, '1f596-1f3fc':0, '1f596-1f3fd':0, '1f596-1f3fe':0, '1f596-1f3ff':0, '1f645-1f3fb-200d-2640':0, '1f645-1f3fc-200d-2640':0, '1f645-1f3fd-200d-2640':0, '1f645-1f3fe-200d-2640':0, '1f645-1f3ff-200d-2640':0, '1f645-1f3fb-200d-2642':0, '1f645-1f3fc-200d-2642':0, '1f645-1f3fd-200d-2642':0, '1f645-1f3fe-200d-2642':0, '1f645-1f3ff-200d-2642':0, '1f645-1f3fb':0, '1f645-1f3fc':0, '1f645-1f3fd':0, '1f645-1f3fe':0, '1f645-1f3ff':0, '1f646-1f3fb-200d-2640':0, '1f646-1f3fc-200d-2640':0, '1f646-1f3fd-200d-2640':0, '1f646-1f3fe-200d-2640':0, '1f646-1f3ff-200d-2640':0, '1f646-1f3fb-200d-2642':0, '1f646-1f3fc-200d-2642':0, '1f646-1f3fd-200d-2642':0, '1f646-1f3fe-200d-2642':0, '1f646-1f3ff-200d-2642':0, '1f646-1f3fb':0, '1f646-1f3fc':0, '1f646-1f3fd':0, '1f646-1f3fe':0, '1f646-1f3ff':0, '1f647-1f3fb-200d-2640':0, '1f647-1f3fc-200d-2640':0, '1f647-1f3fd-200d-2640':0, '1f647-1f3fe-200d-2640':0, '1f647-1f3ff-200d-2640':0, '1f647-1f3fb-200d-2642':0, '1f647-1f3fc-200d-2642':0, '1f647-1f3fd-200d-2642':0, '1f647-1f3fe-200d-2642':0, '1f647-1f3ff-200d-2642':0, '1f647-1f3fb':0, '1f647-1f3fc':0, '1f647-1f3fd':0, '1f647-1f3fe':0, '1f647-1f3ff':0, '1f64b-1f3fb-200d-2640':0, '1f64b-1f3fc-200d-2640':0, '1f64b-1f3fd-200d-2640':0, '1f64b-1f3fe-200d-2640':0, '1f64b-1f3ff-200d-2640':0, '1f64b-1f3fb-200d-2642':0, '1f64b-1f3fc-200d-2642':0, '1f64b-1f3fd-200d-2642':0, '1f64b-1f3fe-200d-2642':0, '1f64b-1f3ff-200d-2642':0, '1f64b-1f3fb':0, '1f64b-1f3fc':0, '1f64b-1f3fd':0, '1f64b-1f3fe':0, '1f64b-1f3ff':0, '1f64c-1f3fb':0, '1f64c-1f3fc':0, '1f64c-1f3fd':0, '1f64c-1f3fe':0, '1f64c-1f3ff':0, '1f64d-1f3fb-200d-2640':0, '1f64d-1f3fc-200d-2640':0, '1f64d-1f3fd-200d-2640':0, '1f64d-1f3fe-200d-2640':0, '1f64d-1f3ff-200d-2640':0, '1f64d-1f3fb-200d-2642':0, '1f64d-1f3fc-200d-2642':0, '1f64d-1f3fd-200d-2642':0, '1f64d-1f3fe-200d-2642':0, '1f64d-1f3ff-200d-2642':0, '1f64d-1f3fb':0, '1f64d-1f3fc':0, '1f64d-1f3fd':0, '1f64d-1f3fe':0, '1f64d-1f3ff':0, '1f64e-1f3fb-200d-2640':0, '1f64e-1f3fc-200d-2640':0, '1f64e-1f3fd-200d-2640':0, '1f64e-1f3fe-200d-2640':0, '1f64e-1f3ff-200d-2640':0, '1f64e-1f3fb-200d-2642':0, '1f64e-1f3fc-200d-2642':0, '1f64e-1f3fd-200d-2642':0, '1f64e-1f3fe-200d-2642':0, '1f64e-1f3ff-200d-2642':0, '1f64e-1f3fb':0, '1f64e-1f3fc':0, '1f64e-1f3fd':0, '1f64e-1f3fe':0, '1f64e-1f3ff':0, '1f64f-1f3fb':0, '1f64f-1f3fc':0, '1f64f-1f3fd':0, '1f64f-1f3fe':0, '1f64f-1f3ff':0, '1f6a3-1f3fb-200d-2640':0, '1f6a3-1f3fc-200d-2640':0, '1f6a3-1f3fd-200d-2640':0, '1f6a3-1f3fe-200d-2640':0, '1f6a3-1f3ff-200d-2640':0, '1f6a3-1f3fb-200d-2642':0, '1f6a3-1f3fc-200d-2642':0, '1f6a3-1f3fd-200d-2642':0, '1f6a3-1f3fe-200d-2642':0, '1f6a3-1f3ff-200d-2642':0, '1f6a3-1f3fb':0, '1f6a3-1f3fc':0, '1f6a3-1f3fd':0, '1f6a3-1f3fe':0, '1f6a3-1f3ff':0, '1f6b4-1f3fb-200d-2640':0, '1f6b4-1f3fc-200d-2640':0, '1f6b4-1f3fd-200d-2640':0, '1f6b4-1f3fe-200d-2640':0, '1f6b4-1f3ff-200d-2640':0, '1f6b4-1f3fb-200d-2642':0, '1f6b4-1f3fc-200d-2642':0, '1f6b4-1f3fd-200d-2642':0, '1f6b4-1f3fe-200d-2642':0, '1f6b4-1f3ff-200d-2642':0, '1f6b4-1f3fb':0, '1f6b4-1f3fc':0, '1f6b4-1f3fd':0, '1f6b4-1f3fe':0, '1f6b4-1f3ff':0, '1f6b5-1f3fb-200d-2640':0, '1f6b5-1f3fc-200d-2640':0, '1f6b5-1f3fd-200d-2640':0, '1f6b5-1f3fe-200d-2640':0, '1f6b5-1f3ff-200d-2640':0, '1f6b5-1f3fb-200d-2642':0, '1f6b5-1f3fc-200d-2642':0, '1f6b5-1f3fd-200d-2642':0, '1f6b5-1f3fe-200d-2642':0, '1f6b5-1f3ff-200d-2642':0, '1f6b5-1f3fb':0, '1f6b5-1f3fc':0, '1f6b5-1f3fd':0, '1f6b5-1f3fe':0, '1f6b5-1f3ff':0, '1f6b6-1f3fb-200d-2640':0, '1f6b6-1f3fc-200d-2640':0, '1f6b6-1f3fd-200d-2640':0, '1f6b6-1f3fe-200d-2640':0, '1f6b6-1f3ff-200d-2640':0, '1f6b6-1f3fb-200d-2642':0, '1f6b6-1f3fc-200d-2642':0, '1f6b6-1f3fd-200d-2642':0, '1f6b6-1f3fe-200d-2642':0, '1f6b6-1f3ff-200d-2642':0, '1f6b6-1f3fb':0, '1f6b6-1f3fc':0, '1f6b6-1f3fd':0, '1f6b6-1f3fe':0, '1f6b6-1f3ff':0, '1f6c0-1f3fb':0, '1f6c0-1f3fc':0, '1f6c0-1f3fd':0, '1f6c0-1f3fe':0, '1f6c0-1f3ff':0, '1f6cc-1f3fb':0, '1f6cc-1f3fc':0, '1f6cc-1f3fd':0, '1f6cc-1f3fe':0, '1f6cc-1f3ff':0, '1f90c-1f3fb':0, '1f90c-1f3fc':0, '1f90c-1f3fd':0, '1f90c-1f3fe':0, '1f90c-1f3ff':0, '1f90f-1f3fb':0, '1f90f-1f3fc':0, '1f90f-1f3fd':0, '1f90f-1f3fe':0, '1f90f-1f3ff':0, '1f918-1f3fb':0, '1f918-1f3fc':0, '1f918-1f3fd':0, '1f918-1f3fe':0, '1f918-1f3ff':0, '1f919-1f3fb':0, '1f919-1f3fc':0, '1f919-1f3fd':0, '1f919-1f3fe':0, '1f919-1f3ff':0, '1f91a-1f3fb':0, '1f91a-1f3fc':0, '1f91a-1f3fd':0, '1f91a-1f3fe':0, '1f91a-1f3ff':0, '1f91b-1f3fb':0, '1f91b-1f3fc':0, '1f91b-1f3fd':0, '1f91b-1f3fe':0, '1f91b-1f3ff':0, '1f91c-1f3fb':0, '1f91c-1f3fc':0, '1f91c-1f3fd':0, '1f91c-1f3fe':0, '1f91c-1f3ff':0, '1f91d-1f3fb':0, '1f91d-1f3fc':0, '1f91d-1f3fd':0, '1f91d-1f3fe':0, '1f91d-1f3ff':0, '1f91e-1f3fb':0, '1f91e-1f3fc':0, '1f91e-1f3fd':0, '1f91e-1f3fe':0, '1f91e-1f3ff':0, '1f91f-1f3fb':0, '1f91f-1f3fc':0, '1f91f-1f3fd':0, '1f91f-1f3fe':0, '1f91f-1f3ff':0, '1f926-1f3fb-200d-2640':0, '1f926-1f3fc-200d-2640':0, '1f926-1f3fd-200d-2640':0, '1f926-1f3fe-200d-2640':0, '1f926-1f3ff-200d-2640':0, '1f926-1f3fb-200d-2642':0, '1f926-1f3fc-200d-2642':0, '1f926-1f3fd-200d-2642':0, '1f926-1f3fe-200d-2642':0, '1f926-1f3ff-200d-2642':0, '1f926-1f3fb':0, '1f926-1f3fc':0, '1f926-1f3fd':0, '1f926-1f3fe':0, '1f926-1f3ff':0, '1f930-1f3fb':0, '1f930-1f3fc':0, '1f930-1f3fd':0, '1f930-1f3fe':0, '1f930-1f3ff':0, '1f931-1f3fb':0, '1f931-1f3fc':0, '1f931-1f3fd':0, '1f931-1f3fe':0, '1f931-1f3ff':0, '1f932-1f3fb':0, '1f932-1f3fc':0, '1f932-1f3fd':0, '1f932-1f3fe':0, '1f932-1f3ff':0, '1f933-1f3fb':0, '1f933-1f3fc':0, '1f933-1f3fd':0, '1f933-1f3fe':0, '1f933-1f3ff':0, '1f934-1f3fb':0, '1f934-1f3fc':0, '1f934-1f3fd':0, '1f934-1f3fe':0, '1f934-1f3ff':0, '1f935-1f3fb-200d-2640':0, '1f935-1f3fc-200d-2640':0, '1f935-1f3fd-200d-2640':0, '1f935-1f3fe-200d-2640':0, '1f935-1f3ff-200d-2640':0, '1f935-1f3fb-200d-2642':0, '1f935-1f3fc-200d-2642':0, '1f935-1f3fd-200d-2642':0, '1f935-1f3fe-200d-2642':0, '1f935-1f3ff-200d-2642':0, '1f935-1f3fb':0, '1f935-1f3fc':0, '1f935-1f3fd':0, '1f935-1f3fe':0, '1f935-1f3ff':0, '1f936-1f3fb':0, '1f936-1f3fc':0, '1f936-1f3fd':0, '1f936-1f3fe':0, '1f936-1f3ff':0, '1f937-1f3fb-200d-2640':0, '1f937-1f3fc-200d-2640':0, '1f937-1f3fd-200d-2640':0, '1f937-1f3fe-200d-2640':0, '1f937-1f3ff-200d-2640':0, '1f937-1f3fb-200d-2642':0, '1f937-1f3fc-200d-2642':0, '1f937-1f3fd-200d-2642':0, '1f937-1f3fe-200d-2642':0, '1f937-1f3ff-200d-2642':0, '1f937-1f3fb':0, '1f937-1f3fc':0, '1f937-1f3fd':0, '1f937-1f3fe':0, '1f937-1f3ff':0, '1f938-1f3fb-200d-2640':0, '1f938-1f3fc-200d-2640':0, '1f938-1f3fd-200d-2640':0, '1f938-1f3fe-200d-2640':0, '1f938-1f3ff-200d-2640':0, '1f938-1f3fb-200d-2642':0, '1f938-1f3fc-200d-2642':0, '1f938-1f3fd-200d-2642':0, '1f938-1f3fe-200d-2642':0, '1f938-1f3ff-200d-2642':0, '1f938-1f3fb':0, '1f938-1f3fc':0, '1f938-1f3fd':0, '1f938-1f3fe':0, '1f938-1f3ff':0, '1f939-1f3fb-200d-2640':0, '1f939-1f3fc-200d-2640':0, '1f939-1f3fd-200d-2640':0, '1f939-1f3fe-200d-2640':0, '1f939-1f3ff-200d-2640':0, '1f939-1f3fb-200d-2642':0, '1f939-1f3fc-200d-2642':0, '1f939-1f3fd-200d-2642':0, '1f939-1f3fe-200d-2642':0, '1f939-1f3ff-200d-2642':0, '1f939-1f3fb':0, '1f939-1f3fc':0, '1f939-1f3fd':0, '1f939-1f3fe':0, '1f939-1f3ff':0, '1f93d-1f3fb-200d-2640':0, '1f93d-1f3fc-200d-2640':0, '1f93d-1f3fd-200d-2640':0, '1f93d-1f3fe-200d-2640':0, '1f93d-1f3ff-200d-2640':0, '1f93d-1f3fb-200d-2642':0, '1f93d-1f3fc-200d-2642':0, '1f93d-1f3fd-200d-2642':0, '1f93d-1f3fe-200d-2642':0, '1f93d-1f3ff-200d-2642':0, '1f93d-1f3fb':0, '1f93d-1f3fc':0, '1f93d-1f3fd':0, '1f93d-1f3fe':0, '1f93d-1f3ff':0, '1f93e-1f3fb-200d-2640':0, '1f93e-1f3fc-200d-2640':0, '1f93e-1f3fd-200d-2640':0, '1f93e-1f3fe-200d-2640':0, '1f93e-1f3ff-200d-2640':0, '1f93e-1f3fb-200d-2642':0, '1f93e-1f3fc-200d-2642':0, '1f93e-1f3fd-200d-2642':0, '1f93e-1f3fe-200d-2642':0, '1f93e-1f3ff-200d-2642':0, '1f93e-1f3fb':0, '1f93e-1f3fc':0, '1f93e-1f3fd':0, '1f93e-1f3fe':0, '1f93e-1f3ff':0, '1f977-1f3fb':0, '1f977-1f3fc':0, '1f977-1f3fd':0, '1f977-1f3fe':0, '1f977-1f3ff':0, '1f9b5-1f3fb':0, '1f9b5-1f3fc':0, '1f9b5-1f3fd':0, '1f9b5-1f3fe':0, '1f9b5-1f3ff':0, '1f9b6-1f3fb':0, '1f9b6-1f3fc':0, '1f9b6-1f3fd':0, '1f9b6-1f3fe':0, '1f9b6-1f3ff':0, '1f9b8-1f3fb-200d-2640':0, '1f9b8-1f3fc-200d-2640':0, '1f9b8-1f3fd-200d-2640':0, '1f9b8-1f3fe-200d-2640':0, '1f9b8-1f3ff-200d-2640':0, '1f9b8-1f3fb-200d-2642':0, '1f9b8-1f3fc-200d-2642':0, '1f9b8-1f3fd-200d-2642':0, '1f9b8-1f3fe-200d-2642':0, '1f9b8-1f3ff-200d-2642':0, '1f9b8-1f3fb':0, '1f9b8-1f3fc':0, '1f9b8-1f3fd':0, '1f9b8-1f3fe':0, '1f9b8-1f3ff':0, '1f9b9-1f3fb-200d-2640':0, '1f9b9-1f3fc-200d-2640':0, '1f9b9-1f3fd-200d-2640':0, '1f9b9-1f3fe-200d-2640':0, '1f9b9-1f3ff-200d-2640':0, '1f9b9-1f3fb-200d-2642':0, '1f9b9-1f3fc-200d-2642':0, '1f9b9-1f3fd-200d-2642':0, '1f9b9-1f3fe-200d-2642':0, '1f9b9-1f3ff-200d-2642':0, '1f9b9-1f3fb':0, '1f9b9-1f3fc':0, '1f9b9-1f3fd':0, '1f9b9-1f3fe':0, '1f9b9-1f3ff':0, '1f9bb-1f3fb':0, '1f9bb-1f3fc':0, '1f9bb-1f3fd':0, '1f9bb-1f3fe':0, '1f9bb-1f3ff':0, '1f9cd-1f3fb-200d-2640':0, '1f9cd-1f3fc-200d-2640':0, '1f9cd-1f3fd-200d-2640':0, '1f9cd-1f3fe-200d-2640':0, '1f9cd-1f3ff-200d-2640':0, '1f9cd-1f3fb-200d-2642':0, '1f9cd-1f3fc-200d-2642':0, '1f9cd-1f3fd-200d-2642':0, '1f9cd-1f3fe-200d-2642':0, '1f9cd-1f3ff-200d-2642':0, '1f9cd-1f3fb':0, '1f9cd-1f3fc':0, '1f9cd-1f3fd':0, '1f9cd-1f3fe':0, '1f9cd-1f3ff':0, '1f9ce-1f3fb-200d-2640':0, '1f9ce-1f3fc-200d-2640':0, '1f9ce-1f3fd-200d-2640':0, '1f9ce-1f3fe-200d-2640':0, '1f9ce-1f3ff-200d-2640':0, '1f9ce-1f3fb-200d-2642':0, '1f9ce-1f3fc-200d-2642':0, '1f9ce-1f3fd-200d-2642':0, '1f9ce-1f3fe-200d-2642':0, '1f9ce-1f3ff-200d-2642':0, '1f9ce-1f3fb':0, '1f9ce-1f3fc':0, '1f9ce-1f3fd':0, '1f9ce-1f3fe':0, '1f9ce-1f3ff':0, '1f9cf-1f3fb-200d-2640':0, '1f9cf-1f3fc-200d-2640':0, '1f9cf-1f3fd-200d-2640':0, '1f9cf-1f3fe-200d-2640':0, '1f9cf-1f3ff-200d-2640':0, '1f9cf-1f3fb-200d-2642':0, '1f9cf-1f3fc-200d-2642':0, '1f9cf-1f3fd-200d-2642':0, '1f9cf-1f3fe-200d-2642':0, '1f9cf-1f3ff-200d-2642':0, '1f9cf-1f3fb':0, '1f9cf-1f3fc':0, '1f9cf-1f3fd':0, '1f9cf-1f3fe':0, '1f9cf-1f3ff':0, '1f9d1-1f3fb-200d-1f33e':0, '1f9d1-1f3fc-200d-1f33e':0, '1f9d1-1f3fd-200d-1f33e':0, '1f9d1-1f3fe-200d-1f33e':0, '1f9d1-1f3ff-200d-1f33e':0, '1f9d1-1f3fb-200d-1f373':0, '1f9d1-1f3fc-200d-1f373':0, '1f9d1-1f3fd-200d-1f373':0, '1f9d1-1f3fe-200d-1f373':0, '1f9d1-1f3ff-200d-1f373':0, '1f9d1-1f3fb-200d-1f37c':0, '1f9d1-1f3fc-200d-1f37c':0, '1f9d1-1f3fd-200d-1f37c':0, '1f9d1-1f3fe-200d-1f37c':0, '1f9d1-1f3ff-200d-1f37c':0, '1f9d1-1f3fb-200d-1f384':0, '1f9d1-1f3fc-200d-1f384':0, '1f9d1-1f3fd-200d-1f384':0, '1f9d1-1f3fe-200d-1f384':0, '1f9d1-1f3ff-200d-1f384':0, '1f9d1-1f3fb-200d-1f393':0, '1f9d1-1f3fc-200d-1f393':0, '1f9d1-1f3fd-200d-1f393':0, '1f9d1-1f3fe-200d-1f393':0, '1f9d1-1f3ff-200d-1f393':0, '1f9d1-1f3fb-200d-1f3a4':0, '1f9d1-1f3fc-200d-1f3a4':0, '1f9d1-1f3fd-200d-1f3a4':0, '1f9d1-1f3fe-200d-1f3a4':0, '1f9d1-1f3ff-200d-1f3a4':0, '1f9d1-1f3fb-200d-1f3a8':0, '1f9d1-1f3fc-200d-1f3a8':0, '1f9d1-1f3fd-200d-1f3a8':0, '1f9d1-1f3fe-200d-1f3a8':0, '1f9d1-1f3ff-200d-1f3a8':0, '1f9d1-1f3fb-200d-1f3eb':0, '1f9d1-1f3fc-200d-1f3eb':0, '1f9d1-1f3fd-200d-1f3eb':0, '1f9d1-1f3fe-200d-1f3eb':0, '1f9d1-1f3ff-200d-1f3eb':0, '1f9d1-1f3fb-200d-1f3ed':0, '1f9d1-1f3fc-200d-1f3ed':0, '1f9d1-1f3fd-200d-1f3ed':0, '1f9d1-1f3fe-200d-1f3ed':0, '1f9d1-1f3ff-200d-1f3ed':0, '1f9d1-1f3fb-200d-1f4bb':0, '1f9d1-1f3fc-200d-1f4bb':0, '1f9d1-1f3fd-200d-1f4bb':0, '1f9d1-1f3fe-200d-1f4bb':0, '1f9d1-1f3ff-200d-1f4bb':0, '1f9d1-1f3fb-200d-1f4bc':0, '1f9d1-1f3fc-200d-1f4bc':0, '1f9d1-1f3fd-200d-1f4bc':0, '1f9d1-1f3fe-200d-1f4bc':0, '1f9d1-1f3ff-200d-1f4bc':0, '1f9d1-1f3fb-200d-1f527':0, '1f9d1-1f3fc-200d-1f527':0, '1f9d1-1f3fd-200d-1f527':0, '1f9d1-1f3fe-200d-1f527':0, '1f9d1-1f3ff-200d-1f527':0, '1f9d1-1f3fb-200d-1f52c':0, '1f9d1-1f3fc-200d-1f52c':0, '1f9d1-1f3fd-200d-1f52c':0, '1f9d1-1f3fe-200d-1f52c':0, '1f9d1-1f3ff-200d-1f52c':0, '1f9d1-1f3fb-200d-1f680':0, '1f9d1-1f3fc-200d-1f680':0, '1f9d1-1f3fd-200d-1f680':0, '1f9d1-1f3fe-200d-1f680':0, '1f9d1-1f3ff-200d-1f680':0, '1f9d1-1f3fb-200d-1f692':0, '1f9d1-1f3fc-200d-1f692':0, '1f9d1-1f3fd-200d-1f692':0, '1f9d1-1f3fe-200d-1f692':0, '1f9d1-1f3ff-200d-1f692':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fb-200d-1f9af':0, '1f9d1-1f3fc-200d-1f9af':0, '1f9d1-1f3fd-200d-1f9af':0, '1f9d1-1f3fe-200d-1f9af':0, '1f9d1-1f3ff-200d-1f9af':0, '1f9d1-1f3fb-200d-1f9b0':0, '1f9d1-1f3fc-200d-1f9b0':0, '1f9d1-1f3fd-200d-1f9b0':0, '1f9d1-1f3fe-200d-1f9b0':0, '1f9d1-1f3ff-200d-1f9b0':0, '1f9d1-1f3fb-200d-1f9b1':0, '1f9d1-1f3fc-200d-1f9b1':0, '1f9d1-1f3fd-200d-1f9b1':0, '1f9d1-1f3fe-200d-1f9b1':0, '1f9d1-1f3ff-200d-1f9b1':0, '1f9d1-1f3fb-200d-1f9b2':0, '1f9d1-1f3fc-200d-1f9b2':0, '1f9d1-1f3fd-200d-1f9b2':0, '1f9d1-1f3fe-200d-1f9b2':0, '1f9d1-1f3ff-200d-1f9b2':0, '1f9d1-1f3fb-200d-1f9b3':0, '1f9d1-1f3fc-200d-1f9b3':0, '1f9d1-1f3fd-200d-1f9b3':0, '1f9d1-1f3fe-200d-1f9b3':0, '1f9d1-1f3ff-200d-1f9b3':0, '1f9d1-1f3fb-200d-1f9bc':0, '1f9d1-1f3fc-200d-1f9bc':0, '1f9d1-1f3fd-200d-1f9bc':0, '1f9d1-1f3fe-200d-1f9bc':0, '1f9d1-1f3ff-200d-1f9bc':0, '1f9d1-1f3fb-200d-1f9bd':0, '1f9d1-1f3fc-200d-1f9bd':0, '1f9d1-1f3fd-200d-1f9bd':0, '1f9d1-1f3fe-200d-1f9bd':0, '1f9d1-1f3ff-200d-1f9bd':0, '1f9d1-1f3fb-200d-2695':0, '1f9d1-1f3fc-200d-2695':0, '1f9d1-1f3fd-200d-2695':0, '1f9d1-1f3fe-200d-2695':0, '1f9d1-1f3ff-200d-2695':0, '1f9d1-1f3fb-200d-2696':0, '1f9d1-1f3fc-200d-2696':0, '1f9d1-1f3fd-200d-2696':0, '1f9d1-1f3fe-200d-2696':0, '1f9d1-1f3ff-200d-2696':0, '1f9d1-1f3fb-200d-2708':0, '1f9d1-1f3fc-200d-2708':0, '1f9d1-1f3fd-200d-2708':0, '1f9d1-1f3fe-200d-2708':0, '1f9d1-1f3ff-200d-2708':0, '1f9d1-1f3fb':0, '1f9d1-1f3fc':0, '1f9d1-1f3fd':0, '1f9d1-1f3fe':0, '1f9d1-1f3ff':0, '1f9d2-1f3fb':0, '1f9d2-1f3fc':0, '1f9d2-1f3fd':0, '1f9d2-1f3fe':0, '1f9d2-1f3ff':0, '1f9d3-1f3fb':0, '1f9d3-1f3fc':0, '1f9d3-1f3fd':0, '1f9d3-1f3fe':0, '1f9d3-1f3ff':0, '1f9d4-1f3fb-200d-2640':0, '1f9d4-1f3fc-200d-2640':0, '1f9d4-1f3fd-200d-2640':0, '1f9d4-1f3fe-200d-2640':0, '1f9d4-1f3ff-200d-2640':0, '1f9d4-1f3fb-200d-2642':0, '1f9d4-1f3fc-200d-2642':0, '1f9d4-1f3fd-200d-2642':0, '1f9d4-1f3fe-200d-2642':0, '1f9d4-1f3ff-200d-2642':0, '1f9d4-1f3fb':0, '1f9d4-1f3fc':0, '1f9d4-1f3fd':0, '1f9d4-1f3fe':0, '1f9d4-1f3ff':0, '1f9d5-1f3fb':0, '1f9d5-1f3fc':0, '1f9d5-1f3fd':0, '1f9d5-1f3fe':0, '1f9d5-1f3ff':0, '1f9d6-1f3fb-200d-2640':0, '1f9d6-1f3fc-200d-2640':0, '1f9d6-1f3fd-200d-2640':0, '1f9d6-1f3fe-200d-2640':0, '1f9d6-1f3ff-200d-2640':0, '1f9d6-1f3fb-200d-2642':0, '1f9d6-1f3fc-200d-2642':0, '1f9d6-1f3fd-200d-2642':0, '1f9d6-1f3fe-200d-2642':0, '1f9d6-1f3ff-200d-2642':0, '1f9d6-1f3fb':0, '1f9d6-1f3fc':0, '1f9d6-1f3fd':0, '1f9d6-1f3fe':0, '1f9d6-1f3ff':0, '1f9d7-1f3fb-200d-2640':0, '1f9d7-1f3fc-200d-2640':0, '1f9d7-1f3fd-200d-2640':0, '1f9d7-1f3fe-200d-2640':0, '1f9d7-1f3ff-200d-2640':0, '1f9d7-1f3fb-200d-2642':0, '1f9d7-1f3fc-200d-2642':0, '1f9d7-1f3fd-200d-2642':0, '1f9d7-1f3fe-200d-2642':0, '1f9d7-1f3ff-200d-2642':0, '1f9d7-1f3fb':0, '1f9d7-1f3fc':0, '1f9d7-1f3fd':0, '1f9d7-1f3fe':0, '1f9d7-1f3ff':0, '1f9d8-1f3fb-200d-2640':0, '1f9d8-1f3fc-200d-2640':0, '1f9d8-1f3fd-200d-2640':0, '1f9d8-1f3fe-200d-2640':0, '1f9d8-1f3ff-200d-2640':0, '1f9d8-1f3fb-200d-2642':0, '1f9d8-1f3fc-200d-2642':0, '1f9d8-1f3fd-200d-2642':0, '1f9d8-1f3fe-200d-2642':0, '1f9d8-1f3ff-200d-2642':0, '1f9d8-1f3fb':0, '1f9d8-1f3fc':0, '1f9d8-1f3fd':0, '1f9d8-1f3fe':0, '1f9d8-1f3ff':0, '1f9d9-1f3fb-200d-2640':0, '1f9d9-1f3fc-200d-2640':0, '1f9d9-1f3fd-200d-2640':0, '1f9d9-1f3fe-200d-2640':0, '1f9d9-1f3ff-200d-2640':0, '1f9d9-1f3fb-200d-2642':0, '1f9d9-1f3fc-200d-2642':0, '1f9d9-1f3fd-200d-2642':0, '1f9d9-1f3fe-200d-2642':0, '1f9d9-1f3ff-200d-2642':0, '1f9d9-1f3fb':0, '1f9d9-1f3fc':0, '1f9d9-1f3fd':0, '1f9d9-1f3fe':0, '1f9d9-1f3ff':0, '1f9da-1f3fb-200d-2640':0, '1f9da-1f3fc-200d-2640':0, '1f9da-1f3fd-200d-2640':0, '1f9da-1f3fe-200d-2640':0, '1f9da-1f3ff-200d-2640':0, '1f9da-1f3fb-200d-2642':0, '1f9da-1f3fc-200d-2642':0, '1f9da-1f3fd-200d-2642':0, '1f9da-1f3fe-200d-2642':0, '1f9da-1f3ff-200d-2642':0, '1f9da-1f3fb':0, '1f9da-1f3fc':0, '1f9da-1f3fd':0, '1f9da-1f3fe':0, '1f9da-1f3ff':0, '1f9db-1f3fb-200d-2640':0, '1f9db-1f3fc-200d-2640':0, '1f9db-1f3fd-200d-2640':0, '1f9db-1f3fe-200d-2640':0, '1f9db-1f3ff-200d-2640':0, '1f9db-1f3fb-200d-2642':0, '1f9db-1f3fc-200d-2642':0, '1f9db-1f3fd-200d-2642':0, '1f9db-1f3fe-200d-2642':0, '1f9db-1f3ff-200d-2642':0, '1f9db-1f3fb':0, '1f9db-1f3fc':0, '1f9db-1f3fd':0, '1f9db-1f3fe':0, '1f9db-1f3ff':0, '1f9dc-1f3fb-200d-2640':0, '1f9dc-1f3fc-200d-2640':0, '1f9dc-1f3fd-200d-2640':0, '1f9dc-1f3fe-200d-2640':0, '1f9dc-1f3ff-200d-2640':0, '1f9dc-1f3fb-200d-2642':0, '1f9dc-1f3fc-200d-2642':0, '1f9dc-1f3fd-200d-2642':0, '1f9dc-1f3fe-200d-2642':0, '1f9dc-1f3ff-200d-2642':0, '1f9dc-1f3fb':0, '1f9dc-1f3fc':0, '1f9dc-1f3fd':0, '1f9dc-1f3fe':0, '1f9dc-1f3ff':0, '1f9dd-1f3fb-200d-2640':0, '1f9dd-1f3fc-200d-2640':0, '1f9dd-1f3fd-200d-2640':0, '1f9dd-1f3fe-200d-2640':0, '1f9dd-1f3ff-200d-2640':0, '1f9dd-1f3fb-200d-2642':0, '1f9dd-1f3fc-200d-2642':0, '1f9dd-1f3fd-200d-2642':0, '1f9dd-1f3fe-200d-2642':0, '1f9dd-1f3ff-200d-2642':0, '1f9dd-1f3fb':0, '1f9dd-1f3fc':0, '1f9dd-1f3fd':0, '1f9dd-1f3fe':0, '1f9dd-1f3ff':0, '261d-1f3fb':0, '261d-1f3fc':0, '261d-1f3fd':0, '261d-1f3fe':0, '261d-1f3ff':0, '26f9-1f3fb-200d-2640':0, '26f9-1f3fc-200d-2640':0, '26f9-1f3fd-200d-2640':0, '26f9-1f3fe-200d-2640':0, '26f9-1f3ff-200d-2640':0, '26f9-1f3fb-200d-2642':0, '26f9-1f3fc-200d-2642':0, '26f9-1f3fd-200d-2642':0, '26f9-1f3fe-200d-2642':0, '26f9-1f3ff-200d-2642':0, '26f9-1f3fb':0, '26f9-1f3fc':0, '26f9-1f3fd':0, '26f9-1f3fe':0, '26f9-1f3ff':0, '270a-1f3fb':0, '270a-1f3fc':0, '270a-1f3fd':0, '270a-1f3fe':0, '270a-1f3ff':0, '270b-1f3fb':0, '270b-1f3fc':0, '270b-1f3fd':0, '270b-1f3fe':0, '270b-1f3ff':0, '270c-1f3fb':0, '270c-1f3fc':0, '270c-1f3fd':0, '270c-1f3fe':0, '270c-1f3ff':0, '270d-1f3fb':0, '270d-1f3fc':0, '270d-1f3fd':0, '270d-1f3fe':0, '270d-1f3ff':0}};\r\n\r\nconst Emoji: {[emoji: string]: number} = EmojiVersions[''];\r\nfor(const version in EmojiVersions) {\r\n if(version) {\r\n Object.assign(Emoji, EmojiVersions[version as EMOJI_VERSION]);\r\n }\r\n}\r\n\r\nexport default Emoji;\r\n\r\n/* Emoji[\"00a9-fe0f\"] = 6362;\r\nEmoji[\"00ae-fe0f\"] = 6363;\r\nEmoji[\"2122-fe0f\"] = 6364; */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport LatinizeMap from '../config/latinizeMap';\r\n\r\nexport const badCharsRe = /[`~!@#$%^&*()\\-_=+\\[\\]\\\\|{}'\";:\\/?.>,<]+/g;\r\nconst trimRe = /^\\s+|\\s$/g;\r\n\r\nconst C2L: {[k: string]: string} = {\r\n 'й': 'q',\r\n 'ц': 'w',\r\n 'у': 'e',\r\n 'к': 'r',\r\n 'е': 't',\r\n 'н': 'y',\r\n 'г': 'u',\r\n 'ш': 'i',\r\n 'щ': 'o',\r\n 'з': 'p',\r\n 'х': '[',\r\n 'ъ': ']',\r\n 'ф': 'a',\r\n 'ы': 's',\r\n 'в': 'd',\r\n 'а': 'f',\r\n 'п': 'g',\r\n 'р': 'h',\r\n 'о': 'j',\r\n 'л': 'k',\r\n 'д': 'l',\r\n 'ж': ';',\r\n 'э': '\\'',\r\n 'я': 'z',\r\n 'ч': 'x',\r\n 'с': 'c',\r\n 'м': 'v',\r\n 'и': 'b',\r\n 'т': 'n',\r\n 'ь': 'm',\r\n 'б': ',',\r\n 'ю': '.',\r\n '.': '/'\r\n};\r\n\r\nexport function clearBadCharsAndTrim(text: string) {\r\n return text.replace(badCharsRe, '').replace(trimRe, '');\r\n}\r\n\r\nexport function fixCyrillic(text: string) {\r\n return text.toLowerCase().replace(/[\\wа-я]/g, (ch) => {\r\n const latinizeCh = C2L[ch];\r\n return latinizeCh ?? ch;\r\n });\r\n}\r\n\r\nexport function latinizeString(text: string) {\r\n return text.replace(/[^A-Za-z0-9]/g, (ch) => {\r\n const latinizeCh = LatinizeMap[ch];\r\n return latinizeCh ?? ch;\r\n });\r\n}\r\n\r\nexport default function cleanSearchText(text: string, latinize = true) {\r\n return processSearchText(text, {\r\n clearBadChars: true,\r\n latinize,\r\n ignoreCase: true\r\n });\r\n}\r\n\r\nexport type ProcessSearchTextOptions = Partial<{\r\n clearBadChars: boolean,\r\n latinize: boolean,\r\n ignoreCase: boolean,\r\n includeTag: boolean\r\n}>;\r\n\r\nexport function processSearchText(text: string, options: ProcessSearchTextOptions = {}) {\r\n const hasTag = options.includeTag && text.charAt(0) === '%';\r\n const originalText = text;\r\n if(options.clearBadChars) text = clearBadCharsAndTrim(text);\r\n if(options.latinize) text = latinizeString(text);\r\n if(options.ignoreCase) text = text.toLowerCase();\r\n if(hasTag) text = '%' + text;\r\n if(options.latinize) text += '\\x01' + fixCyrillic(originalText);\r\n return text;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {InputFileLocation, InputStickerSet, InputWebFileLocation} from '../layer';\r\nimport type {DownloadOptions} from '../lib/mtproto/apiFileManager';\r\n\r\nconst FILENAME_JOINER = '_';\r\n\r\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\r\n fileName: string,\r\n downloadId: string\r\n}>) {\r\n const fileName = '';// (options?.fileName || '').split('.');\r\n const ext = fileName[fileName.length - 1] || '';\r\n\r\n let str: string;\r\n switch(location._) {\r\n case 'inputPhotoFileLocation': {\r\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputDocumentFileLocation': {\r\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputPeerPhotoFileLocation':\r\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\r\n break;\r\n\r\n case 'inputStickerSetThumb': {\r\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id ||\r\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name ||\r\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon ||\r\n location.stickerset._;\r\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputFileLocation': {\r\n str = location.volume_id + '_' + location.local_id;\r\n break;\r\n }\r\n\r\n case 'inputWebFileLocation': {\r\n str = ['webFile', location.url].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n default: {\r\n console.error('Unrecognized location:', location);\r\n str = '';\r\n break;\r\n }\r\n }\r\n\r\n return str + (options?.downloadId ? '_download' : '') + (ext ? '.' + ext : ext);\r\n}\r\n\r\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\r\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\r\n // console.log('getFileURL', location);\r\n // const perf = performance.now();\r\n const encoded = encodeURIComponent(JSON.stringify(options));\r\n // console.log('getFileURL encode:', performance.now() - perf, encoded);\r\n\r\n return /* '/' + */type + '/' + encoded;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport {Database} from '../../config/databases';\r\nimport Modes from '../../config/modes';\r\nimport makeError from '../../helpers/makeError';\r\nimport safeAssign from '../../helpers/object/safeAssign';\r\nimport {logger} from '../logger';\r\n\r\n/**\r\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\r\n */\r\nexport type IDBIndex = {\r\n indexName: string,\r\n keyPath: string,\r\n objectParameters: IDBIndexParameters\r\n};\r\n\r\nexport type IDBStore = {\r\n name: string,\r\n indexes?: IDBIndex[]\r\n};\r\n\r\nexport type IDBOptions = {\r\n name?: string,\r\n storeName: string,\r\n stores?: IDBStore[],\r\n version?: number\r\n};\r\n\r\nconst DEBUG = false;\r\n\r\nexport class IDB {\r\n private static INSTANCES: IDB[] = [];\r\n private openDbPromise: Promise<IDBDatabase>;\r\n private db: IDBDatabase;\r\n private storageIsAvailable: boolean;\r\n private log: ReturnType<typeof logger>;\r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n\r\n constructor(db: Database<any>) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storageIsAvailable = true;\r\n this.log = logger(['IDB', db.name].join('-'));\r\n this.log('constructor');\r\n\r\n this.openDatabase(true);\r\n\r\n IDB.INSTANCES.push(this);\r\n }\r\n\r\n public isAvailable() {\r\n return this.storageIsAvailable;\r\n }\r\n\r\n public openDatabase(createNew = false): Promise<IDBDatabase> {\r\n if(this.openDbPromise && !createNew) {\r\n return this.openDbPromise;\r\n }\r\n\r\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\r\n const indexNames = Array.from(os.indexNames);\r\n for(const indexName of indexNames) {\r\n os.deleteIndex(indexName);\r\n }\r\n\r\n if(!store.indexes?.length) {\r\n return;\r\n }\r\n\r\n for(const index of store.indexes) {\r\n if(os.indexNames.contains(index.indexName)) {\r\n continue;\r\n }\r\n\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n };\r\n\r\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n createIndexes(os, store);\r\n };\r\n\r\n try {\r\n var request = indexedDB.open(this.name, this.version);\r\n\r\n if(!request) {\r\n return Promise.reject();\r\n }\r\n } catch(error) {\r\n this.log.error('error opening db', (error as Error).message);\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n let finished = false;\r\n setTimeout(() => {\r\n if(!finished) {\r\n request.onerror(makeError('IDB_CREATE_TIMEOUT') as Event);\r\n }\r\n }, 3000);\r\n\r\n return this.openDbPromise = new Promise<IDBDatabase>((resolve, reject) => {\r\n request.onsuccess = (event) => {\r\n finished = true;\r\n const db = request.result;\r\n let calledNew = false;\r\n\r\n this.log('Opened');\r\n\r\n db.onerror = (error) => {\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', error);\r\n reject(error);\r\n };\r\n\r\n db.onclose = (e) => {\r\n this.log.error('closed:', e);\r\n !calledNew && this.openDatabase();\r\n };\r\n\r\n db.onabort = (e) => {\r\n this.log.error('abort:', e);\r\n const transaction = e.target as IDBTransaction;\r\n\r\n this.openDatabase(calledNew = true);\r\n\r\n if(transaction.onerror) {\r\n transaction.onerror(e);\r\n }\r\n\r\n db.close();\r\n };\r\n\r\n db.onversionchange = (e) => {\r\n this.log.error('onversionchange, lol?');\r\n };\r\n\r\n resolve(this.db = db);\r\n };\r\n\r\n request.onerror = (event) => {\r\n finished = true;\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', event);\r\n reject(event);\r\n };\r\n\r\n request.onupgradeneeded = (event) => {\r\n finished = true;\r\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\r\n\r\n const target = event.target as IDBOpenDBRequest;\r\n const db = target.result;\r\n this.stores.forEach((store) => {\r\n /* if(db.objectStoreNames.contains(store.name)) {\r\n //if(event.oldVersion === 1) {\r\n db.deleteObjectStore(store.name);\r\n //}\r\n } */\r\n\r\n if(!db.objectStoreNames.contains(store.name)) {\r\n createObjectStore(db, store);\r\n } else {\r\n const txn = target.transaction;\r\n const os = txn.objectStore(store.name);\r\n createIndexes(os, store);\r\n }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public static create<T extends Database<any>>(db: T) {\r\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDB) {\r\n this.INSTANCES.forEach((storage) => {\r\n if(preserve && preserve === storage) {\r\n return;\r\n }\r\n\r\n const db = storage.db;\r\n if(db) {\r\n db.onclose = () => {};\r\n db.close();\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport default class IDBStorage<T extends Database<any>, StoreName extends string = T['stores'][0]['name']> {\r\n private log: ReturnType<typeof logger>;\r\n private storeName: T['stores'][0]['name'];\r\n private idb: IDB;\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n this.storeName = storeName;\r\n this.log = logger(['IDB', db.name, storeName].join('-'));\r\n this.idb = IDB.create(db);\r\n }\r\n\r\n /**\r\n * ! WARNING ! function requires at least one opened connection\r\n */\r\n /* public static clearObjectStores() {\r\n const storage = this.STORAGES[0];\r\n this.closeDatabases(storage);\r\n\r\n const names = Array.from(storage.db.objectStoreNames);\r\n const promises = names.map((name) => storage.clear(name));\r\n return Promise.all(promises);\r\n } */\r\n\r\n /* public static deleteDatabase() {\r\n this.closeDatabases();\r\n\r\n const storages = this.STORAGES;\r\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\r\n const promises = dbNames.map((dbName) => {\r\n return new Promise<void>((resolve, reject) => {\r\n const deleteRequest = indexedDB.deleteDatabase(dbName);\r\n\r\n deleteRequest.onerror = () => {\r\n reject();\r\n };\r\n\r\n deleteRequest.onsuccess = () => {\r\n resolve();\r\n };\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n } */\r\n\r\n public delete(entryName: string | string[], storeName?: StoreName): Promise<void> {\r\n // return Promise.resolve();\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\r\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n public clear(storeName?: StoreName): Promise<void> {\r\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\r\n }\r\n\r\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\r\n // const handleError = (error: Error) => {\r\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\r\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\r\n // setTimeout(() => {\r\n // this.save(entryName, value);\r\n // }, 2e3);\r\n // } else {\r\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\r\n // }\r\n // };\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n value = [].concat(value);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\r\n }, DEBUG ? 'save: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n // //return Promise.resolve(blobConstruct([blob]));\r\n // if(!(blob instanceof Blob)) {\r\n // blob = blobConstruct(blob);\r\n // }\r\n\r\n // return this.save(fileName, blob);\r\n // }\r\n\r\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise<Blob> {\r\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\r\n return Promise.reject();\r\n }\r\n\r\n if(!(blob instanceof Blob)) {\r\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\r\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\r\n return this.storagePutB64String(db, fileName, address).then(() => {\r\n return blob;\r\n });\r\n }\r\n\r\n try {\r\n var reader = new FileReader();\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n let promise = new Promise<Blob>((resolve, reject) => {\r\n reader.onloadend = () => {\r\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\r\n resolve(blob);\r\n }, reject);\r\n }\r\n\r\n reader.onerror = reject;\r\n });\r\n\r\n\r\n try {\r\n reader.readAsDataURL(blob);\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\r\n try {\r\n var objectStore = db.transaction([this.storeName], 'readwrite')\r\n .objectStore(this.storeName);\r\n var request = objectStore.put(b64string, fileName);\r\n } catch(error) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n resolve();\r\n };\r\n\r\n request.onerror = reject;\r\n });\r\n }\r\n\r\n public getBlobSize(blob: any) {\r\n return blob.size || blob.byteLength || blob.length;\r\n } */\r\n\r\n public get<T>(entryName: string[], storeName?: StoreName): Promise<T[]>;\r\n public get<T>(entryName: string, storeName?: StoreName): Promise<T>;\r\n public get<T>(entryName: string | string[], storeName?: StoreName): Promise<T> | Promise<T[]> {\r\n // return Promise.reject();\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n if(!entryName.length) {\r\n return Promise.resolve([]) as any;\r\n }\r\n\r\n return this.getObjectStore<T>('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n private getObjectStore<T>(\r\n mode: IDBTransactionMode,\r\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[],\r\n log?: string,\r\n storeName = this.storeName\r\n ) {\r\n let perf: number;\r\n\r\n if(log) {\r\n perf = performance.now();\r\n this.log(log + ': start');\r\n }\r\n\r\n return this.idb.openDatabase().then((db) => {\r\n return new Promise<T>((resolve, reject) => {\r\n /* if(mode === 'readwrite') {\r\n return;\r\n } */\r\n\r\n const transaction = db.transaction([storeName], mode);\r\n\r\n const onError = () => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n\r\n // let resolved = false;\r\n const onComplete = (/* what: string */) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf/* , what */);\r\n }\r\n\r\n // if(resolved) {\r\n // return;\r\n // }\r\n\r\n // resolved = true;\r\n const results = requests.map((r) => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n\r\n transaction.onerror = onError;\r\n\r\n // * have to wait while clearing or setting something\r\n const waitForTransactionComplete = mode === 'readwrite';\r\n if(waitForTransactionComplete) {\r\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\r\n }\r\n\r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction, log);\r\n }, 10000);\r\n\r\n /* transaction.addEventListener('abort', (e) => {\r\n //handleError();\r\n this.log.error('IndexedDB: transaction abort!', transaction.error);\r\n }); */\r\n\r\n const callbackResult = callback(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(callbackResult);\r\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\r\n\r\n if(waitForTransactionComplete) {\r\n return;\r\n }\r\n\r\n const length = requests.length;\r\n let left = length;\r\n\r\n const onRequestFinished = () => {\r\n if(transaction.error) {\r\n return;\r\n }\r\n\r\n if(!--left) {\r\n onComplete(/* 'requests' */);\r\n }\r\n };\r\n\r\n for(let i = 0; i < length; ++i) {\r\n const request = requests[i];\r\n request.onerror = onError;\r\n request.onsuccess = onRequestFinished;\r\n }\r\n });\r\n });\r\n }\r\n\r\n public getAll<T>(storeName?: StoreName): Promise<T[]> {\r\n return this.getObjectStore<T[]>('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\r\n }\r\n\r\n /* public getAllKeys(): Promise<Array<string>> {\r\n console.time('getAllEntries');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.getAllKeys();\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var result = event.target.result;\r\n resolve(result);\r\n console.timeEnd('getAllEntries');\r\n }\r\n\r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public isFileExists(fileName: string): Promise<boolean> {\r\n console.time('isFileExists');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.openCursor(fileName);\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var cursor = event.target.result;\r\n resolve(!!cursor);\r\n console.timeEnd('isFileExists');\r\n }\r\n\r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public getFileWriter(fileName: string, mimeType: string) {\r\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n } */\r\n}\r\n","import type ENVIRONMENT from '.';\r\n\r\nlet environment: typeof ENVIRONMENT;\r\nexport function getEnvironment() {\r\n return environment;\r\n}\r\n\r\nexport function setEnvironment(env: typeof environment) {\r\n return environment = env;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, ReactionCount, MessagePeerReaction, PhoneCall, Config, Reaction} from '../layer';\r\nimport type {AppMessagesManager, Dialog, MessagesStorageKey, MyMessage} from './appManagers/appMessagesManager';\r\nimport type {MyDialogFilter} from './storages/filters';\r\nimport type {Folder} from './storages/dialogs';\r\nimport type {UserTyping} from './appManagers/appProfileManager';\r\nimport type {MyDraftMessage} from './appManagers/appDraftsManager';\r\nimport type {ConnectionStatusChange} from './mtproto/connectionStatus';\r\nimport type {GroupCallId} from './appManagers/appGroupCallsManager';\r\nimport type {AppManagers} from './appManagers/managers';\r\nimport type {State} from '../config/state';\r\nimport type {Progress} from './appManagers/appDownloadManager';\r\nimport type {CallId} from './appManagers/appCallsManager';\r\nimport type {MyDocument} from './appManagers/appDocsManager';\r\nimport {NULL_PEER_ID, UserAuth} from './mtproto/mtproto_config';\r\nimport EventListenerBase from '../helpers/eventListenerBase';\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\r\nimport {IS_WORKER} from '../helpers/context';\r\nimport {MTAppConfig} from './mtproto/appConfig';\r\n\r\nexport type BroadcastEvents = {\r\n 'chat_full_update': ChatId,\r\n 'chat_update': ChatId,\r\n\r\n 'channel_update': ChatId,\r\n\r\n 'user_update': UserId,\r\n 'user_auth': UserAuth,\r\n 'user_full_update': UserId,\r\n\r\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\r\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\r\n 'peer_typings': {peerId: PeerId, typings: UserTyping[]},\r\n 'peer_block': {peerId: PeerId, blocked: boolean},\r\n 'peer_title_edit': PeerId,\r\n 'peer_bio_edit': PeerId,\r\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\r\n 'peer_full_update': PeerId,\r\n\r\n 'filter_delete': MyDialogFilter,\r\n 'filter_update': MyDialogFilter,\r\n 'filter_new': MyDialogFilter,\r\n 'filter_order': number[],\r\n\r\n 'folder_unread': Omit<Folder, 'dialogs' | 'dispatchUnreadTimeout'>,\r\n\r\n 'dialog_draft': {peerId: PeerId, dialog: Dialog, drop: boolean, draft: MyDraftMessage | undefined},\r\n 'dialog_unread': {peerId: PeerId, dialog: Dialog},\r\n 'dialog_flush': {peerId: PeerId, dialog: Dialog},\r\n 'dialog_drop': {peerId: PeerId, dialog?: Dialog},\r\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\r\n // 'dialog_top': Dialog,\r\n 'dialog_notify_settings': Dialog,\r\n // 'dialog_order': {dialog: Dialog, pos: number},\r\n 'dialogs_multiupdate': Map<PeerId, Dialog>,\r\n\r\n 'history_append': {storageKey: MessagesStorageKey, message: Message.message},\r\n 'history_update': {storageKey: MessagesStorageKey, message: MyMessage, sequential?: boolean},\r\n 'history_reply_markup': {peerId: PeerId},\r\n 'history_multiappend': MyMessage,\r\n 'history_delete': {peerId: PeerId, msgs: Set<number>},\r\n 'history_forbidden': PeerId,\r\n 'history_reload': PeerId,\r\n // 'history_request': void,\r\n\r\n 'message_edit': {storageKey: MessagesStorageKey, peerId: PeerId, mid: number, message: MyMessage},\r\n 'message_sent': {storageKey: MessagesStorageKey, tempId: number, tempMessage: any, mid: number, message: MyMessage},\r\n 'message_error': {storageKey: MessagesStorageKey, tempId: number, error: ApiError},\r\n 'messages_views': {peerId: PeerId, mid: number, views: number}[],\r\n 'messages_reactions': {message: Message.message, changedResults: ReactionCount[]}[],\r\n 'messages_pending': void,\r\n 'messages_read': void,\r\n 'messages_downloaded': {peerId: PeerId, mids: number[]},\r\n 'messages_media_read': {peerId: PeerId, mids: number[]},\r\n\r\n 'replies_updated': Message.message,\r\n\r\n 'scheduled_new': Message.message,\r\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\r\n\r\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[], messages: Message.message[]},\r\n\r\n 'stickers_installed': StickerSet.stickerSet,\r\n 'stickers_deleted': StickerSet.stickerSet,\r\n 'stickers_updated': {type: 'recent' | 'faved', stickers: MyDocument[]},\r\n 'stickers_top': Long,\r\n 'sticker_updated': {type: 'recent' | 'faved', document: MyDocument, faved: boolean},\r\n\r\n 'state_cleared': void,\r\n 'state_synchronized': ChatId | void,\r\n 'state_synchronizing': ChatId | void,\r\n\r\n 'contacts_update': UserId,\r\n 'avatar_update': PeerId,\r\n 'poll_update': {poll: Poll, results: PollResults},\r\n 'invalidate_participants': ChatId,\r\n // 'channel_settings': {channelId: number},\r\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\r\n\r\n 'connection_status_change': ConnectionStatusChange,\r\n 'settings_updated': {key: string, value: any, settings: State['settings']},\r\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\r\n\r\n 'background_change': void,\r\n\r\n 'privacy_update': Update.updatePrivacy,\r\n\r\n 'notify_settings': Update.updateNotifySettings,\r\n 'notify_peer_type_settings': {key: Exclude<NotifyPeer['_'], 'notifyPeer'>, settings: PeerNotifySettings},\r\n\r\n 'notification_reset': string,\r\n 'notification_cancel': string,\r\n\r\n 'language_change': string,\r\n\r\n 'theme_change': void,\r\n\r\n 'media_play': void,\r\n\r\n 'emoji_recent': AppEmoji,\r\n\r\n 'download_progress': Progress,\r\n 'document_downloading': DocId,\r\n 'document_downloaded': DocId,\r\n\r\n 'choosing_sticker': boolean\r\n\r\n 'group_call_update': GroupCall,\r\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\r\n // 'group_call_video_track_added': {instance: GroupCallInstance}\r\n\r\n 'call_update': PhoneCall,\r\n 'call_signaling': {callId: CallId, data: Uint8Array},\r\n\r\n 'quick_reaction': Reaction,\r\n\r\n 'service_notification': Update.updateServiceNotification,\r\n\r\n 'logging_out': void,\r\n\r\n 'payment_sent': {peerId: PeerId, mid: number, receiptMessage: Message.messageService}\r\n\r\n 'premium_toggle': boolean,\r\n\r\n 'config': Config,\r\n 'app_config': MTAppConfig\r\n};\r\n\r\nexport type BroadcastEventsListeners = {\r\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\r\n};\r\n\r\nexport class RootScope extends EventListenerBase<BroadcastEventsListeners> {\r\n public myId: PeerId;\r\n private connectionStatus: {[name: string]: ConnectionStatusChange};\r\n public settings: State['settings'];\r\n public managers: AppManagers;\r\n public premium: boolean;\r\n\r\n constructor() {\r\n super();\r\n\r\n this.myId = NULL_PEER_ID;\r\n this.connectionStatus = {};\r\n this.premium = false;\r\n\r\n this.addEventListener('user_auth', ({id}) => {\r\n this.myId = id.toPeerId();\r\n });\r\n\r\n this.addEventListener('premium_toggle', (isPremium) => {\r\n this.premium = isPremium;\r\n });\r\n\r\n this.addEventListener('connection_status_change', (status) => {\r\n this.connectionStatus[status.name] = status;\r\n });\r\n\r\n this.dispatchEvent = (e, ...args) => {\r\n super.dispatchEvent(e, ...args);\r\n MTProtoMessagePort.getInstance().invokeVoid('event', {name: e as string, args});\r\n };\r\n\r\n if(!IS_WORKER) {\r\n this.addEventListener('settings_updated', ({settings}) => {\r\n this.settings = settings;\r\n });\r\n }\r\n }\r\n\r\n public getConnectionStatus() {\r\n return this.connectionStatus;\r\n }\r\n\r\n public getPremium() {\r\n return this.premium;\r\n }\r\n\r\n public dispatchEventSingle(...args: any[]) {\r\n // @ts-ignore\r\n super.dispatchEvent(...args);\r\n }\r\n}\r\n\r\nconst rootScope = new RootScope();\r\nMOUNT_CLASS_TO.rootScope = rootScope;\r\nexport default rootScope;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {State} from '../../config/state';\r\nimport rootScope from '../rootScope';\r\nimport stateStorage from '../stateStorage';\r\nimport setDeepProperty from '../../helpers/object/setDeepProperty';\r\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\r\n\r\nexport class AppStateManager {\r\n private state: State = {} as any;\r\n private storage = stateStorage;\r\n\r\n // ! for mtproto worker use only\r\n public newVersion: string;\r\n public oldVersion: string;\r\n public userId: UserId;\r\n\r\n public getState() {\r\n return Promise.resolve(this.state);\r\n }\r\n\r\n public setByKey(key: string, value: any) {\r\n setDeepProperty(this.state, key, value);\r\n\r\n const first = key.split('.')[0] as keyof State;\r\n if(first === 'settings') {\r\n rootScope.dispatchEvent('settings_updated', {key, value, settings: this.state.settings});\r\n }\r\n\r\n this.pushToState(first, this.state[first]);\r\n }\r\n\r\n public pushToState<T extends keyof State>(key: T, value: State[T], direct = true, onlyLocal?: boolean) {\r\n if(direct) {\r\n this.state[key] = value;\r\n }\r\n\r\n this.setKeyValueToStorage(key, value, onlyLocal);\r\n }\r\n\r\n public setKeyValueToStorage<T extends keyof State>(key: T, value: State[T] = this.state[key], onlyLocal?: boolean) {\r\n MTProtoMessagePort.getInstance<false>().invokeVoid('mirror', {name: 'state', key, value});\r\n\r\n this.storage.set({\r\n [key]: value\r\n }, onlyLocal);\r\n }\r\n\r\n /* public resetState() {\r\n for(let i in this.state) {\r\n // @ts-ignore\r\n this.state[i] = false;\r\n }\r\n sessionStorage.set(this.state).then(() => {\r\n location.reload();\r\n });\r\n } */\r\n}\r\n\r\nconst appStateManager = new AppStateManager();\r\nexport default appStateManager;\r\n","import getDeepProperty from './getDeepProperty';\r\n\r\nexport default function setDeepProperty(object: any, key: string, value: any) {\r\n const splitted = key.split('.');\r\n getDeepProperty(object, splitted.slice(0, -1).join('.'))[splitted.pop()] = value;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport pause from '../../../helpers/schedulers/pause';\nimport {DcId} from '../../../types';\nimport {logger, LogTypes} from '../../logger';\nimport type MTPNetworker from '../networker';\nimport MTTransport from './transport';\nimport Modes from '../../../config/modes';\n\n \nimport transportController from './controller';\n// import networkStats from '../networkStats';\n \n\nexport default class HTTP implements MTTransport {\n public networker: MTPNetworker;\n private log: ReturnType<typeof logger>;\n\n private pending: Array<{\n resolve: (body: Uint8Array) => void,\n reject: any,\n body: Uint8Array\n }> = [];\n private releasing: boolean;\n\n public connected: boolean;\n private destroyed: boolean;\n private debug: boolean;\n\n constructor(protected dcId: DcId, protected url: string, logSuffix: string) {\n this.debug = Modes.debug && false;\n\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n\n this.log = logger(`HTTP-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n\n this.connected = false;\n }\n\n public _send(body: Uint8Array, mode?: RequestMode) {\n const length = body.length;\n this.debug && this.log.debug('-> body length to send:', length);\n\n // networkStats.addSent(this.dcId, length);\n return fetch(this.url, {method: 'POST', body, mode}).then((response) => {\n if(response.status !== 200 && !mode) {\n response.arrayBuffer().then((buffer) => {\n this.log.error('not 200',\n new TextDecoder('utf-8').decode(new Uint8Array(buffer)));\n });\n\n throw response;\n }\n\n this.setConnected(true);\n\n // * test resending by dropping random request\n // if(Math.random() > .5) {\n // throw 'asd';\n // }\n\n return response.arrayBuffer().then((buffer) => {\n // networkStats.addReceived(this.dcId, buffer.byteLength);\n return new Uint8Array(buffer);\n });\n }, (err) => {\n this.setConnected(false);\n throw err;\n });\n }\n\n private setConnected(connected: boolean) {\n if(this.connected === connected || this.destroyed) {\n return;\n }\n\n this.connected = connected;\n\n \n transportController.setTransportValue('https', connected);\n \n }\n\n public destroy() {\n this.setConnected(false);\n this.destroyed = true;\n this.pending.forEach((pending) => pending.reject());\n this.pending.length = 0;\n }\n\n public send(body: Uint8Array) {\n if(this.networker) {\n return this._send(body);\n } else {\n const promise = new Promise<typeof body>((resolve, reject) => {\n this.pending.push({resolve, reject, body});\n });\n\n this.releasePending();\n\n return promise;\n }\n }\n\n private async releasePending() {\n if(this.releasing) return;\n\n this.releasing = true;\n // this.log('-> messages to send:', this.pending.length);\n for(let i = 0; i < this.pending.length; ++i) {\n const pending = this.pending[i];\n const {body, resolve} = pending;\n\n try {\n const result = await this._send(body);\n resolve(result);\n this.pending.splice(i, 1);\n } catch(err) {\n this.log.error('Send plain request error:', err);\n await pause(5000);\n }\n\n --i;\n }\n\n this.releasing = false;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {logger, LogTypes} from '../../logger';\r\nimport Modes from '../../../config/modes';\r\nimport EventListenerBase from '../../../helpers/eventListenerBase';\r\nimport {MTConnection} from './transport';\r\n\r\n// let closeSocketBefore = Date.now() + 30e3;\r\n// let closeSocketAfter = Date.now() + 10e3;\r\n\r\nexport default class Socket extends EventListenerBase<{\r\n open: () => void,\r\n message: (buffer: ArrayBuffer) => any,\r\n close: () => void,\r\n}> implements MTConnection {\r\n private ws: WebSocket;\r\n private log: ReturnType<typeof logger>;\r\n private debug = Modes.debug && false;\r\n\r\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\r\n super();\r\n\r\n let logTypes = LogTypes.Error | LogTypes.Log;\r\n if(this.debug) logTypes |= LogTypes.Debug;\r\n this.log = logger(`WS-${dcId}` + logSuffix, logTypes);\r\n this.log('constructor');\r\n this.connect();\r\n\r\n return this;\r\n }\r\n\r\n private removeListeners() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.ws.removeEventListener('open', this.handleOpen);\r\n this.ws.removeEventListener('close', this.handleClose);\r\n this.ws.removeEventListener('error', this.handleError);\r\n this.ws.removeEventListener('message', this.handleMessage);\r\n this.ws = undefined;\r\n }\r\n\r\n private connect() {\r\n this.ws = new WebSocket(this.url, 'binary');\r\n this.ws.binaryType = 'arraybuffer';\r\n this.ws.addEventListener('open', this.handleOpen);\r\n this.ws.addEventListener('close', this.handleClose);\r\n this.ws.addEventListener('error', this.handleError);\r\n this.ws.addEventListener('message', this.handleMessage);\r\n\r\n // if(Date.now() < closeSocketBefore) {\r\n // if(Date.now() >= closeSocketAfter) {\r\n // this.ws.close();\r\n // }\r\n }\r\n\r\n public close() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.log('close execution');\r\n\r\n try {\r\n this.ws.close();\r\n } catch(err) {\r\n\r\n }\r\n this.handleClose();\r\n }\r\n\r\n private handleOpen = () => {\r\n this.log('opened');\r\n\r\n this.debug && this.log.debug('sending init packet');\r\n this.dispatchEvent('open');\r\n };\r\n\r\n private handleError = (e: Event) => {\r\n this.log.error('handleError', e);\r\n this.close();\r\n };\r\n\r\n private handleClose = (e?: CloseEvent) => {\r\n this.log('closed', e/* , this.pending, this.ws.bufferedAmount */);\r\n\r\n this.removeListeners();\r\n this.dispatchEvent('close');\r\n };\r\n\r\n private handleMessage = (event: MessageEvent) => {\r\n this.debug && this.log.debug('<-', 'handleMessage', /* event, */event.data.byteLength);\r\n\r\n this.dispatchEvent('message', event.data as ArrayBuffer);\r\n };\r\n\r\n public send = (body: Uint8Array) => {\r\n this.debug && this.log.debug('-> body length to send:', body.length);\r\n\r\n this.ws.send(body);\r\n };\r\n}\r\n","export default function randomize<T extends ArrayBufferView>(arr: T) {\r\n if(crypto && 'getRandomValues' in crypto) {\r\n crypto.getRandomValues(arr);\r\n } else {\r\n throw new Error('NO_SECURE_RANDOM');\r\n }\r\n\r\n return arr;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// import aesjs from 'aes-js';\r\nimport randomize from '../../../helpers/array/randomize';\r\nimport cryptoMessagePort from '../../crypto/cryptoMessagePort';\r\nimport {Codec} from './codec';\r\n\r\n/*\r\n@cryptography/aes не работает с массивами которые не кратны 4, поэтому использую intermediate а не abridged\r\n*/\r\nexport default class Obfuscation {\r\n /* private enc: aesjs.ModeOfOperation.ModeOfOperationCTR;\r\n private dec: aesjs.ModeOfOperation.ModeOfOperationCTR; */\r\n\r\n private id: number;\r\n private idPromise: Promise<Obfuscation['id']>;\r\n private process: (data: Uint8Array, operation: 'encrypt' | 'decrypt') => ReturnType<Obfuscation['_process']>;\r\n\r\n // private cryptoEncKey: CryptoKey;\r\n // private cryptoDecKey: CryptoKey;\r\n // private cryptoKey: CryptoKey;\r\n\r\n // private encIv: Uint8Array;\r\n // private decIv: Uint8Array;\r\n\r\n // private decIvCounter: Counter;\r\n\r\n public async init(codec: Codec) {\r\n if(this.idPromise !== undefined) {\r\n this.release();\r\n }\r\n\r\n const initPayload = new Uint8Array(64);\r\n randomize(initPayload);\r\n\r\n while(true) {\r\n const val = (initPayload[3] << 24) | (initPayload[2] << 16) | (initPayload[1] << 8) | initPayload[0];\r\n const val2 = (initPayload[7] << 24) | (initPayload[6] << 16) | (initPayload[5] << 8) | initPayload[4];\r\n if(initPayload[0] !== 0xef &&\r\n val !== 0x44414548 &&\r\n val !== 0x54534f50 &&\r\n val !== 0x20544547 &&\r\n val !== 0x4954504f &&\r\n val !== 0xeeeeeeee &&\r\n val !== 0xdddddddd &&\r\n val2 !== 0x00000000) {\r\n // initPayload[56] = initPayload[57] = initPayload[58] = initPayload[59] = transport;\r\n break;\r\n }\r\n randomize(initPayload);\r\n }\r\n\r\n // //////////////////////initPayload.subarray(60, 62).hex = dcId;\r\n /* initPayload.set(new Uint8Array([161, 208, 67, 71, 118, 109, 20, 111, 113, 255, 134, 10, 159, 241, 7, 44, 217, 82, 187, 76, 108, 131, 200, 186, 33, 57, 177, 251, 52, 34, 18, 54, 65, 105, 37, 89, 38, 20, 47, 168, 126, 181, 24, 138, 212, 68, 60, 150, 225, 37, 181, 4, 201, 50, 72, 151, 168, 143, 204, 169, 81, 187, 241, 23]));\r\n console.log('initPayload', initPayload); */\r\n\r\n const reversedPayload = initPayload.slice().reverse();\r\n\r\n const encKey = initPayload.slice(8, 40);\r\n const encIv = /* this.encIv = */initPayload.slice(40, 56);\r\n const decKey = reversedPayload.slice(8, 40);\r\n const decIv = /* this.decIv = */reversedPayload.slice(40, 56);\r\n\r\n /* this.enc = new aesjs.ModeOfOperation.ctr(encKey, new aesjs.Counter(encIv as any));\r\n this.dec = new aesjs.ModeOfOperation.ctr(decKey, new aesjs.Counter(decIv as any)); */\r\n\r\n // console.log('encKey', encKey.hex, encIv.hex);\r\n // console.log('decKey', decKey.hex, decIv.hex);\r\n\r\n const idPromise = this.idPromise = cryptoMessagePort.invokeCrypto('aes-ctr-prepare', {\r\n encKey,\r\n encIv,\r\n decKey,\r\n decIv\r\n });\r\n\r\n this.process = async(data, operation) => {\r\n await idPromise;\r\n return this._process(data, operation);\r\n };\r\n\r\n this.id = await idPromise;\r\n\r\n this.process = this._process;\r\n\r\n // this.decIvCounter = new Counter(this.decIv);\r\n /* const key = this.cryptoEncKey = await subtle.importKey(\r\n 'raw',\r\n encKey,\r\n {name: 'AES-CTR'},\r\n false,\r\n ['encrypt']\r\n ); */\r\n\r\n // this.cryptoDecKey = await subtle.importKey(\r\n // 'raw',\r\n // decKey,\r\n // {name: 'AES-CTR'},\r\n // false,\r\n // ['encrypt']\r\n // );\r\n\r\n // this.cryptoKey = await subtle.importKey(\r\n // 'raw',\r\n // encKey,\r\n // {name: 'AES-CTR'},\r\n // false,\r\n // ['encrypt', 'decrypt']\r\n // );\r\n\r\n initPayload.set(codec.obfuscateTag, 56);\r\n const encrypted = await this.encode(initPayload.slice());\r\n\r\n // console.log('encrypted', encrypted);\r\n\r\n initPayload.set(encrypted.slice(56, 64), 56);\r\n\r\n return initPayload;\r\n }\r\n\r\n /* public encode(payload: Uint8Array) {\r\n let startTime = performance.now();\r\n let res = this.enc.encrypt(payload);\r\n let time = performance.now() - startTime;\r\n\r\n try {\r\n startTime = performance.now();\r\n let arr = this.encNew.encrypt(payload);\r\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\r\n let resNew = new Uint8Array(bytesFromWordss(arr));\r\n let time2 = performance.now() - startTime;\r\n console.log('Obfuscation: encode comparison:', res, arr, resNew, res.hex === resNew.hex, time2 < time);\r\n } catch(err) {\r\n console.error('Obfuscation: error:', err);\r\n }\r\n\r\n return res;\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n let res = this.dec.encrypt(payload);\r\n\r\n try {\r\n let arr = this.decNew.decrypt(payload);\r\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\r\n let resNew = new Uint8Array(bytesFromWordss(arr));\r\n console.log('Obfuscation: decode comparison:', res, arr, resNew, res.hex === resNew.hex);\r\n } catch(err) {\r\n console.error('Obfuscation: error:', err);\r\n }\r\n\r\n return res;\r\n } */\r\n\r\n private _process = (data: Uint8Array, operation: 'encrypt' | 'decrypt') => {\r\n return cryptoMessagePort.invokeCryptoNew({\r\n method: 'aes-ctr-process',\r\n args: [{id: this.id, data, operation}],\r\n transfer: [data.buffer]\r\n }) as Promise<Uint8Array>;\r\n };\r\n\r\n public encode(payload: Uint8Array) {\r\n /* return subtle.encrypt({\r\n name: 'AES-CTR',\r\n counter: this.encIv,\r\n length: 64\r\n },\r\n this.cryptoEncKey,\r\n payload\r\n ); */\r\n return this.process(payload, 'encrypt');\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n return this.process(payload, 'decrypt');\r\n }\r\n\r\n public async release() {\r\n const idPromise = this.idPromise;\r\n if(idPromise === undefined) {\r\n return;\r\n }\r\n\r\n this.id = undefined;\r\n this.idPromise = undefined;\r\n\r\n const id = await idPromise;\r\n cryptoMessagePort.invokeCrypto('aes-ctr-destroy', id);\r\n }\r\n\r\n public destroy() {\r\n this.release();\r\n }\r\n\r\n // public encode(payload: Uint8Array) {\r\n // let res = this.encNew.encrypt(payload);\r\n // let bytes = new Uint8Array(bytesFromWordss(res));\r\n\r\n // return bytes;\r\n // }\r\n\r\n // public async decode(payload: Uint8Array) {\r\n // const counter = this.decIvCounter.counter.slice();\r\n // this.decIvCounter.increment();\r\n\r\n // const n: ArrayBuffer = await subtle.encrypt({\r\n // name: 'AES-CTR',\r\n // counter: counter,\r\n // length: 64\r\n // },\r\n // this.cryptoDecKey,\r\n // payload\r\n // );\r\n\r\n // const decoded = this.decNew.update(payload);\r\n\r\n // console.log('decode', bytesToHex(decoded), 'new', n, bytesToHex(new Uint8Array(n)));\r\n\r\n // return decoded;\r\n // }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// import { bytesFromHex, addPadding } from \"../../bin_utils\";\r\nimport {Codec} from './codec';\r\n\r\nclass AbridgedPacketCodec implements Codec {\r\n public tag = 0xef;\r\n public obfuscateTag = new Uint8Array([this.tag, this.tag, this.tag, this.tag]);\r\n\r\n public encodePacket(data: Uint8Array) {\r\n const len = data.byteLength >> 2;\r\n let header: Uint8Array;\r\n if(len < 127) {\r\n header = new Uint8Array([len]);\r\n } else { // Length: payload length, divided by four, and encoded as 3 length bytes (little endian)\r\n // header = new Uint8Array([0x7f, ...addPadding(bytesFromHex(len.toString(16)).reverse(), 3, true)/* .reverse() */]);\r\n header = new Uint8Array([0x7f, len & 0xFF, (len >> 8) & 0xFF, (len >> 16) & 0xFF]);\r\n // console.log('got nobody cause im braindead', header, len);\r\n }\r\n\r\n return header.concat(data);\r\n // return new Uint8Array([...header, ...data]);\r\n }\r\n\r\n public readPacket(data: Uint8Array) {\r\n let length = data[0];\r\n if(length >= 127) { // 0x7f\r\n length = data[1] | (data[2] << 8) | (data[3] << 16);\r\n\r\n return data.slice(4, length << 2 + 1); // need +1\r\n }\r\n\r\n return data.slice(1, length << 2 + 1); // need +1\r\n }\r\n}\r\n\r\nexport default new AbridgedPacketCodec();\r\n","export default function bytesToHex(bytes: ArrayLike<number>) {\r\n const length = bytes.length;\r\n const arr: string[] = new Array(length);\r\n for(let i = 0; i < length; ++i) {\r\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\r\n }\r\n return arr.join('');\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from '../../../config/modes';\nimport {logger, LogTypes} from '../../logger';\nimport MTPNetworker from '../networker';\nimport Obfuscation from './obfuscation';\nimport MTTransport, {MTConnection, MTConnectionConstructable} from './transport';\n// import intermediatePacketCodec from './intermediate';\nimport abridgedPacketCodec from './abridged';\n// import paddedIntermediatePacketCodec from './padded';\nimport {ConnectionStatus} from '../connectionStatus';\n\n \nimport transportController from './controller';\nimport bytesToHex from '../../../helpers/bytes/bytesToHex';\n// import networkStats from '../networkStats';\nimport ctx from '../../../environment/ctx';\n \n\nexport default class TcpObfuscated implements MTTransport {\n private codec = abridgedPacketCodec;\n private obfuscation = new Obfuscation();\n public networker: MTPNetworker;\n\n private pending: Array<Partial<{\n resolve: any,\n reject: any,\n body: Uint8Array,\n encoded?: Uint8Array,\n bodySent: boolean\n }>> = [];\n\n private debug = Modes.debug && false/* true */;\n private log: ReturnType<typeof logger>;\n public connected = false;\n private lastCloseTime: number;\n public connection: MTConnection;\n\n private autoReconnect = true;\n private reconnectTimeout: number;\n private releasingPending: boolean;\n\n // private debugPayloads: MTPNetworker['debugRequests'] = [];\n\n constructor(\n private Connection: MTConnectionConstructable,\n private dcId: number,\n private url: string,\n private logSuffix: string,\n private retryTimeout: number\n ) {\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n this.log = logger(`TCP-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n\n this.connect();\n }\n\n private onOpen = async() => {\n this.connected = true;\n\n \n transportController.setTransportOpened('websocket');\n \n\n const initPayload = await this.obfuscation.init(this.codec);\n if(!this.connected) {\n return;\n }\n\n this.connection.send(initPayload);\n\n if(this.networker) {\n this.pending.length = 0; // ! clear queue and reformat messages to container, because if sending simultaneously 10+ messages, connection will die\n this.networker.setConnectionStatus(ConnectionStatus.Connected);\n this.networker.cleanupSent();\n this.networker.resend();\n }/* else {\n for(const pending of this.pending) {\n if(pending.encoded && pending.body) {\n pending.encoded = this.encodeBody(pending.body);\n }\n }\n } */\n\n setTimeout(() => {\n this.releasePending();\n }, 0);\n };\n\n private onMessage = async(buffer: ArrayBuffer) => {\n // networkStats.addReceived(this.dcId, buffer.byteLength);\n\n let data = await this.obfuscation.decode(new Uint8Array(buffer));\n data = this.codec.readPacket(data);\n\n if(this.networker) { // authenticated!\n // this.pending = this.pending.filter((p) => p.body); // clear pending\n\n this.debug && this.log.debug('redirecting to networker', data.length);\n this.networker.parseResponse(data).then((response) => {\n this.debug && this.log.debug('redirecting to networker response:', response);\n\n try {\n this.networker.processMessage(response.response, response.messageId, response.sessionId);\n } catch(err) {\n this.log.error('handleMessage networker processMessage error', err);\n }\n\n // this.releasePending();\n }).catch((err) => {\n this.log.error('handleMessage networker parseResponse error', err);\n });\n\n // this.dd();\n return;\n }\n\n // console.log('got hex:', data.hex);\n const pending = this.pending.shift();\n if(!pending) {\n this.debug && this.log.debug('no pending for res:', bytesToHex(data));\n return;\n }\n\n pending.resolve(data);\n };\n\n private onClose = () => {\n this.clear();\n\n let needTimeout: number, retryAt: number;\n if(this.autoReconnect) {\n const time = Date.now();\n const diff = time - this.lastCloseTime;\n needTimeout = !isNaN(diff) && diff < this.retryTimeout ? this.retryTimeout - diff : 0;\n retryAt = time + needTimeout;\n }\n\n if(this.networker) {\n this.networker.setConnectionStatus(ConnectionStatus.Closed, retryAt);\n this.pending.length = 0;\n }\n\n if(this.autoReconnect) {\n this.log('will try to reconnect after timeout:', needTimeout / 1000);\n this.reconnectTimeout = ctx.setTimeout(this.reconnect, needTimeout);\n } else {\n this.log('reconnect isn\\'t needed');\n }\n };\n\n public clear() {\n \n if(this.connected) {\n transportController.setTransportClosed('websocket');\n }\n \n\n this.connected = false;\n\n if(this.connection) {\n this.connection.removeEventListener('open', this.onOpen);\n this.connection.removeEventListener('close', this.onClose);\n this.connection.removeEventListener('message', this.onMessage);\n this.connection = undefined;\n }\n }\n\n /**\n * invoke only when closed\n */\n public reconnect = () => {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n if(this.connection) {\n return;\n }\n\n this.log('trying to reconnect...');\n this.lastCloseTime = Date.now();\n\n if(!this.networker) {\n for(const pending of this.pending) {\n if(pending.bodySent) {\n pending.bodySent = false;\n }\n }\n } else {\n this.networker.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.connect();\n }\n\n public forceReconnect() {\n this.close();\n this.reconnect();\n }\n\n public destroy() {\n this.setAutoReconnect(false);\n this.close();\n\n if(this.obfuscation) {\n this.obfuscation.destroy();\n }\n\n this.pending.forEach((pending) => {\n if(pending.reject) {\n pending.reject();\n }\n });\n this.pending.length = 0;\n }\n\n public close() {\n const connection = this.connection;\n if(connection) {\n const connected = this.connected;\n this.clear();\n if(connected) { // wait for buffered messages if they are there\n connection.addEventListener('message', this.onMessage);\n connection.addEventListener('close', () => {\n connection.removeEventListener('message', this.onMessage);\n }, {once: true});\n connection.close();\n }\n }\n }\n\n /**\n * Will connect if enable and disconnected \\\n * Will reset reconnection timeout if disable\n */\n public setAutoReconnect(enable: boolean) {\n this.autoReconnect = enable;\n\n if(!enable) {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n } else if(!this.connection && this.reconnectTimeout === undefined) {\n this.reconnect();\n }\n }\n\n private connect() {\n if(this.connection) {\n this.close();\n }\n\n this.connection = new this.Connection(this.dcId, this.url, this.logSuffix);\n this.connection.addEventListener('open', this.onOpen);\n this.connection.addEventListener('close', this.onClose);\n this.connection.addEventListener('message', this.onMessage);\n }\n\n public changeUrl(url: string) {\n if(this.url === url) {\n return;\n }\n\n this.url = url;\n this.forceReconnect();\n }\n\n private encodeBody(body: Uint8Array) {\n const toEncode = this.codec.encodePacket(body);\n\n // this.log('send before obf:', /* body.hex, nonce.hex, */ toEncode.hex);\n const encoded = this.obfuscation.encode(toEncode);\n // this.log('send after obf:', enc.hex);\n\n return encoded;\n }\n\n public send(body: Uint8Array) {\n this.debug && this.log.debug('-> body length to pending:', body.length);\n\n const encoded: typeof body = /* this.connected ? this.encodeBody(body) : */undefined;\n\n // return;\n\n if(this.networker) {\n this.pending.push({body, encoded});\n this.releasePending();\n } else {\n const promise = new Promise<typeof body>((resolve, reject) => {\n this.pending.push({resolve, reject, body, encoded});\n });\n\n this.releasePending();\n\n return promise;\n }\n }\n\n private async releasePending(/* tt = false */) {\n if(!this.connected || this.releasingPending) {\n // this.connect();\n return;\n }\n\n this.releasingPending = true;\n\n /* if(!tt) {\n this.releasePendingDebounced();\n return;\n } */\n\n // this.log('-> messages to send:', this.pending.length);\n let length = this.pending.length;\n let sent = false;\n // for(let i = length - 1; i >= 0; --i) {\n for(let i = 0; i < length; ++i) {\n const pending = this.pending[i];\n if(!pending) {\n break;\n }\n\n const {body, bodySent} = pending;\n if(body && !bodySent) {\n // this.debugPayloads.push({before: body.slice(), after: enc});\n\n this.debug && this.log.debug('-> body length to send:', body.length);\n\n // if(!encoded) {\n // encoded = pending.encoded = this.encodeBody(body);\n // }\n\n const encoded = pending.encoded ??= await this.encodeBody(body);\n if(!this.connected) {\n break;\n }\n\n // networkStats.addSent(this.dcId, encoded.byteLength);\n this.connection.send(encoded);\n\n if(!pending.resolve) { // remove if no response needed\n this.pending.splice(i--, 1);\n length--;\n } else {\n pending.bodySent = true;\n }\n\n sent = true;\n // delete pending.body;\n }\n }\n\n this.releasingPending = undefined;\n\n if(this.pending.length && sent) {\n this.releasePending();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport MTTransport, {MTConnectionConstructable} from './transports/transport';\nimport Modes from '../../config/modes';\nimport App from '../../config/app';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\n\n \nimport HTTP from './transports/http';\n \n\n \nimport Socket from './transports/websocket';\nimport TcpObfuscated from './transports/tcpObfuscated';\nimport {IS_WEB_WORKER} from '../../helpers/context';\nimport {DcId} from '../../types';\nimport {getEnvironment} from '../../environment/utils';\n\n \n \n \n\n \n\nexport type TransportType = 'websocket' | 'https' | 'http';\nexport type ConnectionType = 'client' | 'download' | 'upload';\ntype Servers = {\n [transportType in TransportType]: {\n [connectionType in ConnectionType]: {\n [dcId: DcId]: MTTransport[]\n }\n }\n};\n\nconst TEST_SUFFIX = Modes.test ? '_test' : '';\nconst PREMIUM_SUFFIX = '_premium';\n\nexport function getTelegramConnectionSuffix(connectionType: ConnectionType) {\n return connectionType === 'client' ? '' : '-1';\n}\n\n \nexport function constructTelegramWebSocketUrl(dcId: DcId, connectionType: ConnectionType, premium?: boolean) {\n const suffix = getTelegramConnectionSuffix(connectionType);\n const path = connectionType !== 'client' ? 'apiws' + TEST_SUFFIX + (premium ? PREMIUM_SUFFIX : '') : ('apiws' + TEST_SUFFIX);\n const chosenServer = `wss://${App.suffix.toLowerCase()}ws${dcId}${suffix}.web.telegram.org/${path}`;\n\n return chosenServer;\n}\n \n\nexport class DcConfigurator {\n private sslSubdomains = ['pluto', 'venus', 'aurora', 'vesta', 'flora'];\n\n private dcOptions = Modes.test ?\n [\n {id: 1, host: '149.154.175.10', port: 80},\n {id: 2, host: '149.154.167.40', port: 80},\n {id: 3, host: '149.154.175.117', port: 80}\n ] :\n [\n {id: 1, host: '149.154.175.50', port: 80},\n {id: 2, host: '149.154.167.50', port: 80},\n {id: 3, host: '149.154.175.100', port: 80},\n {id: 4, host: '149.154.167.91', port: 80},\n {id: 5, host: '149.154.171.5', port: 80}\n ];\n\n public chosenServers: Servers = {} as any;\n\n \n private transportSocket = (dcId: DcId, connectionType: ConnectionType, premium?: boolean) => {\n const chosenServer = constructTelegramWebSocketUrl(dcId, connectionType, premium);\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\n\n const retryTimeout = connectionType === 'client' ? 10000 : 10000;\n\n let oooohLetMeLive: MTConnectionConstructable;\n \n oooohLetMeLive = Socket;\n \n \n \n\n return new TcpObfuscated(oooohLetMeLive, dcId, chosenServer, logSuffix, retryTimeout);\n };\n \n\n \n private transportHTTP = (dcId: DcId, connectionType: ConnectionType, premium?: boolean) => {\n let chosenServer: string;\n if(Modes.ssl || !Modes.http) {\n const suffix = getTelegramConnectionSuffix(connectionType);\n const subdomain = this.sslSubdomains[dcId - 1] + suffix;\n const path = Modes.test ? 'apiw_test1' : 'apiw1';\n chosenServer = 'https://' + subdomain + '.web.telegram.org/' + path;\n } else {\n for(const dcOption of this.dcOptions) {\n if(dcOption.id === dcId) {\n chosenServer = 'http://' + dcOption.host + (dcOption.port !== 80 ? ':' + dcOption.port : '') + '/apiw1';\n break;\n }\n }\n }\n\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\n return new HTTP(dcId, chosenServer, logSuffix);\n };\n \n\n public chooseServer(\n dcId: DcId,\n connectionType: ConnectionType = 'client',\n transportType: TransportType = Modes.transport,\n reuse = true,\n premium?: boolean\n ) {\n /* if(transportType === 'websocket' && !Modes.multipleConnections) {\n connectionType = 'client';\n } */\n\n if(!this.chosenServers.hasOwnProperty(transportType)) {\n this.chosenServers[transportType] = {\n client: {},\n download: {},\n upload: {}\n };\n }\n\n const servers = this.chosenServers[transportType][connectionType];\n\n if(!(dcId in servers)) {\n servers[dcId] = [];\n }\n\n const transports = servers[dcId];\n\n if(!transports.length || !reuse/* || (upload && transports.length < 1) */) {\n let transport: MTTransport;\n\n \n transport = (transportType === 'websocket' ? this.transportSocket : this.transportHTTP)(dcId, connectionType, premium);\n \n \n \n \n \n\n if(!transport) {\n console.error('No chosenServer!', dcId);\n return null;\n }\n\n if(reuse) {\n transports.push(transport);\n }\n\n return transport;\n }\n\n return transports[0];\n }\n\n public static removeTransport<T>(obj: any, transport: T) {\n for(const transportType in obj) {\n // @ts-ignore\n for(const connectionType in obj[transportType]) {\n // @ts-ignore\n for(const dcId in obj[transportType][connectionType]) {\n // @ts-ignore\n const transports: T[] = obj[transportType][connectionType][dcId];\n indexOfAndSplice(transports, transport);\n }\n }\n }\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport App from '../../../config/app';\r\nimport deferredPromise from '../../../helpers/cancellablePromise';\r\nimport EventListenerBase from '../../../helpers/eventListenerBase';\r\nimport pause from '../../../helpers/schedulers/pause';\r\nimport {TransportType, DcConfigurator} from '../dcConfigurator';\r\nimport type HTTP from './http';\r\nimport type TcpObfuscated from './tcpObfuscated';\r\nimport MTTransport from './transport';\r\n\r\nexport class MTTransportController extends EventListenerBase<{\r\n change: (opened: MTTransportController['opened']) => void,\r\n transport: (type: TransportType) => void\r\n}> {\r\n private opened: Map<TransportType, number>;\r\n private transports: {[k in TransportType]?: MTTransport};\r\n private pinging: boolean;\r\n private dcConfigurator: DcConfigurator;\r\n\r\n constructor() {\r\n super(true);\r\n\r\n this.opened = new Map();\r\n /* this.addEventListener('change', (opened) => {\r\n this.dispatchEvent('transport', opened.get('websocket') || !opened.get('https') ? 'websocket' : 'https');\r\n }); */\r\n\r\n this.addEventListener('change', (opened) => {\r\n if(!opened.get('websocket')) {\r\n this.waitForWebSocket();\r\n }\r\n });\r\n\r\n // setTimeout(() => {\r\n // this.waitForWebSocket();\r\n // }, 200); // wait for first transport so won't have delay for first WS\r\n }\r\n\r\n public async pingTransports() {\r\n const dcConfigurator = this.dcConfigurator ??= new DcConfigurator();\r\n const timeout = 2000;\r\n const transports: {[k in TransportType]?: MTTransport} = this.transports = {\r\n https: dcConfigurator.chooseServer(App.baseDcId, 'client', 'https', false),\r\n websocket: dcConfigurator.chooseServer(App.baseDcId, 'client', 'websocket', false)\r\n };\r\n\r\n const httpPromise = deferredPromise<boolean>();\r\n ((this.transports.https as HTTP)._send(new Uint8Array(), 'no-cors') as any as Promise<any>)\r\n .then(() => httpPromise.resolve(true), () => httpPromise.resolve(false));\r\n setTimeout(() => httpPromise.resolve(false), timeout);\r\n\r\n const websocketPromise = deferredPromise<boolean>();\r\n const socket = transports.websocket as TcpObfuscated;\r\n socket.setAutoReconnect(false);\r\n socket.connection.addEventListener('close', () => websocketPromise.resolve(false), {once: true});\r\n socket.connection.addEventListener('open', () => websocketPromise.resolve(true), {once: true});\r\n setTimeout(() => {\r\n if(websocketPromise.isFulfilled || websocketPromise.isRejected) {\r\n return;\r\n }\r\n\r\n if(socket.connection) {\r\n socket.connection.close();\r\n }\r\n\r\n websocketPromise.resolve(false);\r\n }, timeout);\r\n\r\n const [isHttpAvailable, isWebSocketAvailable] = await Promise.all([httpPromise, websocketPromise]);\r\n\r\n for(const transportType in transports) {\r\n const transport = transports[transportType as TransportType];\r\n transport.destroy();\r\n }\r\n\r\n const result = {\r\n https: isHttpAvailable || this.opened.get('https') > 0,\r\n websocket: isWebSocketAvailable || this.opened.get('websocket') > 0\r\n };\r\n\r\n // result.websocket = false;\r\n return result;\r\n }\r\n\r\n public async waitForWebSocket() {\r\n if(this.pinging) return;\r\n this.pinging = true;\r\n\r\n while(true) {\r\n const {https, websocket} = await this.pingTransports();\r\n if(https || websocket) {\r\n this.dispatchEvent('transport', websocket || !https ? 'websocket' : 'https');\r\n }\r\n\r\n if(websocket) {\r\n break;\r\n }\r\n\r\n await pause(10000);\r\n }\r\n\r\n this.pinging = false;\r\n }\r\n\r\n public setTransportValue(type: TransportType, value: boolean) {\r\n let length = this.opened.get(type) || 0;\r\n length += value ? 1 : -1;\r\n\r\n this.opened.set(type, length);\r\n this.dispatchEvent('change', this.opened);\r\n }\r\n\r\n public setTransportOpened(type: TransportType) {\r\n return this.setTransportValue(type, true);\r\n }\r\n\r\n public setTransportClosed(type: TransportType) {\r\n return this.setTransportValue(type, false);\r\n }\r\n}\r\n\r\nconst transportController = new MTTransportController();\r\nexport default transportController;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport deferredPromise, {CancellablePromise} from '../../../../helpers/cancellablePromise';\r\nimport type {StoragesResults} from './loadStorages';\r\n\r\nconst RESET_STORAGES_PROMISE: CancellablePromise<Set<keyof StoragesResults>> = deferredPromise();\r\nexport default RESET_STORAGES_PROMISE;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {CryptoMessagePort} from '../crypto/cryptoMessagePort';\r\nimport type {ApiFileManager} from '../mtproto/apiFileManager';\r\nimport type {ApiManager} from '../mtproto/apiManager';\r\nimport type {Authorizer} from '../mtproto/authorizer';\r\nimport type {DcConfigurator} from '../mtproto/dcConfigurator';\r\nimport type {NetworkerFactory} from '../mtproto/networkerFactory';\r\nimport type {PasswordManager} from '../mtproto/passwordManager';\r\nimport type {ReferenceDatabase} from '../mtproto/referenceDatabase';\r\nimport type {TimeManager} from '../mtproto/timeManager';\r\nimport type {RootScope} from '../rootScope';\r\nimport type DialogsStorage from '../storages/dialogs';\r\nimport type FiltersStorage from '../storages/filters';\r\nimport type PeersStorage from '../storages/peers';\r\nimport type ThumbsStorage from '../storages/thumbs';\r\nimport type {ApiUpdatesManager} from './apiUpdatesManager';\r\nimport type {AppAvatarsManager} from './appAvatarsManager';\r\nimport type {AppCallsManager} from './appCallsManager';\r\nimport type {AppChatsManager} from './appChatsManager';\r\nimport type {AppDocsManager} from './appDocsManager';\r\nimport type {AppDraftsManager} from './appDraftsManager';\r\nimport type {AppEmojiManager} from './appEmojiManager';\r\nimport type {AppGroupCallsManager} from './appGroupCallsManager';\r\nimport type {AppInlineBotsManager} from './appInlineBotsManager';\r\nimport type {AppMessagesIdsManager} from './appMessagesIdsManager';\r\nimport type {AppMessagesManager} from './appMessagesManager';\r\nimport type {AppNotificationsManager} from './appNotificationsManager';\r\nimport type AppPaymentsManager from './appPaymentsManager';\r\nimport type {AppPeersManager} from './appPeersManager';\r\nimport type {AppPhotosManager} from './appPhotosManager';\r\nimport type {AppPollsManager} from './appPollsManager';\r\nimport type {AppPrivacyManager} from './appPrivacyManager';\r\nimport type {AppProfileManager} from './appProfileManager';\r\nimport type {AppReactionsManager} from './appReactionsManager';\r\nimport type {AppStateManager} from './appStateManager';\r\nimport type {AppStickersManager} from './appStickersManager';\r\nimport type {AppStoragesManager} from './appStoragesManager';\r\nimport type {AppUsersManager} from './appUsersManager';\r\nimport type AppWebDocsManager from './appWebDocsManager';\r\nimport type {AppWebPagesManager} from './appWebPagesManager';\r\nimport type {AppManagers} from './managers';\r\n\r\nexport class AppManager {\r\n protected appPeersManager: AppPeersManager;\r\n protected appChatsManager: AppChatsManager;\r\n protected appDocsManager: AppDocsManager;\r\n protected appPhotosManager: AppPhotosManager;\r\n protected appPollsManager: AppPollsManager;\r\n protected appUsersManager: AppUsersManager;\r\n protected appWebPagesManager: AppWebPagesManager;\r\n protected appDraftsManager: AppDraftsManager;\r\n protected appProfileManager: AppProfileManager;\r\n protected appNotificationsManager: AppNotificationsManager;\r\n protected apiUpdatesManager: ApiUpdatesManager;\r\n protected appAvatarsManager: AppAvatarsManager;\r\n protected appGroupCallsManager: AppGroupCallsManager;\r\n protected appCallsManager: AppCallsManager;\r\n protected appReactionsManager: AppReactionsManager;\r\n protected appMessagesManager: AppMessagesManager;\r\n protected appMessagesIdsManager: AppMessagesIdsManager;\r\n protected appPrivacyManager: AppPrivacyManager;\r\n protected appInlineBotsManager: AppInlineBotsManager;\r\n protected appStickersManager: AppStickersManager;\r\n protected referenceDatabase: ReferenceDatabase;\r\n protected appEmojiManager: AppEmojiManager;\r\n protected dialogsStorage: DialogsStorage;\r\n protected filtersStorage: FiltersStorage;\r\n protected apiManager: ApiManager;\r\n // protected apiManager: ApiManagerProxy;\r\n protected passwordManager: PasswordManager;\r\n protected cryptoWorker: CryptoMessagePort;\r\n protected apiFileManager: ApiFileManager;\r\n protected peersStorage: PeersStorage;\r\n protected thumbsStorage: ThumbsStorage;\r\n protected networkerFactory: NetworkerFactory;\r\n protected rootScope: RootScope;\r\n protected authorizer: Authorizer;\r\n protected dcConfigurator: DcConfigurator;\r\n protected timeManager: TimeManager;\r\n protected appStoragesManager: AppStoragesManager;\r\n protected appStateManager: AppStateManager;\r\n protected appWebDocsManager: AppWebDocsManager;\r\n protected appPaymentsManager: AppPaymentsManager;\r\n\r\n public clear: (init?: boolean) => void;\r\n\r\n public setManagers(managers: AppManagers) {\r\n Object.assign(this, managers);\r\n // this.after();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type{Chat} from '../../../../layer';\r\nimport type{Dialog} from '../../appMessagesManager';\r\nimport type{User} from '../../appUsersManager';\r\nimport type {StoragesStorages} from './createStorages';\r\nimport {recordPromiseBound} from '../../../../helpers/recordPromise';\r\nimport {Awaited} from '../../../../types';\r\nimport {logger} from '../../../logger';\r\nimport RESET_STORAGES_PROMISE from './resetStoragesPromise';\r\n\r\nexport type StoragesResults = Awaited<ReturnType<typeof loadStoragesInner>>;\r\n\r\nasync function loadStoragesInner(storages: StoragesStorages) {\r\n const recordPromise = recordPromiseBound(logger('STORAGES-LOADER'));\r\n const storagesKeys = Object.keys(storages) as Array<keyof StoragesStorages>;\r\n const storagesPromises: Promise<any>[] = storagesKeys.map((key) => {\r\n const promise = storages[key].getAll();\r\n return recordPromise(promise, 'storage ' + (key as any as string));\r\n });\r\n\r\n const storagesResults: {\r\n users: User[],\r\n chats: Chat[],\r\n dialogs: Dialog[]\r\n } = {} as any;\r\n const arr = await Promise.all(storagesPromises);\r\n for(let i = 0, length = storagesKeys.length; i < length; ++i) {\r\n storagesResults[storagesKeys[i]] = arr[i] as any;\r\n }\r\n\r\n arr.splice(0, storagesKeys.length);\r\n\r\n const resetStorages = await RESET_STORAGES_PROMISE;\r\n if(resetStorages.size) {\r\n for(const key of resetStorages) {\r\n storagesResults[key].length = 0;\r\n }\r\n\r\n resetStorages.clear();\r\n }\r\n\r\n return storagesResults;\r\n}\r\n\r\nlet promise: ReturnType<typeof loadStoragesInner>;\r\nexport default function loadStorages(storages: StoragesStorages) {\r\n return promise ??= loadStoragesInner(storages);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {logger} from '../logger';\r\nimport {AppManager} from './manager';\r\nimport createStorages from './utils/storages/createStorages';\r\nimport loadStorages from './utils/storages/loadStorages';\r\n\r\nexport class AppStoragesManager extends AppManager {\r\n private storages: ReturnType<typeof createStorages>;\r\n\r\n // private loadPromise: CancellablePromise<StoragesResults>;\r\n\r\n private log: ReturnType<typeof logger>;\r\n\r\n constructor() {\r\n super();\r\n\r\n this.log = logger('STORAGES');\r\n this.storages = createStorages();\r\n // this.loadPromise = deferredPromise();\r\n }\r\n\r\n public loadStorages() {\r\n return loadStorages(this.storages);\r\n // loadStorages(this.storages).then((storagesResults) => {\r\n // this.loadPromise.resolve(storagesResults);\r\n // });\r\n\r\n // return this.loadPromise;\r\n }\r\n\r\n // public setStoragesResults(storagesResults: StoragesResults) {\r\n // this.loadPromise.resolve(storagesResults);\r\n // }\r\n\r\n public async loadStorage<T extends keyof AppStoragesManager['storages']>(name: T) {\r\n return this.loadStorages().then((storagesResults) => {\r\n return {\r\n storage: this.storages[name],\r\n results: storagesResults[name]\r\n };\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {Chat} from '../../../../layer';\r\nimport type {Dialog} from '../../appMessagesManager';\r\nimport type {User} from '../../appUsersManager';\r\nimport DATABASE_STATE from '../../../../config/databases/state';\r\nimport AppStorage from '../../../storage';\r\n\r\nexport type StoragesStorages = {\r\n users: AppStorage<Record<UserId, User>, typeof DATABASE_STATE>,\r\n chats: AppStorage<Record<ChatId, Chat>, typeof DATABASE_STATE>,\r\n dialogs: AppStorage<Record<PeerId, Dialog>, typeof DATABASE_STATE>\r\n};\r\n\r\nexport default function createStorages() {\r\n const names: (keyof StoragesStorages)[] = ['users', 'chats', 'dialogs'];\r\n const storages: StoragesStorages = {} as any;\r\n for(const name of names) {\r\n // @ts-ignore\r\n storages[name] = new AppStorage(DATABASE_STATE, name);\r\n }\r\n\r\n return storages;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type {AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo} from '../../layer';\r\nimport randomize from '../../helpers/array/randomize';\r\nimport {AppManager} from '../appManagers/manager';\r\n\r\nexport class PasswordManager extends AppManager {\r\n public getState(): Promise<AccountPassword> {\r\n return this.apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n // state = Object.assign({}, state);\r\n // state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then((state) => {\r\n let currentHashPromise: Promise<InputCheckPasswordSRP>;\r\n let newHashPromise: Promise<Uint8Array>;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n\r\n if(settings.currentPassword) {\r\n currentHashPromise = this.cryptoWorker.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n\r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n randomize(salt1);\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n\r\n if(settings.newPassword) {\r\n newHashPromise = this.cryptoWorker.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n\r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n\r\n return this.apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public getInputCheckPassword(password: string, state: AccountPassword) {\r\n return this.cryptoWorker.invokeCrypto('computeSRP', password, state, false) as Promise<InputCheckPasswordSRP.inputCheckPasswordSRP>;\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return this.getInputCheckPassword(password, state).then((inputCheckPassword) => {\r\n // console.log('SRP', inputCheckPassword);\r\n return this.apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\r\n }, options).then((auth) => {\r\n if(auth._ === 'auth.authorization') {\r\n this.apiManager.setUser(auth.user);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return this.apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return this.apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return this.apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {Photo} from '../../layer';\r\nimport {logger} from '../logger';\r\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\r\nimport deepEqual from '../../helpers/object/deepEqual';\r\nimport {AppManager} from '../appManagers/manager';\r\nimport makeError from '../../helpers/makeError';\r\n\r\nexport type ReferenceContext = ReferenceContext.referenceContextProfilePhoto | ReferenceContext.referenceContextMessage | ReferenceContext.referenceContextEmojiesSounds | ReferenceContext.referenceContextReactions | ReferenceContext.referenceContextUserFull | ReferenceContext.referenceContextCustomEmoji;\r\nexport namespace ReferenceContext {\r\n export type referenceContextProfilePhoto = {\r\n type: 'profilePhoto',\r\n peerId: PeerId\r\n };\r\n\r\n export type referenceContextMessage = {\r\n type: 'message',\r\n peerId: PeerId,\r\n messageId: number\r\n };\r\n\r\n export type referenceContextEmojiesSounds = {\r\n type: 'emojiesSounds'\r\n };\r\n\r\n export type referenceContextReactions = {\r\n type: 'reactions'\r\n };\r\n\r\n export type referenceContextUserFull = {\r\n type: 'userFull',\r\n userId: UserId\r\n };\r\n\r\n export type referenceContextCustomEmoji = {\r\n type: 'customEmoji',\r\n docId: DocId\r\n };\r\n}\r\n\r\nexport type ReferenceBytes = Photo.photo['file_reference'];\r\nexport type ReferenceContexts = Set<ReferenceContext>;\r\n\r\n// type ReferenceBytes = Uint8Array;\r\n\r\nexport class ReferenceDatabase extends AppManager {\r\n private contexts: Map<ReferenceBytes, ReferenceContexts> = new Map();\r\n // private references: Map<ReferenceBytes, number[]> = new Map();\r\n private links: {[hex: string]: ReferenceBytes} = {};\r\n private log = logger('RD', undefined, true);\r\n private refreshEmojiesSoundsPromise: Promise<any>;\r\n\r\n // constructor() {\r\n // super();\r\n\r\n // apiManager.addTaskListener('refreshReference', (task: RefreshReferenceTask) => {\r\n // const originalPayload = task.payload;\r\n\r\n // assumeType<RefreshReferenceTaskResponse>(task);\r\n // task.originalPayload = originalPayload;\r\n\r\n // this.refreshReference(originalPayload).then((bytes) => {\r\n // task.payload = bytes;\r\n // }, (err) => {\r\n // task.error = err;\r\n // }).then(() => apiManager.postMessage(task));\r\n // });\r\n // }\r\n\r\n public saveContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\r\n [contexts, reference] = this.getContexts(reference);\r\n if(!contexts) {\r\n contexts = new Set();\r\n this.contexts.set(reference, contexts);\r\n }\r\n\r\n this.links[bytesToHex(reference)] = reference;\r\n for(const _context of contexts) {\r\n if(deepEqual(_context, context)) {\r\n return;\r\n }\r\n }\r\n\r\n contexts.add(context);\r\n }\r\n\r\n public getReferenceByLink(reference: ReferenceBytes) {\r\n return this.links[bytesToHex(reference)];\r\n }\r\n\r\n public getContexts(reference: ReferenceBytes): [ReferenceContexts, ReferenceBytes] {\r\n const contexts = this.contexts.get(reference) || (reference = this.getReferenceByLink(reference) || reference, this.contexts.get(reference));\r\n return [contexts, reference];\r\n }\r\n\r\n public getContext(reference: ReferenceBytes): [ReferenceContext, ReferenceBytes] {\r\n const contexts = this.getContexts(reference);\r\n return contexts[0] ? [contexts[0].values().next().value, contexts[1]] : undefined;\r\n }\r\n\r\n public deleteContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\r\n [contexts, reference] = this.getContexts(reference);\r\n if(contexts) {\r\n for(const _context of contexts) {\r\n if(deepEqual(_context, context)) {\r\n contexts.delete(_context);\r\n if(!contexts.size) {\r\n this.contexts.delete(reference);\r\n delete this.links[bytesToHex(reference)];\r\n }\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public refreshReference(reference: ReferenceBytes, context?: ReferenceContext): Promise<Uint8Array | number[]> {\r\n this.log('refreshReference: start', reference.slice(), context);\r\n if(!context) {\r\n const c = this.getContext(reference);\r\n if(!c) {\r\n this.log('refreshReference: got no context for reference:', reference.slice());\r\n return Promise.reject('NO_CONTEXT');\r\n }\r\n\r\n [context, reference] = c;\r\n }\r\n\r\n let promise: Promise<any>;\r\n switch(context?.type) {\r\n case 'message': {\r\n promise = this.appMessagesManager.reloadMessages(context.peerId, context.messageId, true);\r\n break;\r\n // .then(() => {\r\n // console.log('FILE_REFERENCE_EXPIRED: got message', context, appMessagesManager.getMessage((context as ReferenceContext.referenceContextMessage).messageId).media, reference);\r\n // });\r\n }\r\n\r\n case 'emojiesSounds': {\r\n promise = this.refreshEmojiesSoundsPromise || this.appStickersManager.getAnimatedEmojiSounds(true).then(() => {\r\n this.refreshEmojiesSoundsPromise = undefined;\r\n });\r\n break;\r\n }\r\n\r\n case 'userFull': {\r\n promise = Promise.resolve(this.appProfileManager.getProfile(context.userId, true));\r\n break;\r\n }\r\n\r\n case 'customEmoji': {\r\n promise = this.appEmojiManager.getCustomEmojiDocuments([context.docId]);\r\n }\r\n\r\n default: {\r\n this.log.warn('refreshReference: not implemented context', context);\r\n return Promise.reject();\r\n }\r\n }\r\n\r\n const hex = bytesToHex(reference);\r\n this.log('refreshReference: refreshing reference:', hex);\r\n return promise.then(() => {\r\n const newHex = bytesToHex(reference);\r\n this.log('refreshReference: refreshed, reference before:', hex, 'after:', newHex);\r\n if(hex !== newHex) {\r\n return reference;\r\n }\r\n\r\n this.deleteContext(reference, context);\r\n\r\n const newContext = this.getContext(reference);\r\n if(newContext) {\r\n return this.refreshReference(reference, newContext[0]);\r\n }\r\n\r\n this.log.error('refreshReference: no new context, reference before:', hex, 'after:', newHex, context);\r\n\r\n throw makeError('NO_NEW_CONTEXT');\r\n });\r\n }\r\n\r\n /* public replaceReference(oldReference: ReferenceBytes, newReference: ReferenceBytes) {\r\n const contexts = this.contexts.get(oldReference);\r\n if(contexts) {\r\n this.contexts.delete(oldReference);\r\n this.contexts.set(newReference, contexts);\r\n }\r\n } */\r\n}\r\n","export default function safeReplaceObject(wasObject: any, newObject: any) {\r\n if(!wasObject) {\r\n return newObject;\r\n }\r\n\r\n for(var key in wasObject) {\r\n if(!newObject.hasOwnProperty(key)) {\r\n delete wasObject[key];\r\n }\r\n }\r\n\r\n for(var key in newObject) {\r\n // if (newObject.hasOwnProperty(key)) { // useless\r\n wasObject[key] = newObject[key];\r\n // }\r\n }\r\n\r\n return wasObject;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {Message, MessageAction, MessageMedia} from '../../../../layer';\r\nimport getPeerId from '../peers/getPeerId';\r\n\r\nexport default function getPeerIdsFromMessage(message: Message.message | Message.messageService) {\r\n const peerIds: number[] = [\r\n message.fromId,\r\n message.viaBotId,\r\n (message as Message.message).fwdFromId\r\n ];\r\n\r\n const media = (message as Message.message).media;\r\n if(media) {\r\n const contactUserId = (media as MessageMedia.messageMediaContact).user_id;\r\n if(contactUserId !== undefined) {\r\n peerIds.push(contactUserId.toPeerId());\r\n }\r\n\r\n const results = (media as MessageMedia.messageMediaPoll).results;\r\n const recentVoters = results?.recent_voters;\r\n if(recentVoters?.length) {\r\n peerIds.push(...recentVoters.map((userId) => userId.toPeerId()));\r\n }\r\n }\r\n\r\n const recentReactions = ((message as Message.message).reactions)?.recent_reactions;\r\n if(recentReactions?.length) {\r\n peerIds.push(...recentReactions.map((reaction) => getPeerId(reaction.peer_id)));\r\n }\r\n\r\n const action = (message as Message.messageService).action;\r\n if(action) {\r\n const userIds: UserId[] = [\r\n ...((action as MessageAction.messageActionChatAddUser).users || []),\r\n (action as MessageAction.messageActionChatDeleteUser).user_id,\r\n (action as MessageAction.messageActionChatJoinedByLink).inviter_id\r\n ];\r\n peerIds.push(...userIds.filter(Boolean).map((userId) => userId.toPeerId()));\r\n\r\n const chatIds: ChatId[] = [\r\n (action as MessageAction.messageActionChatMigrateTo).channel_id,\r\n (action as MessageAction.messageActionChannelMigrateFrom).chat_id\r\n ];\r\n peerIds.push(...chatIds.filter(Boolean).map((chatId) => chatId.toPeerId(true)));\r\n }\r\n\r\n const recentRepliers = ((message as Message.message).replies)?.recent_repliers;\r\n if(recentRepliers?.length) {\r\n peerIds.push(...recentRepliers.map((reply) => getPeerId(reply)));\r\n }\r\n\r\n return new Set(peerIds.filter(Boolean));\r\n}\r\n","export default function defineNotNumerableProperties<T extends any>(obj: T, names: (keyof T)[]) {\r\n // const perf = performance.now();\r\n const props = {writable: true, configurable: true};\r\n const out: {[name in keyof T]?: typeof props} = {};\r\n names.forEach((name) => {\r\n if(!obj.hasOwnProperty(name)) {\r\n out[name] = props;\r\n }\r\n });\r\n Object.defineProperties(obj, out);\r\n // console.log('defineNotNumerableProperties time:', performance.now() - perf);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {Dialog} from '../../appMessagesManager';\r\nimport type getDialogIndexKey from './getDialogIndexKey';\r\n\r\nexport default function setDialogIndex(\r\n dialog: Dialog,\r\n indexKey: ReturnType<typeof getDialogIndexKey>,\r\n index: number\r\n) {\r\n return dialog[indexKey] = index;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type {Chat, DialogPeer, Message, MessageAction, MessageMedia, MessagesPeerDialogs, Update} from '../../layer';\r\nimport type {Dialog, MyMessage} from '../appManagers/appMessagesManager';\r\nimport tsNow from '../../helpers/tsNow';\r\nimport SearchIndex from '../searchIndex';\r\nimport {SliceEnd} from '../../helpers/slicedArray';\r\nimport {MyDialogFilter} from './filters';\r\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, NULL_PEER_ID, REAL_FOLDERS, REAL_FOLDER_ID} from '../mtproto/mtproto_config';\r\nimport {NoneToVoidFunction} from '../../types';\r\nimport ctx from '../../environment/ctx';\r\nimport AppStorage from '../storage';\r\nimport type DATABASE_STATE from '../../config/databases/state';\r\nimport forEachReverse from '../../helpers/array/forEachReverse';\r\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\r\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\r\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\r\nimport getServerMessageId from '../appManagers/utils/messageId/getServerMessageId';\r\nimport generateMessageId from '../appManagers/utils/messageId/generateMessageId';\r\nimport {AppManager} from '../appManagers/manager';\r\nimport getDialogIndexKey from '../appManagers/utils/dialogs/getDialogIndexKey';\r\nimport isObject from '../../helpers/object/isObject';\r\nimport getDialogIndex from '../appManagers/utils/dialogs/getDialogIndex';\r\nimport getPeerIdsFromMessage from '../appManagers/utils/messages/getPeerIdsFromMessage';\r\nimport {AppStoragesManager} from '../appManagers/appStoragesManager';\r\nimport defineNotNumerableProperties from '../../helpers/object/defineNotNumerableProperties';\r\nimport setDialogIndex from '../appManagers/utils/dialogs/setDialogIndex';\r\n\r\nexport type FolderDialog = {\r\n dialog: Dialog,\r\n index: number\r\n};\r\n\r\nexport type Folder = {\r\n dialogs: Dialog[],\r\n id: number,\r\n unreadMessagesCount: number,\r\n unreadPeerIds: Set<PeerId>,\r\n unreadUnmutedPeerIds: Set<PeerId>,\r\n dispatchUnreadTimeout?: number\r\n};\r\n\r\nexport const GLOBAL_FOLDER_ID: REAL_FOLDER_ID = undefined;\r\n\r\n// let spentTime = 0;\r\nexport default class DialogsStorage extends AppManager {\r\n private storage: AppStoragesManager['storages']['dialogs'];\r\n\r\n private dialogs: {[peerId: PeerId]: Dialog};\r\n\r\n private folders: {[folderId: number]: Folder} = {};\r\n\r\n private allDialogsLoaded: {[folder_id: number]: boolean};\r\n private dialogsOffsetDate: {[folder_id: number]: number};\r\n private pinnedOrders: {[folder_id: number]: PeerId[]};\r\n private dialogsNum: number;\r\n\r\n private dialogsIndex: SearchIndex<PeerId>;\r\n\r\n private cachedResults: {\r\n query: string,\r\n count: number,\r\n dialogs: Dialog[],\r\n folderId: number\r\n };\r\n\r\n protected after() {\r\n this.clear(true);\r\n\r\n this.rootScope.addEventListener('language_change', () => {\r\n const peerId = this.appUsersManager.getSelf().id.toPeerId(false);\r\n const dialog = this.getDialogOnly(peerId);\r\n if(dialog) {\r\n const peerText = this.appPeersManager.getPeerSearchText(peerId);\r\n this.dialogsIndex.indexObject(peerId, peerText);\r\n }\r\n });\r\n\r\n const onFilterUpdate = (filter: MyDialogFilter) => {\r\n const dialogs = this.getCachedDialogs(false);\r\n for(let i = 0; i < dialogs.length; ++i) {\r\n this.processDialogForFilter(dialogs[i], filter);\r\n }\r\n };\r\n\r\n this.rootScope.addEventListener('filter_order', () => {\r\n const dialogs = this.getCachedDialogs(false);\r\n // const indexKeys: ReturnType<DialogsStorage['getDialogIndexKey']>[] = [];\r\n for(const filterId in this.folders) {\r\n if(+filterId > 1) {\r\n delete this.folders[filterId];\r\n }\r\n\r\n // indexKeys.push(this.getDialogIndexKey(+filterId));\r\n }\r\n\r\n for(let i = 0; i < dialogs.length; ++i) {\r\n const dialog = dialogs[i];\r\n // for(const indexKey of indexKeys) {\r\n // delete dialog[indexKey];\r\n // }\r\n\r\n this.processDialogForFilters(dialog);\r\n }\r\n });\r\n\r\n this.rootScope.addEventListener('filter_update', onFilterUpdate);\r\n this.rootScope.addEventListener('filter_new', onFilterUpdate);\r\n\r\n this.rootScope.addEventListener('filter_delete', (filter) => {\r\n const dialogs = this.getCachedDialogs(false);\r\n\r\n const indexKey = this.getDialogIndexKeyByFilterId(filter.id);\r\n for(let i = 0; i < dialogs.length; ++i) {\r\n const dialog = dialogs[i];\r\n delete dialog[indexKey];\r\n }\r\n\r\n delete this.folders[filter.id];\r\n });\r\n\r\n this.rootScope.addEventListener('dialog_notify_settings', (dialog) => {\r\n this.processDialogForFilters(dialog);\r\n this.prepareDialogUnreadCountModifying(dialog)();\r\n });\r\n\r\n this.rootScope.addEventListener('chat_update', (chatId) => {\r\n const chat: Chat.chat = this.appChatsManager.getChat(chatId);\r\n\r\n const peerId = chatId.toPeerId(true);\r\n if(chat.pFlags.left && this.getDialogOnly(peerId)) {\r\n this.dropDialogOnDeletion(peerId);\r\n }\r\n });\r\n\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updateFolderPeers: this.onUpdateFolderPeers,\r\n\r\n updateDialogPinned: this.onUpdateDialogPinned,\r\n\r\n updatePinnedDialogs: this.onUpdatePinnedDialogs\r\n });\r\n\r\n return Promise.all([\r\n this.appStateManager.getState(),\r\n this.appStoragesManager.loadStorage('dialogs')\r\n ]).then(([state, {results: dialogs, storage}]) => {\r\n this.storage = storage;\r\n this.dialogs = this.storage.getCache();\r\n\r\n for(const folderId of REAL_FOLDERS) {\r\n const order = state.pinnedOrders[folderId];\r\n if(!order) {\r\n continue;\r\n }\r\n\r\n const _order = this.pinnedOrders[folderId];\r\n _order.splice(0, _order.length, ...order);\r\n }\r\n\r\n if(dialogs.length) {\r\n AppStorage.freezeSaving<typeof DATABASE_STATE>(this.setDialogsFromState.bind(this, dialogs), ['chats', 'dialogs', 'messages', 'users']);\r\n }\r\n\r\n this.allDialogsLoaded = state.allDialogsLoaded || {};\r\n\r\n if(dialogs.length) {\r\n this.appDraftsManager.addMissedDialogs();\r\n }\r\n });\r\n }\r\n\r\n private setDialogsFromState(dialogs: Dialog[]) {\r\n for(let i = 0, length = dialogs.length; i < length; ++i) {\r\n const dialog = dialogs[i];\r\n if(!dialog) {\r\n continue;\r\n }\r\n\r\n // if(dialog.peerId !== SERVICE_PEER_ID) {\r\n dialog.top_message = getServerMessageId(dialog.top_message); // * fix outgoing message to avoid copying dialog\r\n // }\r\n\r\n if(dialog.topMessage) {\r\n this.appMessagesManager.saveMessages([dialog.topMessage]);\r\n }\r\n\r\n for(let i = 0; i <= 21; ++i) {\r\n const indexKey: ReturnType<typeof getDialogIndexKey> = `index_${i}` as any;\r\n delete dialog[indexKey];\r\n }\r\n // delete dialog.indexes;\r\n\r\n this.saveDialog(dialog, undefined, true);\r\n\r\n // ! WARNING, убрать это когда нужно будет делать чтобы pending сообщения сохранялись\r\n const message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\r\n if(!message) {\r\n this.appMessagesManager.reloadConversation(dialog.peerId);\r\n }\r\n }\r\n }\r\n\r\n public isDialogsLoaded(folderId: number) {\r\n return !!this.allDialogsLoaded[folderId];\r\n }\r\n\r\n public setDialogsLoaded(folderId: number, loaded: boolean) {\r\n if(folderId === GLOBAL_FOLDER_ID && loaded) {\r\n this.allDialogsLoaded[FOLDER_ID_ALL] = loaded;\r\n this.allDialogsLoaded[FOLDER_ID_ARCHIVE] = loaded;\r\n } else {\r\n this.allDialogsLoaded[folderId] = loaded;\r\n }\r\n\r\n if(Array.from(REAL_FOLDERS).every((folderId) => this.allDialogsLoaded[folderId])) {\r\n this.allDialogsLoaded[GLOBAL_FOLDER_ID] = true;\r\n }\r\n\r\n this.appStateManager.pushToState('allDialogsLoaded', this.allDialogsLoaded);\r\n }\r\n\r\n public clear = (init = false) => {\r\n if(!init) {\r\n this.storage.clear();\r\n\r\n this.setDialogsLoaded(FOLDER_ID_ALL, false);\r\n this.setDialogsLoaded(FOLDER_ID_ARCHIVE, false);\r\n this.setDialogsLoaded(GLOBAL_FOLDER_ID, false);\r\n\r\n for(const folderId of REAL_FOLDERS) {\r\n this.resetPinnedOrder(folderId);\r\n }\r\n this.savePinnedOrders();\r\n } else {\r\n this.allDialogsLoaded = {};\r\n this.pinnedOrders = {};\r\n for(const folderId of REAL_FOLDERS) {\r\n this.pinnedOrders[folderId] = [];\r\n }\r\n }\r\n\r\n this.folders = {};\r\n this.dialogsOffsetDate = {};\r\n this.dialogsNum = 0;\r\n this.dialogsIndex = new SearchIndex({\r\n clearBadChars: true,\r\n ignoreCase: true,\r\n latinize: true,\r\n includeTag: true\r\n });\r\n this.cachedResults = {\r\n query: '',\r\n count: 0,\r\n dialogs: [],\r\n folderId: 0\r\n };\r\n };\r\n\r\n public handleDialogUnpinning(dialog: Dialog, folderId: number) {\r\n delete dialog.pFlags.pinned;\r\n indexOfAndSplice(this.pinnedOrders[folderId], dialog.peerId);\r\n this.savePinnedOrders();\r\n }\r\n\r\n public savePinnedOrders() {\r\n this.appStateManager.pushToState('pinnedOrders', this.pinnedOrders);\r\n }\r\n\r\n public resetPinnedOrder(folderId: number) {\r\n this.pinnedOrders[folderId].length = 0;\r\n }\r\n\r\n public getPinnedOrders(folderId: number) {\r\n return this.pinnedOrders[folderId];\r\n }\r\n\r\n public getOffsetDate(folderId: number): number {\r\n const offsetDate = this.dialogsOffsetDate[folderId] || 0;\r\n if(folderId === GLOBAL_FOLDER_ID && !offsetDate) { // make request not from beginning if we have loaded some dialogs\r\n return Math.min(...Array.from(REAL_FOLDERS).sort((a, b) => a - b));\r\n }\r\n\r\n return offsetDate;\r\n }\r\n\r\n private generateFolder(id: number) {\r\n const folder: Folder = {\r\n dialogs: [],\r\n id,\r\n unreadMessagesCount: 0,\r\n unreadPeerIds: new Set(),\r\n unreadUnmutedPeerIds: new Set()\r\n };\r\n\r\n defineNotNumerableProperties(folder, ['dispatchUnreadTimeout']);\r\n\r\n return folder;\r\n }\r\n\r\n public getFolder(id: number) {\r\n return this.folders[id] ??= this.generateFolder(id);\r\n }\r\n\r\n public getFolderDialogs(id: number, skipMigrated = true): Dialog[] {\r\n if(id === GLOBAL_FOLDER_ID) { // * it won't be sorted\r\n return this.getCachedDialogs(skipMigrated);\r\n }\r\n\r\n const folder = this.getFolder(id);\r\n return skipMigrated ? folder.dialogs.filter((dialog) => dialog.migratedTo === undefined) : folder.dialogs;\r\n }\r\n\r\n public getNextDialog(currentPeerId: PeerId, next: boolean, filterId: number) {\r\n const folder = this.getFolderDialogs(filterId, true);\r\n let dialog: Dialog;\r\n if(!currentPeerId) {\r\n if(next) {\r\n dialog = folder[0];\r\n }\r\n } else {\r\n const idx = folder.findIndex((dialog) => dialog.peerId === currentPeerId);\r\n if(idx !== -1) {\r\n const nextIndex = next ? idx + 1 : idx - 1;\r\n dialog = folder[nextIndex];\r\n }\r\n }\r\n\r\n return dialog;\r\n }\r\n\r\n public getDialogIndexKeyByFilterId(filterId: number) {\r\n if(REAL_FOLDERS.has(filterId)) return getDialogIndexKey(filterId as REAL_FOLDER_ID);\r\n const filter = this.filtersStorage.getFilter(filterId);\r\n return getDialogIndexKey(filter.localId);\r\n }\r\n\r\n public isPeerUnmuted(peerId: PeerId) {\r\n return !this.appNotificationsManager.isPeerLocalMuted(peerId, true);\r\n }\r\n\r\n public getFolderUnreadCount(filterId: number) {\r\n const folder = this.getFolder(filterId);\r\n return {unreadUnmutedCount: folder.unreadUnmutedPeerIds.size, unreadCount: folder.unreadPeerIds.size};\r\n }\r\n\r\n public getCachedDialogs(skipMigrated?: boolean) {\r\n const arrays = Array.from(REAL_FOLDERS).map((folderId) => this.getFolderDialogs(folderId, skipMigrated));\r\n return [].concat(...arrays) as typeof arrays[0];\r\n }\r\n\r\n private setDialogIndexInFilter(dialog: Dialog, indexKey: ReturnType<typeof getDialogIndexKey>, filter: MyDialogFilter) {\r\n let index: number;\r\n\r\n const isRealFolder = REAL_FOLDERS.has(filter.id);\r\n /* if(isRealFolder) {\r\n // index = getDialogIndex(dialog, indexKey);\r\n index = this.generateIndexForDialog(dialog, true);\r\n } else */if(this.filtersStorage.testDialogForFilter(dialog, filter)) {\r\n const pinnedIndex = filter.pinnedPeerIds.indexOf(dialog.peerId);\r\n if(pinnedIndex !== -1) {\r\n index = this.generateDialogIndex(this.generateDialogPinnedDateByIndex(filter.pinnedPeerIds.length - 1 - pinnedIndex), true);\r\n } else if(dialog.pFlags?.pinned || isRealFolder) {\r\n index = this.generateIndexForDialog(dialog, true, undefined, !isRealFolder);\r\n } else {\r\n index = getDialogIndex(dialog) ?? this.generateIndexForDialog(dialog, true);\r\n }\r\n }\r\n\r\n // if(!dialog.hasOwnProperty(indexKey)) {\r\n // defineNotNumerableProperties(dialog, [indexKey]);\r\n // }\r\n\r\n return setDialogIndex(dialog, indexKey, index);\r\n }\r\n\r\n public getDialog(peerId: PeerId, folderId?: number, skipMigrated = true): [Dialog, number] | [] {\r\n const folders: Dialog[][] = [];\r\n\r\n if(folderId === undefined) {\r\n folders.push(...Array.from(REAL_FOLDERS).map((folderId) => this.getFolder(folderId).dialogs));\r\n } else {\r\n folders.push(this.getFolderDialogs(folderId, false));\r\n }\r\n\r\n for(const folder of folders) {\r\n let i = 0, skipped = 0;\r\n for(let length = folder.length; i < length; ++i) {\r\n const dialog = folder[i];\r\n if(dialog.peerId === peerId) {\r\n return [dialog, i - skipped];\r\n } else if(skipMigrated && dialog.migratedTo !== undefined) {\r\n ++skipped;\r\n }\r\n }\r\n }\r\n\r\n return [];\r\n }\r\n\r\n public getDialogOnly(peerId: PeerId) {\r\n return this.dialogs[peerId];\r\n }\r\n\r\n public getDialogIndex(peerId: PeerId | Dialog, indexKey: ReturnType<typeof getDialogIndexKey>) {\r\n const dialog = isObject(peerId) ? peerId : this.getDialogOnly(peerId);\r\n return getDialogIndex(dialog, indexKey);\r\n }\r\n\r\n /*\r\n var date = Date.now() / 1000 | 0;\r\n var m = date * 0x10000;\r\n\r\n var k = (date + 1) * 0x10000;\r\n k - m;\r\n 65536\r\n */\r\n public generateDialogIndex(date?: number, isPinned?: boolean) {\r\n if(date === undefined) {\r\n date = tsNow(true) + this.timeManager.getServerTimeOffset();\r\n }\r\n\r\n return (date * 0x10000) + (isPinned ? 0 : ((++this.dialogsNum) & 0xFFFF));\r\n }\r\n\r\n public processDialogForFilters(dialog: Dialog) {\r\n // let perf = performance.now();\r\n const filters = this.filtersStorage.getFilters();\r\n for(const id in filters) {\r\n const filter = filters[id];\r\n this.processDialogForFilter(dialog, filter);\r\n }\r\n // spentTime += (performance.now() - perf);\r\n // console.log('generate index time:', spentTime);\r\n }\r\n\r\n public processDialogForFilter(dialog: Dialog, filter: MyDialogFilter) {\r\n const indexKey = this.getDialogIndexKeyByFilterId(filter.id);\r\n const folder = this.getFolder(filter.id);\r\n const dialogs = folder.dialogs;\r\n\r\n const wasIndex = dialogs.findIndex((d) => d.peerId === dialog.peerId);\r\n const wasDialog = dialogs[wasIndex];\r\n const wasDialogIndex = this.getDialogIndex(wasDialog, indexKey);\r\n\r\n const newDialogIndex = this.setDialogIndexInFilter(dialog, indexKey, filter);\r\n\r\n if(wasDialogIndex === newDialogIndex) {\r\n return false;\r\n }\r\n\r\n if((!wasDialogIndex && newDialogIndex) || (wasIndex && !newDialogIndex)) {\r\n this.prepareFolderUnreadCountModifyingByDialog(filter.id, dialog, !!newDialogIndex);\r\n }\r\n\r\n if(wasIndex !== -1) {\r\n dialogs.splice(wasIndex, 1);\r\n }\r\n\r\n if(newDialogIndex) {\r\n insertInDescendSortedArray(dialogs, dialog, (dialog) => this.getDialogIndex(dialog, indexKey), -1);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public prepareDialogUnreadCountModifying(dialog: Dialog) {\r\n const callbacks: NoneToVoidFunction[] = [\r\n this.prepareFolderUnreadCountModifyingByDialog(dialog.folder_id, dialog)\r\n ];\r\n\r\n const filters = this.filtersStorage.getFilters();\r\n for(const id in filters) {\r\n const filter = filters[id];\r\n if(this.filtersStorage.testDialogForFilter(dialog, filter)) {\r\n callbacks.push(this.prepareFolderUnreadCountModifyingByDialog(filter.id, dialog));\r\n }\r\n }\r\n\r\n return () => callbacks.forEach((callback) => callback());\r\n }\r\n\r\n public prepareFolderUnreadCountModifyingByDialog(folderId: number, dialog: Dialog, toggle?: boolean) {\r\n const wasUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\r\n const wasUnmuted = this.isPeerUnmuted(dialog.peerId);\r\n\r\n if(toggle !== undefined) {\r\n const addMessagesCount = toggle ? wasUnreadCount : -wasUnreadCount;\r\n this.modifyFolderUnreadCount(folderId, addMessagesCount, !!wasUnreadCount, wasUnreadCount && wasUnmuted, dialog);\r\n return;\r\n }\r\n\r\n return () => {\r\n const newUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\r\n const newUnmuted = this.isPeerUnmuted(dialog.peerId);\r\n\r\n const addMessagesCount = newUnreadCount - wasUnreadCount;\r\n this.modifyFolderUnreadCount(folderId, addMessagesCount, !!newUnreadCount, newUnreadCount && newUnmuted, dialog);\r\n };\r\n }\r\n\r\n public modifyFolderUnreadCount(\r\n folderId: number,\r\n addMessagesCount: number,\r\n toggleDialog: boolean,\r\n toggleUnmuted: boolean,\r\n dialog: Dialog\r\n ) {\r\n const folder = this.getFolder(folderId);\r\n if(addMessagesCount) {\r\n folder.unreadMessagesCount = Math.max(0, folder.unreadMessagesCount + addMessagesCount);\r\n }\r\n\r\n const {peerId} = dialog;\r\n if(toggleDialog) {\r\n folder.unreadPeerIds.add(peerId);\r\n } else {\r\n folder.unreadPeerIds.delete(peerId);\r\n }\r\n\r\n if(toggleUnmuted) {\r\n folder.unreadUnmutedPeerIds.add(peerId);\r\n } else {\r\n folder.unreadUnmutedPeerIds.delete(peerId);\r\n }\r\n\r\n if(folder.dispatchUnreadTimeout === undefined) {\r\n folder.dispatchUnreadTimeout = ctx.setTimeout(() => {\r\n folder.dispatchUnreadTimeout = undefined;\r\n const _folder = {...folder};\r\n delete _folder.dialogs;\r\n this.rootScope.dispatchEvent('folder_unread', _folder);\r\n }, 0);\r\n }\r\n }\r\n\r\n public generateIndexForDialog(\r\n dialog: Dialog,\r\n justReturn?: boolean,\r\n message?: MyMessage,\r\n noPinnedOrderUpdate?: boolean\r\n ) {\r\n if(!justReturn) {\r\n return;\r\n }\r\n\r\n let topDate = 0, isPinned: boolean;\r\n if(dialog.pFlags.pinned && !noPinnedOrderUpdate) {\r\n topDate = this.generateDialogPinnedDate(dialog);\r\n isPinned = true;\r\n } else {\r\n if(!message) {\r\n message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\r\n }\r\n\r\n topDate = (message as Message.message)?.date || topDate;\r\n\r\n const channelId = this.appPeersManager.isChannel(dialog.peerId) && dialog.peerId.toChatId();\r\n if(channelId) {\r\n const channel: Chat.channel = this.appChatsManager.getChat(channelId);\r\n if(!topDate || (channel.date && channel.date > topDate)) {\r\n topDate = channel.date;\r\n }\r\n }\r\n\r\n if(dialog.draft?._ === 'draftMessage' && dialog.draft.date > topDate) {\r\n topDate = dialog.draft.date;\r\n }\r\n }\r\n\r\n if(!topDate) {\r\n topDate = tsNow(true);\r\n }\r\n\r\n const index = this.generateDialogIndex(topDate, isPinned);\r\n if(justReturn) {\r\n return index;\r\n }\r\n\r\n const indexKey = getDialogIndexKey(dialog.folder_id);\r\n setDialogIndex(dialog, indexKey, index);\r\n }\r\n\r\n public generateDialogPinnedDateByIndex(pinnedIndex: number) {\r\n return 0x7fff0000 + (pinnedIndex & 0xFFFF); // 0xFFFF - потому что в папках может быть бесконечное число пиннедов\r\n }\r\n\r\n public generateDialogPinnedDate(dialog: Dialog) {\r\n const order = this.pinnedOrders[dialog.folder_id];\r\n\r\n let pinnedIndex = order.indexOf(dialog.peerId);\r\n if(pinnedIndex === -1) {\r\n order.unshift(dialog.peerId);\r\n pinnedIndex = 0;\r\n this.savePinnedOrders();\r\n }\r\n\r\n return this.generateDialogPinnedDateByIndex(order.length - 1 - pinnedIndex);\r\n }\r\n\r\n /* public generateDialog(peerId: PeerId) {\r\n const dialog: Dialog = {\r\n _: 'dialog',\r\n pFlags: {},\r\n peer: this.appPeersManager.getOutputPeer(peerId),\r\n top_message: 0,\r\n read_inbox_max_id: 0,\r\n read_outbox_max_id: 0,\r\n unread_count: 0,\r\n unread_mentions_count: 0,\r\n notify_settings: {\r\n _: 'peerNotifySettings',\r\n },\r\n };\r\n\r\n return dialog;\r\n } */\r\n\r\n public setDialogToState(dialog: Dialog) {\r\n const {peerId, pts} = dialog;\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId);\r\n const messagesStorage = this.appMessagesManager.getHistoryMessagesStorage(peerId);\r\n const history = historyStorage.history.slice;\r\n let incomingMessage: MyMessage;\r\n for(let i = 0, length = history.length; i < length; ++i) {\r\n const mid = history[i];\r\n const message: MyMessage = this.appMessagesManager.getMessageFromStorage(messagesStorage, mid);\r\n if(message && !message.pFlags.is_outgoing/* || peerId === SERVICE_PEER_ID */) {\r\n incomingMessage = message;\r\n\r\n const peerIds = getPeerIdsFromMessage(message);\r\n this.peersStorage.requestPeersForKey(peerIds, `topMessage_${peerId}`);\r\n\r\n break;\r\n }\r\n }\r\n\r\n dialog.topMessage = incomingMessage;\r\n\r\n // DO NOT TOUCH THESE LINES, SOME REAL MAGIC HERE.\r\n // * Read service chat when refreshing page with outgoing & getting new service outgoing message\r\n /* if(incomingMessage && dialog.read_inbox_max_id >= dialog.top_message) {\r\n dialog.unread_count = 0;\r\n }\r\n\r\n dialog.read_inbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_inbox_max_id);\r\n dialog.read_outbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_outbox_max_id); */\r\n // CAN TOUCH NOW\r\n\r\n if(peerId.isAnyChat() && pts) {\r\n const newPts = this.apiUpdatesManager.getChannelState(peerId.toChatId(), pts).pts;\r\n dialog.pts = newPts;\r\n }\r\n\r\n this.storage.set({\r\n [peerId]: dialog\r\n });\r\n\r\n this.peersStorage.requestPeer(peerId, 'dialog');\r\n\r\n /* for(let id in this.filtersStorage.filters) {\r\n const filter = this.filtersStorage.filters[id];\r\n\r\n if(this.filtersStorage.testDialogForFilter(dialog, filter)) {\r\n\r\n }\r\n } */\r\n }\r\n\r\n public pushDialog(dialog: Dialog, offsetDate?: number, ignoreOffsetDate?: boolean, saveGlobalOffset?: boolean) {\r\n const {folder_id, peerId} = dialog;\r\n\r\n this.dialogs[peerId] = dialog;\r\n\r\n offsetDate ??= this.getDialogOffsetDate(dialog);\r\n\r\n this.processDialogForFilters(dialog);\r\n\r\n if(offsetDate && !dialog.pFlags.pinned) {\r\n if(saveGlobalOffset) {\r\n const savedGlobalOffsetDate = this.dialogsOffsetDate[GLOBAL_FOLDER_ID];\r\n if(!savedGlobalOffsetDate || offsetDate < savedGlobalOffsetDate) {\r\n this.dialogsOffsetDate[GLOBAL_FOLDER_ID] = offsetDate;\r\n }\r\n }\r\n\r\n const savedOffsetDate = this.dialogsOffsetDate[folder_id];\r\n if(!savedOffsetDate || offsetDate < savedOffsetDate) {\r\n // if(pos !== -1) {\r\n if(!ignoreOffsetDate && !this.isDialogsLoaded(folder_id)) {\r\n this.dropDialog(peerId, true);\r\n return;\r\n }\r\n\r\n this.dialogsOffsetDate[folder_id] = offsetDate;\r\n }\r\n }\r\n\r\n this.setDialogToState(dialog);\r\n\r\n // if(pos === -1) {\r\n // this.prepareFolderUnreadCountModifyingByDialog(folder_id, dialog, true);\r\n // }\r\n\r\n // const indexKey = getDialogIndexKey(folder_id);\r\n // /* const newPos = */insertInDescendSortedArray(dialogs, dialog, (dialog) => getDialogIndex(dialog, indexKey), -1);\r\n /* if(pos !== -1 && pos !== newPos) {\r\n rootScope.dispatchEvent('dialog_order', {dialog, pos: newPos});\r\n } */\r\n }\r\n\r\n public dropDialogFromFolders(peerId: PeerId) {\r\n const foundDialog = this.getDialog(peerId, undefined, false);\r\n const [dialog, index] = foundDialog;\r\n if(dialog) {\r\n const folder = this.getFolder(dialog.folder_id);\r\n folder.dialogs.splice(index, 1);\r\n const wasPinned = indexOfAndSplice(this.pinnedOrders[dialog.folder_id], peerId) !== undefined;\r\n\r\n this.processDialogForFilters(dialog);\r\n\r\n this.dialogsIndex.indexObject(peerId, '');\r\n\r\n if(wasPinned) {\r\n this.savePinnedOrders();\r\n }\r\n }\r\n\r\n return foundDialog;\r\n }\r\n\r\n public dropDialog(peerId: PeerId, keepLocal?: boolean): ReturnType<DialogsStorage['getDialog']> {\r\n const dialog = this.getDialogOnly(peerId);\r\n const foundDialog = this.dropDialogFromFolders(peerId);\r\n if(dialog) {\r\n if(!keepLocal) {\r\n delete this.dialogs[peerId];\r\n }\r\n\r\n this.clearDialogFromState(dialog, keepLocal);\r\n }\r\n\r\n return foundDialog;\r\n }\r\n\r\n public clearDialogFromState(dialog: Dialog, keepLocal: boolean) {\r\n const peerId = dialog.peerId;\r\n this.peersStorage.requestPeersForKey([], `topMessage_${peerId}`);\r\n this.peersStorage.releasePeer(peerId, 'dialog');\r\n this.storage.delete(peerId, keepLocal);\r\n }\r\n\r\n public dropDialogWithEvent(peerId: PeerId) {\r\n const dropped = this.dropDialog(peerId);\r\n if(dropped.length) {\r\n this.rootScope.dispatchEvent('dialog_drop', {peerId, dialog: dropped[0]});\r\n }\r\n\r\n return dropped;\r\n }\r\n\r\n /**\r\n * leaving chat, leaving channel, deleting private dialog\r\n */\r\n public dropDialogOnDeletion(peerId: PeerId) {\r\n this.dropDialogWithEvent(peerId);\r\n this.rootScope.dispatchEvent('peer_deleted', peerId);\r\n }\r\n\r\n public applyDialogs(dialogsResult: MessagesPeerDialogs.messagesPeerDialogs) {\r\n // * В эту функцию попадут только те диалоги, в которых есть read_inbox_max_id и read_outbox_max_id, в отличие от тех, что будут в getTopMessages\r\n\r\n // ! fix 'dialogFolder', maybe there is better way to do it, this only can happen by 'messages.getPinnedDialogs' by folder_id: 0\r\n forEachReverse(dialogsResult.dialogs, (dialog, idx) => {\r\n if(dialog._ === 'dialogFolder') {\r\n dialogsResult.dialogs.splice(idx, 1);\r\n }\r\n });\r\n\r\n this.appUsersManager.saveApiUsers(dialogsResult.users);\r\n this.appChatsManager.saveApiChats(dialogsResult.chats);\r\n this.appMessagesManager.saveMessages(dialogsResult.messages);\r\n\r\n // this.appMessagesManager.log('applyConversation', dialogsResult);\r\n\r\n const updatedDialogs: Map<PeerId, Dialog> = new Map();\r\n (dialogsResult.dialogs as Dialog[]).forEach((dialog) => {\r\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\r\n let topMid = dialog.top_message;\r\n\r\n const topPendingMid = this.appMessagesManager.pendingTopMsgs[peerId];\r\n if(topPendingMid) {\r\n const topPendingMessage = this.appMessagesManager.getMessageByPeer(peerId, topPendingMid) as MyMessage;\r\n const topMessage = this.appMessagesManager.getMessageByPeer(peerId, topMid) as MyMessage;\r\n if(!topMid || (topPendingMessage && (!topMessage || topPendingMessage?.date > topMessage?.date))) {\r\n dialog.top_message = topMid = topPendingMid;\r\n this.appMessagesManager.getHistoryStorage(peerId).maxId = topPendingMid;\r\n }\r\n }\r\n\r\n /* const d = Object.assign({}, dialog);\r\n if(peerId === 239602833) {\r\n this.log.error('applyConversation lun', dialog, d);\r\n } */\r\n\r\n if(topMid || dialog.draft?._ === 'draftMessage') {\r\n if(this.saveDialog(dialog)) {\r\n updatedDialogs.set(peerId, dialog);\r\n }\r\n } else {\r\n this.dropDialogWithEvent(peerId);\r\n }\r\n\r\n const updates = this.appMessagesManager.newUpdatesAfterReloadToHandle[peerId];\r\n if(updates !== undefined) {\r\n for(const update of updates) {\r\n updates.delete(update);\r\n this.apiUpdatesManager.saveUpdate(update);\r\n }\r\n\r\n if(!updates.size) {\r\n delete this.appMessagesManager.newUpdatesAfterReloadToHandle[peerId];\r\n }\r\n }\r\n });\r\n\r\n if(updatedDialogs.size) {\r\n this.rootScope.dispatchEvent('dialogs_multiupdate', updatedDialogs);\r\n }\r\n }\r\n\r\n private getDialogOffsetDate(dialog: Dialog) {\r\n const message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\r\n return message?.date || 0;\r\n }\r\n\r\n public canSaveDialogByPeerId(peerId: PeerId) {\r\n if(peerId.isAnyChat()) {\r\n const chat: Chat = this.appChatsManager.getChat(peerId.toChatId());\r\n // ! chatForbidden stays for chat where you're kicked\r\n if(\r\n chat._ === 'channelForbidden' ||\r\n // || chat._ === 'chatForbidden'\r\n (chat as Chat.chat).pFlags.left\r\n // || (chat as any).pFlags.kicked\r\n ) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Won't save migrated from peer, forbidden peers, left and kicked\r\n */\r\n public saveDialog(dialog: Dialog, folderId = dialog.folder_id ?? FOLDER_ID_ALL, ignoreOffsetDate?: boolean, saveGlobalOffset?: boolean) {\r\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\r\n if(!peerId) {\r\n console.error('saveConversation no peerId???', dialog, folderId);\r\n return false;\r\n }\r\n\r\n if(dialog._ !== 'dialog'/* || peerId === 239602833 */) {\r\n console.error('saveConversation not regular dialog', dialog, Object.assign({}, dialog));\r\n }\r\n\r\n if(!this.canSaveDialogByPeerId(peerId)) {\r\n return false;\r\n }\r\n\r\n const channelId = this.appPeersManager.isChannel(peerId) ? peerId.toChatId() : NULL_PEER_ID;\r\n\r\n const peerText = this.appPeersManager.getPeerSearchText(peerId);\r\n this.dialogsIndex.indexObject(peerId, peerText);\r\n\r\n const wasDialogBefore = this.getDialogOnly(peerId);\r\n\r\n let mid: number, message: MyMessage;\r\n if(dialog.top_message) {\r\n mid = generateMessageId(dialog.top_message);// dialog.top_message;\r\n\r\n // preserve outgoing message\r\n const wasTopMessage = wasDialogBefore?.top_message && this.appMessagesManager.getMessageByPeer(peerId, wasDialogBefore.top_message) as MyMessage;\r\n if(wasTopMessage?.pFlags?.is_outgoing && wasDialogBefore.top_message >= mid) {\r\n mid = wasDialogBefore.top_message;\r\n }\r\n\r\n message = this.appMessagesManager.getMessageByPeer(peerId, mid);\r\n } else {\r\n mid = this.appMessagesManager.generateTempMessageId(peerId);\r\n message = {\r\n _: 'message',\r\n id: mid,\r\n mid,\r\n from_id: this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(false)),\r\n peer_id: this.appPeersManager.getOutputPeer(peerId),\r\n deleted: true,\r\n pFlags: {out: true},\r\n date: 0,\r\n message: ''\r\n };\r\n this.appMessagesManager.saveMessages([message], {isOutgoing: true});\r\n }\r\n\r\n if(!message?.pFlags) {\r\n this.appMessagesManager.log.error('saveConversation no message:', dialog, message);\r\n }\r\n\r\n if(!channelId && peerId.isAnyChat()) {\r\n const chat = this.appChatsManager.getChat(peerId.toChatId());\r\n if(chat && chat.migrated_to && chat.pFlags.deactivated) {\r\n const migratedToPeer = this.appPeersManager.getPeerId(chat.migrated_to);\r\n this.appMessagesManager.migratedFromTo[peerId] = migratedToPeer;\r\n this.appMessagesManager.migratedToFrom[migratedToPeer] = peerId;\r\n dialog.migratedTo = migratedToPeer;\r\n // return;\r\n }\r\n }\r\n\r\n dialog.top_message = mid;\r\n // dialog.unread_count = wasDialogBefore && dialog.read_inbox_max_id === getServerMessageId(wasDialogBefore.read_inbox_max_id) ? wasDialogBefore.unread_count : dialog.unread_count;\r\n dialog.read_inbox_max_id = generateMessageId(wasDialogBefore && !dialog.read_inbox_max_id ? wasDialogBefore.read_inbox_max_id : dialog.read_inbox_max_id);\r\n dialog.read_outbox_max_id = generateMessageId(wasDialogBefore && !dialog.read_outbox_max_id ? wasDialogBefore.read_outbox_max_id : dialog.read_outbox_max_id);\r\n\r\n if(dialog.folder_id === undefined) {\r\n if(dialog._ === 'dialog') {\r\n // ! СЛОЖНО ! СМОТРИ В getTopMessages\r\n dialog.folder_id = wasDialogBefore ? wasDialogBefore.folder_id : folderId;\r\n }/* else if(dialog._ === 'dialogFolder') {\r\n dialog.folder_id = dialog.folder.id;\r\n } */\r\n }\r\n\r\n dialog.draft = this.appDraftsManager.saveDraft(peerId, 0, dialog.draft);\r\n dialog.peerId = peerId;\r\n // dialog.indexes ??= {} as any;\r\n\r\n // if(dialog.peerId === -) {\r\n // debugger;\r\n // }\r\n\r\n // Because we saved message without dialog present\r\n if(message && message.pFlags.is_outgoing) {\r\n const isOut = message.pFlags.out;\r\n if(mid > dialog[isOut ? 'read_outbox_max_id' : 'read_inbox_max_id']) {\r\n message.pFlags.unread = true;\r\n\r\n if(!dialog.unread_count && !isOut) {\r\n ++dialog.unread_count;\r\n }\r\n } else {\r\n delete message.pFlags.unread;\r\n }\r\n }\r\n\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId);\r\n const slice = historyStorage.history.slice;\r\n /* if(historyStorage === undefined) { // warning\r\n historyStorage.history.push(mid);\r\n } else */if(!slice.length) {\r\n historyStorage.history.unshift(mid);\r\n historyStorage.count ||= 1;\r\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\r\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\r\n }\r\n } else if(!slice.isEnd(SliceEnd.Bottom)) { // * this will probably never happen, however, if it does, then it will fix slice with top_message\r\n const slice = historyStorage.history.insertSlice([mid]);\r\n slice.setEnd(SliceEnd.Bottom);\r\n historyStorage.count ||= 1;\r\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\r\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\r\n }\r\n }\r\n\r\n historyStorage.maxId = mid;\r\n historyStorage.readMaxId = dialog.read_inbox_max_id;\r\n historyStorage.readOutboxMaxId = dialog.read_outbox_max_id;\r\n\r\n this.appNotificationsManager.savePeerSettings({\r\n peerId,\r\n settings: dialog.notify_settings\r\n });\r\n\r\n if(channelId && dialog.pts) {\r\n this.apiUpdatesManager.addChannelState(channelId, dialog.pts);\r\n }\r\n\r\n this.generateIndexForDialog(dialog);\r\n\r\n if(wasDialogBefore) {\r\n // fix unread count\r\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(wasDialogBefore);\r\n safeReplaceObject(wasDialogBefore, dialog);\r\n releaseUnreadCount();\r\n }\r\n\r\n this.pushDialog(dialog, message?.date, ignoreOffsetDate, saveGlobalOffset);\r\n\r\n return true;\r\n }\r\n\r\n public getDialogs(query = '', offsetIndex?: number, limit = 20, folderId: number = 0, skipMigrated = false): {\r\n dialogs: Dialog[],\r\n count: number,\r\n isTopEnd: boolean,\r\n isEnd: boolean\r\n } | Promise<{\r\n dialogs: Dialog[],\r\n count: number,\r\n isTopEnd: boolean,\r\n isEnd: boolean\r\n }> {\r\n if(!REAL_FOLDERS.has(folderId)) {\r\n const promises: Promise<any>[] = [];\r\n\r\n const fillContactsResult = this.appUsersManager.fillContacts();\r\n if(!fillContactsResult.cached) {\r\n promises.push(fillContactsResult.promise);\r\n }\r\n\r\n const reloadMissingDialogsPromise = this.filtersStorage.reloadMissingPeerIds(folderId);\r\n if(reloadMissingDialogsPromise) {\r\n promises.push(reloadMissingDialogsPromise);\r\n }\r\n\r\n if(promises.length) {\r\n return Promise.all(promises).then(() => {\r\n return this.getDialogs(query, offsetIndex, limit, folderId, skipMigrated);\r\n });\r\n }\r\n }\r\n\r\n // let's load only first pages by certain folderId. next pages will load without folder filtering\r\n const realFolderId: REAL_FOLDER_ID = !REAL_FOLDERS.has(folderId) || this.getOffsetDate(folderId) ? GLOBAL_FOLDER_ID : folderId as REAL_FOLDER_ID;\r\n let curDialogStorage = this.getFolderDialogs(folderId, skipMigrated);\r\n\r\n const indexKey = this.getDialogIndexKeyByFilterId(folderId);\r\n\r\n if(query) {\r\n if(!limit || this.cachedResults.query !== query || this.cachedResults.folderId !== folderId) {\r\n this.cachedResults.query = query;\r\n this.cachedResults.folderId = folderId;\r\n\r\n const results = this.dialogsIndex.search(query);\r\n\r\n const dialogs: Dialog[] = [];\r\n for(const peerId in this.dialogs) {\r\n const dialog = this.dialogs[peerId];\r\n if(results.has(dialog.peerId) && dialog.folder_id === folderId) {\r\n dialogs.push(dialog);\r\n }\r\n }\r\n\r\n dialogs.sort((d1, d2) => this.getDialogIndex(d2, indexKey) - this.getDialogIndex(d1, indexKey));\r\n this.cachedResults.dialogs = dialogs;\r\n this.cachedResults.count = dialogs.length;\r\n }\r\n\r\n curDialogStorage = this.cachedResults.dialogs;\r\n } else {\r\n this.cachedResults.query = '';\r\n }\r\n\r\n let offset = 0;\r\n if(offsetIndex > 0) {\r\n for(let length = curDialogStorage.length; offset < length; ++offset) {\r\n if(offsetIndex > this.getDialogIndex(curDialogStorage[offset], indexKey)) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const loadedAll = this.isDialogsLoaded(realFolderId);\r\n const isEnoughDialogs = curDialogStorage.length >= (offset + limit);\r\n if(query || loadedAll || isEnoughDialogs) {\r\n const dialogs = curDialogStorage.slice(offset, offset + limit);\r\n return {\r\n dialogs,\r\n count: loadedAll ? curDialogStorage.length : null,\r\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || this.getDialogIndex(curDialogStorage[0], indexKey) < offsetIndex),\r\n isEnd: (query || loadedAll) && (offset + limit) >= curDialogStorage.length\r\n };\r\n }\r\n\r\n return this.appMessagesManager.getTopMessages(limit, realFolderId).then((result) => {\r\n // const curDialogStorage = this[folderId];\r\n if(skipMigrated) {\r\n curDialogStorage = this.getFolderDialogs(folderId, skipMigrated);\r\n }\r\n\r\n offset = 0;\r\n if(offsetIndex > 0) {\r\n for(let length = curDialogStorage.length; offset < length; ++offset) {\r\n if(offsetIndex > this.getDialogIndex(curDialogStorage[offset], indexKey)) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // this.log.warn(offset, offset + limit, curDialogStorage.dialogs.length, this.dialogs.length);\r\n\r\n const dialogs = curDialogStorage.slice(offset, offset + limit);\r\n return {\r\n dialogs,\r\n count: result.count === undefined ? curDialogStorage.length : result.count,\r\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || this.getDialogIndex(curDialogStorage[0], indexKey) < offsetIndex),\r\n // isEnd: this.isDialogsLoaded(realFolderId) && (offset + limit) >= curDialogStorage.length\r\n isEnd: result.isEnd\r\n };\r\n });\r\n }\r\n\r\n // only 0 and 1 folders\r\n private onUpdateFolderPeers = (update: Update.updateFolderPeers) => {\r\n // this.log('updateFolderPeers', update);\r\n const peers = update.folder_peers;\r\n\r\n peers.forEach((folderPeer) => {\r\n const {folder_id, peer} = folderPeer;\r\n\r\n const peerId = this.appPeersManager.getPeerId(peer);\r\n const dialog = this.dropDialog(peerId)[0];\r\n if(dialog) {\r\n if(dialog.pFlags?.pinned) {\r\n this.handleDialogUnpinning(dialog, folder_id);\r\n }\r\n\r\n dialog.folder_id = folder_id as REAL_FOLDER_ID;\r\n this.generateIndexForDialog(dialog);\r\n this.pushDialog(dialog); // need for simultaneously updatePinnedDialogs\r\n }\r\n\r\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\r\n });\r\n };\r\n\r\n private onUpdateDialogPinned = (update: Update.updateDialogPinned) => {\r\n const folderId = update.folder_id ?? FOLDER_ID_ALL;\r\n // this.log('updateDialogPinned', update);\r\n const peerId = this.appPeersManager.getPeerId((update.peer as DialogPeer.dialogPeer).peer);\r\n const dialog = this.getDialogOnly(peerId);\r\n\r\n // этот код внизу никогда не сработает, в папках за пиннед отвечает updateDialogFilter\r\n /* if(update.folder_id > 1) {\r\n const filter = this.filtersStorage.filters[update.folder_id];\r\n if(update.pFlags.pinned) {\r\n filter.pinned_peers.unshift(peerId);\r\n } else {\r\n filter.pinned_peers.findAndSplice((p) => p === peerId);\r\n }\r\n } */\r\n\r\n if(dialog) {\r\n if(!update.pFlags.pinned) {\r\n this.handleDialogUnpinning(dialog, folderId);\r\n } else { // means set\r\n dialog.pFlags.pinned = true;\r\n }\r\n\r\n this.generateIndexForDialog(dialog);\r\n }\r\n\r\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\r\n };\r\n\r\n private onUpdatePinnedDialogs = (update: Update.updatePinnedDialogs) => {\r\n const folderId = update.folder_id ?? FOLDER_ID_ALL;\r\n\r\n const handleOrder = (order: PeerId[]) => {\r\n this.resetPinnedOrder(folderId);\r\n this.pinnedOrders[folderId].push(...order);\r\n this.savePinnedOrders();\r\n order.reverse(); // index must be higher\r\n order.forEach((peerId) => {\r\n newPinned[peerId] = true;\r\n\r\n const dialog = this.getDialogOnly(peerId);\r\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\r\n if(!dialog) {\r\n return;\r\n }\r\n\r\n dialog.pFlags.pinned = true;\r\n this.generateIndexForDialog(dialog);\r\n });\r\n\r\n const dialogs = this.getFolderDialogs(folderId, false);\r\n for(const dialog of dialogs) {\r\n if(!dialog.pFlags.pinned) {\r\n break;\r\n }\r\n\r\n const peerId = dialog.peerId;\r\n if(!newPinned[peerId]) {\r\n this.appMessagesManager.scheduleHandleNewDialogs(peerId);\r\n }\r\n }\r\n };\r\n\r\n // this.log('updatePinnedDialogs', update);\r\n const newPinned: {[peerId: PeerId]: true} = {};\r\n if(!update.order) {\r\n this.apiManager.invokeApi('messages.getPinnedDialogs', {\r\n folder_id: folderId\r\n }).then((dialogsResult) => {\r\n // * for test reordering and rendering\r\n // dialogsResult.dialogs.reverse();\r\n\r\n this.applyDialogs(dialogsResult);\r\n\r\n handleOrder(dialogsResult.dialogs.map((d) => d.peerId));\r\n\r\n /* dialogsResult.dialogs.forEach((dialog) => {\r\n newPinned[dialog.peerId] = true;\r\n });\r\n\r\n this.dialogsStorage.getFolder(folderId).forEach((dialog) => {\r\n const peerId = dialog.peerId;\r\n if(dialog.pFlags.pinned && !newPinned[peerId]) {\r\n this.newDialogsToHandle[peerId] = {reload: true};\r\n this.scheduleHandleNewDialogs();\r\n }\r\n }); */\r\n });\r\n\r\n return;\r\n }\r\n\r\n // this.log('before order:', this.dialogsStorage[0].map((d) => d.peerId));\r\n\r\n handleOrder(update.order.map((peer) => this.appPeersManager.getPeerId((peer as DialogPeer.dialogPeer).peer)));\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {DialogFilter, Update} from '../../layer';\r\nimport type {Dialog} from '../appManagers/appMessagesManager';\r\nimport forEachReverse from '../../helpers/array/forEachReverse';\r\nimport copy from '../../helpers/object/copy';\r\nimport {AppManager} from '../appManagers/manager';\r\nimport findAndSplice from '../../helpers/array/findAndSplice';\r\nimport assumeType from '../../helpers/assumeType';\r\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, REAL_FOLDERS, REAL_FOLDER_ID, START_LOCAL_ID} from '../mtproto/mtproto_config';\r\nimport makeError from '../../helpers/makeError';\r\n\r\nexport type MyDialogFilter = DialogFilter.dialogFilter;\r\n\r\nconst convertment = [\r\n ['pinned_peers', 'pinnedPeerIds'],\r\n ['exclude_peers', 'excludePeerIds'],\r\n ['include_peers', 'includePeerIds']\r\n] as ['pinned_peers' | 'exclude_peers' | 'include_peers', 'pinnedPeerIds' | 'excludePeerIds' | 'includePeerIds'][];\r\n\r\nconst PREPENDED_FILTERS = REAL_FOLDERS.size;\r\n\r\nconst LOCAL_FILTER: MyDialogFilter = {\r\n _: 'dialogFilter',\r\n pFlags: {},\r\n flags: 0,\r\n id: 0,\r\n title: '',\r\n exclude_peers: [],\r\n include_peers: [],\r\n pinned_peers: [],\r\n excludePeerIds: [],\r\n includePeerIds: [],\r\n pinnedPeerIds: []\r\n};\r\n\r\nexport default class FiltersStorage extends AppManager {\r\n private filters: {[filterId: string]: MyDialogFilter};\r\n private filtersArr: Array<MyDialogFilter>;\r\n private localFilters: {[filterId: string]: MyDialogFilter};\r\n private localId: number;\r\n private reloadedPeerIds: Set<PeerId>;\r\n\r\n protected after() {\r\n this.clear(true);\r\n\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updateDialogFilter: this.onUpdateDialogFilter,\r\n\r\n updateDialogFilters: this.onUpdateDialogFilters,\r\n\r\n updateDialogFilterOrder: this.onUpdateDialogFilterOrder\r\n });\r\n\r\n // delete peers when dialog is being dropped\r\n /* rootScope.addEventListener('peer_deleted', (peerId) => {\r\n for(const filterId in this.filters) {\r\n const filter = this.filters[filterId];\r\n let modified = false;\r\n [filter.pinned_peers, filter.include_peers, filter.exclude_peers].forEach((arr) => {\r\n forEachReverse(arr, (inputPeer, idx) => {\r\n if(getPeerId(inputPeer) === peerId) {\r\n arr.splice(idx, 1);\r\n modified = true;\r\n }\r\n });\r\n });\r\n\r\n if(modified) {\r\n this.saveDialogFilter(filter, true);\r\n }\r\n }\r\n }); */\r\n\r\n this.rootScope.addEventListener('premium_toggle', () => {\r\n this.onUpdateDialogFilters({_: 'updateDialogFilters'});\r\n });\r\n\r\n return this.appStateManager.getState().then((state) => {\r\n const filtersArr = this.prependFilters(state.filtersArr);\r\n filtersArr.map((filter) => {\r\n this.saveDialogFilter(filter, false, true);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * ! use it only with saving\r\n */\r\n private prependFilters(filters: DialogFilter[]) {\r\n filters = filters.slice();\r\n\r\n const allChatsFilter = this.localFilters[FOLDER_ID_ALL];\r\n const archiveFilter = this.localFilters[FOLDER_ID_ARCHIVE];\r\n\r\n const allChatsFilterIndex = filters.findIndex((filter) => filter._ === 'dialogFilterDefault' || filter.id === FOLDER_ID_ALL);\r\n if(allChatsFilterIndex !== -1) filters[allChatsFilterIndex] = allChatsFilter;\r\n else filters.unshift(allChatsFilter);\r\n\r\n findAndSplice(filters, (filter) => (filter as MyDialogFilter).id === FOLDER_ID_ARCHIVE);\r\n filters.splice(/* 1 */filters[0] === allChatsFilter ? 1 : 0, 0, archiveFilter);\r\n\r\n this.localId = START_LOCAL_ID;\r\n filters.forEach((filter) => {\r\n delete filter.localId;\r\n });\r\n\r\n return filters;\r\n }\r\n\r\n private generateLocalFilter(id: REAL_FOLDER_ID) {\r\n const filter: MyDialogFilter = {...copy(LOCAL_FILTER), id};\r\n if(id === FOLDER_ID_ALL) {\r\n filter.pFlags.exclude_archived = true;\r\n } else if(id === FOLDER_ID_ARCHIVE) {\r\n filter.pFlags.exclude_unarchived = true;\r\n }\r\n\r\n if(REAL_FOLDERS.has(id)) {\r\n filter.pinnedPeerIds = this.dialogsStorage.getPinnedOrders(id);\r\n }\r\n\r\n return filter;\r\n }\r\n\r\n // private getLocalFilter(id: number) {\r\n // return this.filters[id] ??= this.generateLocalFilter(id);\r\n // }\r\n\r\n public clear = (init?: boolean) => {\r\n if(!init) {\r\n // safeReplaceObject(this.filters, {});\r\n this.reloadedPeerIds.clear();\r\n this.clearFilters();\r\n } else {\r\n this.filters = {};\r\n this.filtersArr = [];\r\n this.reloadedPeerIds = new Set();\r\n\r\n this.localFilters = {};\r\n for(const filterId of REAL_FOLDERS) {\r\n this.localFilters[filterId] = this.generateLocalFilter(filterId as REAL_FOLDER_ID);\r\n }\r\n }\r\n\r\n this.localId = START_LOCAL_ID;\r\n };\r\n\r\n private onUpdateDialogFilter = (update: Update.updateDialogFilter) => {\r\n if(update.filter) {\r\n this.saveDialogFilter(update.filter as any);\r\n } else if(this.filters[update.id]) { // Папка удалена\r\n // this.getDialogFilters(true);\r\n this.rootScope.dispatchEvent('filter_delete', this.filters[update.id]);\r\n delete this.filters[update.id];\r\n findAndSplice(this.filtersArr, (filter) => (filter as DialogFilter.dialogFilter).id === update.id);\r\n }\r\n\r\n this.pushToState();\r\n };\r\n\r\n private onUpdateDialogFilters = (update: Update.updateDialogFilters) => {\r\n // console.warn('updateDialogFilters', update);\r\n\r\n const oldFilters = copy(this.filters);\r\n\r\n this.getDialogFilters(true).then((filters) => {\r\n for(const _filterId in oldFilters) {\r\n const filterId = +_filterId;\r\n if(!filters.find((filter) => filter.id === filterId)) { // * deleted\r\n this.onUpdateDialogFilter({_: 'updateDialogFilter', id: filterId});\r\n }\r\n }\r\n\r\n this.onUpdateDialogFilterOrder({_: 'updateDialogFilterOrder', order: filters.map((filter) => filter.id)});\r\n });\r\n };\r\n\r\n private onUpdateDialogFilterOrder = (update: Update.updateDialogFilterOrder) => {\r\n // console.log('updateDialogFilterOrder', update);\r\n\r\n const order = update.order.slice();\r\n if(!order.includes(FOLDER_ID_ARCHIVE)) {\r\n order.splice(order[0] === FOLDER_ID_ALL ? 1 : 0, 0, FOLDER_ID_ARCHIVE);\r\n }\r\n\r\n this.localId = START_LOCAL_ID;\r\n order.forEach((filterId) => {\r\n const filter = this.filters[filterId];\r\n delete filter.localId;\r\n this.setLocalId(filter);\r\n });\r\n\r\n this.rootScope.dispatchEvent('filter_order', order);\r\n\r\n this.pushToState();\r\n };\r\n\r\n private pushToState() {\r\n this.appStateManager.pushToState('filtersArr', this.filtersArr);\r\n }\r\n\r\n public testDialogForFilter(dialog: Dialog, filter: MyDialogFilter) {\r\n if(REAL_FOLDERS.has(filter.id)) {\r\n return dialog.folder_id === filter.id && this.dialogsStorage.canSaveDialogByPeerId(dialog.peerId);\r\n }\r\n\r\n const peerId = dialog.peerId;\r\n\r\n // * check whether dialog exists\r\n if(!this.appMessagesManager.getDialogOnly(peerId)) {\r\n return false;\r\n }\r\n\r\n // exclude_peers\r\n if(filter.excludePeerIds.includes(peerId)) {\r\n return false;\r\n }\r\n\r\n // include_peers\r\n if(filter.includePeerIds.includes(peerId)) {\r\n return true;\r\n }\r\n\r\n const pFlags = filter.pFlags;\r\n\r\n // exclude_archived\r\n if(pFlags.exclude_archived && dialog.folder_id === FOLDER_ID_ARCHIVE) {\r\n return false;\r\n }\r\n\r\n // exclude_read\r\n if(pFlags.exclude_read && !this.appMessagesManager.isDialogUnread(dialog)) {\r\n return false;\r\n }\r\n\r\n // exclude_muted\r\n if(pFlags.exclude_muted && this.appNotificationsManager.isPeerLocalMuted(peerId) && !(dialog.unread_mentions_count && dialog.unread_count)) {\r\n return false;\r\n }\r\n\r\n if(this.appPeersManager.isAnyChat(peerId)) {\r\n // broadcasts\r\n if(pFlags.broadcasts && this.appPeersManager.isBroadcast(peerId)) {\r\n return true;\r\n }\r\n\r\n // groups\r\n if(pFlags.groups && this.appPeersManager.isAnyGroup(peerId)) {\r\n return true;\r\n }\r\n } else {\r\n const userId = peerId.toUserId();\r\n\r\n // bots\r\n if(this.appUsersManager.isBot(userId)) {\r\n return !!pFlags.bots;\r\n }\r\n\r\n // non_contacts\r\n if(pFlags.non_contacts && !this.appUsersManager.isContact(userId)) {\r\n return true;\r\n }\r\n\r\n // contacts\r\n if(pFlags.contacts && this.appUsersManager.isContact(userId)) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public testDialogForFilterId(dialog: Dialog, filterId: number) {\r\n return this.testDialogForFilter(dialog, this.filters[filterId]);\r\n }\r\n\r\n public getFilter(filterId: number) {\r\n return this.filters[filterId];\r\n }\r\n\r\n public getFilters() {\r\n return this.filters;\r\n }\r\n\r\n public clearFilters() {\r\n const filters = this.getFilters();\r\n for(const filterId in filters) { // delete filters\r\n if(REAL_FOLDERS.has(+filterId)) {\r\n continue;\r\n }\r\n\r\n this.onUpdateDialogFilter({\r\n _: 'updateDialogFilter',\r\n id: +filterId\r\n });\r\n }\r\n }\r\n\r\n public async toggleDialogPin(peerId: PeerId, filterId: number) {\r\n const filter = this.filters[filterId];\r\n\r\n const index = filter.pinnedPeerIds.indexOf(peerId);\r\n const wasPinned = index !== -1;\r\n\r\n if(wasPinned) {\r\n filter.pinned_peers.splice(index, 1);\r\n filter.pinnedPeerIds.splice(index, 1);\r\n }\r\n\r\n if(!wasPinned) {\r\n if(filter.pinned_peers.length >= (await this.apiManager.getConfig()).pinned_infolder_count_max) {\r\n return Promise.reject(makeError('PINNED_DIALOGS_TOO_MUCH'));\r\n }\r\n\r\n filter.pinned_peers.unshift(this.appPeersManager.getInputPeerById(peerId));\r\n filter.pinnedPeerIds.unshift(peerId);\r\n }\r\n\r\n return this.updateDialogFilter(filter);\r\n }\r\n\r\n public createDialogFilter(filter: MyDialogFilter, prepend?: boolean) {\r\n const maxId = Math.max(1, ...Object.keys(this.filters).map((i) => +i));\r\n filter = copy(filter);\r\n filter.id = maxId + 1;\r\n return this.updateDialogFilter(filter, undefined, prepend);\r\n }\r\n\r\n public updateDialogFilter(filter: MyDialogFilter, remove = false, prepend = false) {\r\n const flags = remove ? 0 : 1;\r\n\r\n return this.apiManager.invokeApi('messages.updateDialogFilter', {\r\n flags,\r\n id: filter.id,\r\n filter: remove ? undefined : this.getOutputDialogFilter(filter)\r\n }).then((bool: boolean) => { // возможно нужна проверка и откат, если результат не ТРУ\r\n // console.log('updateDialogFilter bool:', bool);\r\n\r\n if(bool) {\r\n /* if(!this.filters[filter.id]) {\r\n this.saveDialogFilter(filter);\r\n }\r\n\r\n rootScope.$broadcast('filter_update', filter); */\r\n\r\n this.onUpdateDialogFilter({\r\n _: 'updateDialogFilter',\r\n id: filter.id,\r\n filter: remove ? undefined : filter as any\r\n });\r\n\r\n if(prepend) {\r\n const f: MyDialogFilter[] = [];\r\n for(const filterId in this.filters) {\r\n const filter = this.filters[filterId];\r\n ++filter.localId;\r\n f.push(filter);\r\n }\r\n\r\n filter.localId = START_LOCAL_ID;\r\n\r\n const order = f.sort((a, b) => a.localId - b.localId).map((filter) => filter.id);\r\n this.onUpdateDialogFilterOrder({\r\n _: 'updateDialogFilterOrder',\r\n order\r\n });\r\n }\r\n }\r\n\r\n return bool;\r\n });\r\n }\r\n\r\n public getOutputDialogFilter(filter: MyDialogFilter) {\r\n const c = copy(filter);\r\n /* convertment.forEach(([from, to]) => {\r\n c[from] = c[to].map((peerId) => this.appPeersManager.getInputPeerById(peerId));\r\n }); */\r\n\r\n this.filterIncludedPinnedPeers(filter);\r\n\r\n return c;\r\n }\r\n\r\n private filterIncludedPinnedPeers(filter: MyDialogFilter) {\r\n forEachReverse(filter.includePeerIds, (peerId, idx) => {\r\n if(filter.pinnedPeerIds.includes(peerId)) {\r\n filter.include_peers.splice(idx, 1);\r\n filter.includePeerIds.splice(idx, 1);\r\n }\r\n });\r\n }\r\n\r\n // private spliceMissingPeerIds(filterId: number, type: ArgumentTypes<FiltersStorage['reloadMissingPeerIds']>[1], missingPeerIds: PeerId[]) {\r\n // const filter = this.getFilter(filterId);\r\n // const peers = filter && filter[type];\r\n // if(!peers?.length) {\r\n // return;\r\n // }\r\n\r\n // let spliced = false;\r\n // missingPeerIds.forEach((peerId) => {\r\n // const inputPeer = findAndSplice(peers, (inputPeer) => getPeerId(inputPeer) === peerId);\r\n // if(inputPeer) {\r\n // spliced = true;\r\n // }\r\n // });\r\n\r\n // if(spliced) {\r\n // this.onUpdateDialogFilter({\r\n // _: 'updateDialogFilter',\r\n // id: filterId,\r\n // filter\r\n // });\r\n // }\r\n // }\r\n\r\n public reloadMissingPeerIds(filterId: number, type: 'pinned_peers' | 'include_peers' | 'exclude_peers' = 'pinned_peers') {\r\n const filter = this.getFilter(filterId);\r\n const peers = filter && filter[type];\r\n if(!peers?.length) {\r\n return;\r\n }\r\n\r\n // const missingPeerIds: PeerId[] = [];\r\n const reloadDialogs = peers.filter((inputPeer) => {\r\n const peerId = this.appPeersManager.getPeerId(inputPeer);\r\n const isAlreadyReloaded = this.reloadedPeerIds.has(peerId);\r\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\r\n // if(isAlreadyReloaded && !dialog) {\r\n // missingPeerIds.push(peerId);\r\n // }\r\n\r\n const reload = !isAlreadyReloaded && !dialog;\r\n return reload;\r\n });\r\n\r\n if(!reloadDialogs.length) {\r\n // if(missingPeerIds.length) {\r\n // this.spliceMissingPeerIds(filterId, type, missingPeerIds);\r\n // }\r\n\r\n return;\r\n }\r\n\r\n const reloadPromises = reloadDialogs.map((inputPeer) => {\r\n const peerId = this.appPeersManager.getPeerId(inputPeer);\r\n const promise = this.appMessagesManager.reloadConversation(inputPeer)\r\n .then((dialog) => {\r\n this.reloadedPeerIds.add(peerId);\r\n\r\n return dialog ? undefined : peerId;\r\n });\r\n\r\n return promise;\r\n });\r\n\r\n const reloadPromise = Promise.all(reloadPromises).then((missingPeerIds) => {\r\n missingPeerIds = missingPeerIds.filter(Boolean);\r\n if(!missingPeerIds.length) {\r\n return;\r\n }\r\n\r\n // this.spliceMissingPeerIds(filterId, type, missingPeerIds);\r\n });\r\n\r\n return reloadPromise;\r\n }\r\n\r\n public async getDialogFilters(overwrite = false): Promise<MyDialogFilter[]> {\r\n const keys = Object.keys(this.filters);\r\n if(keys.length > PREPENDED_FILTERS && !overwrite) {\r\n return keys.map((filterId) => this.filters[filterId]).sort((a, b) => a.localId - b.localId);\r\n }\r\n\r\n const filters = await this.apiManager.invokeApiSingle('messages.getDialogFilters');\r\n const prepended = this.prependFilters(filters);\r\n return prepended.map((filter) => this.saveDialogFilter(filter, overwrite)).filter(Boolean);\r\n }\r\n\r\n public getSuggestedDialogsFilters() {\r\n return this.apiManager.invokeApi('messages.getSuggestedDialogFilters');\r\n }\r\n\r\n public saveDialogFilter(filter: DialogFilter, update = true, silent?: boolean) {\r\n // defineNotNumerableProperties(filter, ['includePeerIds', 'excludePeerIds', 'pinnedPeerIds']);\r\n\r\n if(filter._ === 'dialogFilterDefault') {\r\n filter = this.localFilters[FOLDER_ID_ALL];\r\n }\r\n\r\n assumeType<MyDialogFilter>(filter);\r\n if(!REAL_FOLDERS.has(filter.id)) {\r\n convertment.forEach(([from, to]) => {\r\n assumeType<MyDialogFilter>(filter);\r\n filter[to] = filter[from].map((peer) => this.appPeersManager.getPeerId(peer));\r\n });\r\n\r\n this.filterIncludedPinnedPeers(filter);\r\n\r\n filter.include_peers = filter.pinned_peers.concat(filter.include_peers);\r\n filter.includePeerIds = filter.pinnedPeerIds.concat(filter.includePeerIds);\r\n }\r\n\r\n const oldFilter = this.filters[filter.id];\r\n if(oldFilter) {\r\n Object.assign(oldFilter, filter);\r\n } else {\r\n this.filters[filter.id] = filter;\r\n }\r\n\r\n this.setLocalId(filter);\r\n\r\n if(!silent) {\r\n if(update) {\r\n this.rootScope.dispatchEvent('filter_update', filter);\r\n } else if(!oldFilter) {\r\n this.rootScope.dispatchEvent('filter_new', filter);\r\n }\r\n }\r\n\r\n return filter;\r\n }\r\n\r\n private setLocalId(filter: MyDialogFilter) {\r\n if(filter.localId !== undefined) {\r\n if(filter.localId >= this.localId) {\r\n this.localId = filter.localId + 1;\r\n }\r\n } else {\r\n filter.localId = this.localId++ as MyDialogFilter['localId'];\r\n findAndSplice(this.filtersArr, (_filter) => _filter.id === filter.id);\r\n this.filtersArr.push(filter);\r\n this.pushToState();\r\n }\r\n }\r\n\r\n public async isFilterIdAvailable(filterId: number) {\r\n if(REAL_FOLDERS.has(filterId)) {\r\n return true;\r\n }\r\n\r\n const limit = await this.apiManager.getLimit('folders');\r\n const isFolderAvailable = this.filtersArr.filter((filter) => !REAL_FOLDERS.has(filter.id)).slice(0, limit).some((filter) => filter.id === filterId);\r\n\r\n return isFolderAvailable;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function applyMixins(derivedCtor: any, constructors: any[]) {\r\n // const callbacks: Array<(...args: any[]) => any> = [];\r\n\r\n constructors.forEach((baseCtor) => {\r\n Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {\r\n const value: PropertyDescriptor = Object.getOwnPropertyDescriptor(baseCtor.prototype, name) || Object.create(null);\r\n /* if(name === '_constructor') {\r\n callbacks.push(value.value);\r\n return;\r\n } else */if(name === 'constructor') {\r\n return;\r\n }\r\n\r\n Object.defineProperty(\r\n derivedCtor.prototype,\r\n name,\r\n value\r\n );\r\n });\r\n });\r\n\r\n // if(callbacks.length) {\r\n // function c(...args: any[]): any {\r\n // callbacks.forEach((cb, idx) => {\r\n // // @ts-ignore\r\n // cb.apply(this, args[idx] || []);\r\n // });\r\n // };\r\n\r\n // Object.defineProperty(derivedCtor.prototype, 'superConstructor', {\r\n // configurable: true,\r\n // enumerable: true,\r\n // value: c,\r\n // writable: true\r\n // });\r\n // }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport DEBUG from '../../config/debug';\r\nimport {ConstructorDeclMap, Message, MessageEntity, MessageFwdHeader, Peer, Update, Updates} from '../../layer';\r\nimport {logger, LogTypes} from '../logger';\r\nimport assumeType from '../../helpers/assumeType';\r\nimport App from '../../config/app';\r\nimport filterUnique from '../../helpers/array/filterUnique';\r\nimport {AppManager} from './manager';\r\nimport parseMarkdown from '../richTextProcessor/parseMarkdown';\r\nimport ctx from '../../environment/ctx';\r\nimport EventListenerBase from '../../helpers/eventListenerBase';\r\nimport applyMixins from '../../helpers/applyMixins';\r\n\r\ntype UpdatesState = {\r\n pendingPtsUpdates: (Update & {pts: number, pts_count: number})[],\r\n pendingSeqUpdates?: {[seq: number]: {seq: number, date: number, updates: any[]}},\r\n syncPending: {\r\n seqAwaiting?: number,\r\n ptsAwaiting?: true,\r\n timeout: number\r\n },\r\n syncLoading: Promise<void>,\r\n\r\n seq?: number,\r\n pts?: number,\r\n date?: number,\r\n lastPtsUpdateTime?: number\r\n};\r\n\r\nconst SYNC_DELAY = 6;\r\n\r\nclass ApiUpdatesManager {\r\n public updatesState: UpdatesState = {\r\n pendingPtsUpdates: [],\r\n pendingSeqUpdates: {},\r\n syncPending: null,\r\n syncLoading: null\r\n };\r\n\r\n private channelStates: {[channelId: ChatId]: UpdatesState} = {};\r\n private attached = false;\r\n\r\n private log = logger('UPDATES', LogTypes.Error | LogTypes.Warn | LogTypes.Log/* | LogTypes.Debug */);\r\n private debug = DEBUG;\r\n\r\n constructor() {\r\n this._constructor(false);\r\n }\r\n\r\n private setProxy() {\r\n const self = this;\r\n this.updatesState = new Proxy(this.updatesState, {\r\n set: function(target: ApiUpdatesManager['updatesState'], key: keyof ApiUpdatesManager['updatesState'], value: ApiUpdatesManager['updatesState'][typeof key]) {\r\n // @ts-ignore\r\n target[key] = value;\r\n self.saveUpdatesState();\r\n return true;\r\n }\r\n });\r\n }\r\n\r\n public saveUpdatesState() {\r\n const us = this.updatesState;\r\n this.appStateManager.pushToState('updates', {\r\n seq: us.seq,\r\n pts: us.pts,\r\n date: us.date\r\n });\r\n }\r\n\r\n private popPendingSeqUpdate() {\r\n const state = this.updatesState;\r\n const nextSeq = state.seq + 1;\r\n const pendingUpdatesData = state.pendingSeqUpdates[nextSeq];\r\n if(!pendingUpdatesData) {\r\n return false;\r\n }\r\n\r\n const updates = pendingUpdatesData.updates;\r\n for(let i = 0, length = updates.length; i < length; ++i) {\r\n this.saveUpdate(updates[i]);\r\n }\r\n\r\n state.seq = pendingUpdatesData.seq;\r\n if(pendingUpdatesData.date && state.date < pendingUpdatesData.date) {\r\n state.date = pendingUpdatesData.date;\r\n }\r\n delete state.pendingSeqUpdates[nextSeq];\r\n\r\n if(!this.popPendingSeqUpdate() &&\r\n state.syncPending &&\r\n state.syncPending.seqAwaiting &&\r\n state.seq >= state.syncPending.seqAwaiting) {\r\n if(!state.syncPending.ptsAwaiting) {\r\n clearTimeout(state.syncPending.timeout);\r\n state.syncPending = null;\r\n } else {\r\n delete state.syncPending.seqAwaiting;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private popPendingPtsUpdate(channelId: ChatId) {\r\n const curState = channelId ? this.getChannelState(channelId) : this.updatesState;\r\n if(!curState.pendingPtsUpdates.length) {\r\n return false;\r\n }\r\n\r\n curState.pendingPtsUpdates.sort((a, b) => {\r\n return a.pts - b.pts;\r\n });\r\n // this.log('pop update', channelId, curState.pendingPtsUpdates)\r\n\r\n let curPts = curState.pts;\r\n let goodPts = 0;\r\n let goodIndex = 0;\r\n for(let i = 0, length = curState.pendingPtsUpdates.length; i < length; ++i) {\r\n const update = curState.pendingPtsUpdates[i];\r\n curPts += update.pts_count;\r\n if(curPts >= update.pts) {\r\n goodPts = update.pts;\r\n goodIndex = i;\r\n }\r\n }\r\n\r\n if(!goodPts) {\r\n return false;\r\n }\r\n\r\n this.debug && this.log.debug('pop pending pts updates', goodPts, curState.pendingPtsUpdates.slice(0, goodIndex + 1));\r\n\r\n curState.pts = goodPts;\r\n for(let i = 0; i <= goodIndex; ++i) {\r\n const update = curState.pendingPtsUpdates[i];\r\n\r\n // @ts-ignore\r\n this.saveUpdate(update);\r\n }\r\n curState.pendingPtsUpdates.splice(0, goodIndex + 1);\r\n\r\n if(!curState.pendingPtsUpdates.length && curState.syncPending) {\r\n if(!curState.syncPending.seqAwaiting) {\r\n clearTimeout(curState.syncPending.timeout);\r\n curState.syncPending = null;\r\n } else {\r\n delete curState.syncPending.ptsAwaiting;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public forceGetDifference() {\r\n if(!this.updatesState.syncLoading) {\r\n this.getDifference();\r\n }\r\n }\r\n\r\n public processLocalUpdate(update: Update) {\r\n this.processUpdateMessage({\r\n _: 'updateShort',\r\n update\r\n } as Updates);\r\n }\r\n\r\n public processUpdateMessage = (updateMessage: any, options: Partial<{\r\n override: boolean\r\n }> = {}) => {\r\n // return forceGetDifference()\r\n const processOpts = {\r\n date: updateMessage.date,\r\n seq: updateMessage.seq,\r\n seqStart: updateMessage.seq_start\r\n // ignoreSyncLoading: options.ignoreSyncLoading\r\n };\r\n\r\n this.debug && this.log.debug('processUpdateMessage', updateMessage);\r\n\r\n switch(updateMessage._) {\r\n case 'updatesTooLong':\r\n case 'new_session_created':\r\n this.forceGetDifference();\r\n break;\r\n\r\n case 'updateShort':\r\n this.processUpdate(updateMessage.update, processOpts);\r\n break;\r\n\r\n case 'updateShortMessage':\r\n case 'updateShortChatMessage': {\r\n assumeType<Updates.updateShortChatMessage | Updates.updateShortMessage>(updateMessage);\r\n this.debug && this.log.debug('updateShortMessage | updateShortChatMessage', {...updateMessage});\r\n const isOut = updateMessage.pFlags.out;\r\n const fromId = (updateMessage as Updates.updateShortChatMessage).from_id || (isOut ? this.appPeersManager.peerId : (updateMessage as Updates.updateShortMessage).user_id);\r\n const toId = (updateMessage as Updates.updateShortChatMessage).chat_id ?\r\n (updateMessage as Updates.updateShortChatMessage).chat_id.toPeerId(true) :\r\n ((updateMessage as Updates.updateShortMessage).user_id.toPeerId(false) || this.appPeersManager.peerId);\r\n\r\n this.processUpdate({\r\n _: 'updateNewMessage',\r\n message: {\r\n _: 'message',\r\n pFlags: updateMessage.pFlags,\r\n id: updateMessage.id,\r\n from_id: this.appPeersManager.getOutputPeer(fromId.toPeerId()),\r\n peer_id: this.appPeersManager.getOutputPeer(toId),\r\n date: updateMessage.date,\r\n message: updateMessage.message,\r\n fwd_from: updateMessage.fwd_from,\r\n reply_to: updateMessage.reply_to,\r\n entities: updateMessage.entities\r\n },\r\n pts: updateMessage.pts,\r\n pts_count: updateMessage.pts_count\r\n }, processOpts);\r\n break;\r\n }\r\n\r\n case 'updatesCombined':\r\n case 'updates':\r\n this.appUsersManager.saveApiUsers(updateMessage.users, options.override);\r\n this.appChatsManager.saveApiChats(updateMessage.chats, options.override);\r\n\r\n updateMessage.updates.forEach((update: Update) => {\r\n this.processUpdate(update, processOpts);\r\n });\r\n break;\r\n\r\n default:\r\n this.log.warn('Unknown update message', updateMessage);\r\n }\r\n };\r\n\r\n private getDifference(first = false): Promise<void> {\r\n // this.trace('Get full diff')\r\n const updatesState = this.updatesState;\r\n const wasSyncing = updatesState.syncLoading;\r\n if(!wasSyncing) {\r\n updatesState.pendingSeqUpdates = {};\r\n updatesState.pendingPtsUpdates = [];\r\n }\r\n\r\n if(updatesState.syncPending) {\r\n clearTimeout(updatesState.syncPending.timeout);\r\n updatesState.syncPending = null;\r\n }\r\n\r\n const promise = this.apiManager.invokeApi('updates.getDifference', {\r\n pts: updatesState.pts,\r\n pts_total_limit: first /* && false */? /* 50 */1200 : undefined,\r\n date: updatesState.date,\r\n qts: -1\r\n }, {\r\n timeout: 0x7fffffff\r\n }).then((differenceResult) => {\r\n this.debug && this.log.debug('Get diff result', differenceResult);\r\n\r\n if(differenceResult._ === 'updates.differenceEmpty') {\r\n this.debug && this.log.debug('apply empty diff', differenceResult.seq);\r\n updatesState.date = differenceResult.date;\r\n updatesState.seq = differenceResult.seq;\r\n return;\r\n }\r\n\r\n // ! SORRY I'M SORRY I'M SORRY\r\n if(first) {\r\n this.rootScope.dispatchEvent('state_synchronizing');\r\n }\r\n\r\n if(differenceResult._ !== 'updates.differenceTooLong') {\r\n this.appUsersManager.saveApiUsers(differenceResult.users);\r\n this.appChatsManager.saveApiChats(differenceResult.chats);\r\n\r\n // Should be first because of updateMessageID\r\n // this.log('applying', differenceResult.other_updates.length, 'other updates')\r\n\r\n differenceResult.other_updates.forEach((update) => {\r\n switch(update._) {\r\n case 'updateChannelTooLong':\r\n case 'updateNewChannelMessage':\r\n case 'updateEditChannelMessage':\r\n this.processUpdate(update);\r\n return;\r\n }\r\n\r\n this.saveUpdate(update);\r\n });\r\n\r\n // this.log('applying', differenceResult.new_messages.length, 'new messages')\r\n differenceResult.new_messages.forEach((apiMessage) => {\r\n this.saveUpdate({\r\n _: 'updateNewMessage',\r\n message: apiMessage,\r\n pts: updatesState.pts,\r\n pts_count: 0\r\n });\r\n });\r\n\r\n const nextState = differenceResult._ === 'updates.difference' ? differenceResult.state : differenceResult.intermediate_state;\r\n updatesState.seq = nextState.seq;\r\n updatesState.pts = nextState.pts;\r\n updatesState.date = nextState.date;\r\n } else {\r\n updatesState.pts = differenceResult.pts;\r\n updatesState.date = (Date.now() / 1000 | 0) + this.timeManager.getServerTimeOffset();\r\n delete updatesState.seq;\r\n\r\n this.channelStates = {};\r\n\r\n this.log.warn('getDifference:', differenceResult._);\r\n this.onDifferenceTooLong();\r\n }\r\n\r\n // this.log('apply diff', updatesState.seq, updatesState.pts)\r\n\r\n if(differenceResult._ === 'updates.differenceSlice') {\r\n return this.getDifference();\r\n } else {\r\n this.debug && this.log.debug('finished get diff');\r\n }\r\n });\r\n\r\n if(!wasSyncing) {\r\n this.justAName(updatesState, promise);\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private getChannelDifference(channelId: ChatId): Promise<void> {\r\n const channelState = this.getChannelState(channelId);\r\n const wasSyncing = channelState.syncLoading;\r\n if(!wasSyncing) {\r\n channelState.pendingPtsUpdates = [];\r\n }\r\n\r\n if(channelState.syncPending) {\r\n clearTimeout(channelState.syncPending.timeout);\r\n channelState.syncPending = null;\r\n }\r\n\r\n const log = this.debug ? this.log.bindPrefix('getChannelDifference-' + channelId) : undefined;\r\n // this.log.trace('Get channel diff', appChatsManager.getChat(channelId), channelState.pts);\r\n const promise = this.apiManager.invokeApi('updates.getChannelDifference', {\r\n channel: this.appChatsManager.getChannelInput(channelId),\r\n filter: {_: 'channelMessagesFilterEmpty'},\r\n pts: channelState.pts,\r\n limit: 30\r\n }, {timeout: 0x7fffffff}).then((differenceResult) => {\r\n log?.debug('diff result', differenceResult)\r\n channelState.pts = 'pts' in differenceResult ? differenceResult.pts : undefined;\r\n\r\n if(differenceResult._ === 'updates.channelDifferenceEmpty') {\r\n // log?.debug('apply channel empty diff', differenceResult);\r\n return;\r\n }\r\n\r\n if(differenceResult._ === 'updates.channelDifferenceTooLong') {\r\n // log?.debug('channel diff too long', differenceResult);\r\n delete this.channelStates[channelId];\r\n\r\n this.saveUpdate({_: 'updateChannelReload', channel_id: channelId});\r\n return;\r\n }\r\n\r\n this.appUsersManager.saveApiUsers(differenceResult.users);\r\n this.appChatsManager.saveApiChats(differenceResult.chats);\r\n\r\n // Should be first because of updateMessageID\r\n log?.debug('applying', differenceResult.other_updates.length, 'channel other updates');\r\n differenceResult.other_updates.forEach((update) => {\r\n this.saveUpdate(update);\r\n });\r\n\r\n log?.debug('applying', differenceResult.new_messages.length, 'channel new messages');\r\n differenceResult.new_messages.forEach((apiMessage) => {\r\n this.saveUpdate({\r\n _: 'updateNewChannelMessage',\r\n message: apiMessage,\r\n pts: channelState.pts,\r\n pts_count: 0\r\n });\r\n });\r\n\r\n log?.debug('apply channel diff', channelState.pts);\r\n\r\n if(differenceResult._ === 'updates.channelDifference' &&\r\n !differenceResult.pFlags.final) {\r\n return this.getChannelDifference(channelId);\r\n } else {\r\n log?.debug('finished channel get diff');\r\n }\r\n });\r\n\r\n if(!wasSyncing) {\r\n this.justAName(channelState, promise, channelId);\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private onDifferenceTooLong() {\r\n this.appUsersManager.clear();\r\n this.appChatsManager.clear();\r\n this.appMessagesManager.clear();\r\n\r\n this.rootScope.dispatchEvent('state_cleared');\r\n }\r\n\r\n private justAName(state: UpdatesState, promise: UpdatesState['syncLoading'], channelId?: ChatId) {\r\n state.syncLoading = promise;\r\n this.rootScope.dispatchEvent('state_synchronizing', channelId);\r\n\r\n promise.then(() => {\r\n state.syncLoading = null;\r\n this.rootScope.dispatchEvent('state_synchronized', channelId);\r\n }, () => {\r\n state.syncLoading = null;\r\n });\r\n }\r\n\r\n public addChannelState(channelId: ChatId, pts: number) {\r\n if(!pts) {\r\n throw new Error('Add channel state without pts ' + channelId);\r\n }\r\n\r\n if(!(channelId in this.channelStates)) {\r\n this.channelStates[channelId] = {\r\n pts,\r\n pendingPtsUpdates: [],\r\n syncPending: null,\r\n syncLoading: null\r\n };\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public getChannelState(channelId: ChatId, pts?: number) {\r\n if(this.channelStates[channelId] === undefined) {\r\n this.addChannelState(channelId, pts);\r\n }\r\n\r\n return this.channelStates[channelId];\r\n }\r\n\r\n private processUpdate(update: Update, options: Partial<{\r\n date: number,\r\n seq: number,\r\n seqStart: number/* ,\r\n ignoreSyncLoading: boolean */\r\n }> = {}) {\r\n let channelId: ChatId;\r\n switch(update._) {\r\n case 'updateNewChannelMessage':\r\n case 'updateEditChannelMessage':\r\n channelId = this.appPeersManager.getPeerId(update.message.peer_id).toChatId();\r\n break;\r\n /* case 'updateDeleteChannelMessages':\r\n channelId = update.channel_id;\r\n break; */\r\n case 'updateChannelTooLong':\r\n channelId = update.channel_id;\r\n if(!(channelId in this.channelStates)) {\r\n return false;\r\n }\r\n break;\r\n default:\r\n if('channel_id' in update && 'pts' in update) {\r\n channelId = update.channel_id;\r\n }\r\n break;\r\n }\r\n\r\n const {pts, pts_count} = update as Update.updateNewMessage;\r\n const curState = channelId ? this.getChannelState(channelId, pts) : this.updatesState;\r\n\r\n // this.log.log('process', channelId, curState.pts, update)\r\n\r\n if(curState.syncLoading/* && !options.ignoreSyncLoading */) {\r\n return false;\r\n }\r\n\r\n if(update._ === 'updateChannelTooLong') {\r\n if(!curState.lastPtsUpdateTime ||\r\n curState.lastPtsUpdateTime < (Date.now() - SYNC_DELAY)) {\r\n // this.log.trace('channel too long, get diff', channelId, update)\r\n this.getChannelDifference(channelId);\r\n }\r\n return false;\r\n }\r\n\r\n if(update._ === 'updateNewMessage' ||\r\n update._ === 'updateEditMessage' ||\r\n update._ === 'updateNewChannelMessage' ||\r\n update._ === 'updateEditChannelMessage') {\r\n const message = update.message as Message.message;\r\n const toPeerId = this.appPeersManager.getPeerId(message.peer_id);\r\n const fwdHeader: MessageFwdHeader.messageFwdHeader = message.fwd_from || {} as any;\r\n let reason: string;\r\n if(message.from_id && !this.appUsersManager.hasUser(this.appPeersManager.getPeerId(message.from_id), message.pFlags.post/* || channelId*/) && (reason = 'author') ||\r\n fwdHeader.from_id && !this.appUsersManager.hasUser(this.appPeersManager.getPeerId(fwdHeader.from_id), !!(fwdHeader.from_id as Peer.peerChannel).channel_id) && (reason = 'fwdAuthor') ||\r\n (fwdHeader.from_id as Peer.peerChannel)?.channel_id && !this.appChatsManager.hasChat((fwdHeader.from_id as Peer.peerChannel).channel_id, true) && (reason = 'fwdChannel') ||\r\n toPeerId.isUser() && !this.appUsersManager.hasUser(toPeerId) && (reason = 'toPeer User') ||\r\n toPeerId.isAnyChat() && !this.appChatsManager.hasChat(toPeerId.toChatId()) && (reason = 'toPeer Chat')) {\r\n this.log.warn('Not enough data for message update', toPeerId, reason, message);\r\n if(channelId && this.appChatsManager.hasChat(channelId)) {\r\n this.getChannelDifference(channelId);\r\n } else {\r\n this.forceGetDifference();\r\n }\r\n return false;\r\n }\r\n } else if(channelId && !this.appChatsManager.hasChat(channelId)) {\r\n // this.log.log('skip update, missing channel', channelId, update)\r\n return false;\r\n }\r\n\r\n let popPts: boolean;\r\n let popSeq: boolean;\r\n\r\n if(pts) {\r\n const newPts = curState.pts + (pts_count || 0);\r\n if(newPts < pts) {\r\n this.debug && this.log.warn('Pts hole', curState, update, channelId && this.appChatsManager.getChat(channelId));\r\n curState.pendingPtsUpdates.push(update as Update.updateNewMessage);\r\n if(!curState.syncPending && !curState.syncLoading) {\r\n curState.syncPending = {\r\n timeout: ctx.setTimeout(() => {\r\n curState.syncPending = null;\r\n\r\n if(curState.syncLoading) {\r\n return;\r\n }\r\n\r\n if(channelId) {\r\n this.getChannelDifference(channelId);\r\n } else {\r\n this.getDifference();\r\n }\r\n }, SYNC_DELAY)\r\n };\r\n }\r\n\r\n curState.syncPending.ptsAwaiting = true;\r\n return false;\r\n }\r\n\r\n if(pts > curState.pts) {\r\n curState.pts = pts;\r\n popPts = true;\r\n\r\n curState.lastPtsUpdateTime = Date.now();\r\n } else if(pts_count) {\r\n // this.log.warn('Duplicate update', update)\r\n return false;\r\n }\r\n\r\n if(channelId && options.date && this.updatesState.date < options.date) {\r\n this.updatesState.date = options.date;\r\n }\r\n } else if(!channelId && options.seq > 0) {\r\n const seq = options.seq;\r\n const seqStart = options.seqStart || seq;\r\n\r\n if(seqStart !== curState.seq + 1) {\r\n if(seqStart > curState.seq) {\r\n this.debug && this.log.warn('Seq hole', curState, curState.syncPending && curState.syncPending.seqAwaiting);\r\n\r\n if(curState.pendingSeqUpdates[seqStart] === undefined) {\r\n curState.pendingSeqUpdates[seqStart] = {seq, date: options.date, updates: []};\r\n }\r\n curState.pendingSeqUpdates[seqStart].updates.push(update);\r\n\r\n if(!curState.syncPending) {\r\n curState.syncPending = {\r\n timeout: ctx.setTimeout(() => {\r\n curState.syncPending = null;\r\n\r\n if(curState.syncLoading) {\r\n return;\r\n }\r\n\r\n this.getDifference();\r\n }, SYNC_DELAY)\r\n };\r\n }\r\n\r\n if(!curState.syncPending.seqAwaiting ||\r\n curState.syncPending.seqAwaiting < seqStart) {\r\n curState.syncPending.seqAwaiting = seqStart;\r\n }\r\n return false;\r\n }\r\n }\r\n\r\n if(curState.seq !== seq) {\r\n curState.seq = seq;\r\n if(options.date && curState.date < options.date) {\r\n curState.date = options.date;\r\n }\r\n\r\n popSeq = true;\r\n }\r\n }\r\n\r\n this.saveUpdate(update);\r\n\r\n if(popPts) {\r\n this.popPendingPtsUpdate(channelId);\r\n } else if(popSeq) {\r\n this.popPendingSeqUpdate();\r\n }\r\n }\r\n\r\n public saveUpdate(update: Update) {\r\n // this.debug && this.log('saveUpdate', update);\r\n this.dispatchEvent(update._, update as any);\r\n }\r\n\r\n public attach(langCode?: string) {\r\n if(this.attached) return;\r\n\r\n // return;\r\n\r\n this.log('attach');\r\n\r\n this.attached = true;\r\n\r\n this.appStateManager.getState().then(({updates: state}) => {\r\n const newVersion = this.appStateManager.newVersion/* || '1.6.0' */;\r\n\r\n // rootScope.broadcast('state_synchronizing');\r\n if(!state || !state.pts || !state.date/* || !state.seq */) { // seq can be undefined because of updates.differenceTooLong\r\n this.log('will get new state');\r\n\r\n this.updatesState.syncLoading = new Promise((resolve) => {\r\n this.apiManager.invokeApi('updates.getState', {}, {noErrorBox: true}).then((stateResult) => {\r\n this.updatesState.seq = stateResult.seq;\r\n this.updatesState.pts = stateResult.pts;\r\n this.updatesState.date = stateResult.date;\r\n this.saveUpdatesState();\r\n // setTimeout(() => {\r\n this.updatesState.syncLoading = null;\r\n resolve();\r\n // rootScope.broadcast('state_synchronized');\r\n // }, 1000);\r\n\r\n // ! for testing\r\n // updatesState.seq = 1\r\n // updatesState.pts = stateResult.pts - 5000\r\n // updatesState.date = 1\r\n // getDifference()\r\n });\r\n });\r\n } else {\r\n // ! for testing\r\n /* state.seq = 1;\r\n state.pts = state.pts - 15;\r\n state.date = 1; */\r\n // state.pts -= 100;\r\n\r\n // state.date = 1628623682;\r\n // state.pts = 2007500;\r\n // state.seq = 503;\r\n\r\n Object.assign(this.updatesState, state);\r\n\r\n this.log('will get difference', Object.assign({}, state));\r\n\r\n this.getDifference(true)/* .finally(() => {\r\n if(this.updatesState.syncLoading) {\r\n rootScope.broadcast('state_synchronizing');\r\n }\r\n }) */;\r\n }\r\n\r\n this.apiManager.setUpdatesProcessor(this.processUpdateMessage);\r\n\r\n // this.updatesState.syncLoading.then(() => {\r\n this.setProxy();\r\n // });\r\n\r\n if(newVersion) {\r\n this.updatesState.syncLoading.then(async() => {\r\n const strs: Record<string, string> = {\r\n en: 'was updated to version',\r\n ru: 'обновлён до версии'\r\n };\r\n\r\n const getChangelog = (lang: string) => {\r\n fetch(`changelogs/${lang}_${newVersion.split(' ')[0]}.md`)\r\n .then((res) => (res.status === 200 && res.ok && res.text()) || Promise.reject())\r\n .then((text) => {\r\n const langStr = strs[lang] || strs.en;\r\n const pre = `**Telegram Web${App.suffix} ${langStr} ${newVersion}**\\n\\n`;\r\n\r\n text = pre + text;\r\n\r\n const entities: MessageEntity[] = [];\r\n const message = parseMarkdown(text, entities);\r\n\r\n const update: Update.updateServiceNotification = {\r\n _: 'updateServiceNotification',\r\n entities,\r\n message,\r\n type: 'local',\r\n pFlags: {},\r\n inbox_date: Date.now() / 1000 | 0,\r\n media: undefined\r\n };\r\n\r\n this.processLocalUpdate(update);\r\n });\r\n };\r\n\r\n const languages = filterUnique([langCode, 'en']);\r\n for(const language of languages) {\r\n try {\r\n await getChangelog(language);\r\n break;\r\n } catch(err) {\r\n\r\n }\r\n }\r\n });\r\n }\r\n });\r\n }\r\n}\r\n\r\ninterface ApiUpdatesManager extends EventListenerBase<{\r\n [name in Update['_']]: (update: ConstructorDeclMap[name]) => void\r\n}>, AppManager {}\r\napplyMixins(ApiUpdatesManager, [EventListenerBase, AppManager]);\r\n\r\nexport {ApiUpdatesManager};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {UserProfilePhoto, ChatPhoto, InputFileLocation} from '../../layer';\r\nimport {DownloadOptions} from '../mtproto/apiFileManager';\r\nimport {AppManager} from './manager';\r\n\r\nexport type PeerPhotoSize = 'photo_small' | 'photo_big';\r\n\r\nexport class AppAvatarsManager extends AppManager {\r\n private savedAvatarURLs: {\r\n [peerId: PeerId]: {\r\n [size in PeerPhotoSize]?: string | Promise<string>\r\n }\r\n } = {};\r\n\r\n protected after() {\r\n this.rootScope.addEventListener('avatar_update', (peerId) => {\r\n this.removeFromAvatarsCache(peerId);\r\n });\r\n }\r\n\r\n public isAvatarCached(peerId: PeerId, size?: PeerPhotoSize) {\r\n const saved = this.savedAvatarURLs[peerId];\r\n if(size === undefined) {\r\n return !!saved;\r\n }\r\n\r\n return !!(saved && saved[size] && !(saved[size] instanceof Promise));\r\n }\r\n\r\n public removeFromAvatarsCache(peerId: PeerId) {\r\n if(this.savedAvatarURLs[peerId]) {\r\n delete this.savedAvatarURLs[peerId];\r\n }\r\n }\r\n\r\n public loadAvatar(peerId: PeerId, photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto, size: PeerPhotoSize) {\r\n let saved = this.savedAvatarURLs[peerId];\r\n if(!saved || !saved[size]) {\r\n if(!saved) {\r\n saved = this.savedAvatarURLs[peerId] = {};\r\n }\r\n\r\n // console.warn('will invoke downloadSmallFile:', peerId);\r\n const peerPhotoFileLocation: InputFileLocation.inputPeerPhotoFileLocation = {\r\n _: 'inputPeerPhotoFileLocation',\r\n pFlags: {},\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n photo_id: photo.photo_id\r\n };\r\n\r\n const downloadOptions: DownloadOptions = {dcId: photo.dc_id, location: peerPhotoFileLocation};\r\n if(size === 'photo_big') {\r\n peerPhotoFileLocation.pFlags.big = true;\r\n downloadOptions.limitPart = 512 * 1024;\r\n }\r\n\r\n /* let str: string;\r\n const time = Date.now();\r\n if(peerId === 0) {\r\n str = `download avatar ${peerId}`;\r\n } */\r\n\r\n const promise = this.apiFileManager.download(downloadOptions);\r\n return saved[size] = promise.then((blob) => {\r\n return saved[size] = URL.createObjectURL(blob);\r\n\r\n /* if(str) {\r\n console.log(str, Date.now() / 1000, Date.now() - time);\r\n } */\r\n });\r\n } else {\r\n return saved[size];\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {getEnvironment} from '../../environment/utils';\r\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\r\nimport {nextRandomUint} from '../../helpers/random';\r\nimport {InputPhoneCall, MessagesDhConfig, PhoneCall, PhoneCallDiscardReason, PhoneCallProtocol, PhonePhoneCall} from '../../layer';\r\nimport {AppManager} from './manager';\r\n\r\nexport type CallId = PhoneCall['id'];\r\n\r\nexport type MyPhoneCall = Exclude<PhoneCall, PhoneCall.phoneCallEmpty | PhoneCall.phoneCallDiscarded>;\r\n\r\nexport class AppCallsManager extends AppManager {\r\n private calls: Map<CallId, MyPhoneCall>;\r\n\r\n protected after() {\r\n this.calls = new Map();\r\n\r\n if(!getEnvironment().IS_CALL_SUPPORTED) {\r\n return;\r\n }\r\n\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updatePhoneCall: (update) => {\r\n this.saveCall(update.phone_call);\r\n },\r\n\r\n updatePhoneCallSignalingData: (update) => {\r\n this.rootScope.dispatchEvent('call_signaling', {callId: update.phone_call_id, data: update.data});\r\n }\r\n });\r\n }\r\n\r\n public computeKey(g_b: Uint8Array, a: Uint8Array, p: Uint8Array) {\r\n return this.cryptoWorker.invokeCrypto('compute-dh-key', g_b, a, p);\r\n }\r\n\r\n public saveCall(call: PhoneCall) {\r\n const isDiscarded = call._ === 'phoneCallDiscarded';\r\n const oldCall = this.calls.get(call.id);\r\n if(oldCall) {\r\n // if(shouldUpdate) {\r\n safeReplaceObject(oldCall, call);\r\n // }\r\n\r\n if(isDiscarded) {\r\n this.calls.delete(call.id);\r\n }\r\n\r\n call = oldCall;\r\n } else if(!isDiscarded) {\r\n this.calls.set(call.id, call as any);\r\n }\r\n\r\n this.rootScope.dispatchEvent('call_update', call);\r\n\r\n return call;\r\n }\r\n\r\n public getCall(callId: CallId) {\r\n return this.calls.get(callId);\r\n }\r\n\r\n public getCallInput(id: CallId): InputPhoneCall {\r\n const call = this.getCall(id);\r\n return {\r\n _: 'inputPhoneCall',\r\n id: call.id,\r\n access_hash: call.access_hash\r\n };\r\n }\r\n\r\n public savePhonePhoneCall(phonePhoneCall: PhonePhoneCall) {\r\n this.appUsersManager.saveApiUsers(phonePhoneCall.users);\r\n return this.saveCall(phonePhoneCall.phone_call);\r\n }\r\n\r\n public generateDh() {\r\n return this.apiManager.invokeApi('messages.getDhConfig', {\r\n version: 0,\r\n random_length: 256\r\n }).then((dhConfig) => {\r\n return this.cryptoWorker.invokeCrypto('generate-dh', dhConfig as MessagesDhConfig.messagesDhConfig);\r\n });\r\n }\r\n\r\n // private verifyProtocolCompatibility(protocol: PhoneCallProtocol) {\r\n // const my = getCallProtocol();\r\n // const myVersion = my.library_versions[0];\r\n // return !protocol.library_versions.find((version) => {\r\n // return compareVersion(myVersion, version) > 0;\r\n // });\r\n // }\r\n\r\n public async requestCall(userId: UserId, protocol: PhoneCallProtocol, g_a_hash: Uint8Array, video?: boolean) {\r\n const phonePhoneCall = await this.apiManager.invokeApi('phone.requestCall', {\r\n user_id: this.appUsersManager.getUserInput(userId),\r\n protocol: protocol,\r\n video: video,\r\n random_id: nextRandomUint(32),\r\n g_a_hash: g_a_hash\r\n });\r\n\r\n return this.savePhonePhoneCall(phonePhoneCall);\r\n }\r\n\r\n public async discardCall(callId: CallId, duration: number, reason: PhoneCallDiscardReason['_'], video?: boolean) {\r\n if(!this.getCall(callId)) {\r\n return;\r\n }\r\n\r\n const updates = await this.apiManager.invokeApi('phone.discardCall', {\r\n video,\r\n peer: this.getCallInput(callId),\r\n duration,\r\n reason: {\r\n _: reason\r\n },\r\n connection_id: '0'\r\n });\r\n\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n }\r\n}\r\n","import {RestrictionReason} from '../layer';\r\n\r\nconst platforms = new Set([\r\n 'all',\r\n 'web',\r\n 'webk'\r\n]);\r\n\r\nconst ignore = new Set();\r\n\r\nexport function getRestrictionReason(reasons: RestrictionReason[]) {\r\n // return reasons[0];\r\n return reasons.find((reason) => platforms.has(reason.platform) && !ignore.has(reason.reason));\r\n}\r\n\r\nexport function isRestricted(reasons: RestrictionReason[]) {\r\n return !!getRestrictionReason(reasons);\r\n}\r\n\r\nexport function ignoreRestrictionReasons(reasons: string[]) {\r\n ignore.clear();\r\n reasons.forEach((reason) => {\r\n ignore.add(reason);\r\n });\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport deepEqual from '../../helpers/object/deepEqual';\r\nimport isObject from '../../helpers/object/isObject';\r\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\r\nimport {ChannelParticipant, ChannelsCreateChannel, Chat, ChatAdminRights, ChatBannedRights, ChatInvite, ChatPhoto, ChatReactions, InputChannel, InputChatPhoto, InputFile, InputPeer, MessagesSponsoredMessages, SponsoredMessage, Update, Updates} from '../../layer';\r\nimport {isRestricted} from '../../helpers/restrictions';\r\nimport {AppManager} from './manager';\r\nimport hasRights from './utils/chats/hasRights';\r\nimport getParticipantPeerId from './utils/chats/getParticipantPeerId';\r\nimport {AppStoragesManager} from './appStoragesManager';\r\n\r\nexport type Channel = Chat.channel;\r\nexport type ChatRights = keyof ChatBannedRights['pFlags'] | keyof ChatAdminRights['pFlags'] | 'change_type' | 'change_permissions' | 'delete_chat' | 'view_participants';\r\n\r\nexport class AppChatsManager extends AppManager {\r\n private storage: AppStoragesManager['storages']['chats'];\r\n\r\n private chats: {[id: ChatId]: Chat.channel | Chat.chat | any};\r\n // private usernames: any;\r\n // private channelAccess: any;\r\n // private megagroups: {[id: number]: true};\r\n\r\n protected after() {\r\n this.clear(true);\r\n\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n /* updateChannel: (update) => {\r\n const channelId = update.channel_id;\r\n //console.log('updateChannel:', update);\r\n rootScope.broadcast('channel_settings', {channelId});\r\n }, */\r\n\r\n updateChannelParticipant: (update) => {\r\n this.apiManager.clearCache('channels.getParticipants', (params) => {\r\n return (params.channel as InputChannel.inputChannel).channel_id === update.channel_id;\r\n });\r\n },\r\n\r\n updateChatDefaultBannedRights: (update) => {\r\n const chatId = this.appPeersManager.getPeerId(update.peer).toChatId();\r\n const chat: Chat.chat = this.chats[chatId];\r\n if(chat) {\r\n chat.default_banned_rights = update.default_banned_rights;\r\n this.rootScope.dispatchEvent('chat_update', chatId);\r\n }\r\n }\r\n });\r\n\r\n return Promise.all([\r\n this.appStateManager.getState(),\r\n this.appStoragesManager.loadStorage('chats')\r\n ]).then(([state, {results: chats, storage}]) => {\r\n this.storage = storage;\r\n\r\n if(chats.length) {\r\n for(let i = 0, length = chats.length; i < length; ++i) {\r\n const chat = chats[i];\r\n if(chat) {\r\n this.chats[chat.id] = chat;\r\n }\r\n }\r\n }\r\n\r\n this.peersStorage.addEventListener('peerNeeded', (peerId) => {\r\n if(peerId.isUser() || this.storage.getFromCache(peerId.toChatId())) {\r\n return;\r\n }\r\n\r\n this.storage.set({\r\n [peerId.toChatId()]: this.getChat(peerId.toChatId())\r\n });\r\n });\r\n\r\n this.peersStorage.addEventListener('peerUnneeded', (peerId) => {\r\n if(peerId.isUser() || !this.storage.getFromCache(peerId.toChatId())) {\r\n return;\r\n }\r\n\r\n this.storage.delete(peerId.toChatId());\r\n });\r\n });\r\n }\r\n\r\n public clear = (init = false) => {\r\n if(!init) {\r\n for(const chatId in this.chats) {\r\n if(!chatId) continue;\r\n if(!this.peersStorage.isPeerNeeded(chatId.toPeerId(true))) {\r\n /* const chat = this.chats[chatId];\r\n if(chat.username) {\r\n delete this.usernames[cleanUsername(chat.username)];\r\n } */\r\n\r\n this.storage.delete(chatId);\r\n delete this.chats[chatId];\r\n }\r\n }\r\n } else {\r\n this.chats = {};\r\n }\r\n };\r\n\r\n public saveApiChats(apiChats: any[], override?: boolean) {\r\n if((apiChats as any).saved) return;\r\n (apiChats as any).saved = true;\r\n apiChats.forEach((chat) => this.saveApiChat(chat, override));\r\n }\r\n\r\n public saveApiChat(chat: Chat, override?: boolean) {\r\n if(chat._ === 'chatEmpty') return;\r\n /* if(chat._ !== 'chat' && chat._ !== 'channel') {\r\n return;\r\n } */\r\n\r\n // * exclude from state\r\n // defineNotNumerableProperties(chat, ['rTitle', 'initials']);\r\n\r\n const oldChat: Exclude<Chat, Chat.chatEmpty> = this.chats[chat.id];\r\n\r\n /* if(oldChat && !override) {\r\n return;\r\n } */\r\n\r\n (chat as Chat.chat).pFlags ??= {};\r\n\r\n if((chat as Chat.channel).pFlags.min && oldChat !== undefined) {\r\n return;\r\n }\r\n\r\n if(chat._ === 'channel' &&\r\n chat.participants_count === undefined &&\r\n oldChat !== undefined &&\r\n (oldChat as Chat.channel).participants_count) {\r\n chat.participants_count = (oldChat as Chat.channel).participants_count;\r\n }\r\n\r\n /* if(chat.username) {\r\n let searchUsername = searchIndexManager.cleanUsername(chat.username);\r\n this.usernames[searchUsername] = chat.id;\r\n } */\r\n\r\n const peerId = chat.id.toPeerId(true);\r\n if(oldChat === undefined) {\r\n this.chats[chat.id] = chat;\r\n } else {\r\n const oldPhotoId = ((oldChat as Chat.chat).photo as ChatPhoto.chatPhoto)?.photo_id;\r\n const newPhotoId = ((chat as Chat.chat).photo as ChatPhoto.chatPhoto)?.photo_id;\r\n const changedPhoto = oldPhotoId !== newPhotoId;\r\n\r\n const changedTitle = oldChat.title !== chat.title;\r\n\r\n const changedAnyBadge = (oldChat as Chat.channel).pFlags.verified !== (chat as Chat.channel).pFlags.verified ||\r\n (oldChat as Chat.channel).pFlags.scam !== (chat as Chat.channel).pFlags.scam ||\r\n (oldChat as Chat.channel).pFlags.fake !== (chat as Chat.channel).pFlags.fake;\r\n\r\n safeReplaceObject(oldChat, chat);\r\n this.rootScope.dispatchEvent('chat_update', chat.id);\r\n\r\n if(changedPhoto) {\r\n this.rootScope.dispatchEvent('avatar_update', peerId);\r\n }\r\n\r\n if(changedTitle || changedAnyBadge) {\r\n this.rootScope.dispatchEvent('peer_title_edit', peerId);\r\n }\r\n }\r\n\r\n if(this.peersStorage.isPeerNeeded(peerId)) {\r\n this.storage.set({\r\n [chat.id]: chat\r\n });\r\n }\r\n }\r\n\r\n public getChat(id: ChatId) {\r\n return this.chats[id] || {_: 'chatEmpty', id, deleted: true, access_hash: '', pFlags: {}/* this.channelAccess[id] */};\r\n }\r\n\r\n public getChatTyped(id: ChatId): Chat {\r\n return this.getChat(id);\r\n }\r\n\r\n /**\r\n * Check the user's ability to do an action in chat\r\n * @param id\r\n * @param action creator can still send messages to left channel. so this function shows server rights. see canSendToPeer for local rights in messages manager.\r\n * @param rights do not provide this parameter when checking rights for self\r\n * @param isThread\r\n * @returns\r\n */\r\n public hasRights(id: ChatId, action: ChatRights, rights?: ChatAdminRights | ChatBannedRights, isThread?: boolean) {\r\n return hasRights(this.getChat(id), action, rights, isThread);\r\n }\r\n\r\n public editChatDefaultBannedRights(id: ChatId, banned_rights: ChatBannedRights) {\r\n const chat: Chat.chat = this.getChat(id);\r\n if(chat.default_banned_rights) {\r\n if(chat.default_banned_rights.until_date === banned_rights.until_date && deepEqual(chat.default_banned_rights.pFlags, banned_rights.pFlags)) {\r\n return Promise.resolve();\r\n }\r\n }\r\n\r\n return this.apiManager.invokeApi('messages.editChatDefaultBannedRights', {\r\n peer: this.appPeersManager.getInputPeerById(id.toPeerId(true)),\r\n banned_rights\r\n }).then(this.onChatUpdated.bind(this, id));\r\n }\r\n\r\n /* public resolveUsername(username: string) {\r\n return this.usernames[username] || 0;\r\n } */\r\n\r\n /* public saveChannelAccess(id: ChatId, accessHash: string) {\r\n this.channelAccess[id] = accessHash;\r\n } */\r\n\r\n /* public saveIsMegagroup(id: ChatId) {\r\n this.megagroups[id] = true;\r\n } */\r\n\r\n public isChannel(id: ChatId) {\r\n const chat = this.chats[id];\r\n return !!(chat && (chat._ === 'channel' || chat._ === 'channelForbidden')/* || this.channelAccess[id] */);\r\n }\r\n\r\n public isMegagroup(id: ChatId) {\r\n /* if(this.megagroups[id]) {\r\n return true;\r\n } */\r\n\r\n const chat: Chat = this.chats[id];\r\n return !!(chat as Chat.channel)?.pFlags?.megagroup;\r\n }\r\n\r\n public isBroadcast(id: ChatId) {\r\n return this.isChannel(id) && !this.isMegagroup(id);\r\n }\r\n\r\n public isInChat(id: ChatId) {\r\n let good = true;\r\n const chat: Chat = this.getChat(id);\r\n if(chat._ === 'channelForbidden' ||\r\n chat._ === 'chatForbidden' ||\r\n chat._ === 'chatEmpty' ||\r\n (chat as Chat.chat).pFlags.left ||\r\n // || (chat as any).pFlags.kicked\r\n (chat as Chat.chat).pFlags.deactivated) {\r\n good = false;\r\n }\r\n\r\n return good;\r\n }\r\n\r\n public getChannelInput(id: ChatId): InputChannel {\r\n const chat: Chat = this.getChat(id);\r\n if(chat._ === 'chatEmpty' || !(chat as Chat.channel).access_hash) {\r\n return {\r\n _: 'inputChannelEmpty'\r\n };\r\n } else {\r\n return {\r\n _: 'inputChannel',\r\n channel_id: id,\r\n access_hash: (chat as Chat.channel).access_hash/* || this.channelAccess[id] */ || '0'\r\n };\r\n }\r\n }\r\n\r\n public getInputPeer(id: ChatId) {\r\n return this.isChannel(id) ? this.getChannelInputPeer(id) : this.getChatInputPeer(id);\r\n }\r\n\r\n public getChatInputPeer(id: ChatId): InputPeer.inputPeerChat {\r\n return {\r\n _: 'inputPeerChat',\r\n chat_id: id\r\n };\r\n }\r\n\r\n public getChannelInputPeer(id: ChatId): InputPeer.inputPeerChannel {\r\n return {\r\n _: 'inputPeerChannel',\r\n channel_id: id,\r\n access_hash: this.getChat(id).access_hash/* || this.channelAccess[id] */ || 0\r\n };\r\n }\r\n\r\n public hasChat(id: ChatId, allowMin?: true) {\r\n const chat = this.chats[id];\r\n return isObject(chat) && (allowMin || !chat.pFlags.min);\r\n }\r\n\r\n public getChatPhoto(id: ChatId) {\r\n const chat: Chat.chat = this.getChat(id);\r\n\r\n return chat && chat.photo || {\r\n _: 'chatPhotoEmpty'\r\n };\r\n }\r\n\r\n public getChatString(id: ChatId) {\r\n const chat = this.getChat(id);\r\n if(this.isChannel(id)) {\r\n return (this.isMegagroup(id) ? 's' : 'c') + id + '_' + chat.access_hash;\r\n }\r\n return 'g' + id;\r\n }\r\n\r\n /* public wrapForFull(id: number, fullChat: any) {\r\n const chatFull = copy(fullChat);\r\n const chat = this.getChat(id);\r\n\r\n if(!chatFull.participants_count) {\r\n chatFull.participants_count = chat.participants_count;\r\n }\r\n\r\n if(chatFull.participants &&\r\n chatFull.participants._ === 'chatParticipants') {\r\n chatFull.participants.participants = this.wrapParticipants(id, chatFull.participants.participants);\r\n }\r\n\r\n if(chatFull.about) {\r\n chatFull.rAbout = wrapRichText(chatFull.about, {noLinebreaks: true});\r\n }\r\n\r\n //chatFull.peerString = this.getChatString(id);\r\n chatFull.chat = chat;\r\n\r\n return chatFull;\r\n }\r\n\r\n public wrapParticipants(id: number, participants: any[]) {\r\n const chat = this.getChat(id);\r\n const myId = appUsersManager.getSelf().id;\r\n if(this.isChannel(id)) {\r\n const isAdmin = chat.pFlags.creator;\r\n participants.forEach((participant) => {\r\n participant.canLeave = myId === participant.user_id;\r\n participant.canKick = isAdmin && participant._ === 'channelParticipant';\r\n\r\n // just for order by last seen\r\n participant.user = appUsersManager.getUser(participant.user_id);\r\n });\r\n } else {\r\n const isAdmin = chat.pFlags.creator || chat.pFlags.admins_enabled && chat.pFlags.admin;\r\n participants.forEach((participant) => {\r\n participant.canLeave = myId === participant.user_id;\r\n participant.canKick = !participant.canLeave && (\r\n chat.pFlags.creator ||\r\n participant._ === 'chatParticipant' && (isAdmin || myId === participant.inviter_id)\r\n );\r\n\r\n // just for order by last seen\r\n participant.user = appUsersManager.getUser(participant.user_id);\r\n });\r\n }\r\n\r\n return participants;\r\n } */\r\n\r\n public createChannel(options: ChannelsCreateChannel): Promise<ChatId> {\r\n return this.apiManager.invokeApi('channels.createChannel', options).then((updates) => {\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n\r\n const channelId = (updates as any).chats[0].id;\r\n return channelId;\r\n });\r\n }\r\n\r\n public inviteToChannel(id: ChatId, userIds: UserId[]) {\r\n const input = this.getChannelInput(id);\r\n const usersInputs = userIds.map((u) => this.appUsersManager.getUserInput(u));\r\n\r\n return this.apiManager.invokeApi('channels.inviteToChannel', {\r\n channel: input,\r\n users: usersInputs\r\n }).then(this.onChatUpdated.bind(this, id));\r\n }\r\n\r\n public createChat(title: string, userIds: UserId[]): Promise<ChatId> {\r\n return this.apiManager.invokeApi('messages.createChat', {\r\n users: userIds.map((u) => this.appUsersManager.getUserInput(u)),\r\n title\r\n }).then((updates) => {\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n\r\n const chatId = (updates as any as Updates.updates).chats[0].id;\r\n return chatId;\r\n });\r\n }\r\n\r\n private onChatUpdated = (chatId: ChatId, updates?: any) => {\r\n // console.log('onChatUpdated', chatId, updates);\r\n\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n if(updates?.updates?.length && this.isChannel(chatId)) {\r\n this.rootScope.dispatchEvent('invalidate_participants', chatId);\r\n }\r\n };\r\n\r\n public leaveChannel(id: ChatId) {\r\n return this.apiManager.invokeApi('channels.leaveChannel', {\r\n channel: this.getChannelInput(id)\r\n }).then(this.onChatUpdated.bind(this, id));\r\n }\r\n\r\n public joinChannel(id: ChatId) {\r\n return this.apiManager.invokeApi('channels.joinChannel', {\r\n channel: this.getChannelInput(id)\r\n }).then(this.onChatUpdated.bind(this, id));\r\n }\r\n\r\n public addChatUser(id: ChatId, userId: UserId, fwdLimit = 100) {\r\n return this.apiManager.invokeApi('messages.addChatUser', {\r\n chat_id: id,\r\n user_id: this.appUsersManager.getUserInput(userId),\r\n fwd_limit: fwdLimit\r\n }).then(this.onChatUpdated.bind(this, id));\r\n }\r\n\r\n public deleteChatUser(id: ChatId, userId: UserId) {\r\n return this.apiManager.invokeApi('messages.deleteChatUser', {\r\n chat_id: id,\r\n user_id: this.appUsersManager.getUserInput(userId)\r\n }).then(this.onChatUpdated.bind(this, id));\r\n }\r\n\r\n public leaveChat(id: ChatId) {\r\n return this.deleteChatUser(id, this.appUsersManager.getSelf().id);\r\n }\r\n\r\n public leave(id: ChatId) {\r\n return this.isChannel(id) ? this.leaveChannel(id) : this.leaveChat(id);\r\n }\r\n\r\n public delete(id: ChatId) {\r\n return this.isChannel(id) ? this.deleteChannel(id) : this.deleteChat(id);\r\n }\r\n\r\n public deleteChannel(id: ChatId) {\r\n return this.apiManager.invokeApi('channels.deleteChannel', {\r\n channel: this.getChannelInput(id)\r\n }).then(this.onChatUpdated.bind(this, id));\r\n }\r\n\r\n public deleteChat(id: ChatId) {\r\n // return this.leaveChat(id).then(() => {\r\n return this.apiManager.invokeApi('messages.deleteChat', {\r\n chat_id: id\r\n });\r\n // });\r\n }\r\n\r\n public migrateChat(id: ChatId): Promise<ChatId> {\r\n const chat: Chat = this.getChat(id);\r\n if(chat._ === 'channel') return Promise.resolve(chat.id);\r\n return this.apiManager.invokeApi('messages.migrateChat', {\r\n chat_id: id\r\n }).then((updates) => {\r\n this.onChatUpdated(id, updates);\r\n const update: Update.updateChannel = (updates as Updates.updates).updates.find((u) => u._ === 'updateChannel') as any;\r\n return update.channel_id;\r\n });\r\n }\r\n\r\n public updateUsername(id: ChatId, username: string) {\r\n return this.apiManager.invokeApi('channels.updateUsername', {\r\n channel: this.getChannelInput(id),\r\n username\r\n }).then((bool) => {\r\n if(bool) {\r\n const chat: Chat.channel = this.getChat(id);\r\n chat.username = username;\r\n }\r\n\r\n return bool;\r\n });\r\n }\r\n\r\n public editPhoto(id: ChatId, inputFile: InputFile) {\r\n const inputChatPhoto: InputChatPhoto = {\r\n _: 'inputChatUploadedPhoto',\r\n file: inputFile\r\n };\r\n\r\n let promise: any;\r\n if(this.isChannel(id)) {\r\n promise = this.apiManager.invokeApi('channels.editPhoto', {\r\n channel: this.getChannelInput(id),\r\n photo: inputChatPhoto\r\n });\r\n } else {\r\n promise = this.apiManager.invokeApi('messages.editChatPhoto', {\r\n chat_id: id,\r\n photo: inputChatPhoto\r\n });\r\n }\r\n\r\n return promise.then((updates: any) => {\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n public editTitle(id: ChatId, title: string) {\r\n let promise: any;\r\n\r\n if(this.isChannel(id)) {\r\n promise = this.apiManager.invokeApi('channels.editTitle', {\r\n channel: this.getChannelInput(id),\r\n title\r\n });\r\n } else {\r\n promise = this.apiManager.invokeApi('messages.editChatTitle', {\r\n chat_id: id,\r\n title\r\n });\r\n }\r\n\r\n return promise.then((updates: any) => {\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n public editAbout(id: ChatId, about: string) {\r\n const peerId = id.toPeerId(true);\r\n return this.apiManager.invokeApi('messages.editChatAbout', {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n about\r\n }).then((bool) => {\r\n if(bool) {\r\n this.rootScope.dispatchEvent('peer_bio_edit', peerId);\r\n }\r\n\r\n return bool;\r\n });\r\n }\r\n\r\n public editBanned(id: ChatId, participant: PeerId | ChannelParticipant, banned_rights: ChatBannedRights) {\r\n const peerId = typeof(participant) !== 'object' ? participant : getParticipantPeerId(participant);\r\n return this.apiManager.invokeApi('channels.editBanned', {\r\n channel: this.getChannelInput(id),\r\n participant: this.appPeersManager.getInputPeerById(peerId),\r\n banned_rights\r\n }).then((updates) => {\r\n this.onChatUpdated(id, updates);\r\n\r\n if(typeof(participant) === 'object') {\r\n const timestamp = Date.now() / 1000 | 0;\r\n this.apiUpdatesManager.processLocalUpdate({\r\n _: 'updateChannelParticipant',\r\n channel_id: id,\r\n date: timestamp,\r\n actor_id: undefined,\r\n qts: undefined,\r\n user_id: peerId,\r\n prev_participant: participant,\r\n new_participant: Object.keys(banned_rights.pFlags).length ? {\r\n _: 'channelParticipantBanned',\r\n date: timestamp,\r\n banned_rights,\r\n kicked_by: this.appUsersManager.getSelf().id,\r\n peer: this.appPeersManager.getOutputPeer(peerId),\r\n pFlags: {}\r\n } : undefined\r\n });\r\n }\r\n });\r\n }\r\n\r\n public clearChannelParticipantBannedRights(id: ChatId, participant: PeerId | ChannelParticipant) {\r\n return this.editBanned(id, participant, {\r\n _: 'chatBannedRights',\r\n until_date: 0,\r\n pFlags: {}\r\n });\r\n }\r\n\r\n public kickFromChannel(id: ChatId, participant: PeerId | ChannelParticipant) {\r\n return this.editBanned(id, participant, {\r\n _: 'chatBannedRights',\r\n until_date: 0,\r\n pFlags: {\r\n view_messages: true\r\n }\r\n });\r\n }\r\n\r\n public kickFromChat(id: ChatId, participant: PeerId | ChannelParticipant) {\r\n if(this.isChannel(id)) return this.kickFromChannel(id, participant);\r\n else return this.deleteChatUser(id, (participant as PeerId).toUserId());\r\n }\r\n\r\n public resolveChannel(id: ChatId) {\r\n return this.apiManager.invokeApiSingle('channels.getChannels', {\r\n id: [{\r\n _: 'inputChannel',\r\n channel_id: id,\r\n access_hash: '0'\r\n }]\r\n }).then((messagesChats) => {\r\n this.saveApiChats(messagesChats.chats);\r\n });\r\n }\r\n\r\n public togglePreHistoryHidden(id: ChatId, enabled: boolean) {\r\n return this.migrateChat(id).then((channelId) => {\r\n return this.apiManager.invokeApi('channels.togglePreHistoryHidden', {\r\n channel: this.getChannelInput(channelId),\r\n enabled\r\n });\r\n }).then((updates) => {\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n public toggleSignatures(id: ChatId, enabled: boolean) {\r\n return this.apiManager.invokeApi('channels.toggleSignatures', {\r\n channel: this.getChannelInput(id),\r\n enabled\r\n }).then((updates) => {\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n public toggleNoForwards(id: ChatId, enabled: boolean) {\r\n return this.apiManager.invokeApi('messages.toggleNoForwards', {\r\n peer: this.getInputPeer(id),\r\n enabled\r\n }).then((updates) => {\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n public setChatAvailableReactions(id: ChatId, reactions: ChatReactions) {\r\n const chatFull = this.appProfileManager.getCachedFullChat(id);\r\n if(chatFull) {\r\n chatFull.available_reactions = reactions;\r\n }\r\n\r\n return this.apiManager.invokeApi('messages.setChatAvailableReactions', {\r\n peer: this.getInputPeer(id),\r\n available_reactions: reactions\r\n }).then((updates) => {\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n public isRestricted(chatId: ChatId) {\r\n const chat: Chat.channel = this.getChat(chatId);\r\n const restrictionReasons = chat.restriction_reason;\r\n\r\n return !!(chat.pFlags.restricted && restrictionReasons && isRestricted(restrictionReasons));\r\n }\r\n\r\n public getSendAs(channelId: ChatId) {\r\n return this.apiManager.invokeApiSingleProcess({\r\n method: 'channels.getSendAs',\r\n params: {\r\n peer: this.getChannelInputPeer(channelId)\r\n },\r\n processResult: (sendAsPeers) => {\r\n this.appUsersManager.saveApiUsers(sendAsPeers.users);\r\n this.saveApiChats(sendAsPeers.chats);\r\n\r\n return sendAsPeers.peers;\r\n }\r\n });\r\n }\r\n\r\n public importChatInvite(hash: string) {\r\n return this.apiManager.invokeApi('messages.importChatInvite', {hash})\r\n .then((updates) => {\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n const chat = (updates as Updates.updates).chats[0];\r\n return chat.id;\r\n });\r\n }\r\n\r\n public checkUsername(chatId: ChatId, username: string) {\r\n return this.apiManager.invokeApi('channels.checkUsername', {\r\n channel: this.getChannelInput(chatId),\r\n username\r\n });\r\n }\r\n\r\n public getSponsoredMessage(chatId: ChatId) {\r\n // const s: MessagesSponsoredMessages.messagesSponsoredMessages = {\r\n // '_': 'messages.sponsoredMessages',\r\n // 'messages': [\r\n // {\r\n // '_': 'sponsoredMessage',\r\n // 'pFlags': {},\r\n // 'flags': 9,\r\n // 'random_id': new Uint8Array([\r\n // 80,\r\n // 5,\r\n // 249,\r\n // 174,\r\n // 44,\r\n // 73,\r\n // 173,\r\n // 14,\r\n // 246,\r\n // 81,\r\n // 187,\r\n // 182,\r\n // 223,\r\n // 5,\r\n // 4,\r\n // 128\r\n // ]),\r\n // 'from_id': {\r\n // '_': 'peerUser',\r\n // 'user_id': 983000232\r\n // },\r\n // 'start_param': 'GreatMinds',\r\n // 'message': 'This is a long sponsored message. In fact, it has the maximum length allowed on the platform  160 characters 😬😬. It\\'s promoting a bot with a start parameter.' + chatId\r\n // }\r\n // ],\r\n // 'chats': [],\r\n // 'users': [\r\n // {\r\n // '_': 'user',\r\n // 'pFlags': {\r\n // 'bot': true,\r\n // 'verified': true,\r\n // 'apply_min_photo': true\r\n // },\r\n // 'flags': 34226219,\r\n // 'id': 983000232,\r\n // 'access_hash': '-294959558742535650',\r\n // 'first_name': 'Quiz Bot',\r\n // 'username': 'QuizBot',\r\n // 'photo': {\r\n // '_': 'userProfilePhoto',\r\n // 'pFlags': {},\r\n // 'flags': 2,\r\n // 'photo_id': '4221953848856651689',\r\n // 'stripped_thumb': new Uint8Array([\r\n // 1,\r\n // 8,\r\n // 8,\r\n // 155,\r\n // 247,\r\n // 95,\r\n // 103,\r\n // 255,\r\n // 0,\r\n // 110,\r\n // 138,\r\n // 40,\r\n // 174,\r\n // 132,\r\n // 142,\r\n // 6,\r\n // 238,\r\n // 127\r\n // ]),\r\n // 'dc_id': 2\r\n // },\r\n // 'bot_info_version': 11,\r\n // 'bot_inline_placeholder': 'Search a quiz...',\r\n // 'sortName': 'quiz bot'\r\n // }\r\n // ]\r\n // };\r\n\r\n // const promise = Promise.resolve(s);\r\n const promise = this.apiManager.invokeApiCacheable('channels.getSponsoredMessages', {\r\n channel: this.getChannelInput(chatId)\r\n }, {cacheSeconds: 300});\r\n\r\n return promise.then((sponsoredMessages) => {\r\n this.appUsersManager.saveApiUsers(sponsoredMessages.users);\r\n this.appChatsManager.saveApiChats(sponsoredMessages.chats);\r\n\r\n const sponsoredMessage = sponsoredMessages.messages.shift();\r\n sponsoredMessages.messages.push(sponsoredMessage);\r\n\r\n return sponsoredMessages;\r\n });\r\n }\r\n\r\n public viewSponsoredMessage(chatId: ChatId, randomId: SponsoredMessage['random_id']) {\r\n return this.apiManager.invokeApiSingle('channels.viewSponsoredMessage', {\r\n channel: this.getChannelInput(chatId),\r\n random_id: randomId\r\n });\r\n }\r\n\r\n public checkChatInvite(hash: string) {\r\n return this.apiManager.invokeApi('messages.checkChatInvite', {\r\n hash: hash\r\n }).then((chatInvite) => {\r\n if((chatInvite as ChatInvite.chatInvitePeek).chat) {\r\n this.saveApiChat((chatInvite as ChatInvite.chatInvitePeek).chat, true);\r\n }\r\n\r\n return chatInvite;\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type lang from '../lang';\r\nimport type langSign from '../langSign';\r\nimport type {State} from '../config/state';\r\nimport DEBUG, {MOUNT_CLASS_TO} from '../config/debug';\r\nimport {HelpCountriesList, HelpCountry, LangPackDifference, LangPackString} from '../layer';\r\nimport stateStorage from './stateStorage';\r\nimport App from '../config/app';\r\nimport rootScope from './rootScope';\r\nimport {IS_MOBILE} from '../environment/userAgent';\r\nimport deepEqual from '../helpers/object/deepEqual';\r\nimport safeAssign from '../helpers/object/safeAssign';\r\nimport capitalizeFirstLetter from '../helpers/string/capitalizeFirstLetter';\r\nimport matchUrlProtocol from './richTextProcessor/matchUrlProtocol';\r\nimport wrapUrl from './richTextProcessor/wrapUrl';\r\n\r\nexport const langPack: {[actionType: string]: LangPackKey} = {\r\n 'messageActionChatCreate': 'ActionCreateGroup',\r\n 'messageActionChatCreateYou': 'ActionYouCreateGroup',\r\n 'messageActionChatEditTitle': 'ActionChangedTitle',\r\n 'messageActionChatEditPhoto': 'ActionChangedPhoto',\r\n 'messageActionChatEditVideo': 'ActionChangedVideo',\r\n 'messageActionChatDeletePhoto': 'ActionRemovedPhoto',\r\n 'messageActionChatReturn': 'ActionAddUserSelf',\r\n 'messageActionChatReturnYou': 'ActionAddUserSelfYou',\r\n 'messageActionChatJoined': 'ActionAddUserSelfMega',\r\n 'messageActionChatJoinedYou': 'ChannelMegaJoined',\r\n 'messageActionChatAddUser': 'ActionAddUser',\r\n 'messageActionChatAddUsers': 'ActionAddUser',\r\n 'messageActionChatLeave': 'ActionLeftUser',\r\n 'messageActionChatLeaveYou': 'YouLeft',\r\n 'messageActionChatDeleteUser': 'ActionKickUser',\r\n 'messageActionChatJoinedByLink': 'ActionInviteUser',\r\n 'messageActionPinMessage': 'Chat.Service.Group.UpdatedPinnedMessage',\r\n 'messageActionContactSignUp': 'Chat.Service.PeerJoinedTelegram',\r\n 'messageActionChannelCreate': 'ActionCreateChannel',\r\n 'messageActionChannelEditTitle': 'Chat.Service.Channel.UpdatedTitle',\r\n 'messageActionChannelEditPhoto': 'Chat.Service.Channel.UpdatedPhoto',\r\n 'messageActionChannelEditVideo': 'Chat.Service.Channel.UpdatedVideo',\r\n 'messageActionChannelDeletePhoto': 'Chat.Service.Channel.RemovedPhoto',\r\n 'messageActionHistoryClear': 'HistoryCleared',\r\n 'messageActionDiscussionStarted': 'DiscussionStarted',\r\n\r\n 'messageActionChannelMigrateFrom': 'ActionMigrateFromGroup',\r\n\r\n 'messageActionPhoneCall.video_in_ok': 'ChatList.Service.VideoCall.incoming',\r\n 'messageActionPhoneCall.video_out_ok': 'ChatList.Service.VideoCall.outgoing',\r\n 'messageActionPhoneCall.video_missed': 'ChatList.Service.VideoCall.Missed',\r\n 'messageActionPhoneCall.video_cancelled': 'ChatList.Service.VideoCall.Cancelled',\r\n 'messageActionPhoneCall.in_ok': 'ChatList.Service.Call.incoming',\r\n 'messageActionPhoneCall.out_ok': 'ChatList.Service.Call.outgoing',\r\n 'messageActionPhoneCall.missed': 'ChatList.Service.Call.Missed',\r\n 'messageActionPhoneCall.cancelled': 'ChatList.Service.Call.Cancelled',\r\n\r\n 'messageActionGroupCall.started': 'Chat.Service.VoiceChatStarted.Channel',\r\n 'messageActionGroupCall.started_by': 'Chat.Service.VoiceChatStarted',\r\n 'messageActionGroupCall.started_byYou': 'Chat.Service.VoiceChatStartedYou',\r\n 'messageActionGroupCall.ended': 'Chat.Service.VoiceChatFinished.Channel',\r\n 'messageActionGroupCall.ended_by': 'Chat.Service.VoiceChatFinished',\r\n 'messageActionGroupCall.ended_byYou': 'Chat.Service.VoiceChatFinishedYou',\r\n\r\n 'messageActionBotAllowed': 'Chat.Service.BotPermissionAllowed'\r\n};\r\n\r\nexport type LangPackKey = /* string | */keyof typeof lang | keyof typeof langSign;\r\n\r\nexport type FormatterArgument = string | number | Node | FormatterArgument[];\r\nexport type FormatterArguments = FormatterArgument[];\r\n\r\nexport const UNSUPPORTED_LANG_PACK_KEY: LangPackKey = IS_MOBILE ? 'Message.Unsupported.Mobile' : 'Message.Unsupported.Desktop';\r\n\r\nnamespace I18n {\r\n export const strings: Map<LangPackKey, LangPackString> = new Map();\r\n export const countriesList: HelpCountry[] = [];\r\n let pluralRules: Intl.PluralRules;\r\n\r\n let cacheLangPackPromise: Promise<LangPackDifference>;\r\n export let lastRequestedLangCode: string;\r\n export let lastRequestedNormalizedLangCode: string;\r\n export let lastAppliedLangCode: string;\r\n export let requestedServerLanguage = false;\r\n export let timeFormat: State['settings']['timeFormat'];\r\n\r\n function setLangCode(langCode: string) {\r\n lastRequestedLangCode = langCode;\r\n lastRequestedNormalizedLangCode = langCode.split('-')[0];\r\n }\r\n\r\n export function getCacheLangPack(): Promise<LangPackDifference> {\r\n if(cacheLangPackPromise) return cacheLangPackPromise;\r\n return cacheLangPackPromise = Promise.all([\r\n stateStorage.get('langPack') as Promise<LangPackDifference>,\r\n polyfillPromise\r\n ]).then(([langPack]) => {\r\n if(!langPack/* || true */) {\r\n return loadLocalLangPack();\r\n } else if(DEBUG && false) {\r\n return getLangPack(langPack.lang_code);\r\n }/* else if(langPack.appVersion !== App.langPackVersion) {\r\n return getLangPack(langPack.lang_code);\r\n } */\r\n\r\n if(!lastRequestedLangCode) {\r\n setLangCode(langPack.lang_code);\r\n }\r\n\r\n applyLangPack(langPack);\r\n return langPack;\r\n }).finally(() => {\r\n cacheLangPackPromise = undefined;\r\n });\r\n }\r\n\r\n function updateAmPm() {\r\n if(timeFormat === 'h12') {\r\n try {\r\n const dateTimeFormat = getDateTimeFormat({hour: 'numeric', minute: 'numeric', hour12: true});\r\n const date = new Date();\r\n date.setHours(0);\r\n const amText = dateTimeFormat.format(date);\r\n amPmCache.am = amText.split(' ')[1];\r\n date.setHours(12);\r\n const pmText = dateTimeFormat.format(date);\r\n amPmCache.pm = pmText.split(' ')[1];\r\n } catch(err) {\r\n console.error('cannot get am/pm', err);\r\n amPmCache = {am: 'AM', pm: 'PM'};\r\n }\r\n }\r\n }\r\n\r\n export function setTimeFormat(\r\n format: State['settings']['timeFormat'],\r\n haveToUpdate = !!timeFormat && timeFormat !== format\r\n ) {\r\n timeFormat = format;\r\n\r\n updateAmPm();\r\n\r\n if(haveToUpdate) {\r\n cachedDateTimeFormats.clear();\r\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\r\n elements.forEach((element) => {\r\n const instance = weakMap.get(element);\r\n\r\n if(instance instanceof IntlDateElement) {\r\n instance.update();\r\n }\r\n });\r\n }\r\n }\r\n\r\n export function loadLocalLangPack() {\r\n const defaultCode = App.langPackCode;\r\n setLangCode(defaultCode);\r\n return Promise.all([\r\n import('../lang'),\r\n import('../langSign'),\r\n import('../countries')\r\n ]).then(([lang, langSign, countries]) => {\r\n const strings: LangPackString[] = [];\r\n formatLocalStrings(lang.default, strings);\r\n formatLocalStrings(langSign.default, strings);\r\n\r\n const langPack: LangPackDifference = {\r\n _: 'langPackDifference',\r\n from_version: 0,\r\n lang_code: defaultCode,\r\n strings,\r\n version: 0,\r\n local: true,\r\n countries: countries.default\r\n };\r\n return saveLangPack(langPack);\r\n });\r\n }\r\n\r\n export function loadLangPack(langCode: string, web?: boolean) {\r\n requestedServerLanguage = true;\r\n const managers = rootScope.managers;\r\n return Promise.all([\r\n managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\r\n lang_code: langCode,\r\n lang_pack: web ? 'web' : App.langPack\r\n }),\r\n !web && managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\r\n lang_code: langCode,\r\n lang_pack: 'android'\r\n }),\r\n import('../lang'),\r\n import('../langSign'),\r\n managers.apiManager.invokeApiCacheable('help.getCountriesList', {\r\n lang_code: langCode,\r\n hash: 0\r\n }) as Promise<HelpCountriesList.helpCountriesList>,\r\n polyfillPromise\r\n ]);\r\n }\r\n\r\n export function getStrings(langCode: string, strings: string[]) {\r\n return rootScope.managers.apiManager.invokeApi('langpack.getStrings', {\r\n lang_pack: App.langPack,\r\n lang_code: langCode,\r\n keys: strings\r\n });\r\n }\r\n\r\n export function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\r\n for(const i in strings) {\r\n // @ts-ignore\r\n const v = strings[i];\r\n if(typeof(v) === 'string') {\r\n pushTo.push({\r\n _: 'langPackString',\r\n key: i,\r\n value: v\r\n });\r\n } else {\r\n pushTo.push({\r\n _: 'langPackStringPluralized',\r\n key: i,\r\n ...v\r\n });\r\n }\r\n }\r\n\r\n return pushTo;\r\n }\r\n\r\n export function getLangPack(langCode: string, web?: boolean) {\r\n setLangCode(langCode);\r\n return loadLangPack(langCode, web).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\r\n let strings: LangPackString[] = [];\r\n\r\n [localLangPack1, localLangPack2].forEach((l) => {\r\n formatLocalStrings(l.default as any, strings);\r\n });\r\n\r\n strings = strings.concat(...[langPack1.strings, langPack2.strings].filter(Boolean));\r\n\r\n langPack1.strings = strings;\r\n langPack1.countries = countries;\r\n return saveLangPack(langPack1);\r\n });\r\n }\r\n\r\n export function saveLangPack(langPack: LangPackDifference) {\r\n langPack.appVersion = App.langPackVersion;\r\n\r\n return stateStorage.set({langPack}).then(() => {\r\n applyLangPack(langPack);\r\n return langPack;\r\n });\r\n }\r\n\r\n export const polyfillPromise = (function checkIfPolyfillNeeded() {\r\n if(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\r\n return Promise.resolve();\r\n } else {\r\n return import('./pluralPolyfill').then((_Intl) => {\r\n (window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\r\n });\r\n }\r\n })();\r\n\r\n export function applyLangPack(langPack: LangPackDifference) {\r\n const currentLangCode = lastRequestedLangCode;\r\n if(langPack.lang_code !== currentLangCode) {\r\n return;\r\n }\r\n\r\n try {\r\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode);\r\n } catch(err) {\r\n console.error('pluralRules error', err);\r\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode.split('-', 1)[0]);\r\n }\r\n\r\n try {\r\n pluralRules = new Intl.PluralRules(langPack.lang_code);\r\n } catch(err) {\r\n console.error('pluralRules error', err);\r\n pluralRules = new Intl.PluralRules(langPack.lang_code.split('-', 1)[0]);\r\n }\r\n\r\n strings.clear();\r\n\r\n for(const string of langPack.strings) {\r\n strings.set(string.key as LangPackKey, string);\r\n }\r\n\r\n if(langPack.countries) {\r\n countriesList.length = 0;\r\n countriesList.push(...langPack.countries.countries);\r\n\r\n langPack.countries.countries.forEach((country) => {\r\n if(country.name) {\r\n const langPackKey: any = country.default_name;\r\n strings.set(langPackKey, {\r\n _: 'langPackString',\r\n key: langPackKey,\r\n value: country.name\r\n });\r\n }\r\n });\r\n }\r\n\r\n if(lastAppliedLangCode !== currentLangCode) {\r\n rootScope.dispatchEvent('language_change', currentLangCode);\r\n lastAppliedLangCode = currentLangCode;\r\n cachedDateTimeFormats.clear();\r\n updateAmPm();\r\n }\r\n\r\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\r\n elements.forEach((element) => {\r\n const instance = weakMap.get(element);\r\n\r\n if(instance) {\r\n instance.update();\r\n }\r\n });\r\n }\r\n\r\n function pushNextArgument(out: ReturnType<typeof superFormatter>, args: FormatterArguments, indexHolder: {i: number}) {\r\n const arg = args[indexHolder.i++];\r\n if(Array.isArray(arg)) {\r\n out.push(...arg as any);\r\n } else {\r\n out.push(arg);\r\n }\r\n }\r\n\r\n export function superFormatter(input: string, args?: FormatterArguments, indexHolder = {i: 0}): Exclude<FormatterArgument, FormatterArgument[]>[] {\r\n const out: ReturnType<typeof superFormatter> = [];\r\n const regExp = /(\\*\\*|__)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%./g;\r\n\r\n let lastIndex = 0;\r\n input.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\r\n // console.table({match, p1, p2, offset, string});\r\n\r\n out.push(string.slice(lastIndex, offset));\r\n\r\n if(p1) {\r\n // offset += p1.length;\r\n let element: HTMLElement;\r\n switch(p1) {\r\n case '**': {\r\n element = document.createElement('b');\r\n break;\r\n }\r\n\r\n case '__': {\r\n element = document.createElement('i');\r\n break;\r\n }\r\n }\r\n\r\n element.append(...superFormatter(p2, args, indexHolder) as any);\r\n out.push(element);\r\n } else if(p3) {\r\n out.push(document.createElement('br'));\r\n } else if(p4) {\r\n const idx = p4.lastIndexOf(']');\r\n const text = p4.slice(1, idx);\r\n\r\n const url = p4.slice(idx + 2, p4.length - 1);\r\n let a: HTMLAnchorElement;\r\n if(url && matchUrlProtocol(url)) {\r\n a = document.createElement('a');\r\n const wrappedUrl = wrapUrl(url);\r\n a.href = wrappedUrl.url;\r\n if(wrappedUrl.onclick) a.setAttribute('onclick', wrappedUrl.onclick);\r\n a.target = '_blank';\r\n } else {\r\n a = args[indexHolder.i++] as HTMLAnchorElement;\r\n\r\n if(a instanceof DocumentFragment) { // right after wrapRichText\r\n a = a.firstChild as any;\r\n }\r\n\r\n a.textContent = ''; // reset content\r\n }\r\n\r\n a.append(...superFormatter(text, args, indexHolder) as any);\r\n\r\n out.push(a);\r\n } else if(args) {\r\n pushNextArgument(out, args, indexHolder);\r\n }\r\n\r\n lastIndex = offset + match.length;\r\n return '';\r\n });\r\n\r\n if(lastIndex !== input.length) {\r\n out.push(input.slice(lastIndex));\r\n }\r\n\r\n return out;\r\n }\r\n\r\n export function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\r\n export function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType<typeof superFormatter>;\r\n export function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType<typeof superFormatter> | string {\r\n const str = strings.get(key);\r\n let input: string;\r\n if(str) {\r\n if(str._ === 'langPackStringPluralized' && args?.length) {\r\n let v = args[0] as number | string;\r\n if(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\r\n const s = pluralRules.select(v);\r\n // @ts-ignore\r\n input = str[s + '_value'] || str['other_value'];\r\n } else if(str._ === 'langPackString') {\r\n input = str.value;\r\n } else {\r\n // input = '[' + key + ']';\r\n input = key;\r\n }\r\n } else {\r\n // input = '[' + key + ']';\r\n input = key;\r\n }\r\n\r\n const result = superFormatter(input, args);\r\n if(plain) { // * let's try a hack now... (don't want to replace []() entity)\r\n return result.map((item) => item instanceof Node ? item.textContent : item).join('');\r\n } else {\r\n return result;\r\n }\r\n\r\n /* if(plain) {\r\n if(args?.length) {\r\n const regExp = /un\\d|%\\d\\$.|%./g;\r\n let i = 0;\r\n input = input.replace(regExp, (match, offset, string) => {\r\n return '' + args[i++];\r\n });\r\n }\r\n\r\n return input;\r\n } else {\r\n return superFormatter(input, args);\r\n } */\r\n }\r\n\r\n export const weakMap: WeakMap<HTMLElement, IntlElementBase<IntlElementBaseOptions>> = new WeakMap();\r\n\r\n export type IntlElementBaseOptions = {\r\n element?: HTMLElement,\r\n property?: 'innerText' | 'innerHTML' | 'placeholder' | 'textContent',\r\n };\r\n\r\n abstract class IntlElementBase<Options extends IntlElementBaseOptions> {\r\n public element: IntlElementBaseOptions['element'];\r\n public property: IntlElementBaseOptions['property'];\r\n\r\n constructor(options?: Options) {\r\n this.element = options?.element || document.createElement('span');\r\n this.element.classList.add('i18n');\r\n\r\n this.property = options?.property;\r\n if(options && ((options as any as IntlElementOptions).key || (options as any as IntlDateElementOptions).date)) {\r\n this.update(options);\r\n }\r\n\r\n weakMap.set(this.element, this);\r\n }\r\n\r\n abstract update(options?: Options): void;\r\n }\r\n\r\n export type IntlElementOptions = IntlElementBaseOptions & {\r\n key?: LangPackKey,\r\n args?: FormatterArguments\r\n };\r\n export class IntlElement extends IntlElementBase<IntlElementOptions> {\r\n public key: IntlElementOptions['key'];\r\n public args: IntlElementOptions['args'];\r\n\r\n constructor(options: IntlElementOptions = {}) {\r\n super({...options, property: options.property ?? 'innerHTML'});\r\n }\r\n\r\n public update(options?: IntlElementOptions) {\r\n safeAssign(this, options);\r\n\r\n if(this.property === 'innerHTML') {\r\n this.element.textContent = '';\r\n this.element.append(...format(this.key, false, this.args) as any);\r\n } else {\r\n // @ts-ignore\r\n const v = this.element[this.property];\r\n const formatted = format(this.key, true, this.args);\r\n\r\n // * hasOwnProperty won't work here\r\n if(v === undefined) this.element.dataset[this.property] = formatted;\r\n else (this.element as HTMLInputElement)[this.property] = formatted;\r\n }\r\n }\r\n\r\n public compareAndUpdate(options?: IntlElementOptions) {\r\n if(this.key === options.key && deepEqual(this.args, options.args)) {\r\n return;\r\n }\r\n\r\n return this.update(options);\r\n }\r\n }\r\n\r\n const cachedDateTimeFormats: Map<string, Intl.DateTimeFormat> = new Map();\r\n function getDateTimeFormat(options: Intl.DateTimeFormatOptions = {}) {\r\n const json = JSON.stringify(options);\r\n let dateTimeFormat = cachedDateTimeFormats.get(json);\r\n if(!dateTimeFormat) {\r\n dateTimeFormat = new Intl.DateTimeFormat(lastRequestedNormalizedLangCode + '-u-hc-' + timeFormat, options);\r\n cachedDateTimeFormats.set(json, dateTimeFormat);\r\n }\r\n\r\n return dateTimeFormat;\r\n }\r\n\r\n export let amPmCache = {am: 'AM', pm: 'PM'};\r\n export type IntlDateElementOptions = IntlElementBaseOptions & {\r\n date?: Date,\r\n options: Intl.DateTimeFormatOptions\r\n };\r\n export class IntlDateElement extends IntlElementBase<IntlDateElementOptions> {\r\n public date: IntlDateElementOptions['date'];\r\n public options: IntlDateElementOptions['options'];\r\n\r\n constructor(options: IntlDateElementOptions) {\r\n super({...options, property: options.property ?? 'textContent'});\r\n }\r\n\r\n public update(options?: IntlDateElementOptions) {\r\n safeAssign(this, options);\r\n\r\n let text: string;\r\n if(this.options.hour && this.options.minute && Object.keys(this.options).length === 2/* && false */) {\r\n const hours = this.date.getHours();\r\n text = ('0' + (timeFormat === 'h12' ? (hours % 12) || 12 : hours)).slice(-2) + ':' + ('0' + this.date.getMinutes()).slice(-2);\r\n // if(this.options.second) {\r\n // text += ':' + ('0' + this.date.getSeconds()).slice(-2);\r\n // }\r\n\r\n if(timeFormat === 'h12') {\r\n text += ' ' + (hours < 12 ? amPmCache.am : amPmCache.pm);\r\n }\r\n } else {\r\n // * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\r\n const dateTimeFormat = getDateTimeFormat(this.options);\r\n text = capitalizeFirstLetter(dateTimeFormat.format(this.date));\r\n }\r\n\r\n (this.element as any)[this.property] = text;\r\n }\r\n }\r\n\r\n export function i18n(key: LangPackKey, args?: FormatterArguments) {\r\n return new IntlElement({key, args}).element;\r\n }\r\n\r\n export function i18n_(options: IntlElementOptions) {\r\n return new IntlElement(options).element;\r\n }\r\n\r\n export function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\r\n return new IntlElement({element, key, args, property}).element;\r\n }\r\n}\r\n\r\nexport {I18n};\r\nexport default I18n;\r\n\r\nconst i18n = I18n.i18n;\r\nexport {i18n};\r\n\r\nconst i18n_ = I18n.i18n_;\r\nexport {i18n_};\r\n\r\nconst _i18n = I18n._i18n;\r\nexport {_i18n};\r\n\r\nexport function joinElementsWith(elements: (Node | string)[], joiner: typeof elements[0] | ((isLast: boolean) => typeof elements[0])) {\r\n const arr = elements.slice(0, 1);\r\n for(let i = 1; i < elements.length; ++i) {\r\n const isLast = (elements.length - 1) === i;\r\n arr.push(typeof(joiner) === 'function' ? joiner(isLast) : joiner);\r\n arr.push(elements[i]);\r\n }\r\n\r\n return arr;\r\n}\r\n\r\n\r\nexport function join(elements: (Node | string)[], useLast: boolean, plain: true): string;\r\nexport function join(elements: (Node | string)[], useLast?: boolean, plain?: false): (string | Node)[];\r\nexport function join(elements: (Node | string)[], useLast: boolean, plain: boolean): string | (string | Node)[];\r\nexport function join(elements: (Node | string)[], useLast = true, plain?: boolean): string | (string | Node)[] {\r\n const joined = joinElementsWith(elements, (isLast) => {\r\n const langPackKey: LangPackKey = isLast && useLast ? 'AutoDownloadSettings.LastDelimeter' : 'AutoDownloadSettings.Delimeter';\r\n return plain ? I18n.format(langPackKey, true) : i18n(langPackKey);\r\n });\r\n\r\n return plain ? joined.join('') : joined;\r\n}\r\n\r\nMOUNT_CLASS_TO.I18n = I18n;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport I18n, {i18n} from '../lib/langPack';\r\n\r\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\r\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n\r\nexport const ONE_DAY = 86400;\r\n\r\n// https://stackoverflow.com/a/6117889\r\nexport const getWeekNumber = (date: Date) => {\r\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\r\n const dayNum = d.getUTCDay() || 7;\r\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\r\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\r\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\r\n};\r\n\r\nexport function formatDateAccordingToTodayNew(time: Date) {\r\n const today = new Date();\r\n const now = today.getTime() / 1000 | 0;\r\n const timestamp = time.getTime() / 1000 | 0;\r\n\r\n const options: Intl.DateTimeFormatOptions = {};\r\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\r\n options.hour = options.minute = '2-digit';\r\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\r\n options.year = options.day = 'numeric';\r\n options.month = '2-digit';\r\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\r\n options.weekday = 'short';\r\n } else { // same year\r\n options.month = 'short';\r\n options.day = 'numeric';\r\n }\r\n\r\n return new I18n.IntlDateElement({\r\n date: time,\r\n options\r\n }).element;\r\n}\r\n\r\nexport function formatFullSentTimeRaw(timestamp: number, options: {\r\n capitalize?: boolean\r\n} = {}) {\r\n const date = new Date();\r\n const time = new Date(timestamp * 1000);\r\n const now = date.getTime() / 1000;\r\n\r\n const timeEl = formatTime(time);\r\n\r\n let dateEl: Node | string;\r\n if((now - timestamp) < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\r\n dateEl = i18n(options.capitalize ? 'Date.Today' : 'Peer.Status.Today');\r\n } else if((now - timestamp) < (ONE_DAY * 2) && (date.getDate() - 1) === time.getDate()) { // yesterday\r\n dateEl = i18n(options.capitalize ? 'Yesterday' : 'Peer.Status.Yesterday');\r\n\r\n if(options.capitalize) {\r\n (dateEl as HTMLElement).style.textTransform = 'capitalize';\r\n }\r\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\r\n dateEl = new I18n.IntlDateElement({\r\n date: time,\r\n options: {\r\n month: 'short',\r\n day: 'numeric',\r\n year: 'numeric'\r\n }\r\n }).element;\r\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate() + ', ' + time.getFullYear();\r\n } else {\r\n dateEl = new I18n.IntlDateElement({\r\n date: time,\r\n options: {\r\n month: 'short',\r\n day: 'numeric'\r\n }\r\n }).element;\r\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate();\r\n }\r\n\r\n return {dateEl, timeEl};\r\n}\r\n\r\nexport function formatFullSentTime(timestamp: number) {\r\n const {dateEl, timeEl} = formatFullSentTimeRaw(timestamp, {\r\n capitalize: true\r\n });\r\n\r\n const fragment = document.createDocumentFragment();\r\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\r\n return fragment;\r\n}\r\n\r\nexport function formatTime(date: Date) {\r\n return new I18n.IntlDateElement({\r\n date,\r\n options: {\r\n hour: '2-digit',\r\n minute: '2-digit'\r\n }\r\n }).element;\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\r\n\r\nexport const getFullDate = (date: Date, options: Partial<{\r\n noTime: true,\r\n noSeconds: true,\r\n monthAsNumber: true,\r\n leadingZero: true\r\n}> = {}) => {\r\n const joiner = options.monthAsNumber ? '.' : ' ';\r\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\r\n\r\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) +\r\n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) +\r\n joiner + date.getFullYear() +\r\n (options.noTime ? '' : ', ' + time);\r\n};\r\n\r\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\r\nconst minYear = 2013;\r\nconst yearPattern = new RegExp('20[0-9]{1,2}');\r\nconst monthYearOrDayPattern = new RegExp('(\\\\w{3,}) ([0-9]{0,4})', 'i');\r\nconst yearOrDayAndMonthPattern = new RegExp('([0-9]{0,4}) (\\\\w{2,})', 'i');\r\nconst shortDate = new RegExp('^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\r\nconst longDate = new RegExp('^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\r\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\r\nexport type DateData = {\r\n title: string,\r\n minDate: number,\r\n maxDate: number,\r\n};\r\nexport function fillTipDates(query: string, dates: DateData[]) {\r\n const q = query.trim().toLowerCase();\r\n\r\n if(q.length < 3) {\r\n return;\r\n }\r\n\r\n if('today'.indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: 'Today',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n if('yesterday'.indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime() - 86400000;\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 86400001;\r\n dates.push({\r\n title: 'Yesterday',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n const dayOfWeek = getDayOfWeek(q);\r\n if(dayOfWeek >= 0) {\r\n const date = new Date();\r\n const now = date.getTime();\r\n const currentDay = date.getDay();\r\n const distance = dayOfWeek - currentDay;\r\n date.setDate(date.getDate() + distance);\r\n if(date.getTime() > now) {\r\n date.setTime(date.getTime() - 604800000);\r\n }\r\n const year = date.getFullYear()\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatWeekLong(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n let matches: any[];\r\n if((matches = shortDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const k = parseInt(g1);\r\n const k1 = parseInt(g2);\r\n if(k > 0 && k <= 31) {\r\n if(k1 >= minYear && k <= 12) {\r\n const selectedYear = k1;\r\n const month = k - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n } else if(k1 <= 12) {\r\n const day = k - 1;\r\n const month = k1 - 1;\r\n createForDayMonth(dates, day, month);\r\n }\r\n } else if(k >= minYear && k1 <= 12) {\r\n const selectedYear = k;\r\n const month = k1 - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = longDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const g3 = matches[5];\r\n if(!matches[2] === matches[4]) {\r\n return;\r\n }\r\n\r\n const day = parseInt(g1);\r\n const month = parseInt(g2) - 1;\r\n let year = parseInt(g3);\r\n if(year >= 10 && year <= 99) {\r\n year += 2000;\r\n }\r\n\r\n const currentYear = new Date().getFullYear();\r\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = yearPattern.exec(q)) !== null) {\r\n let selectedYear = +q;\r\n const currentYear = new Date().getFullYear();\r\n if(selectedYear < minYear) {\r\n selectedYear = minYear;\r\n for(let i = currentYear; i >= selectedYear; i--) {\r\n const date = new Date();\r\n date.setFullYear(i, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(i + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + i,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n } else if(selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(selectedYear + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + selectedYear,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g1);\r\n if(month >= 0) {\r\n const k = +g2;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if(k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g2);\r\n if(month >= 0) {\r\n const k = +g1;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if(k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n if(selectedYear >= minYear && selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, month, 1);\r\n date.setHours(0, 0, 0);\r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n return;\r\n }\r\n date.setMonth(date.getMonth() + 1);\r\n const maxDate = date.getTime() - 1;\r\n\r\n dates.push({\r\n title: formatterMonthYear(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n}\r\n\r\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\r\n if(validDateForMonth(day, month)) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n\r\n for(let i = currentYear; i >= minYear; i--) {\r\n if(month === 1 && day === 28 && !isLeapYear(i)) {\r\n continue;\r\n }\r\n\r\n const date = new Date();\r\n date.setFullYear(i, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n continue;\r\n }\r\n\r\n date.setFullYear(i, month, day + 2);\r\n date.setHours(0, 0, 0);\r\n const maxDate = date.getTime() - 1;\r\n if(i === currentYear) {\r\n dates.push({\r\n title: formatterDayMonth(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n } else {\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction formatterMonthYear(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\r\n}\r\n\r\nfunction formatterDayMonth(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\r\n}\r\n\r\nfunction formatterYearMax(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\r\n}\r\n\r\nfunction formatWeekLong(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return days[date.getDay()];\r\n}\r\n\r\nfunction validDateForMonth(day: number, month: number) {\r\n if(month >= 0 && month < 12) {\r\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction isLeapYear(year: number) {\r\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\r\n}\r\n\r\nfunction getMonth(q: string) {\r\n /* String[] months = new String[]{\r\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\r\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\r\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\r\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\r\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\r\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\r\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\r\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\r\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\r\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\r\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\r\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\r\n }; */\r\n\r\n /* String[] monthsEng = new String[12];\r\n Calendar c = Calendar.getInstance();\r\n for (int i = 1; i <= 12; i++) {\r\n c.set(0, 0, 0, 0, 0, 0);\r\n c.set(Calendar.MONTH, i);\r\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\r\n } */\r\n\r\n q = q.toLowerCase();\r\n for(let i = 0; i < 12; i++) {\r\n const month = months[i].toLowerCase();\r\n if(month.indexOf(q) === 0) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nfunction getDayOfWeek(q: string) {\r\n const c = new Date();\r\n if(q.length <= 3) {\r\n return -1;\r\n }\r\n\r\n for(let i = 0; i < 7; i++) {\r\n c.setDate(c.getDate() + 1);\r\n\r\n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\r\n return c.getDay();\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\r\n","/**\r\n * Will be used for FILE_REFERENCE_EXPIRED\r\n * @param key\r\n * @param wasObject\r\n * @param newObject\r\n */\r\nexport default function safeReplaceArrayInObject<K>(key: K, wasObject: any, newObject: any) {\r\n if('byteLength' in newObject[key]) { // Uint8Array\r\n newObject[key] = [...newObject[key]];\r\n }\r\n\r\n if(wasObject && wasObject[key] !== newObject[key]) {\r\n wasObject[key].length = newObject[key].length;\r\n (newObject[key] as any[]).forEach((v, i) => {\r\n wasObject[key][i] = v;\r\n });\r\n\r\n /* wasObject[key].set(newObject[key]); */\r\n newObject[key] = wasObject[key];\r\n }\r\n}\r\n","export const EXTENSION_MIME_TYPE_MAP: {[ext in MTFileExtension]: MTMimeType} = {\r\n pdf: 'application/pdf',\r\n tgv: 'application/x-tgwallpattern',\r\n tgs: 'application/x-tgsticker',\r\n json: 'application/json',\r\n wav: 'audio/wav',\r\n mp3: 'audio/mpeg',\r\n ogg: 'audio/ogg',\r\n jpeg: 'image/jpeg',\r\n jpg: 'image/jpeg',\r\n png: 'image/png',\r\n gif: 'image/gif',\r\n webp: 'image/webp',\r\n mp4: 'video/mp4',\r\n webm: 'video/webm',\r\n mov: 'video/quicktime',\r\n svg: 'image/svg+xml'\r\n};\r\n\r\nexport const MIME_TYPE_EXTENSION_MAP: {[mimeType in MTMimeType]?: MTFileExtension} = {};\r\n\r\nfor(const ext in EXTENSION_MIME_TYPE_MAP) {\r\n MIME_TYPE_EXTENSION_MAP[EXTENSION_MIME_TYPE_MAP[ext as MTFileExtension]] = ext as MTFileExtension;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport {AccountWallPapers, Document, DocumentAttribute, MessagesSavedGifs, PhotoSize, WallPaper} from '../../layer';\r\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\r\nimport {getFullDate} from '../../helpers/date';\r\nimport isObject from '../../helpers/object/isObject';\r\nimport safeReplaceArrayInObject from '../../helpers/object/safeReplaceArrayInObject';\r\nimport {AppManager} from './manager';\r\nimport wrapPlainText from '../richTextProcessor/wrapPlainText';\r\nimport assumeType from '../../helpers/assumeType';\r\nimport {getEnvironment} from '../../environment/utils';\r\nimport {isServiceWorkerOnline} from '../mtproto/mtproto.worker';\r\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\r\nimport getDocumentInputFileLocation from './utils/docs/getDocumentInputFileLocation';\r\nimport getDocumentURL from './utils/docs/getDocumentURL';\r\nimport type {ThumbCache} from '../storages/thumbs';\r\nimport makeError from '../../helpers/makeError';\r\nimport {EXTENSION_MIME_TYPE_MAP} from '../../environment/mimeTypeMap';\r\nimport {THUMB_TYPE_FULL} from '../mtproto/mtproto_config';\r\n\r\nexport type MyDocument = Document.document;\r\n\r\n// TODO: если залить картинку файлом, а потом перезайти в диалог - превьюшка заново скачается\r\n\r\ntype WallPaperId = WallPaper.wallPaper['id'];\r\n\r\nlet uploadWallPaperTempId = 0;\r\n\r\nexport class AppDocsManager extends AppManager {\r\n private docs: {[docId: DocId]: MyDocument};\r\n\r\n private stickerCachedThumbs: {[docId: DocId]: {[toneIndex: number]: {url: string, w: number, h: number}}};\r\n\r\n private uploadingWallPapers: {[id: WallPaperId]: {cacheContext: ThumbCache, file: File}};\r\n\r\n protected after() {\r\n this.docs = {};\r\n this.stickerCachedThumbs = {};\r\n this.uploadingWallPapers = {};\r\n\r\n MTProtoMessagePort.getInstance<false>().addEventListener('serviceWorkerOnline', (online) => {\r\n if(!online) {\r\n this.onServiceWorkerFail();\r\n }\r\n });\r\n }\r\n\r\n private onServiceWorkerFail = () => {\r\n for(const id in this.docs) {\r\n const doc = this.docs[id];\r\n\r\n if(doc.supportsStreaming) {\r\n delete doc.supportsStreaming;\r\n this.thumbsStorage.deleteCacheContext(doc);\r\n }\r\n }\r\n };\r\n\r\n public saveDoc(doc: Document, context?: ReferenceContext): MyDocument {\r\n if(!doc || doc._ === 'documentEmpty') {\r\n return;\r\n }\r\n\r\n const oldDoc = this.docs[doc.id];\r\n\r\n if(doc.file_reference) { // * because we can have a new object w/o the file_reference while sending\r\n safeReplaceArrayInObject('file_reference', oldDoc, doc);\r\n this.referenceDatabase.saveContext(doc.file_reference, context);\r\n }\r\n\r\n // console.log('saveDoc', apiDoc, this.docs[apiDoc.id]);\r\n // if(oldDoc) {\r\n // //if(doc._ !== 'documentEmpty' && doc._ === d._) {\r\n // if(doc.thumbs) {\r\n // if(!oldDoc.thumbs) oldDoc.thumbs = doc.thumbs;\r\n // /* else if(apiDoc.thumbs[0].bytes && !d.thumbs[0].bytes) {\r\n // d.thumbs.unshift(apiDoc.thumbs[0]);\r\n // } else if(d.thumbs[0].url) { // fix for converted thumb in safari\r\n // apiDoc.thumbs[0] = d.thumbs[0];\r\n // } */\r\n // }\r\n\r\n // //}\r\n\r\n // return oldDoc;\r\n\r\n // //return Object.assign(d, apiDoc, context);\r\n // //return context ? Object.assign(d, context) : d;\r\n // }\r\n\r\n if(!oldDoc) {\r\n this.docs[doc.id] = doc;\r\n }\r\n\r\n // * exclude from state\r\n // defineNotNumerableProperties(doc, [/* 'thumbs', */'type', 'h', 'w', 'file_name',\r\n // 'file', 'duration', 'downloaded', 'url', 'audioTitle',\r\n // 'audioPerformer', 'sticker', 'stickerEmoji', 'stickerEmojiRaw',\r\n // 'stickerSetInput', 'stickerThumbConverted', 'animated', 'supportsStreaming']);\r\n\r\n for(let i = 0, length = doc.attributes.length; i < length; ++i) {\r\n const attribute = doc.attributes[i];\r\n switch(attribute._) {\r\n case 'documentAttributeFilename':\r\n doc.file_name = wrapPlainText(attribute.file_name);\r\n break;\r\n\r\n case 'documentAttributeAudio':\r\n doc.duration = attribute.duration;\r\n doc.type = attribute.pFlags.voice && doc.mime_type === 'audio/ogg' ? 'voice' : 'audio';\r\n /* if(apiDoc.type === 'audio') {\r\n apiDoc.supportsStreaming = true;\r\n } */\r\n break;\r\n\r\n case 'documentAttributeVideo':\r\n doc.duration = attribute.duration;\r\n doc.w = attribute.w;\r\n doc.h = attribute.h;\r\n // apiDoc.supportsStreaming = attribute.pFlags?.supports_streaming/* && apiDoc.size > 524288 */;\r\n if(/* apiDoc.thumbs && */attribute.pFlags.round_message) {\r\n doc.type = 'round';\r\n } else /* if(apiDoc.thumbs) */ {\r\n doc.type = 'video';\r\n }\r\n break;\r\n\r\n case 'documentAttributeCustomEmoji':\r\n case 'documentAttributeSticker':\r\n if(attribute.alt !== undefined) {\r\n doc.stickerEmojiRaw = attribute.alt;\r\n }\r\n\r\n if(attribute.stickerset) {\r\n if(attribute.stickerset._ === 'inputStickerSetEmpty') {\r\n delete attribute.stickerset;\r\n } else if(attribute.stickerset._ === 'inputStickerSetID') {\r\n doc.stickerSetInput = attribute.stickerset;\r\n }\r\n }\r\n\r\n // * there can be no thumbs, then it is a document\r\n if(/* apiDoc.thumbs && */doc.mime_type === 'image/webp' && (doc.thumbs || getEnvironment().IS_WEBP_SUPPORTED)) {\r\n doc.type = 'sticker';\r\n doc.sticker = 1;\r\n } else if(doc.mime_type === 'video/webm') {\r\n if(!getEnvironment().IS_WEBM_SUPPORTED) {\r\n break;\r\n }\r\n\r\n doc.type = 'sticker';\r\n doc.sticker = 3;\r\n doc.animated = true;\r\n }\r\n break;\r\n\r\n case 'documentAttributeImageSize':\r\n doc.type = 'photo';\r\n doc.w = attribute.w;\r\n doc.h = attribute.h;\r\n break;\r\n\r\n case 'documentAttributeAnimated':\r\n if((doc.mime_type === 'image/gif' || doc.mime_type === 'video/mp4')/* && apiDoc.thumbs */) {\r\n doc.type = 'gif';\r\n }\r\n\r\n doc.animated = true;\r\n break;\r\n }\r\n }\r\n\r\n if(!doc.mime_type) {\r\n const ext = (doc.file_name || '').split('.').pop();\r\n // @ts-ignore\r\n const mappedMimeType = ext && EXTENSION_MIME_TYPE_MAP[ext.toLowerCase()];\r\n if(mappedMimeType) {\r\n doc.mime_type = mappedMimeType;\r\n } else {\r\n switch(doc.type) {\r\n case 'gif':\r\n case 'video':\r\n case 'round':\r\n doc.mime_type = 'video/mp4';\r\n break;\r\n case 'sticker':\r\n doc.mime_type = 'image/webp';\r\n break;\r\n case 'audio':\r\n doc.mime_type = 'audio/mpeg';\r\n break;\r\n case 'voice':\r\n doc.mime_type = 'audio/ogg';\r\n break;\r\n default:\r\n doc.mime_type = 'application/octet-stream';\r\n break;\r\n }\r\n }\r\n } else if(doc.mime_type === EXTENSION_MIME_TYPE_MAP.pdf) {\r\n doc.type = 'pdf';\r\n } else if(doc.mime_type === EXTENSION_MIME_TYPE_MAP.gif) {\r\n doc.type = 'gif';\r\n }\r\n\r\n if(doc.type === 'voice' || doc.type === 'round') {\r\n // browser will identify extension\r\n const attribute = doc.attributes.find((attribute) => attribute._ === 'documentAttributeFilename') as DocumentAttribute.documentAttributeFilename;\r\n const ext = attribute && attribute.file_name.split('.').pop();\r\n const date = getFullDate(new Date(doc.date * 1000), {monthAsNumber: true, leadingZero: true}).replace(/[:\\.]/g, '-').replace(', ', '_');\r\n doc.file_name = `${doc.type}_${date}${ext ? '.' + ext : ''}`;\r\n }\r\n\r\n if(isServiceWorkerOnline()) {\r\n if((doc.type === 'gif' && doc.size > 8e6) || doc.type === 'audio' || doc.type === 'video'/* || doc.mime_type.indexOf('video/') === 0 */) {\r\n doc.supportsStreaming = true;\r\n\r\n const cacheContext = this.thumbsStorage.getCacheContext(doc);\r\n if(!cacheContext.url) {\r\n this.thumbsStorage.setCacheContextURL(doc, undefined, getDocumentURL(doc), 0);\r\n }\r\n }\r\n }\r\n\r\n // for testing purposes\r\n // doc.supportsStreaming = false;\r\n // doc.url = ''; // * this will break upload urls\r\n\r\n if(!doc.file_name) {\r\n doc.file_name = '';\r\n }\r\n\r\n if(doc.mime_type === 'application/x-tgsticker' && doc.file_name === 'AnimatedSticker.tgs') {\r\n doc.type = 'sticker';\r\n doc.animated = true;\r\n doc.sticker = 2;\r\n }\r\n\r\n /* if(!doc.url) {\r\n doc.url = this.getFileURL(doc);\r\n } */\r\n\r\n if(oldDoc) {\r\n return Object.assign(oldDoc, doc);\r\n }\r\n\r\n return doc;\r\n }\r\n\r\n public getDoc(docId: DocId | MyDocument): MyDocument {\r\n return isObject<MyDocument>(docId) ? docId : this.docs[docId];\r\n }\r\n\r\n public downloadDoc(doc: MyDocument, queueId?: number, onlyCache?: boolean) {\r\n return this.apiFileManager.downloadMedia({\r\n media: doc,\r\n queueId,\r\n onlyCache\r\n });\r\n }\r\n\r\n public getLottieCachedThumb(docId: DocId, toneIndex: number) {\r\n const cached = this.stickerCachedThumbs[docId];\r\n return cached && cached[toneIndex];\r\n }\r\n\r\n public saveLottiePreview(docId: DocId, blob: Blob, width: number, height: number, toneIndex: number) {\r\n const doc = this.getDoc(docId);\r\n if(!doc) {\r\n return;\r\n }\r\n\r\n const cached = this.stickerCachedThumbs[doc.id] ??= {};\r\n\r\n const thumb = cached[toneIndex];\r\n if(thumb && thumb.w >= width && thumb.h >= height) {\r\n return;\r\n }\r\n\r\n cached[toneIndex] = {\r\n url: URL.createObjectURL(blob),\r\n w: width,\r\n h: height\r\n };\r\n }\r\n\r\n public saveWebPConvertedStrippedThumb(docId: DocId, bytes: Uint8Array) {\r\n const doc = this.getDoc(docId);\r\n if(!doc) {\r\n return;\r\n }\r\n\r\n const thumb = doc.thumbs && doc.thumbs.find((thumb) => thumb._ === 'photoStrippedSize') as PhotoSize.photoStrippedSize;\r\n if(!thumb) {\r\n return;\r\n }\r\n\r\n doc.pFlags.stickerThumbConverted = true;\r\n thumb.bytes = bytes;\r\n }\r\n\r\n public getWallPapers() {\r\n return this.apiManager.invokeApiHashable({method: 'account.getWallPapers'}).then((accountWallpapers) => {\r\n const wallPapers = (accountWallpapers as AccountWallPapers.accountWallPapers).wallpapers as WallPaper.wallPaper[];\r\n wallPapers.forEach((wallPaper) => {\r\n wallPaper.document = this.saveDoc(wallPaper.document);\r\n });\r\n\r\n return wallPapers;\r\n });\r\n }\r\n\r\n public prepareWallPaperUpload(file: File) {\r\n const id = 'wallpaper-upload-' + ++uploadWallPaperTempId;\r\n\r\n const thumb = {\r\n _: 'photoSize',\r\n h: 0,\r\n w: 0,\r\n location: {} as any,\r\n size: file.size,\r\n type: THUMB_TYPE_FULL\r\n } as PhotoSize.photoSize;\r\n let document: MyDocument = {\r\n _: 'document',\r\n access_hash: '',\r\n attributes: [],\r\n dc_id: 0,\r\n file_reference: [],\r\n id,\r\n mime_type: file.type as MTMimeType,\r\n size: file.size,\r\n date: Date.now() / 1000,\r\n pFlags: {},\r\n thumbs: [thumb],\r\n file_name: file.name\r\n };\r\n\r\n document = this.saveDoc(document);\r\n\r\n const cacheContext = this.thumbsStorage.setCacheContextURL(document, undefined, URL.createObjectURL(file), file.size);\r\n\r\n const wallpaper: WallPaper.wallPaper = {\r\n _: 'wallPaper',\r\n access_hash: '',\r\n document: document,\r\n id,\r\n slug: id,\r\n pFlags: {}\r\n };\r\n\r\n this.uploadingWallPapers[id] = {\r\n cacheContext,\r\n file\r\n };\r\n\r\n return wallpaper;\r\n }\r\n\r\n public uploadWallPaper(id: WallPaperId) {\r\n const {cacheContext, file} = this.uploadingWallPapers[id];\r\n delete this.uploadingWallPapers[id];\r\n\r\n const upload = this.apiFileManager.upload({file, fileName: file.name});\r\n return upload.then((inputFile) => {\r\n return this.apiManager.invokeApi('account.uploadWallPaper', {\r\n file: inputFile,\r\n mime_type: file.type,\r\n settings: {\r\n _: 'wallPaperSettings'\r\n\r\n }\r\n }).then((wallPaper) => {\r\n assumeType<WallPaper.wallPaper>(wallPaper);\r\n wallPaper.document = this.saveDoc(wallPaper.document);\r\n this.thumbsStorage.setCacheContextURL(wallPaper.document, undefined, cacheContext.url, cacheContext.downloaded);\r\n\r\n return wallPaper;\r\n });\r\n });\r\n }\r\n\r\n public getGifs() {\r\n return this.apiManager.invokeApiHashable({\r\n method: 'messages.getSavedGifs',\r\n processResult: (res) => {\r\n assumeType<MessagesSavedGifs.messagesSavedGifs>(res);\r\n return res.gifs.map((doc) => this.saveDoc(doc));\r\n }\r\n });\r\n }\r\n\r\n public requestDocPart(docId: DocId, dcId: number, offset: number, limit: number) {\r\n const doc = this.getDoc(docId);\r\n if(!doc) return Promise.reject(makeError('NO_DOC'));\r\n return this.apiFileManager.requestFilePart(dcId, getDocumentInputFileLocation(doc), offset, limit);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {FileURLType, getFileURL} from '../../../../helpers/fileName';\r\nimport {Document, PhotoSize} from '../../../../layer';\r\nimport getDocumentDownloadOptions from './getDocumentDownloadOptions';\r\n\r\nexport default function getDocumentURL(doc: Document.document, download = false, thumb?: PhotoSize.photoSize) {\r\n let type: FileURLType;\r\n if(download) {\r\n type = 'download';\r\n } else if(thumb) {\r\n type = 'thumb';\r\n } else if(doc.supportsStreaming) {\r\n type = 'stream';\r\n } else {\r\n type = 'document';\r\n }\r\n\r\n return getFileURL(type, getDocumentDownloadOptions(doc, thumb));\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport {MessageEntity, DraftMessage, MessagesSaveDraft} from '../../layer';\r\nimport tsNow from '../../helpers/tsNow';\r\nimport stateStorage from '../stateStorage';\r\nimport assumeType from '../../helpers/assumeType';\r\nimport {AppManager} from './manager';\r\nimport generateMessageId from './utils/messageId/generateMessageId';\r\nimport getServerMessageId from './utils/messageId/getServerMessageId';\r\nimport draftsAreEqual from './utils/drafts/draftsAreEqual';\r\n\r\nexport type MyDraftMessage = DraftMessage.draftMessage;\r\n\r\nexport class AppDraftsManager extends AppManager {\r\n private drafts: {[peerIdAndThreadId: string]: MyDraftMessage} = {};\r\n private getAllDraftPromise: Promise<void>;\r\n\r\n protected after() {\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updateDraftMessage: (update) => {\r\n const peerId = this.appPeersManager.getPeerId(update.peer);\r\n this.saveDraft(peerId, update.threadId, update.draft, {notify: true});\r\n }\r\n });\r\n\r\n /* return */stateStorage.get('drafts').then((drafts) => {\r\n this.drafts = drafts || {};\r\n });\r\n }\r\n\r\n private getKey(peerId: PeerId, threadId?: number) {\r\n return '' + peerId + (threadId ? '_' + threadId : '');\r\n }\r\n\r\n public getDraft(peerId: PeerId, threadId?: number) {\r\n return this.drafts[this.getKey(peerId, threadId)];\r\n }\r\n\r\n public addMissedDialogs() {\r\n return this.getAllDrafts().then(() => {\r\n for(const key in this.drafts) {\r\n if(key.indexOf('_') !== -1) { // exclude threads\r\n continue;\r\n }\r\n\r\n const peerId = key.toPeerId();\r\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\r\n if(!dialog) {\r\n this.appMessagesManager.reloadConversation(peerId);\r\n /* const dialog = appMessagesManager.generateDialog(peerId);\r\n dialog.draft = this.drafts[key];\r\n appMessagesManager.saveConversation(dialog);\r\n appMessagesManager.newDialogsToHandle[peerId] = dialog;\r\n appMessagesManager.scheduleHandleNewDialogs(); */\r\n }\r\n }\r\n });\r\n }\r\n\r\n private getAllDrafts() {\r\n return this.getAllDraftPromise ??= this.apiManager.invokeApi('messages.getAllDrafts')\r\n .then((updates) => {\r\n const p = this.apiUpdatesManager.updatesState.syncLoading || Promise.resolve();\r\n p.then(() => {\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n });\r\n }\r\n\r\n public saveDraft(peerId: PeerId, threadId: number, apiDraft: DraftMessage, options: Partial<{\r\n notify: boolean,\r\n force: boolean\r\n }> = {}) {\r\n const draft = this.processApiDraft(apiDraft);\r\n\r\n const key = this.getKey(peerId, threadId);\r\n if(draft) {\r\n this.drafts[key] = draft;\r\n } else {\r\n delete this.drafts[key];\r\n }\r\n\r\n stateStorage.set({\r\n drafts: this.drafts\r\n });\r\n\r\n if(options.notify) {\r\n // console.warn(dT(), 'save draft', peerId, apiDraft, options)\r\n this.rootScope.dispatchEvent('draft_updated', {\r\n peerId,\r\n threadId,\r\n draft,\r\n force: options.force\r\n });\r\n }\r\n\r\n return draft;\r\n }\r\n\r\n private isEmptyDraft(draft: DraftMessage) {\r\n if(!draft || draft._ === 'draftMessageEmpty') {\r\n return true;\r\n }\r\n\r\n if(draft.reply_to_msg_id > 0) {\r\n return false;\r\n }\r\n\r\n if(!draft.message.length) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private processApiDraft(draft: DraftMessage): MyDraftMessage {\r\n if(!draft || draft._ !== 'draftMessage') {\r\n return undefined;\r\n }\r\n\r\n if(draft.reply_to_msg_id) {\r\n draft.reply_to_msg_id = generateMessageId(draft.reply_to_msg_id);\r\n }\r\n\r\n return draft;\r\n }\r\n\r\n public async syncDraft(peerId: PeerId, threadId: number, localDraft?: DraftMessage, saveOnServer = true, force = false) {\r\n // console.warn(dT(), 'sync draft', peerID)\r\n const serverDraft = this.getDraft(peerId, threadId);\r\n if(draftsAreEqual(serverDraft, localDraft)) {\r\n // console.warn(dT(), 'equal drafts', localDraft, serverDraft)\r\n return true;\r\n }\r\n\r\n // console.warn(dT(), 'changed draft', localDraft, serverDraft)\r\n const params: MessagesSaveDraft = {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n message: ''\r\n };\r\n\r\n let draftObj: DraftMessage;\r\n if(this.isEmptyDraft(localDraft)) {\r\n draftObj = {_: 'draftMessageEmpty'};\r\n } else {\r\n assumeType<DraftMessage.draftMessage>(localDraft);\r\n const message = localDraft.message;\r\n const entities: MessageEntity[] = localDraft.entities;\r\n\r\n if(localDraft.reply_to_msg_id) {\r\n params.reply_to_msg_id = getServerMessageId(localDraft.reply_to_msg_id);\r\n }\r\n\r\n if(entities?.length) {\r\n params.entities = this.appMessagesManager.getInputEntities(entities);\r\n }\r\n\r\n if(localDraft.pFlags.no_webpage) {\r\n params.no_webpage = localDraft.pFlags.no_webpage;\r\n }\r\n\r\n params.message = message;\r\n }\r\n\r\n const saveLocalDraft = draftObj || localDraft;\r\n saveLocalDraft.date = tsNow(true) + this.timeManager.getServerTimeOffset();\r\n\r\n this.saveDraft(peerId, threadId, saveLocalDraft, {notify: true, force});\r\n\r\n if(saveOnServer && !threadId) {\r\n return this.apiManager.invokeApi('messages.saveDraft', params);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public clearAllDrafts() {\r\n return this.apiManager.invokeApi('messages.clearAllDrafts').then((bool) => {\r\n if(!bool) {\r\n return;\r\n }\r\n\r\n for(const combined in this.drafts) {\r\n const [peerId, threadId] = combined.split('_');\r\n this.rootScope.dispatchEvent('draft_updated', {\r\n peerId: peerId.toPeerId(),\r\n threadId: threadId ? +threadId : undefined,\r\n draft: undefined\r\n });\r\n }\r\n });\r\n }\r\n\r\n public clearDraft(peerId: PeerId, threadId: number) {\r\n const emptyDraft: DraftMessage.draftMessageEmpty = {\r\n _: 'draftMessageEmpty'\r\n };\r\n\r\n if(threadId) {\r\n this.syncDraft(peerId, threadId, emptyDraft as any, false, true);\r\n } else {\r\n this.saveDraft(peerId, threadId, emptyDraft, {notify: true, force: true});\r\n }\r\n }\r\n\r\n public setDraft(peerId: PeerId, threadId: number, message: string, entities?: MessageEntity[]) {\r\n const draft: DraftMessage.draftMessage = {\r\n _: 'draftMessage',\r\n date: Date.now() / 1000 | 0,\r\n message,\r\n pFlags: {},\r\n entities\r\n };\r\n\r\n if(threadId) {\r\n this.syncDraft(peerId, threadId, draft, false, true);\r\n } else {\r\n this.saveDraft(peerId, threadId, draft, {notify: true, force: true});\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {MyDocument} from './appDocsManager';\r\nimport App from '../../config/app';\r\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\r\nimport isObject from '../../helpers/object/isObject';\r\nimport validateInitObject from '../../helpers/object/validateInitObject';\r\nimport fixEmoji from '../richTextProcessor/fixEmoji';\r\nimport SearchIndex from '../searchIndex';\r\nimport stateStorage from '../stateStorage';\r\nimport {AppManager} from './manager';\r\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\r\nimport pause from '../../helpers/schedulers/pause';\r\n\r\ntype EmojiLangPack = {\r\n keywords: {\r\n [keyword: string]: string[],\r\n },\r\n version: number,\r\n langCode: string\r\n};\r\n\r\nconst EMOJI_LANG_PACK: EmojiLangPack = {\r\n keywords: {},\r\n version: 0,\r\n langCode: App.langPackCode\r\n};\r\n\r\nconst RECENT_MAX_LENGTH = 32;\r\n\r\ntype EmojiType = 'native' | 'custom';\r\n\r\nexport class AppEmojiManager extends AppManager {\r\n private static POPULAR_EMOJI = ['😂', '😘', '❤️', '😍', '😊', '😁', '👍', '☺️', '😔', '😄', '😭', '💋', '😒', '😳', '😜', '🙈', '😉', '😃', '😢', '😝', '😱', '😡', '😏', '😞', '😅', '😚', '🙊', '😌', '😀', '😋', '😆', '👌', '😐', '😕'];\r\n private keywordLangPacks: {\r\n [langCode: string]: EmojiLangPack\r\n } = {};\r\n\r\n private index: SearchIndex<EmojiLangPack['keywords'][keyof EmojiLangPack['keywords']]>;\r\n private indexedLangPacks: {[langCode: string]: boolean} = {};\r\n\r\n private getKeywordsPromises: {[langCode: string]: Promise<EmojiLangPack>} = {};\r\n\r\n private recent: {native?: string[], custom?: DocId[]} = {};\r\n private getRecentEmojisPromises: {native?: Promise<string[]>, custom?: Promise<DocId[]>} = {};\r\n\r\n private getCustomEmojiDocumentsPromise: Promise<any>;\r\n private getCustomEmojiDocumentPromises: Map<DocId, CancellablePromise<MyDocument>> = new Map();\r\n\r\n /* public getPopularEmoji() {\r\n return stateStorage.get('emojis_popular').then((popEmojis) => {\r\n var result = []\r\n if (popEmojis && popEmojis.length) {\r\n for (var i = 0, len = popEmojis.length; i < len; i++) {\r\n result.push({code: popEmojis[i][0], rate: popEmojis[i][1]})\r\n }\r\n callback(result)\r\n return\r\n }\r\n\r\n return stateStorage.get('emojis_recent').then((recentEmojis) => {\r\n recentEmojis = recentEmojis || popular || []\r\n var shortcut\r\n var code\r\n for (var i = 0, len = recentEmojis.length; i < len; i++) {\r\n shortcut = recentEmojis[i]\r\n if (Array.isArray(shortcut)) {\r\n shortcut = shortcut[0]\r\n }\r\n if (shortcut && typeof shortcut === 'string') {\r\n if (shortcut.charAt(0) == ':') {\r\n shortcut = shortcut.substr(1, shortcut.length - 2)\r\n }\r\n if (code = shortcuts[shortcut]) {\r\n result.push({code: code, rate: 1})\r\n }\r\n }\r\n }\r\n callback(result)\r\n });\r\n });\r\n }\r\n\r\n function pushPopularEmoji (code) {\r\n getPopularEmoji(function (popularEmoji) {\r\n var exists = false\r\n var count = popularEmoji.length\r\n var result = []\r\n for (var i = 0; i < count; i++) {\r\n if (popularEmoji[i].code == code) {\r\n exists = true\r\n popularEmoji[i].rate++\r\n }\r\n result.push([popularEmoji[i].code, popularEmoji[i].rate])\r\n }\r\n if (exists) {\r\n result.sort(function (a, b) {\r\n return b[1] - a[1]\r\n })\r\n } else {\r\n if (result.length > 41) {\r\n result = result.slice(0, 41)\r\n }\r\n result.push([code, 1])\r\n }\r\n ConfigStorage.set({emojis_popular: result})\r\n })\r\n } */\r\n\r\n public getEmojiKeywords(langCode: string = App.langPackCode) {\r\n const promise = this.getKeywordsPromises[langCode];\r\n if(promise) {\r\n return promise;\r\n }\r\n\r\n const storageKey: any = 'emojiKeywords_' + langCode;\r\n return this.getKeywordsPromises[langCode] = stateStorage.get(storageKey).then((pack: EmojiLangPack) => {\r\n if(!isObject(pack)) {\r\n pack = {} as any;\r\n }\r\n\r\n validateInitObject(EMOJI_LANG_PACK, pack);\r\n\r\n // important\r\n pack.langCode = langCode;\r\n this.keywordLangPacks[langCode] = pack;\r\n\r\n return this.apiManager.invokeApi('messages.getEmojiKeywordsDifference', {\r\n lang_code: pack.langCode,\r\n from_version: pack.version\r\n }).then((keywordsDifference) => {\r\n pack.version = keywordsDifference.version;\r\n\r\n const packKeywords = pack.keywords;\r\n const keywords = keywordsDifference.keywords;\r\n for(let i = 0, length = keywords.length; i < length; ++i) {\r\n const {keyword, emoticons} = keywords[i];\r\n packKeywords[keyword] = emoticons;\r\n }\r\n\r\n stateStorage.set({\r\n [storageKey]: pack\r\n });\r\n\r\n return pack;\r\n }, () => {\r\n return pack;\r\n });\r\n });\r\n }\r\n\r\n public getBothEmojiKeywords() {\r\n const promises: Promise<any>[] = [\r\n this.getEmojiKeywords()\r\n ];\r\n\r\n if(this.networkerFactory.language !== App.langPackCode) {\r\n promises.push(this.getEmojiKeywords(this.networkerFactory.language));\r\n }\r\n\r\n if(!this.recent.native) {\r\n promises.push(this.getRecentEmojis('native'));\r\n }\r\n\r\n return Promise.all(promises);\r\n }\r\n\r\n private indexEmojis() {\r\n if(!this.index) {\r\n this.index = new SearchIndex(undefined, 2);\r\n }\r\n\r\n for(const langCode in this.keywordLangPacks) {\r\n if(this.indexedLangPacks[langCode]) {\r\n continue;\r\n }\r\n\r\n const pack = this.keywordLangPacks[langCode];\r\n const keywords = pack.keywords;\r\n\r\n for(const keyword in keywords) {\r\n const emoticons = keywords[keyword];\r\n this.index.indexObject(emoticons, keyword);\r\n }\r\n\r\n this.indexedLangPacks[langCode] = true;\r\n }\r\n }\r\n\r\n public searchEmojis(q: string) {\r\n this.indexEmojis();\r\n\r\n q = q.toLowerCase().replace(/_/g, ' ');\r\n\r\n // const perf = performance.now();\r\n let emojis: Array<string>;\r\n if(q.trim()) {\r\n const set = this.index.search(q);\r\n emojis = Array.from(set).reduce((acc, v) => acc.concat(v), []);\r\n } else {\r\n emojis = this.recent.native.concat(AppEmojiManager.POPULAR_EMOJI).slice(0, RECENT_MAX_LENGTH);\r\n }\r\n\r\n emojis = Array.from(new Set(emojis));\r\n // console.log('searchEmojis', q, 'time', performance.now() - perf);\r\n\r\n /* for(let i = 0, length = emojis.length; i < length; ++i) {\r\n if(emojis[i].includes(zeroWidthJoiner) && !emojis[i].includes('\\ufe0f')) {\r\n emojis[i] += '\\ufe0f';\r\n }\r\n } */\r\n\r\n return emojis;\r\n }\r\n\r\n public getRecentEmojis<T extends EmojiType>(type: 'custom'): Promise<DocId[]>;\r\n public getRecentEmojis<T extends EmojiType>(type: 'native'): Promise<string[]>;\r\n public getRecentEmojis<T extends EmojiType>(type: T): Promise<string[] | DocId[]> {\r\n const promises = this.getRecentEmojisPromises;\r\n return promises[type] ??= this.appStateManager.getState().then((state) => {\r\n let recent: string[] | DocId[] = [];\r\n if(type === 'native') {\r\n const {recentEmoji} = state;\r\n recent = Array.isArray(recentEmoji) && recentEmoji.length ? recentEmoji : AppEmojiManager.POPULAR_EMOJI;\r\n } else {\r\n const {recentCustomEmoji} = state;\r\n recent = Array.isArray(recentCustomEmoji) && recentCustomEmoji.length ? recentCustomEmoji : [];\r\n }\r\n\r\n return this.recent[type] = recent as any;\r\n }) as any;\r\n }\r\n\r\n public pushRecentEmoji(emoji: AppEmoji) {\r\n const type: EmojiType = emoji.docId ? 'custom' : 'native';\r\n emoji.emoji = fixEmoji(emoji.emoji);\r\n // @ts-ignore\r\n this.getRecentEmojis(type).then((recent) => {\r\n const i = emoji.docId || emoji.emoji;\r\n indexOfAndSplice(recent, i);\r\n recent.unshift(i);\r\n recent.splice(RECENT_MAX_LENGTH, recent.length - RECENT_MAX_LENGTH);\r\n\r\n this.appStateManager.pushToState(type === 'custom' ? 'recentCustomEmoji' : 'recentEmoji', recent);\r\n this.rootScope.dispatchEvent('emoji_recent', emoji);\r\n });\r\n }\r\n\r\n public getCustomEmojiDocuments(docIds: DocId[]) {\r\n if(!docIds.length) return Promise.resolve([] as MyDocument[]);\r\n return this.apiManager.invokeApi('messages.getCustomEmojiDocuments', {document_id: docIds}).then((documents) => {\r\n return documents.map((doc) => {\r\n return this.appDocsManager.saveDoc(doc, {\r\n type: 'customEmoji',\r\n docId: doc.id\r\n });\r\n });\r\n });\r\n }\r\n\r\n public getCachedCustomEmojiDocuments(docIds: DocId[]) {\r\n return docIds.map((docId) => this.appDocsManager.getDoc(docId));\r\n }\r\n\r\n private setDebouncedGetCustomEmojiDocuments() {\r\n if(this.getCustomEmojiDocumentsPromise || !this.getCustomEmojiDocumentPromises.size) {\r\n return;\r\n }\r\n\r\n this.getCustomEmojiDocumentsPromise = pause(0).then(() => {\r\n const allIds = [...this.getCustomEmojiDocumentPromises.keys()];\r\n const promises: Promise<any>[] = [];\r\n do {\r\n const ids = allIds.splice(0, 100);\r\n const promise = this.getCustomEmojiDocuments(ids).then((docs) => {\r\n docs.forEach((doc, idx) => {\r\n const docId = ids[idx];\r\n const deferred = this.getCustomEmojiDocumentPromises.get(docId);\r\n this.getCustomEmojiDocumentPromises.delete(docId);\r\n deferred.resolve(doc);\r\n });\r\n });\r\n\r\n promises.push(promise);\r\n } while(allIds.length);\r\n\r\n return Promise.all(promises);\r\n }).finally(() => {\r\n this.getCustomEmojiDocumentsPromise = undefined;\r\n this.setDebouncedGetCustomEmojiDocuments();\r\n });\r\n }\r\n\r\n public getCustomEmojiDocument(id: DocId) {\r\n let promise = this.getCustomEmojiDocumentPromises.get(id);\r\n if(promise) {\r\n return promise;\r\n }\r\n\r\n const doc = this.appDocsManager.getDoc(id);\r\n if(doc) {\r\n return doc;\r\n }\r\n\r\n promise = deferredPromise();\r\n this.getCustomEmojiDocumentPromises.set(id, promise);\r\n\r\n this.setDebouncedGetCustomEmojiDocuments();\r\n\r\n return promise;\r\n }\r\n\r\n public getCustomEmojis() {\r\n return this.appStickersManager.getEmojiStickers();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/evgeny-nadymov/telegram-react\r\n * Copyright (C) 2018 Evgeny Nadymov\r\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\r\n */\r\n\r\nimport type GroupCallConnectionInstance from '../calls/groupCallConnectionInstance';\r\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\r\nimport {nextRandomUint} from '../../helpers/random';\r\nimport {DataJSON, GroupCall, GroupCallParticipant, GroupCallParticipantVideoSourceGroup, InputGroupCall, PhoneJoinGroupCall, PhoneJoinGroupCallPresentation, Update, Updates} from '../../layer';\r\nimport {logger} from '../logger';\r\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\r\nimport {AppManager} from './manager';\r\nimport getPeerId from './utils/peers/getPeerId';\r\n\r\nexport type GroupCallId = GroupCall['id'];\r\nexport type MyGroupCall = GroupCall | InputGroupCall;\r\n\r\nexport type GroupCallConnectionType = 'main' | 'presentation';\r\n\r\nexport type JoinGroupCallJsonPayload = {\r\n fingerprints: {\r\n fingerprint: string;\r\n setup: string;\r\n hash: string;\r\n }[];\r\n pwd: string;\r\n ssrc: number;\r\n 'ssrc-groups': GroupCallParticipantVideoSourceGroup.groupCallParticipantVideoSourceGroup[];\r\n ufrag: string;\r\n};\r\n\r\nconst GET_PARTICIPANTS_LIMIT = 100;\r\n\r\nexport type GroupCallOutputSource = 'main' | 'presentation' | number;\r\n\r\nexport class AppGroupCallsManager extends AppManager {\r\n private log: ReturnType<typeof logger>;\r\n\r\n private groupCalls: Map<GroupCallId, MyGroupCall>;\r\n private participants: Map<GroupCallId, Map<PeerId, GroupCallParticipant>>;\r\n private nextOffsets: Map<GroupCallId, string>;\r\n\r\n // private doNotDispatchParticipantUpdate: PeerId;\r\n\r\n protected after() {\r\n this.log = logger('GROUP-CALLS');\r\n\r\n this.groupCalls = new Map();\r\n this.participants = new Map();\r\n this.nextOffsets = new Map();\r\n\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updateGroupCall: (update) => {\r\n this.saveGroupCall(update.call, update.chat_id);\r\n },\r\n\r\n updateGroupCallParticipants: (update) => {\r\n this.saveGroupCall(update.call);\r\n\r\n // this.getGroupCallFull(update.call.id, true); // ! WARNING TEMP\r\n\r\n const groupCallId = update.call.id;\r\n this.saveApiParticipants(groupCallId, update.participants);\r\n }\r\n });\r\n\r\n this.rootScope.addEventListener('group_call_update', (groupCall) => {\r\n if(groupCall._ === 'groupCallDiscarded') {\r\n this.participants.delete(groupCall.id);\r\n }\r\n });\r\n }\r\n\r\n public getCachedParticipants(groupCallId: GroupCallId) {\r\n let participants = this.participants.get(groupCallId);\r\n if(!participants) {\r\n this.participants.set(groupCallId, participants = new Map());\r\n }\r\n\r\n return participants;\r\n }\r\n\r\n private prepareToSavingNextOffset(groupCallId: GroupCallId) {\r\n const nextOffsetsMap = this.nextOffsets;\r\n\r\n const setNextOffset = (newNextOffset: string) => {\r\n if(nextOffsetsMap.get(groupCallId) === nextOffset) {\r\n nextOffsetsMap.set(groupCallId, newNextOffset);\r\n }\r\n };\r\n\r\n const nextOffset = nextOffsetsMap.get(groupCallId);\r\n return {\r\n nextOffset,\r\n setNextOffset\r\n };\r\n }\r\n\r\n public saveApiParticipant(groupCallId: GroupCallId, participant: GroupCallParticipant, skipCounterUpdating?: boolean) {\r\n const participants = this.getCachedParticipants(groupCallId);\r\n\r\n const peerId = getPeerId(participant.peer);\r\n\r\n const oldParticipant = participants.get(peerId);\r\n const hasLeft = participant.pFlags.left;\r\n if(!oldParticipant && hasLeft) {\r\n return;\r\n }\r\n\r\n // * fix missing flag\r\n if(!participant.pFlags.muted && !participant.pFlags.can_self_unmute) {\r\n participant.pFlags.can_self_unmute = true;\r\n }\r\n\r\n if(oldParticipant) {\r\n safeReplaceObject(oldParticipant, participant);\r\n participant = oldParticipant;\r\n } else {\r\n participants.set(peerId, participant);\r\n }\r\n\r\n // if(!skipCounterUpdating) {\r\n const groupCall = this.getGroupCall(groupCallId);\r\n if(groupCall?._ === 'groupCall') {\r\n let modified = false;\r\n if(hasLeft) {\r\n --groupCall.participants_count;\r\n modified = true;\r\n } else if(participant.pFlags.just_joined && !oldParticipant && !participant.pFlags.self) {\r\n ++groupCall.participants_count;\r\n modified = true;\r\n }\r\n\r\n if(modified) {\r\n this.rootScope.dispatchEvent('group_call_update', groupCall);\r\n }\r\n }\r\n // }\r\n\r\n if(hasLeft) {\r\n participants.delete(peerId);\r\n }\r\n\r\n if(oldParticipant || true/* && this.doNotDispatchParticipantUpdate !== peerId */) {\r\n this.rootScope.dispatchEvent('group_call_participant', {\r\n groupCallId,\r\n participant\r\n });\r\n }\r\n }\r\n\r\n public saveApiParticipants(groupCallId: GroupCallId, apiParticipants: GroupCallParticipant[], skipCounterUpdating?: boolean) {\r\n if((apiParticipants as any).saved) return;\r\n (apiParticipants as any).saved = true;\r\n apiParticipants.forEach((p) => this.saveApiParticipant(groupCallId, p, skipCounterUpdating));\r\n }\r\n\r\n public async editParticipant(groupCallId: GroupCallId, participant: GroupCallParticipant, options: Partial<{\r\n muted: boolean,\r\n volume: number,\r\n raiseHand: boolean,\r\n videoStopped: boolean,\r\n videoPaused: boolean,\r\n presentationPaused: boolean\r\n }>) {\r\n this.saveApiParticipant(groupCallId, participant);\r\n\r\n const peerId = participant.pFlags.self ? NULL_PEER_ID : getPeerId(participant.peer);\r\n const updates = await this.apiManager.invokeApiSingle('phone.editGroupCallParticipant', {\r\n call: this.getGroupCallInput(groupCallId),\r\n participant: peerId === NULL_PEER_ID ? this.appPeersManager.getInputPeerSelf() : this.appPeersManager.getInputPeerById(peerId),\r\n muted: options.muted,\r\n volume: options.volume,\r\n raise_hand: options.raiseHand,\r\n video_paused: options.videoPaused,\r\n video_stopped: options.videoStopped,\r\n presentation_paused: options.presentationPaused\r\n });\r\n\r\n // do not replace with peerId because it can be null\r\n // if(!processUpdate) this.doNotDispatchParticipantUpdate = getPeerId(participant.peer);\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n // if(!processUpdate) this.doNotDispatchParticipantUpdate = undefined;\r\n }\r\n\r\n public getGroupCall(id: GroupCallId) {\r\n return this.groupCalls.get(id);\r\n }\r\n\r\n public async getGroupCallFull(id: GroupCallId, override?: boolean): Promise<GroupCall> {\r\n const call = this.getGroupCall(id);\r\n if(call && call._ !== 'inputGroupCall' && !override) {\r\n return call;\r\n }\r\n\r\n const limit = this.getCachedParticipants(id).size ? 0 : GET_PARTICIPANTS_LIMIT;\r\n return this.apiManager.invokeApiSingleProcess({\r\n method: 'phone.getGroupCall',\r\n params: {\r\n call: this.getGroupCallInput(id),\r\n limit\r\n },\r\n processResult: (groupCall) => {\r\n // ? maybe I should save group call after participants so I can avoid passing the 'skipCounterUpdating' flag ?\r\n this.appUsersManager.saveApiUsers(groupCall.users);\r\n this.appChatsManager.saveApiChats(groupCall.chats);\r\n this.saveApiParticipants(id, groupCall.participants, true);\r\n const call = this.saveGroupCall(groupCall.call) as GroupCall;\r\n\r\n if(limit && this.nextOffsets.get(id) === undefined) {\r\n this.nextOffsets.set(id, groupCall.participants_next_offset);\r\n }\r\n\r\n return call;\r\n }\r\n });\r\n }\r\n\r\n public saveGroupCall(call: MyGroupCall, chatId?: ChatId) {\r\n const oldCall = this.groupCalls.get(call.id);\r\n const shouldUpdate = call._ !== 'inputGroupCall' && (!oldCall || oldCall._ !== 'groupCallDiscarded');\r\n if(oldCall) {\r\n if(shouldUpdate) {\r\n safeReplaceObject(oldCall, call);\r\n }\r\n\r\n call = oldCall;\r\n } else {\r\n this.groupCalls.set(call.id, call);\r\n }\r\n\r\n if(shouldUpdate) {\r\n this.rootScope.dispatchEvent('group_call_update', call as any);\r\n }\r\n\r\n return call;\r\n }\r\n\r\n public async createGroupCall(chatId: ChatId, scheduleDate?: number, title?: string) {\r\n const updates = await this.apiManager.invokeApi('phone.createGroupCall', {\r\n peer: this.appPeersManager.getInputPeerById(chatId.toPeerId(true)),\r\n random_id: nextRandomUint(32),\r\n schedule_date: scheduleDate,\r\n title\r\n });\r\n\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n\r\n const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateGroupCall') as Update.updateGroupCall;\r\n return update.call;\r\n }\r\n\r\n public getGroupCallInput(id: GroupCallId): InputGroupCall {\r\n const groupCall = this.getGroupCall(id);\r\n return {\r\n _: 'inputGroupCall',\r\n id: groupCall.id,\r\n access_hash: groupCall.access_hash\r\n };\r\n }\r\n\r\n // public generateSelfParticipant(): GroupCallParticipant {\r\n // const mainSources = this.currentGroupCall.connections.main.sources;\r\n // const presentationSources = this.currentGroupCall.connections.presentation?.sources;\r\n // return {\r\n // _: 'groupCallParticipant',\r\n // pFlags: {\r\n // can_self_unmute: true,\r\n // self: true\r\n // },\r\n // source: mainSources.audio.source,\r\n // video: this.generateSelfVideo(mainSources.video),\r\n // presentation: presentationSources && this.generateSelfVideo(presentationSources.video, presentationSources.audio?.source),\r\n // date: tsNow(true),\r\n // peer: this.appPeersManager.getOutputPeer(rootScope.myId)\r\n // };\r\n // }\r\n\r\n public async getGroupCallParticipants(id: GroupCallId) {\r\n const {nextOffset, setNextOffset} = this.prepareToSavingNextOffset(id);\r\n\r\n if(nextOffset !== '') {\r\n await this.apiManager.invokeApiSingleProcess({\r\n method: 'phone.getGroupParticipants',\r\n params: {\r\n call: this.getGroupCallInput(id),\r\n ids: [],\r\n sources: [],\r\n offset: nextOffset || '',\r\n limit: GET_PARTICIPANTS_LIMIT\r\n },\r\n processResult: (groupCallParticipants) => {\r\n const newNextOffset = groupCallParticipants.count === groupCallParticipants.participants.length ? '' : groupCallParticipants.next_offset;\r\n\r\n this.appChatsManager.saveApiChats(groupCallParticipants.chats);\r\n this.appUsersManager.saveApiUsers(groupCallParticipants.users);\r\n this.saveApiParticipants(id, groupCallParticipants.participants);\r\n\r\n setNextOffset(newNextOffset);\r\n }\r\n });\r\n }\r\n\r\n return {\r\n participants: this.getCachedParticipants(id),\r\n isEnd: this.nextOffsets.get(id) === ''\r\n };\r\n }\r\n\r\n public hangUp(id: GroupCallId, discard?: boolean | number) {\r\n const groupCallInput = this.getGroupCallInput(id);\r\n let promise: Promise<Updates>;\r\n if(typeof(discard) === 'boolean' && discard) {\r\n promise = this.apiManager.invokeApi('phone.discardGroupCall', {\r\n call: groupCallInput\r\n });\r\n } else if(typeof(discard) === 'number') {\r\n promise = this.apiManager.invokeApi('phone.leaveGroupCall', {\r\n call: groupCallInput,\r\n source: discard\r\n });\r\n } else {\r\n promise = this.apiManager.invokeApi('phone.joinGroupCall', {\r\n call: groupCallInput,\r\n join_as: this.appPeersManager.getInputPeerSelf(),\r\n muted: true,\r\n video_stopped: true,\r\n params: {\r\n _: 'dataJSON',\r\n data: ''\r\n }\r\n });\r\n }\r\n\r\n return promise.then((updates) => {\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n public async joinGroupCall(groupCallId: GroupCallId, params: DataJSON, options: GroupCallConnectionInstance['options']) {\r\n const groupCallInput = this.getGroupCallInput(groupCallId);\r\n let promise: Promise<Updates>;\r\n if(options.type === 'main') {\r\n const request: PhoneJoinGroupCall = {\r\n call: groupCallInput,\r\n join_as: this.appPeersManager.getInputPeerSelf(),\r\n params,\r\n muted: options.isMuted,\r\n video_stopped: !options.joinVideo\r\n };\r\n\r\n promise = this.apiManager.invokeApi('phone.joinGroupCall', request);\r\n this.log(`[api] joinGroupCall id=${groupCallId}`, request);\r\n } else {\r\n const request: PhoneJoinGroupCallPresentation = {\r\n call: groupCallInput,\r\n params\r\n };\r\n\r\n promise = this.apiManager.invokeApi('phone.joinGroupCallPresentation', request);\r\n this.log(`[api] joinGroupCallPresentation id=${groupCallId}`, request);\r\n }\r\n\r\n const updates = await promise;\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n\r\n const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateGroupCallConnection') as Update.updateGroupCallConnection;\r\n return update;\r\n }\r\n\r\n public leaveGroupCallPresentation(groupCallId: GroupCallId) {\r\n return this.apiManager.invokeApi('phone.leaveGroupCallPresentation', {\r\n call: this.getGroupCallInput(groupCallId)\r\n }).then((updates) => {\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {InputPhoto} from '../../../../layer';\r\nimport {MyPhoto} from '../../appPhotosManager';\r\n\r\nexport default function getPhotoInput(photo: MyPhoto): InputPhoto.inputPhoto {\r\n return {\r\n _: 'inputPhoto',\r\n id: photo.id,\r\n access_hash: photo.access_hash,\r\n file_reference: photo.file_reference\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {InputMedia} from '../../../../layer';\r\nimport {MyPhoto} from '../../appPhotosManager';\r\nimport getPhotoInput from './getPhotoInput';\r\n\r\nexport default function getPhotoMediaInput(photo: MyPhoto): InputMedia.inputMediaPhoto {\r\n return {\r\n _: 'inputMediaPhoto',\r\n id: getPhotoInput(photo),\r\n ttl_seconds: 0\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {Document, InputMedia} from '../../../../layer';\r\n\r\nexport default function getMediaInput(doc: Document.document): InputMedia.inputMediaDocument {\r\n return {\r\n _: 'inputMediaDocument',\r\n id: {\r\n _: 'inputDocument',\r\n id: doc.id,\r\n access_hash: doc.access_hash,\r\n file_reference: doc.file_reference\r\n },\r\n ttl_seconds: 0\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type {MyDocument} from './appDocsManager';\r\nimport type {MyPhoto} from './appPhotosManager';\r\nimport type {MyTopPeer} from './appUsersManager';\r\nimport {BotInlineResult, GeoPoint, InputGeoPoint, InputMedia, MessageEntity, MessageMedia, MessagesBotResults, ReplyMarkup} from '../../layer';\r\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\r\nimport {AppManager} from './manager';\r\nimport getPhotoMediaInput from './utils/photos/getPhotoMediaInput';\r\nimport getServerMessageId from './utils/messageId/getServerMessageId';\r\nimport generateQId from './utils/inlineBots/generateQId';\r\nimport getDocumentMediaInput from './utils/docs/getDocumentMediaInput';\r\nimport {AppMessagesManager} from './appMessagesManager';\r\n\r\nexport class AppInlineBotsManager extends AppManager {\r\n private inlineResults: {[queryAndResultIds: string]: BotInlineResult} = {};\r\n private setHash: {\r\n [botId: UserId]: {\r\n peerId: PeerId,\r\n time: number\r\n }\r\n } = {};\r\n\r\n public getGeoInput(geo: GeoPoint): InputGeoPoint {\r\n return geo._ === 'geoPoint' ? {\r\n _: 'inputGeoPoint',\r\n lat: geo.lat,\r\n long: geo.long,\r\n accuracy_radius: geo.accuracy_radius\r\n } : {\r\n _: 'inputGeoPointEmpty'\r\n };\r\n }\r\n\r\n public getInlineResults(peerId: PeerId, botId: BotId, query = '', offset = '', geo?: GeoPoint) {\r\n return this.apiManager.invokeApi('messages.getInlineBotResults', {\r\n bot: this.appUsersManager.getUserInput(botId),\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n query,\r\n geo_point: geo ? this.getGeoInput(geo) : undefined,\r\n offset\r\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true}).then((botResults) => {\r\n const queryId = botResults.query_id;\r\n\r\n /* if(botResults.switch_pm) {\r\n botResults.switch_pm.rText = wrapRichText(botResults.switch_pm.text, {noLinebreaks: true, noLinks: true});\r\n } */\r\n\r\n botResults.results.forEach((result) => {\r\n if(result._ === 'botInlineMediaResult') {\r\n if(result.document) {\r\n result.document = this.appDocsManager.saveDoc(result.document);\r\n }\r\n\r\n if(result.photo) {\r\n result.photo = this.appPhotosManager.savePhoto(result.photo);\r\n }\r\n }\r\n\r\n this.inlineResults[generateQId(queryId, result.id)] = result;\r\n });\r\n\r\n return botResults;\r\n });\r\n }\r\n\r\n private pushPopularBot(botId: BotId) {\r\n this.appUsersManager.getTopPeers('bots_inline').then((topPeers) => {\r\n const botPeerId = botId.toPeerId();\r\n const index = topPeers.findIndex((topPeer) => topPeer.id === botPeerId);\r\n let topPeer: MyTopPeer;\r\n if(index !== -1) {\r\n topPeer = topPeers[index];\r\n } else {\r\n topPeer = {\r\n id: botPeerId,\r\n rating: 0\r\n };\r\n }\r\n\r\n ++topPeer.rating;\r\n insertInDescendSortedArray(topPeers, topPeer, 'rating');\r\n\r\n this.appStateManager.setKeyValueToStorage('topPeersCache');\r\n\r\n // rootScope.$broadcast('inline_bots_popular')\r\n });\r\n }\r\n\r\n public switchToPM(fromPeerId: PeerId, botId: BotId, startParam: string) {\r\n this.setHash[botId] = {peerId: fromPeerId, time: Date.now()};\r\n return this.appMessagesManager.startBot(botId, undefined, startParam);\r\n }\r\n\r\n /*\r\n function resolveInlineMention (username) {\r\n return AppPeersManager.resolveUsername(username).then(function (peerId) {\r\n if (peerId.isUser()) {\r\n var bot = AppUsersManager.getUser(peerId)\r\n if (bot.pFlags.bot && bot.bot_inline_placeholder !== undefined) {\r\n var resolvedBot = {\r\n username: username,\r\n id: peerId,\r\n placeholder: bot.bot_inline_placeholder\r\n }\r\n if (bot.pFlags.bot_inline_geo &&\r\n GeoLocationManager.isAvailable()) {\r\n return checkGeoLocationAccess(peerId).then(function () {\r\n return GeoLocationManager.getPosition().then(function (coords) {\r\n resolvedBot.geo = coords\r\n return qSync.when(resolvedBot)\r\n })\r\n })['catch'](function () {\r\n return qSync.when(resolvedBot)\r\n })\r\n }\r\n return qSync.when(resolvedBot)\r\n }\r\n }\r\n return $q.reject()\r\n }, function (error) {\r\n error.handled = true\r\n return $q.reject(error)\r\n })\r\n }\r\n\r\n function regroupWrappedResults (results, rowW, rowH) {\r\n if (!results ||\r\n !results[0] ||\r\n ['photo', 'gif', 'sticker'].indexOf(results[0].type) === -1) {\r\n return\r\n }\r\n var ratios = []\r\n angular.forEach(results, function (result) {\r\n var w\r\n var h, doc\r\n var photo\r\n if (result._ === 'botInlineMediaResult') {\r\n if (doc = result.document) {\r\n w = result.document.w\r\n h = result.document.h\r\n }\r\n else if (photo = result.photo) {\r\n var photoSize = (photo.sizes || [])[0]\r\n w = photoSize && photoSize.w\r\n h = photoSize && photoSize.h\r\n }\r\n }else {\r\n w = result.w\r\n h = result.h\r\n }\r\n if (!w || !h) {\r\n w = h = 1\r\n }\r\n ratios.push(w / h)\r\n })\r\n\r\n var rows = []\r\n var curCnt = 0\r\n var curW = 0\r\n angular.forEach(ratios, function (ratio) {\r\n var w = ratio * rowH\r\n curW += w\r\n if (!curCnt || curCnt < 4 && curW < (rowW * 1.1)) {\r\n curCnt++\r\n } else {\r\n rows.push(curCnt)\r\n curCnt = 1\r\n curW = w\r\n }\r\n })\r\n if (curCnt) {\r\n rows.push(curCnt)\r\n }\r\n\r\n var i = 0\r\n var thumbs = []\r\n var lastRowI = rows.length - 1\r\n angular.forEach(rows, function (rowCnt, rowI) {\r\n var lastRow = rowI === lastRowI\r\n var curRatios = ratios.slice(i, i + rowCnt)\r\n var sumRatios = 0\r\n angular.forEach(curRatios, function (ratio) {\r\n sumRatios += ratio\r\n })\r\n angular.forEach(curRatios, function (ratio, j) {\r\n var thumbH = rowH\r\n var thumbW = rowW * ratio / sumRatios\r\n var realW = thumbH * ratio\r\n if (lastRow && thumbW > realW) {\r\n thumbW = realW\r\n }\r\n var result = results[i + j]\r\n result.thumbW = Math.floor(thumbW) - 2\r\n result.thumbH = Math.floor(thumbH) - 2\r\n })\r\n\r\n i += rowCnt\r\n })\r\n } */\r\n\r\n public async checkSwitchReturn(botId: BotId) {\r\n const bot = this.appUsersManager.getUser(botId);\r\n if(!bot || !bot.pFlags.bot || !bot.bot_inline_placeholder) {\r\n return;\r\n }\r\n\r\n const peerData = this.setHash[botId];\r\n if(peerData) {\r\n delete this.setHash[botId];\r\n if((Date.now() - peerData.time) < 3600e3) {\r\n return peerData.peerId;\r\n }\r\n }\r\n }\r\n\r\n public switchInlineQuery(peerId: PeerId, threadId: number, botId: BotId, query: string) {\r\n this.appDraftsManager.setDraft(peerId, threadId, '@' + this.appUsersManager.getUser(botId).username + ' ' + query);\r\n }\r\n\r\n public callbackButtonClick(peerId: PeerId, mid: number, button: any) {\r\n return this.apiManager.invokeApi('messages.getBotCallbackAnswer', {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n msg_id: getServerMessageId(mid),\r\n data: button.data\r\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true});\r\n }\r\n\r\n /* function gameButtonClick (id) {\r\n var message = AppMessagesManager.getMessage(id)\r\n var peerId = AppMessagesManager.getMessagePeer(message)\r\n\r\n return MtpApiManager.invokeApi('messages.getBotCallbackAnswer', {\r\n peer: AppPeersManager.getInputPeerByID(peerId),\r\n msg_id: AppMessagesIDsManager.getMessageLocalID(id)\r\n }, {timeout: 1, stopTime: -1, noErrorBox: true}).then(function (callbackAnswer) {\r\n if (typeof callbackAnswer.message === 'string' &&\r\n callbackAnswer.message.length) {\r\n showCallbackMessage(callbackAnswer.message, callbackAnswer.pFlags.alert)\r\n }\r\n else if (typeof callbackAnswer.url === 'string') {\r\n AppGamesManager.openGame(message.media.game.id, id, callbackAnswer.url)\r\n }\r\n })\r\n } */\r\n\r\n public sendInlineResult(peerId: PeerId, botId: BotId, queryAndResultIds: string, options: Partial<{\r\n viaBotId: BotId,\r\n queryId: string,\r\n resultId: string,\r\n replyMarkup: ReplyMarkup,\r\n entities: MessageEntity[],\r\n replyToMsgId: number,\r\n clearDraft: true,\r\n scheduleDate: number,\r\n silent: true,\r\n sendAsPeerId: PeerId,\r\n geoPoint: GeoPoint\r\n }> = {}) {\r\n const inlineResult = this.inlineResults[queryAndResultIds];\r\n if(!inlineResult) {\r\n return;\r\n }\r\n\r\n this.pushPopularBot(botId);\r\n const splitted = queryAndResultIds.split('_');\r\n const queryID = splitted.shift();\r\n const resultID = splitted.join('_');\r\n options.viaBotId = botId;\r\n options.queryId = queryID;\r\n options.resultId = resultID;\r\n if(inlineResult.send_message.reply_markup) {\r\n options.replyMarkup = inlineResult.send_message.reply_markup;\r\n }\r\n\r\n if(inlineResult.send_message._ === 'botInlineMessageText') {\r\n options.entities = inlineResult.send_message.entities;\r\n this.appMessagesManager.sendText(peerId, inlineResult.send_message.message, options);\r\n } else {\r\n let caption = '';\r\n let inputMedia: Parameters<AppMessagesManager['sendOther']>[1], messageMedia: MessageMedia;\r\n const sendMessage = inlineResult.send_message;\r\n switch(sendMessage._) {\r\n case 'botInlineMessageMediaAuto': {\r\n caption = sendMessage.message;\r\n\r\n if(inlineResult._ === 'botInlineMediaResult') {\r\n const {document, photo} = inlineResult;\r\n if(document) {\r\n inputMedia = getDocumentMediaInput(document as MyDocument);\r\n } else {\r\n inputMedia = getPhotoMediaInput(photo as MyPhoto);\r\n }\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'botInlineMessageMediaGeo': {\r\n inputMedia = {\r\n _: 'inputMediaGeoPoint',\r\n geo_point: this.getGeoInput(sendMessage.geo)\r\n };\r\n\r\n options.geoPoint = sendMessage.geo;\r\n\r\n break;\r\n }\r\n\r\n case 'botInlineMessageMediaVenue': {\r\n inputMedia = {\r\n _: 'inputMediaVenue',\r\n geo_point: this.getGeoInput(sendMessage.geo),\r\n title: sendMessage.title,\r\n address: sendMessage.address,\r\n provider: sendMessage.provider,\r\n venue_id: sendMessage.venue_id,\r\n venue_type: sendMessage.venue_type\r\n };\r\n\r\n options.geoPoint = sendMessage.geo;\r\n\r\n break;\r\n }\r\n\r\n case 'botInlineMessageMediaContact': {\r\n inputMedia = {\r\n _: 'inputMediaContact',\r\n phone_number: sendMessage.phone_number,\r\n first_name: sendMessage.first_name,\r\n last_name: sendMessage.last_name,\r\n vcard: sendMessage.vcard\r\n };\r\n\r\n break;\r\n }\r\n\r\n case 'botInlineMessageMediaInvoice': {\r\n // const photo = sendMessage.photo;\r\n // inputMedia = {\r\n // _: 'inputMediaInvoice',\r\n // description: sendMessage.description,\r\n // title: sendMessage.title,\r\n // photo: photo && {\r\n // _: 'inputWebDocument',\r\n // attributes: photo.attributes,\r\n // mime_type: photo.mime_type,\r\n // size: photo.size,\r\n // url: photo.url\r\n // },\r\n // invoice: undefined,\r\n // payload: undefined,\r\n // provider: undefined,\r\n // provider_data: undefined,\r\n // start_param: undefined\r\n // };\r\n\r\n messageMedia = {\r\n _: 'messageMediaInvoice',\r\n title: sendMessage.title,\r\n description: sendMessage.description,\r\n photo: sendMessage.photo,\r\n currency: sendMessage.currency,\r\n total_amount: sendMessage.total_amount,\r\n pFlags: {\r\n shipping_address_requested: sendMessage.pFlags.shipping_address_requested,\r\n test: sendMessage.pFlags.test\r\n },\r\n start_param: undefined\r\n };\r\n\r\n break;\r\n }\r\n }\r\n\r\n if(!inputMedia && messageMedia) {\r\n inputMedia = {\r\n _: 'messageMediaPending',\r\n messageMedia\r\n };\r\n }\r\n\r\n this.appMessagesManager.sendOther(peerId, inputMedia, options);\r\n }\r\n }\r\n\r\n /* function checkGeoLocationAccess (botID) {\r\n var key = 'bot_access_geo' + botID\r\n return Storage.get(key).then(function (geoAccess) {\r\n if (geoAccess && geoAccess.granted) {\r\n return true\r\n }\r\n return ErrorService.confirm({\r\n type: 'BOT_ACCESS_GEO_INLINE'\r\n }).then(function () {\r\n var setHash = {}\r\n setHash[key] = {granted: true, time: tsNow()}\r\n Storage.set(setHash)\r\n return true\r\n }, function () {\r\n var setHash = {}\r\n setHash[key] = {denied: true, time: tsNow()}\r\n Storage.set(setHash)\r\n return $q.reject()\r\n })\r\n })\r\n } */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {MESSAGE_ID_INCREMENT} from './utils/messageId';\r\nimport generateMessageId from './utils/messageId/generateMessageId';\r\n\r\nexport class AppMessagesIdsManager {\r\n private tempNum = 0;\r\n\r\n public generateTempMessageId(messageId: number) {\r\n const num = ++this.tempNum;\r\n return generateMessageId(messageId) + (num & (MESSAGE_ID_INCREMENT - 1));\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport indexOfAndSplice from './array/indexOfAndSplice';\r\nimport makeError from './makeError';\r\n\r\nexport type Middleware = {\r\n (): boolean;\r\n create(): MiddlewareHelper;\r\n onClean: (callback: VoidFunction) => void;\r\n onDestroy: (callback: VoidFunction) => void;\r\n};\r\n\r\nconst createDetails = (): {\r\n cleaned?: boolean,\r\n inner: MiddlewareHelper[],\r\n onCleanCallbacks: VoidFunction[]\r\n} => ({\r\n cleaned: false,\r\n inner: [],\r\n onCleanCallbacks: []\r\n});\r\n\r\nconst MIDDLEWARE_ERROR = makeError('MIDDLEWARE');\r\n\r\n// * onClean == cancel promises, etc\r\n// * onDestroy == destructor\r\nexport class MiddlewareHelper {\r\n private details = createDetails();\r\n private onDestroyCallbacks: VoidFunction[] = [];\r\n private parent: MiddlewareHelper;\r\n private destroyed: boolean;\r\n\r\n public clean() {\r\n const details = this.details;\r\n details.cleaned = true;\r\n details.inner.splice(0, details.inner.length).forEach((helper) => helper.destroy());\r\n details.onCleanCallbacks.splice(0, details.onCleanCallbacks.length).forEach((callback) => callback());\r\n this.details = createDetails();\r\n }\r\n\r\n public destroy() {\r\n this.destroyed = true;\r\n this.clean();\r\n this.onDestroyCallbacks.splice(0, this.onDestroyCallbacks.length).forEach((callback) => callback());\r\n\r\n if(this.parent) {\r\n indexOfAndSplice(this.parent.details.inner, this);\r\n this.parent = undefined;\r\n }\r\n }\r\n\r\n public get(additionalCallback?: () => boolean) {\r\n const details = this.details;\r\n\r\n const middleware: Middleware = () => {\r\n return !details.cleaned && (!additionalCallback || additionalCallback());\r\n };\r\n\r\n middleware.create = () => {\r\n if(!middleware()) throw MIDDLEWARE_ERROR;\r\n const helper = new MiddlewareHelper();\r\n helper.parent = this;\r\n details.inner.push(helper);\r\n return helper;\r\n };\r\n\r\n middleware.onClean = (callback) => {\r\n if(!middleware()) return callback();\r\n details.onCleanCallbacks.push(callback);\r\n };\r\n\r\n middleware.onDestroy = this.onDestroy;\r\n\r\n return middleware;\r\n }\r\n\r\n public onDestroy = (callback: VoidFunction) => {\r\n if(this.destroyed) return callback();\r\n this.onDestroyCallbacks.push(callback);\r\n };\r\n}\r\n\r\n// * will change .cleaned and new instance will be created\r\nexport function getMiddleware() {\r\n return new MiddlewareHelper();\r\n}\r\n","export default function splitStringByLength(str: string, maxLength: number) {\r\n if(str.length < maxLength) return [str];\r\n let length = 0, lastSliceStartIndex = 0, arrayIndex = 0;\r\n const delimiter = ' ';// '\\n';\r\n const out: string[] = [];\r\n\r\n const cut = (end?: number) => {\r\n let part = str.slice(lastSliceStartIndex, end);\r\n const _arrayIndex = arrayIndex++;\r\n if(part.length > maxLength) {\r\n const overflowPart = part.slice(maxLength);\r\n const splitted = splitStringByLength(overflowPart, maxLength);\r\n splitted.forEach((part) => {\r\n out[arrayIndex++] = part;\r\n });\r\n\r\n part = part.slice(0, maxLength);\r\n }\r\n\r\n lastSliceStartIndex = end;\r\n length = 0;\r\n out[_arrayIndex] = (out[_arrayIndex] || '') + part;\r\n };\r\n\r\n let lastIndex = 0;\r\n do {\r\n let index = str.indexOf(delimiter, lastIndex);\r\n if(index === -1) {\r\n if(lastIndex !== (str.length - 1)) {\r\n cut();\r\n }\r\n\r\n break;\r\n }\r\n\r\n index += delimiter.length;\r\n\r\n const partLength = index - lastIndex;\r\n if((length + partLength) > maxLength) {\r\n cut(length);\r\n }\r\n\r\n lastIndex = index;\r\n length += partLength;\r\n } while(true);\r\n\r\n return out;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {TabState} from '../mtproto/mtprotoworker';\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\r\n\r\ntype Tab = {\r\n source: MessageEventSource,\r\n state: TabState\r\n};\r\n\r\nexport class AppTabsManager {\r\n private tabs: Map<Tab['source'], Tab>;\r\n\r\n constructor() {\r\n this.tabs = new Map();\r\n }\r\n\r\n public start() {\r\n const port = MTProtoMessagePort.getInstance<false>();\r\n\r\n port.addEventListener('tabState', (state, source) => {\r\n const tab = this.tabs.get(source);\r\n tab.state = state;\r\n });\r\n }\r\n\r\n public getTabs() {\r\n return [...this.tabs.values()].filter((tab) => !!tab.state);\r\n }\r\n\r\n public addTab(source: MessageEventSource) {\r\n const tab: Tab = {\r\n source,\r\n state: undefined\r\n };\r\n\r\n this.tabs.set(source, tab);\r\n }\r\n\r\n public deleteTab(source: MessageEventSource) {\r\n this.tabs.delete(source);\r\n }\r\n}\r\n\r\nconst appTabsManager = new AppTabsManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appTabsManager = appTabsManager);\r\nexport default appTabsManager;\r\n","import {InputDocument} from '../../../../layer';\r\nimport type {MyDocument} from '../../appDocsManager';\r\n\r\nexport default function getDocumentInput(doc: MyDocument): InputDocument {\r\n return {\r\n _: 'inputDocument',\r\n id: doc.id,\r\n access_hash: doc.access_hash,\r\n file_reference: doc.file_reference\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport LazyLoadQueueBase from '../../components/lazyLoadQueueBase';\r\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\r\nimport tsNow from '../../helpers/tsNow';\r\nimport {randomLong} from '../../helpers/random';\r\nimport {Chat, ChatFull, Dialog as MTDialog, DialogPeer, DocumentAttribute, InputMedia, InputMessage, InputPeerNotifySettings, InputSingleMedia, Message, MessageAction, MessageEntity, MessageFwdHeader, MessageMedia, MessageReplies, MessageReplyHeader, MessagesDialogs, MessagesFilter, MessagesMessages, MethodDeclMap, NotifyPeer, PeerNotifySettings, PhotoSize, SendMessageAction, Update, Photo, Updates, ReplyMarkup, InputPeer, InputPhoto, InputDocument, InputGeoPoint, WebPage, GeoPoint, ReportReason, MessagesGetDialogs, InputChannel, InputDialogPeer, ReactionCount, MessagePeerReaction, MessagesSearchCounter, Peer, MessageReactions, Document, InputFile, Reaction} from '../../layer';\r\nimport {ArgumentTypes, InvokeApiOptions} from '../../types';\r\nimport {logger, LogTypes} from '../logger';\r\nimport type {ApiFileManager} from '../mtproto/apiFileManager';\r\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\r\nimport {GLOBAL_FOLDER_ID} from '../storages/dialogs';\r\nimport {ChatRights} from './appChatsManager';\r\nimport {MyDocument} from './appDocsManager';\r\nimport {MyPhoto} from './appPhotosManager';\r\nimport {getFileNameByLocation} from '../../helpers/fileName';\r\nimport DEBUG from '../../config/debug';\r\nimport SlicedArray, {Slice, SliceEnd} from '../../helpers/slicedArray';\r\nimport {FOLDER_ID_ALL, MUTE_UNTIL, NULL_PEER_ID, REAL_FOLDER_ID, REPLIES_HIDDEN_CHANNEL_ID, REPLIES_PEER_ID, SERVICE_PEER_ID, THUMB_TYPE_FULL} from '../mtproto/mtproto_config';\r\n// import telegramMeWebManager from '../mtproto/telegramMeWebManager';\r\nimport {getMiddleware} from '../../helpers/middleware';\r\nimport assumeType from '../../helpers/assumeType';\r\nimport copy from '../../helpers/object/copy';\r\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\r\nimport forEachReverse from '../../helpers/array/forEachReverse';\r\nimport deepEqual from '../../helpers/object/deepEqual';\r\nimport splitStringByLength from '../../helpers/string/splitStringByLength';\r\nimport debounce from '../../helpers/schedulers/debounce';\r\nimport {AppManager} from './manager';\r\nimport type {MediaSize} from '../../helpers/mediaSize';\r\nimport getPhotoMediaInput from './utils/photos/getPhotoMediaInput';\r\nimport getPhotoDownloadOptions from './utils/photos/getPhotoDownloadOptions';\r\nimport fixEmoji from '../richTextProcessor/fixEmoji';\r\nimport mergeEntities from '../richTextProcessor/mergeEntities';\r\nimport parseEntities from '../richTextProcessor/parseEntities';\r\nimport parseMarkdown from '../richTextProcessor/parseMarkdown';\r\nimport getServerMessageId from './utils/messageId/getServerMessageId';\r\nimport generateMessageId from './utils/messageId/generateMessageId';\r\nimport filterMessagesByInputFilter from './utils/messages/filterMessagesByInputFilter';\r\nimport ctx from '../../environment/ctx';\r\nimport {getEnvironment} from '../../environment/utils';\r\nimport getDialogIndex from './utils/dialogs/getDialogIndex';\r\nimport defineNotNumerableProperties from '../../helpers/object/defineNotNumerableProperties';\r\nimport getDocumentMediaInput from './utils/docs/getDocumentMediaInput';\r\nimport getDocumentInputFileName from './utils/docs/getDocumentInputFileName';\r\nimport getFileNameForUpload from '../../helpers/getFileNameForUpload';\r\nimport type {Progress} from './appDownloadManager';\r\nimport noop from '../../helpers/noop';\r\nimport appTabsManager from './appTabsManager';\r\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\r\nimport getAlbumText from './utils/messages/getAlbumText';\r\nimport pause from '../../helpers/schedulers/pause';\r\nimport makeError from '../../helpers/makeError';\r\nimport getStickerEffectThumb from './utils/stickers/getStickerEffectThumb';\r\nimport getDocumentInput from './utils/docs/getDocumentInput';\r\nimport reactionsEqual from './utils/reactions/reactionsEqual';\r\n\r\n// console.trace('include');\r\n// TODO: если удалить диалог находясь в папке, то он не удалится из папки и будет виден в настройках\r\n\r\nconst APITIMEOUT = 0;\r\nconst DO_NOT_READ_HISTORY = false;\r\n\r\nexport type HistoryStorage = {\r\n count: number | null,\r\n history: SlicedArray<number>,\r\n\r\n maxId?: number,\r\n readPromise?: Promise<void>,\r\n readMaxId?: number,\r\n readOutboxMaxId?: number,\r\n triedToReadMaxId?: number,\r\n\r\n maxOutId?: number,\r\n replyMarkup?: Exclude<ReplyMarkup, ReplyMarkup.replyInlineMarkup>\r\n};\r\n\r\nexport type HistoryResult = {\r\n count: number,\r\n history: number[],\r\n isEnd: ReturnType<Slice<number>['getEnds']>,\r\n offsetIdOffset?: number,\r\n};\r\n\r\nexport type Dialog = MTDialog.dialog;\r\n\r\nexport type MyMessage = Message.message | Message.messageService;\r\nexport type MyInputMessagesFilter = 'inputMessagesFilterEmpty'\r\n | 'inputMessagesFilterPhotos'\r\n | 'inputMessagesFilterPhotoVideo'\r\n | 'inputMessagesFilterVideo'\r\n | 'inputMessagesFilterDocument'\r\n | 'inputMessagesFilterVoice'\r\n | 'inputMessagesFilterRoundVoice'\r\n | 'inputMessagesFilterRoundVideo'\r\n | 'inputMessagesFilterMusic'\r\n | 'inputMessagesFilterUrl'\r\n | 'inputMessagesFilterMyMentions'\r\n | 'inputMessagesFilterChatPhotos'\r\n | 'inputMessagesFilterPinned';\r\n\r\nexport type PinnedStorage = Partial<{\r\n promise: Promise<PinnedStorage>,\r\n count: number,\r\n maxId: number\r\n}>;\r\nexport type MessagesStorage = Map<number, Message.message | Message.messageService> & {peerId: PeerId, type: MessagesStorageType, key: MessagesStorageKey};\r\nexport type MessagesStorageType = 'scheduled' | 'history' | 'grouped';\r\nexport type MessagesStorageKey = `${PeerId}_${MessagesStorageType}`;\r\n\r\nexport type MyMessageActionType = Message.messageService['action']['_'];\r\n\r\ntype PendingAfterMsg = Partial<InvokeApiOptions & {\r\n afterMessageId: string,\r\n messageId: string\r\n}>;\r\n\r\ntype MapValueType<A> = A extends Map<any, infer V> ? V : never;\r\n\r\nexport type BatchUpdates = {\r\n 'messages_reactions': AppMessagesManager['batchUpdateReactions'],\r\n 'messages_views': AppMessagesManager['batchUpdateViews']\r\n};\r\n\r\ntype PendingMessageDetails = {\r\n peerId: PeerId,\r\n tempId: number,\r\n threadId: number,\r\n storage: MessagesStorage,\r\n sequential?: boolean\r\n};\r\n\r\nconst processAfter = (cb: () => void) => {\r\n // setTimeout(cb, 0);\r\n cb();\r\n};\r\n\r\nconst UPDATE_STICKERSET_ORDER = true;\r\n\r\nexport class AppMessagesManager extends AppManager {\r\n private messagesStorageByPeerId: {[peerId: string]: MessagesStorage};\r\n private groupedMessagesStorage: {[groupId: string]: MessagesStorage}; // will be used for albums\r\n private scheduledMessagesStorage: {[peerId: PeerId]: MessagesStorage};\r\n private historiesStorage: {\r\n [peerId: PeerId]: HistoryStorage\r\n };\r\n private threadsStorage: {\r\n [peerId: PeerId]: {\r\n [threadId: string]: HistoryStorage\r\n }\r\n };\r\n private searchesStorage: {\r\n [peerId: PeerId]: Partial<{\r\n [inputFilter in MyInputMessagesFilter]: {\r\n count?: number,\r\n history: number[]\r\n }\r\n }>\r\n };\r\n private pinnedMessages: {[peerId: PeerId]: PinnedStorage};\r\n\r\n private threadsServiceMessagesIdsStorage: {[peerId_threadId: string]: number};\r\n private threadsToReplies: {\r\n [peerId_threadId: string]: string;\r\n };\r\n\r\n private pendingByRandomId: {\r\n [randomId: string]: PendingMessageDetails\r\n } = {};\r\n private pendingByMessageId: {[mid: string]: Long} = {};\r\n private pendingAfterMsgs: {[peerId: PeerId]: PendingAfterMsg} = {};\r\n public pendingTopMsgs: {[peerId: PeerId]: number} = {};\r\n private tempFinalizeCallbacks: {\r\n [tempId: string]: {\r\n [callbackName: string]: Partial<{\r\n deferred: CancellablePromise<void>,\r\n callback: (message: MyMessage) => Promise<any>\r\n }>\r\n }\r\n } = {};\r\n\r\n private sendSmthLazyLoadQueue = new LazyLoadQueueBase(10);\r\n\r\n private needSingleMessages: Map<PeerId, Map<number, CancellablePromise<Message.message | Message.messageService>>> = new Map();\r\n private fetchSingleMessagesPromise: Promise<void> = null;\r\n private extendedMedia: Map<PeerId, Map<number, CancellablePromise<void>>> = new Map();\r\n\r\n private maxSeenId = 0;\r\n\r\n public migratedFromTo: {[peerId: PeerId]: PeerId} = {};\r\n public migratedToFrom: {[peerId: PeerId]: PeerId} = {};\r\n\r\n private newDialogsHandlePromise: Promise<any>;\r\n private newDialogsToHandle: Map<PeerId, Dialog> = new Map();\r\n public newUpdatesAfterReloadToHandle: {[peerId: PeerId]: Set<Update>} = {};\r\n\r\n private notificationsHandlePromise = 0;\r\n private notificationsToHandle: {[peerId: PeerId]: {\r\n fwdCount: number,\r\n fromId: PeerId,\r\n topMessage?: MyMessage\r\n }} = {};\r\n\r\n private reloadConversationsPromise: Promise<void>;\r\n private reloadConversationsPeers: Map<PeerId, {inputDialogPeer: InputDialogPeer, promise: CancellablePromise<Dialog>}> = new Map();\r\n\r\n public log = logger('MESSAGES', LogTypes.Error | LogTypes.Debug | LogTypes.Log | LogTypes.Warn);\r\n\r\n private groupedTempId = 0;\r\n\r\n private typings: {[peerId: PeerId]: {action: SendMessageAction, timeout?: number}} = {};\r\n\r\n private middleware: ReturnType<typeof getMiddleware>;\r\n\r\n private unreadMentions: {[peerId: PeerId]: SlicedArray<number>} = {};\r\n private goToNextMentionPromises: {[peerId: PeerId]: Promise<number>} = {};\r\n\r\n private batchUpdates: {\r\n [k in keyof BatchUpdates]?: {\r\n callback: BatchUpdates[k],\r\n batch: ArgumentTypes<BatchUpdates[k]>[0]\r\n }\r\n } = {};\r\n private batchUpdatesDebounced: () => Promise<void>;\r\n\r\n private uploadFilePromises: {[fileName: string]: CancellablePromise<any>};\r\n\r\n protected after() {\r\n this.clear(true);\r\n\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updateMessageID: this.onUpdateMessageId,\r\n\r\n updateNewDiscussionMessage: this.onUpdateNewMessage,\r\n updateNewMessage: this.onUpdateNewMessage,\r\n updateNewChannelMessage: this.onUpdateNewMessage,\r\n\r\n updateDialogUnreadMark: this.onUpdateDialogUnreadMark,\r\n\r\n updateEditMessage: this.onUpdateEditMessage,\r\n updateEditChannelMessage: this.onUpdateEditMessage,\r\n\r\n updateMessageReactions: this.onUpdateMessageReactions,\r\n\r\n updateReadChannelDiscussionInbox: this.onUpdateReadHistory,\r\n updateReadChannelDiscussionOutbox: this.onUpdateReadHistory,\r\n updateReadHistoryInbox: this.onUpdateReadHistory,\r\n updateReadHistoryOutbox: this.onUpdateReadHistory,\r\n updateReadChannelInbox: this.onUpdateReadHistory,\r\n updateReadChannelOutbox: this.onUpdateReadHistory,\r\n\r\n updateChannelReadMessagesContents: this.onUpdateReadMessagesContents,\r\n updateReadMessagesContents: this.onUpdateReadMessagesContents,\r\n\r\n updateChannelAvailableMessages: this.onUpdateChannelAvailableMessages,\r\n\r\n updateDeleteMessages: this.onUpdateDeleteMessages,\r\n updateDeleteChannelMessages: this.onUpdateDeleteMessages,\r\n\r\n updateChannel: this.onUpdateChannel,\r\n\r\n updateChannelReload: this.onUpdateChannelReload,\r\n\r\n updateChannelMessageViews: this.onUpdateChannelMessageViews,\r\n\r\n updateServiceNotification: this.onUpdateServiceNotification,\r\n\r\n updatePinnedMessages: this.onUpdatePinnedMessages,\r\n updatePinnedChannelMessages: this.onUpdatePinnedMessages,\r\n\r\n updateNotifySettings: this.onUpdateNotifySettings,\r\n\r\n updateNewScheduledMessage: this.onUpdateNewScheduledMessage,\r\n\r\n updateDeleteScheduledMessages: this.onUpdateDeleteScheduledMessages,\r\n\r\n updateMessageExtendedMedia: this.onUpdateMessageExtendedMedia\r\n });\r\n\r\n // ! Invalidate notify settings, can optimize though\r\n this.rootScope.addEventListener('notify_peer_type_settings', ({key, settings}) => {\r\n const dialogs = this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1));\r\n let filterFunc: (dialog: Dialog) => boolean;\r\n if(key === 'notifyUsers') filterFunc = (dialog) => dialog.peerId.isUser();\r\n else if(key === 'notifyBroadcasts') filterFunc = (dialog) => this.appPeersManager.isBroadcast(dialog.peerId);\r\n else filterFunc = (dialog) => this.appPeersManager.isAnyGroup(dialog.peerId);\r\n\r\n dialogs\r\n .filter(filterFunc)\r\n .forEach((dialog) => {\r\n this.rootScope.dispatchEvent('dialog_notify_settings', dialog);\r\n });\r\n });\r\n\r\n this.rootScope.addEventListener('webpage_updated', ({id, msgs}) => {\r\n msgs.forEach(({peerId, mid, isScheduled}) => {\r\n const storage = isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getHistoryMessagesStorage(peerId);\r\n const message = this.getMessageFromStorage(storage, mid) as Message.message;\r\n if(!message) return;\r\n message.media = {\r\n _: 'messageMediaWebPage',\r\n webpage: this.appWebPagesManager.getCachedWebPage(id)\r\n };\r\n\r\n this.rootScope.dispatchEvent('message_edit', {\r\n storageKey: storage.key,\r\n peerId,\r\n mid,\r\n message\r\n });\r\n });\r\n });\r\n\r\n this.rootScope.addEventListener('draft_updated', ({peerId, threadId, draft}) => {\r\n if(threadId) return;\r\n\r\n const dialog = this.getDialogOnly(peerId);\r\n if(dialog) {\r\n if(!threadId) {\r\n dialog.draft = draft;\r\n\r\n let drop = false;\r\n if(!draft && !getServerMessageId(dialog.top_message)) {\r\n this.dialogsStorage.dropDialog(peerId);\r\n drop = true;\r\n } else {\r\n this.dialogsStorage.generateIndexForDialog(dialog);\r\n this.dialogsStorage.pushDialog(dialog);\r\n }\r\n\r\n this.rootScope.dispatchEvent('dialog_draft', {\r\n peerId,\r\n dialog,\r\n drop,\r\n draft\r\n });\r\n }\r\n } else {\r\n this.reloadConversation(peerId);\r\n }\r\n });\r\n\r\n this.rootScope.addEventListener('poll_update', ({poll}) => {\r\n const set = this.appPollsManager.pollToMessages[poll.id];\r\n if(set) {\r\n for(const key of set) {\r\n const [peerId, mid] = key.split('_');\r\n\r\n const message = this.getMessageByPeer(peerId.toPeerId(), +mid);\r\n if(message) {\r\n this.setDialogToStateIfMessageIsTop(message);\r\n }\r\n }\r\n }\r\n });\r\n\r\n this.batchUpdatesDebounced = debounce(() => {\r\n for(const event in this.batchUpdates) {\r\n const details = this.batchUpdates[event as keyof BatchUpdates];\r\n delete this.batchUpdates[event as keyof BatchUpdates];\r\n\r\n // @ts-ignore\r\n const result = details.callback(details.batch);\r\n if(result && (!(result instanceof Array) || result.length)) {\r\n // @ts-ignore\r\n rootScope.dispatchEvent(event as keyof BatchUpdates, result);\r\n }\r\n }\r\n }, 33, false, true);\r\n\r\n return this.appStateManager.getState().then((state) => {\r\n if(state.maxSeenMsgId) {\r\n this.maxSeenId = state.maxSeenMsgId;\r\n }\r\n });\r\n }\r\n\r\n public clear = (init?: boolean) => {\r\n if(this.middleware) {\r\n this.middleware.clean();\r\n } else {\r\n this.middleware = getMiddleware();\r\n this.uploadFilePromises = {};\r\n }\r\n\r\n this.messagesStorageByPeerId = {};\r\n this.groupedMessagesStorage = {};\r\n this.scheduledMessagesStorage = {};\r\n this.historiesStorage = {};\r\n this.threadsStorage = {};\r\n this.searchesStorage = {};\r\n this.pinnedMessages = {};\r\n this.threadsServiceMessagesIdsStorage = {};\r\n this.threadsToReplies = {};\r\n\r\n this.dialogsStorage && this.dialogsStorage.clear(init);\r\n this.filtersStorage && this.filtersStorage.clear(init);\r\n };\r\n\r\n public getInputEntities(entities: MessageEntity[]) {\r\n const sendEntites = copy(entities);\r\n sendEntites.forEach((entity) => {\r\n if(entity._ === 'messageEntityMentionName') {\r\n (entity as any as MessageEntity.inputMessageEntityMentionName)._ = 'inputMessageEntityMentionName';\r\n (entity as any as MessageEntity.inputMessageEntityMentionName).user_id = this.appUsersManager.getUserInput(entity.user_id);\r\n }\r\n });\r\n return sendEntites;\r\n }\r\n\r\n public invokeAfterMessageIsSent(tempId: number, callbackName: string, callback: (message: MyMessage) => Promise<any>) {\r\n const finalize = this.tempFinalizeCallbacks[tempId] ?? (this.tempFinalizeCallbacks[tempId] = {});\r\n const obj = finalize[callbackName] ?? (finalize[callbackName] = {deferred: deferredPromise<void>()});\r\n\r\n obj.callback = callback;\r\n\r\n return obj.deferred;\r\n }\r\n\r\n public editMessage(message: any, text: string, options: Partial<{\r\n noWebPage: true,\r\n newMedia: any,\r\n scheduleDate: number,\r\n entities: MessageEntity[]\r\n }> = {}): Promise<void> {\r\n /* if(!this.canEditMessage(messageId)) {\r\n return Promise.reject({type: 'MESSAGE_EDIT_FORBIDDEN'});\r\n } */\r\n\r\n const {mid, peerId} = message;\r\n\r\n if(message.pFlags.is_outgoing) {\r\n return this.invokeAfterMessageIsSent(mid, 'edit', (message) => {\r\n // this.log('invoke editMessage callback', message);\r\n return this.editMessage(message, text, options);\r\n });\r\n }\r\n\r\n const entities = options.entities || [];\r\n if(text) {\r\n text = parseMarkdown(text, entities);\r\n }\r\n\r\n const schedule_date = options.scheduleDate || (message.pFlags.is_scheduled ? message.date : undefined);\r\n return this.apiManager.invokeApi('messages.editMessage', {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n id: message.id,\r\n message: text,\r\n media: options.newMedia,\r\n entities: entities.length ? this.getInputEntities(entities) : undefined,\r\n no_webpage: options.noWebPage,\r\n schedule_date\r\n }).then((updates) => {\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n }, (error) => {\r\n this.log.error('editMessage error:', error);\r\n\r\n if(error && error.type === 'MESSAGE_NOT_MODIFIED') {\r\n error.handled = true;\r\n return;\r\n }\r\n if(error && error.type === 'MESSAGE_EMPTY') {\r\n error.handled = true;\r\n }\r\n return Promise.reject(error);\r\n });\r\n }\r\n\r\n public async sendText(peerId: PeerId, text: string, options: Partial<{\r\n entities: MessageEntity[],\r\n replyToMsgId: number,\r\n threadId: number,\r\n viaBotId: BotId,\r\n queryId: string,\r\n resultId: string,\r\n noWebPage: true,\r\n replyMarkup: ReplyMarkup,\r\n clearDraft: true,\r\n webPage: WebPage,\r\n scheduleDate: number,\r\n silent: true,\r\n sendAsPeerId: PeerId,\r\n }> = {}): Promise<void> {\r\n if(!text.trim()) {\r\n return;\r\n }\r\n\r\n options.entities ??= [];\r\n\r\n // this.checkSendOptions(options);\r\n if(options.threadId && !options.replyToMsgId) {\r\n options.replyToMsgId = options.threadId;\r\n }\r\n\r\n const config = await this.apiManager.getConfig();\r\n const MAX_LENGTH = config.message_length_max;\r\n const splitted = splitStringByLength(text, MAX_LENGTH);\r\n text = splitted[0];\r\n if(splitted.length > 1) {\r\n if(options.webPage?._ === 'webPage' && !text.includes(options.webPage.url)) {\r\n delete options.webPage;\r\n }\r\n }\r\n\r\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\r\n\r\n const entities = options.entities;\r\n if(!options.viaBotId) {\r\n text = parseMarkdown(text, entities);\r\n // entities = mergeEntities(entities, parseEntities(text));\r\n }\r\n\r\n let sendEntites = this.getInputEntities(entities);\r\n if(!sendEntites.length) {\r\n sendEntites = undefined;\r\n }\r\n\r\n const message = this.generateOutgoingMessage(peerId, options);\r\n message.entities = entities;\r\n message.message = text;\r\n\r\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\r\n const isChannel = this.appPeersManager.isChannel(peerId);\r\n\r\n if(options.webPage) {\r\n message.media = {\r\n _: 'messageMediaWebPage',\r\n webpage: options.webPage\r\n };\r\n }\r\n\r\n const toggleError = (error?: ApiError) => {\r\n this.onMessagesSendError([message], error);\r\n this.rootScope.dispatchEvent('messages_pending');\r\n };\r\n\r\n message.send = () => {\r\n toggleError();\r\n const sentRequestOptions: PendingAfterMsg = {};\r\n if(this.pendingAfterMsgs[peerId]) {\r\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\r\n }\r\n\r\n const sendAs = options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\r\n let apiPromise: any;\r\n if(options.viaBotId) {\r\n apiPromise = this.apiManager.invokeApiAfter('messages.sendInlineBotResult', {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n random_id: message.random_id,\r\n reply_to_msg_id: replyToMsgId || undefined,\r\n query_id: options.queryId,\r\n id: options.resultId,\r\n clear_draft: options.clearDraft,\r\n send_as: sendAs\r\n }, sentRequestOptions);\r\n } else {\r\n apiPromise = this.apiManager.invokeApiAfter('messages.sendMessage', {\r\n no_webpage: options.noWebPage,\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n message: text,\r\n random_id: message.random_id,\r\n reply_to_msg_id: replyToMsgId || undefined,\r\n entities: sendEntites,\r\n clear_draft: options.clearDraft,\r\n schedule_date: options.scheduleDate || undefined,\r\n silent: options.silent,\r\n send_as: sendAs,\r\n update_stickersets_order: UPDATE_STICKERSET_ORDER\r\n }, sentRequestOptions);\r\n }\r\n\r\n /* function is<T>(value: any, condition: boolean): value is T {\r\n return condition;\r\n } */\r\n\r\n // this.log('sendText', message.mid);\r\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\r\n\r\n return apiPromise.then((updates: Updates) => {\r\n // this.log('sendText sent', message.mid);\r\n // if(is<Updates.updateShortSentMessage>(updates, updates._ === 'updateShortSentMessage')) {\r\n if(updates._ === 'updateShortSentMessage') {\r\n // assumeType<Updates.updateShortSentMessage>(updates);\r\n\r\n // * fix copying object with promise\r\n const promise = message.promise;\r\n delete message.promise;\r\n const newMessage = copy(message);\r\n defineNotNumerableProperties(message, ['promise']);\r\n message.promise = promise;\r\n\r\n newMessage.date = updates.date;\r\n newMessage.id = updates.id;\r\n newMessage.media = updates.media;\r\n newMessage.entities = updates.entities;\r\n this.wrapMessageEntities(newMessage);\r\n if(updates.pFlags.out) {\r\n newMessage.pFlags.out = true;\r\n }\r\n\r\n // * override with new updates\r\n updates = {\r\n _: 'updates',\r\n users: [],\r\n chats: [],\r\n seq: 0,\r\n date: undefined,\r\n updates: [{\r\n _: 'updateMessageID',\r\n random_id: message.random_id,\r\n id: newMessage.id\r\n }, {\r\n _: options.scheduleDate ? 'updateNewScheduledMessage' : (isChannel ? 'updateNewChannelMessage' : 'updateNewMessage'),\r\n message: newMessage,\r\n pts: updates.pts,\r\n pts_count: updates.pts_count\r\n }]\r\n };\r\n } else if((updates as Updates.updates).updates) {\r\n (updates as Updates.updates).updates.forEach((update) => {\r\n if(update._ === 'updateDraftMessage') {\r\n update.local = true;\r\n }\r\n });\r\n }\r\n // Testing bad situations\r\n // var upd = angular.copy(updates)\r\n // updates.updates.splice(0, 1)\r\n\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n\r\n // $timeout(function () {\r\n // ApiUpdatesManager.processUpdateMessage(upd)\r\n // }, 5000)\r\n message.promise.resolve();\r\n }, (error: ApiError) => {\r\n toggleError(error);\r\n message.promise.reject(error);\r\n throw error;\r\n }).finally(() => {\r\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\r\n delete this.pendingAfterMsgs[peerId];\r\n }\r\n });\r\n };\r\n\r\n this.beforeMessageSending(message, {\r\n isScheduled: !!options.scheduleDate || undefined,\r\n threadId: options.threadId,\r\n clearDraft: options.clearDraft,\r\n sequential: true\r\n });\r\n\r\n const promises: ReturnType<AppMessagesManager['sendText']>[] = [message.promise];\r\n for(let i = 1; i < splitted.length; ++i) {\r\n promises.push(this.sendText(peerId, splitted[i], options));\r\n }\r\n\r\n return Promise.all(promises).then(noop);\r\n }\r\n\r\n public sendFile(peerId: PeerId, file: File | Blob | MyDocument, options: Partial<{\r\n isRoundMessage: true,\r\n isVoiceMessage: true,\r\n isGroupedItem: true,\r\n isMedia: true,\r\n\r\n replyToMsgId: number,\r\n sendAsPeerId: PeerId,\r\n threadId: number,\r\n groupId: string,\r\n caption: string,\r\n entities: MessageEntity[],\r\n width: number,\r\n height: number,\r\n objectURL: string,\r\n thumb: {\r\n blob: Blob,\r\n url: string,\r\n size: MediaSize\r\n },\r\n duration: number,\r\n background: boolean,\r\n silent: boolean,\r\n clearDraft: boolean,\r\n scheduleDate: number,\r\n noSound: boolean,\r\n\r\n waveform: Uint8Array,\r\n\r\n // ! only for internal use\r\n processAfter?: typeof processAfter\r\n }> = {}) {\r\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\r\n\r\n // this.checkSendOptions(options);\r\n\r\n const message = this.generateOutgoingMessage(peerId, options);\r\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\r\n\r\n let attachType: 'document' | 'audio' | 'video' | 'voice' | 'photo', apiFileName: string;\r\n\r\n const fileType = 'mime_type' in file ? file.mime_type : file.type;\r\n const fileName = file instanceof File ? file.name : '';\r\n const isDocument = !(file instanceof File) && !(file instanceof Blob);\r\n let caption = options.caption || '';\r\n\r\n this.log('sendFile', file, fileType);\r\n\r\n const entities = options.entities || [];\r\n if(caption) {\r\n caption = parseMarkdown(caption, entities);\r\n }\r\n\r\n const attributes: DocumentAttribute[] = [];\r\n\r\n const isPhoto = getEnvironment().IMAGE_MIME_TYPES_SUPPORTED.has(fileType);\r\n\r\n let photo: MyPhoto, document: MyDocument;\r\n\r\n let actionName: Extract<SendMessageAction['_'], 'sendMessageUploadAudioAction' | 'sendMessageUploadDocumentAction' | 'sendMessageUploadPhotoAction' | 'sendMessageUploadVideoAction'>;\r\n if(isDocument) { // maybe it's a sticker or gif\r\n attachType = 'document';\r\n apiFileName = '';\r\n } else if(fileType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(fileType) >= 0) {\r\n attachType = 'audio';\r\n apiFileName = 'audio.' + (fileType.split('/')[1] === 'ogg' ? 'ogg' : 'mp3');\r\n actionName = 'sendMessageUploadAudioAction';\r\n\r\n if(options.isVoiceMessage) {\r\n attachType = 'voice';\r\n message.pFlags.media_unread = true;\r\n }\r\n\r\n const attribute: DocumentAttribute.documentAttributeAudio = {\r\n _: 'documentAttributeAudio',\r\n pFlags: {\r\n voice: options.isVoiceMessage\r\n },\r\n waveform: options.waveform,\r\n duration: options.duration || 0\r\n };\r\n\r\n attributes.push(attribute);\r\n } else if(!options.isMedia) {\r\n attachType = 'document';\r\n apiFileName = 'document.' + fileType.split('/')[1];\r\n actionName = 'sendMessageUploadDocumentAction';\r\n } else if(isPhoto) {\r\n attachType = 'photo';\r\n apiFileName = 'photo.' + fileType.split('/')[1];\r\n actionName = 'sendMessageUploadPhotoAction';\r\n\r\n const photoSize = {\r\n _: 'photoSize',\r\n w: options.width,\r\n h: options.height,\r\n type: THUMB_TYPE_FULL,\r\n location: null,\r\n size: file.size\r\n } as PhotoSize.photoSize;\r\n\r\n photo = {\r\n _: 'photo',\r\n id: '' + message.id,\r\n sizes: [photoSize],\r\n w: options.width,\r\n h: options.height\r\n } as any;\r\n\r\n const cacheContext = this.thumbsStorage.getCacheContext(photo, photoSize.type);\r\n cacheContext.downloaded = file.size;\r\n cacheContext.url = options.objectURL || '';\r\n\r\n photo = this.appPhotosManager.savePhoto(photo);\r\n } else if(getEnvironment().VIDEO_MIME_TYPES_SUPPORTED.has(fileType)) {\r\n attachType = 'video';\r\n apiFileName = 'video.mp4';\r\n actionName = 'sendMessageUploadVideoAction';\r\n\r\n const videoAttribute: DocumentAttribute.documentAttributeVideo = {\r\n _: 'documentAttributeVideo',\r\n pFlags: {\r\n round_message: options.isRoundMessage,\r\n supports_streaming: true\r\n },\r\n duration: options.duration,\r\n w: options.width,\r\n h: options.height\r\n };\r\n\r\n attributes.push(videoAttribute);\r\n\r\n // * must follow after video attribute\r\n if(options.noSound &&\r\n file.size > (10 * 1024) &&\r\n file.size < (10 * 1024 * 1024)) {\r\n attributes.push({\r\n _: 'documentAttributeAnimated'\r\n });\r\n }\r\n } else {\r\n attachType = 'document';\r\n apiFileName = 'document.' + fileType.split('/')[1];\r\n actionName = 'sendMessageUploadDocumentAction';\r\n }\r\n\r\n attributes.push({_: 'documentAttributeFilename', file_name: fileName || apiFileName});\r\n\r\n if((['document', 'video', 'audio', 'voice'] as (typeof attachType)[]).indexOf(attachType) !== -1 && !isDocument) {\r\n const thumbs: PhotoSize[] = [];\r\n document = {\r\n _: 'document',\r\n id: '' + message.id,\r\n duration: options.duration,\r\n attributes,\r\n w: options.width,\r\n h: options.height,\r\n thumbs,\r\n mime_type: fileType,\r\n size: file.size\r\n } as any;\r\n\r\n if(options.objectURL) {\r\n const cacheContext = this.thumbsStorage.getCacheContext(document);\r\n cacheContext.downloaded = file.size;\r\n cacheContext.url = options.objectURL;\r\n }\r\n\r\n let thumb: PhotoSize.photoSize;\r\n if(isPhoto) {\r\n attributes.push({\r\n _: 'documentAttributeImageSize',\r\n w: options.width,\r\n h: options.height\r\n });\r\n\r\n thumb = {\r\n _: 'photoSize',\r\n w: options.width,\r\n h: options.height,\r\n type: THUMB_TYPE_FULL,\r\n size: file.size\r\n };\r\n } else if(attachType === 'video') {\r\n if(options.thumb) {\r\n thumb = {\r\n _: 'photoSize',\r\n w: options.thumb.size.width,\r\n h: options.thumb.size.height,\r\n type: 'local-thumb',\r\n size: options.thumb.blob.size\r\n };\r\n\r\n const thumbCacheContext = this.thumbsStorage.getCacheContext(document, thumb.type);\r\n thumbCacheContext.downloaded = thumb.size;\r\n thumbCacheContext.url = options.thumb.url;\r\n }\r\n }\r\n\r\n if(thumb) {\r\n thumbs.push(thumb);\r\n }\r\n\r\n /* if(thumbs.length) {\r\n const thumb = thumbs[0] as PhotoSize.photoSize;\r\n const docThumb = appPhotosManager.getDocumentCachedThumb(document.id);\r\n docThumb.downloaded = thumb.size;\r\n docThumb.url = thumb.url;\r\n } */\r\n\r\n document = this.appDocsManager.saveDoc(document);\r\n }\r\n\r\n this.log('sendFile', attachType, apiFileName, file.type, options);\r\n\r\n const sentDeferred = deferredPromise<InputMedia>();\r\n // sentDeferred.cancel = () => {\r\n // const error = new Error('Download canceled');\r\n // error.name = 'AbortError';\r\n // sentDeferred.reject(error);\r\n\r\n // if(uploadPromise?.cancel) {\r\n // uploadPromise.cancel();\r\n // }\r\n // };\r\n\r\n const media: MessageMedia = isDocument ? undefined : {\r\n _: photo ? 'messageMediaPhoto' : 'messageMediaDocument',\r\n pFlags: {},\r\n // preloader,\r\n photo,\r\n document\r\n };\r\n\r\n if(media) {\r\n defineNotNumerableProperties(media as any, ['promise']);\r\n (media as any).promise = sentDeferred;\r\n }\r\n\r\n message.entities = entities;\r\n message.message = caption;\r\n message.media = isDocument ? {\r\n _: 'messageMediaDocument',\r\n pFlags: {},\r\n document: file\r\n } as MessageMedia.messageMediaDocument : media;\r\n\r\n const uploadingFileName = !isDocument ? getFileNameForUpload(file) : undefined;\r\n message.uploadingFileName = uploadingFileName;\r\n\r\n if(uploadingFileName) {\r\n this.uploadFilePromises[uploadingFileName] = sentDeferred;\r\n }\r\n\r\n const toggleError = (error?: ApiError) => {\r\n this.onMessagesSendError([message], error);\r\n this.rootScope.dispatchEvent('messages_pending');\r\n };\r\n\r\n let uploaded = false,\r\n uploadPromise: ReturnType<ApiFileManager['upload']> = null;\r\n\r\n message.send = () => {\r\n if(isDocument) {\r\n const inputMedia: InputMedia = {\r\n _: 'inputMediaDocument',\r\n id: getDocumentInput(file)\r\n };\r\n\r\n sentDeferred.resolve(inputMedia);\r\n } else if(file instanceof File || file instanceof Blob) {\r\n const load = () => {\r\n if(!uploaded || message.error) {\r\n uploaded = false;\r\n\r\n uploadPromise = this.apiFileManager.upload({file, fileName: uploadingFileName});\r\n uploadPromise.catch((err) => {\r\n if(!uploaded) {\r\n this.log('cancelling upload', media);\r\n\r\n this.cancelPendingMessage(message.random_id);\r\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\r\n sentDeferred.reject(err);\r\n }\r\n });\r\n\r\n uploadPromise.addNotifyListener((progress: Progress) => {\r\n /* if(DEBUG) {\r\n this.log('upload progress', progress);\r\n } */\r\n\r\n const percents = Math.max(1, Math.floor(100 * progress.done / progress.total));\r\n if(actionName) {\r\n this.setTyping(peerId, {_: actionName, progress: percents | 0});\r\n }\r\n sentDeferred.notifyAll(progress);\r\n });\r\n\r\n sentDeferred.notifyAll({done: 0, total: file.size});\r\n }\r\n\r\n let thumbUploadPromise: typeof uploadPromise;\r\n if(attachType === 'video' && options.objectURL && options.thumb?.blob) {\r\n thumbUploadPromise = this.apiFileManager.upload({file: options.thumb.blob});\r\n }\r\n\r\n uploadPromise && uploadPromise.then(async(inputFile) => {\r\n /* if(DEBUG) {\r\n this.log('appMessagesManager: sendFile uploaded:', inputFile);\r\n } */\r\n\r\n inputFile.name = apiFileName;\r\n uploaded = true;\r\n let inputMedia: InputMedia;\r\n switch(attachType) {\r\n case 'photo':\r\n inputMedia = {\r\n _: 'inputMediaUploadedPhoto',\r\n file: inputFile\r\n };\r\n break;\r\n\r\n default:\r\n inputMedia = {\r\n _: 'inputMediaUploadedDocument',\r\n file: inputFile,\r\n mime_type: fileType,\r\n pFlags: {\r\n force_file: actionName === 'sendMessageUploadDocumentAction' ? true : undefined\r\n // nosound_video: options.noSound ? true : undefined\r\n },\r\n attributes\r\n };\r\n }\r\n\r\n if(thumbUploadPromise) {\r\n try {\r\n const inputFile = await thumbUploadPromise;\r\n (inputMedia as InputMedia.inputMediaUploadedDocument).thumb = inputFile;\r\n } catch(err) {\r\n this.log.error('sendFile thumb upload error:', err);\r\n }\r\n }\r\n\r\n sentDeferred.resolve(inputMedia);\r\n }, (error: ApiError) => {\r\n toggleError(error);\r\n throw error;\r\n });\r\n\r\n return sentDeferred;\r\n };\r\n\r\n if(options.isGroupedItem) {\r\n load();\r\n } else {\r\n this.sendSmthLazyLoadQueue.push({\r\n load\r\n });\r\n }\r\n }\r\n\r\n return sentDeferred;\r\n };\r\n\r\n this.beforeMessageSending(message, {\r\n isGroupedItem: options.isGroupedItem,\r\n isScheduled: !!options.scheduleDate || undefined,\r\n threadId: options.threadId,\r\n clearDraft: options.clearDraft,\r\n processAfter: options.processAfter\r\n });\r\n\r\n if(!options.isGroupedItem) {\r\n sentDeferred.then((inputMedia) => {\r\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\r\n\r\n return this.apiManager.invokeApi('messages.sendMedia', {\r\n background: options.background,\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n media: inputMedia,\r\n message: caption,\r\n random_id: message.random_id,\r\n reply_to_msg_id: replyToMsgId,\r\n schedule_date: options.scheduleDate,\r\n silent: options.silent,\r\n entities,\r\n clear_draft: options.clearDraft,\r\n send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\r\n }).then((updates) => {\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n }, (error: ApiError) => {\r\n if(attachType === 'photo' &&\r\n error.code === 400 &&\r\n (error.type === 'PHOTO_INVALID_DIMENSIONS' ||\r\n error.type === 'PHOTO_SAVE_FILE_INVALID')) {\r\n error.handled = true;\r\n attachType = 'document';\r\n message.send();\r\n return;\r\n }\r\n\r\n toggleError(error);\r\n throw error;\r\n });\r\n });\r\n\r\n sentDeferred.then(message.promise.resolve, message.promise.reject);\r\n }\r\n\r\n const ret: {\r\n message: typeof message,\r\n promise: typeof sentDeferred\r\n } = {\r\n message\r\n } as any;\r\n\r\n defineNotNumerableProperties(ret, ['promise']);\r\n ret.promise = sentDeferred;\r\n\r\n return ret;\r\n }\r\n\r\n public async sendAlbum(peerId: PeerId, files: File[], options: Partial<{\r\n isMedia: true,\r\n entities: MessageEntity[],\r\n replyToMsgId: number,\r\n sendAsPeerId: PeerId,\r\n threadId: number,\r\n caption: string,\r\n sendFileDetails: Partial<{\r\n duration: number,\r\n width: number,\r\n height: number,\r\n objectURL: string,\r\n thumbBlob: Blob,\r\n thumbURL: string\r\n }>[],\r\n silent: true,\r\n clearDraft: true,\r\n scheduleDate: number\r\n }> = {}) {\r\n // this.checkSendOptions(options);\r\n\r\n if(options.threadId && !options.replyToMsgId) {\r\n options.replyToMsgId = options.threadId;\r\n }\r\n\r\n if(files.length === 1) {\r\n return this.sendFile(peerId, files[0], {...options, ...options.sendFileDetails[0]});\r\n }\r\n\r\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\r\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\r\n\r\n let caption = options.caption || '';\r\n let entities = options.entities || [];\r\n if(caption) {\r\n caption = parseMarkdown(caption, entities);\r\n }\r\n\r\n this.log('sendAlbum', files, options);\r\n\r\n const groupId = '' + ++this.groupedTempId;\r\n\r\n const callbacks: Array<() => void> = [];\r\n const processAfter = (cb: () => void) => {\r\n callbacks.push(cb);\r\n };\r\n\r\n const messages = files.map((file, idx) => {\r\n const details = options.sendFileDetails[idx];\r\n const o: Parameters<AppMessagesManager['sendFile']>[2] = {\r\n isGroupedItem: true,\r\n isMedia: options.isMedia,\r\n scheduleDate: options.scheduleDate,\r\n silent: options.silent,\r\n replyToMsgId,\r\n threadId: options.threadId,\r\n sendAsPeerId: options.sendAsPeerId,\r\n groupId,\r\n processAfter,\r\n ...details\r\n };\r\n\r\n if(idx === 0) {\r\n o.caption = caption;\r\n o.entities = entities;\r\n // o.replyToMsgId = replyToMsgId;\r\n }\r\n\r\n return this.sendFile(peerId, file, o).message;\r\n });\r\n\r\n if(options.clearDraft) {\r\n callbacks.push(() => {\r\n this.appDraftsManager.clearDraft(peerId, options.threadId);\r\n });\r\n }\r\n\r\n callbacks.forEach((callback) => {\r\n callback();\r\n });\r\n\r\n // * test pending\r\n // return;\r\n\r\n const toggleError = (message: Message.message, error?: ApiError) => {\r\n this.onMessagesSendError([message], error);\r\n this.rootScope.dispatchEvent('messages_pending');\r\n };\r\n\r\n const inputPeer = this.appPeersManager.getInputPeerById(peerId);\r\n const invoke = (multiMedia: InputSingleMedia[]) => {\r\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\r\n\r\n const deferred = deferredPromise<void>();\r\n this.sendSmthLazyLoadQueue.push({\r\n load: () => {\r\n return this.apiManager.invokeApi('messages.sendMultiMedia', {\r\n peer: inputPeer,\r\n multi_media: multiMedia,\r\n reply_to_msg_id: replyToMsgId,\r\n schedule_date: options.scheduleDate,\r\n silent: options.silent,\r\n clear_draft: options.clearDraft,\r\n send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined,\r\n update_stickersets_order: UPDATE_STICKERSET_ORDER\r\n }).then((updates) => {\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n deferred.resolve();\r\n }, (error: ApiError) => {\r\n messages.forEach((message) => toggleError(message, error));\r\n deferred.reject(error);\r\n });\r\n }\r\n });\r\n\r\n return deferred;\r\n };\r\n\r\n const promises: Promise<InputSingleMedia>[] = messages.map((message) => {\r\n return (message.send() as Promise<InputMedia>).then((inputMedia) => {\r\n return this.apiManager.invokeApi('messages.uploadMedia', {\r\n peer: inputPeer,\r\n media: inputMedia\r\n });\r\n })\r\n .then((messageMedia) => {\r\n let inputMedia: InputMedia;\r\n if(messageMedia._ === 'messageMediaPhoto') {\r\n const photo = this.appPhotosManager.savePhoto(messageMedia.photo);\r\n inputMedia = getPhotoMediaInput(photo);\r\n } else if(messageMedia._ === 'messageMediaDocument') {\r\n const doc = this.appDocsManager.saveDoc(messageMedia.document);\r\n inputMedia = getDocumentMediaInput(doc);\r\n }\r\n\r\n const inputSingleMedia: InputSingleMedia = {\r\n _: 'inputSingleMedia',\r\n media: inputMedia,\r\n random_id: message.random_id,\r\n message: caption,\r\n entities\r\n };\r\n\r\n // * only 1 caption for all inputs\r\n if(caption) {\r\n caption = '';\r\n entities = [];\r\n }\r\n\r\n return inputSingleMedia;\r\n }).catch((err: ApiError) => {\r\n this.log.error('sendAlbum upload item error:', err, message);\r\n toggleError(message, err);\r\n throw err;\r\n });\r\n });\r\n\r\n return Promise.all(promises).then((inputs) => {\r\n return invoke(inputs.filter(Boolean));\r\n });\r\n }\r\n\r\n public sendContact(peerId: PeerId, contactPeerId: PeerId) {\r\n return this.sendOther(peerId, this.appUsersManager.getContactMediaInput(contactPeerId));\r\n }\r\n\r\n public sendOther(peerId: PeerId, inputMedia: InputMedia | {_: 'messageMediaPending', messageMedia: MessageMedia}, options: Partial<{\r\n replyToMsgId: number,\r\n threadId: number,\r\n viaBotId: BotId,\r\n replyMarkup: ReplyMarkup,\r\n clearDraft: true,\r\n queryId: string\r\n resultId: string,\r\n scheduleDate: number,\r\n silent: true,\r\n geoPoint: GeoPoint,\r\n sendAsPeerId: PeerId,\r\n }> = {}) {\r\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\r\n\r\n // this.checkSendOptions(options);\r\n const message = this.generateOutgoingMessage(peerId, options);\r\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\r\n\r\n let media: MessageMedia;\r\n switch(inputMedia._) {\r\n case 'inputMediaPoll': {\r\n const pollId = '' + message.id;\r\n inputMedia.poll.id = pollId;\r\n this.appPollsManager.savePoll(inputMedia.poll, {\r\n _: 'pollResults',\r\n flags: 4,\r\n total_voters: 0,\r\n pFlags: {},\r\n recent_voters: []\r\n });\r\n\r\n const {poll, results} = this.appPollsManager.getPoll(pollId);\r\n media = {\r\n _: 'messageMediaPoll',\r\n poll,\r\n results\r\n };\r\n\r\n break;\r\n }\r\n\r\n case 'inputMediaPhoto': {\r\n media = {\r\n _: 'messageMediaPhoto',\r\n photo: this.appPhotosManager.getPhoto((inputMedia.id as InputPhoto.inputPhoto).id)\r\n };\r\n break;\r\n }\r\n\r\n case 'inputMediaDocument': {\r\n const doc = this.appDocsManager.getDoc((inputMedia.id as InputDocument.inputDocument).id);\r\n /* if(doc.sticker && doc.stickerSetInput) {\r\n appStickersManager.pushPopularSticker(doc.id);\r\n } */\r\n media = {\r\n _: 'messageMediaDocument',\r\n document: doc\r\n };\r\n break;\r\n }\r\n\r\n case 'inputMediaContact': {\r\n media = {\r\n _: 'messageMediaContact',\r\n phone_number: inputMedia.phone_number,\r\n first_name: inputMedia.first_name,\r\n last_name: inputMedia.last_name,\r\n user_id: inputMedia.user_id ?? '0',\r\n vcard: inputMedia.vcard\r\n };\r\n break;\r\n }\r\n\r\n case 'inputMediaGeoPoint': {\r\n media = {\r\n _: 'messageMediaGeo',\r\n geo: options.geoPoint\r\n };\r\n break;\r\n }\r\n\r\n case 'inputMediaVenue': {\r\n media = {\r\n _: 'messageMediaVenue',\r\n geo: options.geoPoint,\r\n title: inputMedia.title,\r\n address: inputMedia.address,\r\n provider: inputMedia.provider,\r\n venue_id: inputMedia.venue_id,\r\n venue_type: inputMedia.venue_type\r\n };\r\n break;\r\n }\r\n\r\n case 'messageMediaPending': {\r\n media = (inputMedia as any).messageMedia;\r\n break;\r\n }\r\n }\r\n\r\n message.media = media;\r\n\r\n const toggleError = (error?: ApiError) => {\r\n this.onMessagesSendError([message], error);\r\n this.rootScope.dispatchEvent('messages_pending');\r\n };\r\n\r\n message.send = () => {\r\n const sentRequestOptions: PendingAfterMsg = {};\r\n if(this.pendingAfterMsgs[peerId]) {\r\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\r\n }\r\n\r\n const sendAs = options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined;\r\n let apiPromise: Promise<any>;\r\n if(options.viaBotId) {\r\n apiPromise = this.apiManager.invokeApiAfter('messages.sendInlineBotResult', {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n random_id: message.random_id,\r\n reply_to_msg_id: replyToMsgId || undefined,\r\n query_id: options.queryId,\r\n id: options.resultId,\r\n clear_draft: options.clearDraft,\r\n schedule_date: options.scheduleDate,\r\n silent: options.silent,\r\n send_as: sendAs\r\n }, sentRequestOptions);\r\n } else {\r\n apiPromise = this.apiManager.invokeApiAfter('messages.sendMedia', {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n media: inputMedia as InputMedia,\r\n random_id: message.random_id,\r\n reply_to_msg_id: replyToMsgId || undefined,\r\n message: '',\r\n clear_draft: options.clearDraft,\r\n schedule_date: options.scheduleDate,\r\n silent: options.silent,\r\n send_as: sendAs,\r\n update_stickersets_order: UPDATE_STICKERSET_ORDER\r\n }, sentRequestOptions);\r\n }\r\n\r\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\r\n\r\n return apiPromise.then((updates) => {\r\n if(updates.updates) {\r\n updates.updates.forEach((update: Update) => {\r\n if(update._ === 'updateDraftMessage') {\r\n update.local = true;\r\n }\r\n });\r\n }\r\n\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n }, (error: ApiError) => {\r\n toggleError(error);\r\n throw error;\r\n }).finally(() => {\r\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\r\n delete this.pendingAfterMsgs[peerId];\r\n }\r\n });\r\n };\r\n\r\n this.beforeMessageSending(message, {\r\n isScheduled: !!options.scheduleDate || undefined,\r\n threadId: options.threadId,\r\n clearDraft: options.clearDraft,\r\n sequential: true\r\n });\r\n\r\n return message.promise;\r\n }\r\n\r\n /* private checkSendOptions(options: Partial<{\r\n scheduleDate: number\r\n }>) {\r\n if(options.scheduleDate) {\r\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\r\n if(options.scheduleDate <= minTimestamp) {\r\n delete options.scheduleDate;\r\n }\r\n }\r\n } */\r\n\r\n private beforeMessageSending(message: Message.message, options: Partial<{\r\n isGroupedItem: boolean,\r\n isScheduled: boolean,\r\n threadId: number,\r\n clearDraft: boolean,\r\n sequential: boolean,\r\n processAfter?: (cb: () => void) => void\r\n }> = {}) {\r\n const messageId = message.id;\r\n const peerId = this.getMessagePeer(message);\r\n const storage = options.isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getHistoryMessagesStorage(peerId);\r\n message.storageKey = storage.key;\r\n const callbacks: Array<() => void> = [];\r\n if(options.isScheduled) {\r\n // if(!options.isGroupedItem) {\r\n this.saveMessages([message], {storage, isScheduled: true, isOutgoing: true});\r\n callbacks.push(() => {\r\n this.rootScope.dispatchEvent('scheduled_new', message);\r\n });\r\n } else {\r\n /* if(options.threadId && this.threadsStorage[peerId]) {\r\n delete this.threadsStorage[peerId][options.threadId];\r\n } */\r\n const storages: HistoryStorage[] = [\r\n this.getHistoryStorage(peerId),\r\n options.threadId ? this.getHistoryStorage(peerId, options.threadId) : undefined\r\n ];\r\n\r\n for(const storage of storages) {\r\n if(storage) {\r\n storage.history.unshift(messageId);\r\n }\r\n }\r\n\r\n this.saveMessages([message], {storage, isOutgoing: true});\r\n this.setDialogTopMessage(message);\r\n callbacks.push(() => {\r\n this.rootScope.dispatchEvent('history_append', {storageKey: storage.key, message});\r\n });\r\n }\r\n\r\n const pending: PendingMessageDetails = this.pendingByRandomId[message.random_id] = {\r\n peerId,\r\n tempId: messageId,\r\n threadId: options.threadId,\r\n storage,\r\n sequential: options.sequential\r\n };\r\n\r\n this.pendingTopMsgs[peerId] = messageId;\r\n\r\n if(!options.isGroupedItem && message.send) {\r\n callbacks.push(() => {\r\n if(options.clearDraft) {\r\n this.appDraftsManager.clearDraft(peerId, options.threadId);\r\n }\r\n\r\n message.send();\r\n });\r\n }\r\n\r\n if(callbacks.length) {\r\n (options.processAfter || processAfter)(() => {\r\n for(const callback of callbacks) {\r\n callback();\r\n }\r\n });\r\n }\r\n\r\n return pending;\r\n }\r\n\r\n private generateOutgoingMessage(peerId: PeerId, options: Partial<{\r\n scheduleDate: number,\r\n replyToMsgId: number,\r\n sendAsPeerId: PeerId,\r\n threadId: number,\r\n viaBotId: BotId,\r\n groupId: string,\r\n replyMarkup: ReplyMarkup,\r\n }>) {\r\n if(options.threadId && !options.replyToMsgId) {\r\n options.replyToMsgId = options.threadId;\r\n }\r\n\r\n let postAuthor: string;\r\n const isBroadcast = this.appPeersManager.isBroadcast(peerId);\r\n if(isBroadcast) {\r\n const chat = this.appPeersManager.getPeer(peerId) as Chat.channel;\r\n if(chat.pFlags.signatures) {\r\n const user = this.appUsersManager.getSelf();\r\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\r\n postAuthor = fullName;\r\n }\r\n }\r\n\r\n const message: Message.message = {\r\n _: 'message',\r\n id: this.generateTempMessageId(peerId),\r\n from_id: options.sendAsPeerId ? this.appPeersManager.getOutputPeer(options.sendAsPeerId) : this.generateFromId(peerId),\r\n peer_id: this.appPeersManager.getOutputPeer(peerId),\r\n post_author: postAuthor,\r\n pFlags: this.generateFlags(peerId),\r\n date: options.scheduleDate || (tsNow(true) + this.timeManager.getServerTimeOffset()),\r\n message: '',\r\n grouped_id: options.groupId,\r\n random_id: randomLong(),\r\n reply_to: this.generateReplyHeader(options.replyToMsgId, options.threadId),\r\n via_bot_id: options.viaBotId,\r\n reply_markup: options.replyMarkup,\r\n replies: this.generateReplies(peerId),\r\n views: isBroadcast && 1,\r\n pending: true\r\n };\r\n\r\n defineNotNumerableProperties(message, ['send', 'promise']);\r\n if(options.groupId === undefined) {\r\n message.promise = deferredPromise();\r\n }\r\n\r\n return message;\r\n }\r\n\r\n private generateReplyHeader(replyToMsgId: number, replyToTopId?: number) {\r\n const header = {\r\n _: 'messageReplyHeader',\r\n reply_to_msg_id: replyToMsgId || replyToTopId\r\n } as MessageReplyHeader;\r\n\r\n if(replyToTopId && header.reply_to_msg_id !== replyToTopId) {\r\n header.reply_to_top_id = replyToTopId;\r\n }\r\n\r\n return header;\r\n }\r\n\r\n private generateReplies(peerId: PeerId) {\r\n let replies: MessageReplies.messageReplies;\r\n if(this.appPeersManager.isBroadcast(peerId)) {\r\n const channelFull = this.appProfileManager.getCachedFullChat(peerId.toChatId()) as ChatFull.channelFull;\r\n if(channelFull?.linked_chat_id) {\r\n replies = {\r\n _: 'messageReplies',\r\n flags: 1,\r\n pFlags: {\r\n comments: true\r\n },\r\n channel_id: channelFull.linked_chat_id,\r\n replies: 0,\r\n replies_pts: 0\r\n };\r\n }\r\n }\r\n\r\n return replies;\r\n }\r\n\r\n /**\r\n * Generate correct from_id according to anonymous or broadcast\r\n */\r\n private generateFromId(peerId: PeerId) {\r\n if(this.appPeersManager.isAnyChat(peerId) && (this.appPeersManager.isBroadcast(peerId) || this.isAnonymousSending(peerId))) {\r\n return undefined;\r\n } else {\r\n return this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId());\r\n }\r\n }\r\n\r\n private generateFlags(peerId: PeerId) {\r\n const pFlags: Message.message['pFlags'] = {};\r\n const fromId = this.appUsersManager.getSelf().id;\r\n if(peerId !== fromId) {\r\n pFlags.out = true;\r\n\r\n if(!this.appPeersManager.isChannel(peerId) && !this.appUsersManager.isBot(peerId)) {\r\n pFlags.unread = true;\r\n }\r\n }\r\n\r\n if(this.appPeersManager.isBroadcast(peerId)) {\r\n pFlags.post = true;\r\n }\r\n\r\n return pFlags;\r\n }\r\n\r\n private generateForwardHeader(peerId: PeerId, originalMessage: Message.message) {\r\n const myId = this.appUsersManager.getSelf().id.toPeerId();\r\n const fromId = originalMessage.fromId;\r\n if(fromId === myId && originalMessage.peerId === myId && !originalMessage.fwd_from) {\r\n return;\r\n }\r\n\r\n const fwdHeader: MessageFwdHeader.messageFwdHeader = {\r\n _: 'messageFwdHeader',\r\n flags: 0,\r\n date: originalMessage.date\r\n };\r\n\r\n let isUserHidden = false;\r\n if(originalMessage.fwd_from) {\r\n fwdHeader.from_id = originalMessage.fwd_from.from_id;\r\n fwdHeader.from_name = originalMessage.fwd_from.from_name;\r\n fwdHeader.post_author = originalMessage.fwd_from.post_author;\r\n } else {\r\n fwdHeader.post_author = originalMessage.post_author;\r\n\r\n if(fromId.isUser()) {\r\n const userFull = this.appProfileManager.getCachedFullUser(fromId.toUserId());\r\n if(userFull?.private_forward_name) {\r\n fwdHeader.from_name = userFull.private_forward_name;\r\n isUserHidden = true;\r\n }\r\n }\r\n\r\n if(!isUserHidden) {\r\n fwdHeader.from_id = this.appPeersManager.getOutputPeer(fromId);\r\n }\r\n }\r\n\r\n if(this.appPeersManager.isBroadcast(originalMessage.peerId)) {\r\n if(originalMessage.post_author) {\r\n fwdHeader.post_author = originalMessage.post_author;\r\n }\r\n\r\n fwdHeader.channel_post = originalMessage.id;\r\n }\r\n\r\n if(peerId === myId && !isUserHidden) {\r\n fwdHeader.saved_from_msg_id = originalMessage.id;\r\n fwdHeader.saved_from_peer = this.appPeersManager.getOutputPeer(originalMessage.peerId);\r\n }\r\n\r\n return fwdHeader;\r\n }\r\n\r\n public generateFakeAvatarMessage(peerId: PeerId, photo: Photo) {\r\n const maxId = Number.MAX_SAFE_INTEGER;\r\n const message: Message.messageService = {\r\n _: 'messageService',\r\n pFlags: {},\r\n action: {\r\n _: 'messageActionChannelEditPhoto',\r\n photo\r\n },\r\n id: maxId,\r\n peer_id: this.appPeersManager.getOutputPeer(peerId),\r\n mid: maxId,\r\n peerId,\r\n date: (photo as Photo.photo).date,\r\n fromId: peerId\r\n };\r\n\r\n this.getHistoryMessagesStorage(peerId).set(maxId, message);\r\n return message;\r\n }\r\n\r\n public getUploadPromise(uploadFileName: string) {\r\n return this.uploadFilePromises[uploadFileName];\r\n }\r\n\r\n public isAnonymousSending(peerId: PeerId): boolean {\r\n return peerId.isAnyChat() && this.appPeersManager.getPeer(peerId).admin_rights?.pFlags?.anonymous;\r\n }\r\n\r\n public setDialogTopMessage(message: MyMessage, dialog: MTDialog.dialog = this.getDialogOnly(message.peerId)) {\r\n if(dialog) {\r\n dialog.top_message = message.mid;\r\n\r\n const historyStorage = this.getHistoryStorage(message.peerId);\r\n historyStorage.maxId = message.mid;\r\n\r\n this.dialogsStorage.generateIndexForDialog(dialog, false, message);\r\n\r\n this.scheduleHandleNewDialogs(message.peerId, dialog);\r\n }\r\n }\r\n\r\n public cancelPendingMessage(randomId: string) {\r\n const pendingData = this.pendingByRandomId[randomId];\r\n\r\n /* if(DEBUG) {\r\n this.log('cancelPendingMessage', randomId, pendingData);\r\n } */\r\n\r\n if(pendingData) {\r\n const {peerId, tempId, storage} = pendingData;\r\n const historyStorage = this.getHistoryStorage(peerId);\r\n\r\n this.apiUpdatesManager.processLocalUpdate({\r\n _: 'updateDeleteMessages',\r\n messages: [tempId],\r\n pts: undefined,\r\n pts_count: undefined\r\n });\r\n\r\n historyStorage.history.delete(tempId);\r\n\r\n delete this.pendingByRandomId[randomId];\r\n storage.delete(tempId);\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /* public async refreshConversations() {\r\n const limit = 200, outDialogs: Dialog[] = [];\r\n for(let folderId = 0; folderId < 2; ++folderId) {\r\n let offsetDate = 0;\r\n for(;;) {\r\n const {dialogs, isEnd} = await this.getTopMessages(limit, folderId, offsetDate);\r\n\r\n if(dialogs.length) {\r\n outDialogs.push(...dialogs as Dialog[]);\r\n const dialog = dialogs[dialogs.length - 1];\r\n\r\n // * get peerId and mid manually, because dialog can be migrated peer and it won't be saved\r\n const peerId = getPeerId(dialog.peer);\r\n const mid = generateMessageId(dialog.top_message);\r\n offsetDate = this.getMessageByPeer(peerId, mid).date;\r\n\r\n if(!offsetDate) {\r\n console.error('refreshConversations: got no offsetDate', dialog);\r\n break;\r\n }\r\n }\r\n\r\n if(isEnd) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n let obj: {[peerId: string]: Dialog} = {};\r\n outDialogs.forEach((dialog) => {\r\n obj[dialog.peerId] = dialog;\r\n });\r\n rootScope.dispatchEvent('dialogs_multiupdate', obj);\r\n\r\n return outDialogs;\r\n } */\r\n\r\n public async fillConversations(): Promise<void> {\r\n const middleware = this.middleware.get();\r\n while(!this.dialogsStorage.isDialogsLoaded(GLOBAL_FOLDER_ID)) {\r\n const result = await this.getTopMessages(100, GLOBAL_FOLDER_ID);\r\n if(!middleware() || result.isEnd) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /* public async getConversationsAll(query = '', folderId = 0) {\r\n const limit = 200, outDialogs: Dialog[] = [];\r\n for(; folderId < 2; ++folderId) {\r\n let offsetIndex = 0;\r\n for(;;) {\r\n const {dialogs} = await appMessagesManager.getConversations(query, offsetIndex, limit, folderId).promise;\r\n\r\n if(dialogs.length) {\r\n outDialogs.push(...dialogs);\r\n offsetIndex = dialogs[dialogs.length - 1].index || 0;\r\n } else {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return outDialogs;\r\n } */\r\n\r\n public getConversations(query = '', offsetIndex?: number, limit?: number, folderId = 0, skipMigrated?: boolean) {\r\n return this.dialogsStorage.getDialogs(query, offsetIndex, limit, folderId, skipMigrated);\r\n }\r\n\r\n public getReadMaxIdIfUnread(peerId: PeerId, threadId?: number) {\r\n const historyStorage = this.getHistoryStorage(peerId, threadId);\r\n if(threadId) {\r\n const chatHistoryStorage = this.getHistoryStorage(peerId);\r\n const readMaxId = Math.max(chatHistoryStorage.readMaxId ?? 0, historyStorage.readMaxId);\r\n const message = this.getMessageByPeer(peerId, historyStorage.maxId); // usually message is missing, so pFlags.out won't be there anyway\r\n return !message?.pFlags?.out && readMaxId < historyStorage.maxId ? readMaxId : 0;\r\n } else {\r\n const message = this.getMessageByPeer(peerId, historyStorage.maxId);\r\n const readMaxId = peerId.isUser() ? Math.max(historyStorage.readMaxId, historyStorage.readOutboxMaxId) : historyStorage.readMaxId;\r\n return !message?.pFlags?.out && readMaxId < historyStorage.maxId ? readMaxId : 0;\r\n }\r\n }\r\n\r\n // public lolSet = new Set();\r\n public getTopMessages(limit: number, folderId: REAL_FOLDER_ID, offsetDate?: number) {\r\n // const dialogs = this.dialogsStorage.getFolder(folderId);\r\n const offsetId = 0;\r\n let offsetPeerId: PeerId;\r\n let offsetIndex = 0;\r\n\r\n if(offsetDate === undefined) {\r\n offsetDate = this.dialogsStorage.getOffsetDate(folderId);\r\n }\r\n\r\n if(offsetDate) {\r\n offsetIndex = offsetDate * 0x10000;\r\n offsetDate += this.timeManager.getServerTimeOffset();\r\n }\r\n\r\n const useLimit = 100;\r\n const middleware = this.middleware.get();\r\n\r\n // ! ВНИМАНИЕ: ОЧЕНЬ СЛОЖНАЯ ЛОГИКА:\r\n // ! если делать запрос сначала по папке 0, потом по папке 1, по индексу 0 в массиве будет один и тот же диалог, с dialog.pFlags.pinned, ЛОЛ???\r\n // ! т.е., с запросом folder_id: 1, и exclude_pinned: 0, в результате будут ещё и закреплённые с папки 0\r\n const params: MessagesGetDialogs = {\r\n folder_id: folderId,\r\n offset_date: offsetDate,\r\n offset_id: offsetId,\r\n offset_peer: this.appPeersManager.getInputPeerById(offsetPeerId),\r\n limit: useLimit,\r\n hash: '0'\r\n };\r\n\r\n return this.apiManager.invokeApiSingle('messages.getDialogs', params, {\r\n // timeout: APITIMEOUT,\r\n noErrorBox: true\r\n }).then((dialogsResult) => {\r\n if(!middleware() || dialogsResult._ === 'messages.dialogsNotModified') return null;\r\n\r\n if(DEBUG) {\r\n this.log('messages.getDialogs result:', dialogsResult.dialogs, {...dialogsResult.dialogs[0]});\r\n }\r\n\r\n // can reset pinned order here\r\n if(!offsetId && !offsetDate && !offsetPeerId && folderId !== GLOBAL_FOLDER_ID) {\r\n this.dialogsStorage.resetPinnedOrder(folderId);\r\n }\r\n\r\n if(!offsetDate) {\r\n // telegramMeWebManager.setAuthorized(true);\r\n this.appDraftsManager.addMissedDialogs();\r\n }\r\n\r\n this.appUsersManager.saveApiUsers(dialogsResult.users);\r\n this.appChatsManager.saveApiChats(dialogsResult.chats);\r\n this.saveMessages(dialogsResult.messages);\r\n\r\n let maxSeenIdIncremented = offsetDate ? true : false;\r\n let hasPrepend = false;\r\n const noIdsDialogs: Map<PeerId, Dialog> = new Map();\r\n const setFolderId: REAL_FOLDER_ID = folderId === GLOBAL_FOLDER_ID ? FOLDER_ID_ALL : folderId;\r\n const saveGlobalOffset = folderId === GLOBAL_FOLDER_ID;\r\n forEachReverse((dialogsResult.dialogs as Dialog[]), (dialog) => {\r\n // const d = Object.assign({}, dialog);\r\n // ! нужно передавать folderId, так как по папке !== 0 нет свойства folder_id\r\n if(dialog.folder_id === undefined) {\r\n dialog.folder_id = setFolderId;\r\n }\r\n\r\n this.dialogsStorage.saveDialog(dialog, undefined, true, saveGlobalOffset);\r\n\r\n if(!maxSeenIdIncremented &&\r\n !this.appPeersManager.isChannel(dialog.peerId || this.appPeersManager.getPeerId(dialog.peer))) {\r\n this.incrementMaxSeenId(dialog.top_message);\r\n maxSeenIdIncremented = true;\r\n }\r\n\r\n if(dialog.peerId === undefined) {\r\n return;\r\n }\r\n\r\n // if(!folderId && !dialog.folder_id) {\r\n // this.lolSet.add(dialog.peerId);\r\n // }\r\n\r\n if(offsetIndex && getDialogIndex(dialog) > offsetIndex) {\r\n this.scheduleHandleNewDialogs(dialog.peerId, dialog);\r\n hasPrepend = true;\r\n }\r\n\r\n // ! это может случиться, если запрос идёт не по папке 0, а по 1. почему-то read'ов нет\r\n // ! в итоге, чтобы получить 1 диалог, делается первый запрос по папке 0, потом запрос для архивных по папке 1, и потом ещё перезагрузка архивного диалога\r\n if(!getServerMessageId(dialog.read_inbox_max_id) && !getServerMessageId(dialog.read_outbox_max_id)) {\r\n noIdsDialogs.set(dialog.peerId, dialog);\r\n\r\n this.log.error('noIdsDialogs', dialog, params);\r\n }\r\n });\r\n\r\n if(noIdsDialogs.size) {\r\n // setTimeout(() => { // test bad situation\r\n const peerIds = [...noIdsDialogs.keys()];\r\n const promises = peerIds.map((peerId) => this.reloadConversation(peerId));\r\n Promise.all(promises).then(() => {\r\n this.rootScope.dispatchEvent('dialogs_multiupdate', noIdsDialogs);\r\n\r\n for(let i = 0; i < peerIds.length; ++i) {\r\n const peerId = peerIds[i];\r\n this.rootScope.dispatchEvent('dialog_unread', {\r\n peerId,\r\n dialog: this.getDialogOnly(peerId)\r\n });\r\n }\r\n });\r\n // }, 10e3);\r\n }\r\n\r\n const count = (dialogsResult as MessagesDialogs.messagesDialogsSlice).count;\r\n\r\n // exclude empty draft dialogs\r\n const folderDialogs = this.dialogsStorage.getFolderDialogs(folderId, false);\r\n let dialogsLength = 0;\r\n for(let i = 0, length = folderDialogs.length; i < length; ++i) {\r\n if(getServerMessageId(folderDialogs[i].top_message)) {\r\n ++dialogsLength;\r\n }\r\n }\r\n\r\n const isEnd = /* limit > dialogsResult.dialogs.length || */\r\n !count ||\r\n dialogsLength >= count ||\r\n !dialogsResult.dialogs.length;\r\n if(isEnd) {\r\n this.dialogsStorage.setDialogsLoaded(folderId, true);\r\n }\r\n\r\n if(hasPrepend) {\r\n this.scheduleHandleNewDialogs();\r\n } else {\r\n this.rootScope.dispatchEvent('dialogs_multiupdate', new Map());\r\n }\r\n\r\n const dialogs = (dialogsResult as MessagesDialogs.messagesDialogsSlice).dialogs;\r\n const slicedDialogs = limit === useLimit ? dialogs : dialogs.slice(0, limit);\r\n return {\r\n isEnd: isEnd && slicedDialogs[slicedDialogs.length - 1] === dialogs[dialogs.length - 1],\r\n count,\r\n dialogs: slicedDialogs\r\n };\r\n });\r\n }\r\n\r\n public async forwardMessages(peerId: PeerId, fromPeerId: PeerId, mids: number[], options: Partial<{\r\n withMyScore: true,\r\n silent: true,\r\n scheduleDate: number,\r\n dropAuthor: boolean,\r\n dropCaptions: boolean,\r\n sendAsPeerId: PeerId,\r\n replyToMsgId?: number, // will be ignored\r\n threadId?: number // will be ignored\r\n }> = {}) {\r\n delete options.replyToMsgId;\r\n delete options.threadId;\r\n\r\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\r\n mids = mids.slice().sort((a, b) => a - b);\r\n\r\n for(let i = 0, length = mids.length; i < length; ++i) {\r\n const mid = mids[i];\r\n const originalMessage = this.getMessageByPeer(fromPeerId, mid) as Message.message;\r\n if(originalMessage.pFlags.is_outgoing) { // this can happen when forwarding a changelog\r\n this.sendText(peerId, originalMessage.message, {\r\n entities: originalMessage.entities,\r\n scheduleDate: options.scheduleDate,\r\n silent: options.silent\r\n });\r\n\r\n mids.splice(i--, 1);\r\n --length;\r\n }\r\n }\r\n\r\n if(!mids.length) {\r\n return Promise.resolve();\r\n }\r\n\r\n const config = await this.apiManager.getConfig();\r\n const overflowMids = mids.splice(config.forwarded_count_max, mids.length - config.forwarded_count_max);\r\n\r\n if(options.dropCaptions) {\r\n options.dropAuthor = true;\r\n }\r\n\r\n const groups: {\r\n [groupId: string]: {\r\n tempId: string,\r\n messages: Message.message[]\r\n }\r\n } = {};\r\n\r\n const newMids: number[] = [];\r\n const newMessages = mids.map((mid) => {\r\n const originalMessage = this.getMessageByPeer(fromPeerId, mid) as Message.message;\r\n const message: Message.message = this.generateOutgoingMessage(peerId, options);\r\n newMids.push(message.id);\r\n\r\n const keys: Array<keyof Message.message> = [\r\n 'entities',\r\n 'media'\r\n // 'reply_markup'\r\n ];\r\n\r\n if(!options.dropAuthor) {\r\n message.fwd_from = this.generateForwardHeader(peerId, originalMessage);\r\n keys.push('views', 'forwards');\r\n\r\n if(message.fwd_from?.from_name && peerId === this.appPeersManager.peerId) {\r\n delete message.from_id;\r\n }\r\n }\r\n\r\n if(!options.dropCaptions || !originalMessage.media) {\r\n keys.push('message');\r\n }\r\n\r\n const replyToMid = originalMessage.reply_to?.reply_to_msg_id;\r\n const replyToMessageIdx = mids.indexOf(replyToMid);\r\n if(replyToMid && replyToMessageIdx !== -1) {\r\n const newReplyToMid = newMids[replyToMessageIdx];\r\n message.reply_to = {\r\n _: 'messageReplyHeader',\r\n reply_to_msg_id: newReplyToMid\r\n };\r\n\r\n /* this.invokeAfterMessageIsSent(newReplyToMid, 'reply', async(originalMessage) => {\r\n message.reply_to.reply_to_msg_id = originalMessage.mid;\r\n }); */\r\n }\r\n\r\n keys.forEach((key) => {\r\n // @ts-ignore\r\n message[key] = copy(originalMessage[key]);\r\n });\r\n\r\n const document = (message.media as MessageMedia.messageMediaDocument)?.document as MyDocument;\r\n if(document) {\r\n const types: MyDocument['type'][] = ['round', 'voice'];\r\n if(types.includes(document.type)) {\r\n (message as MyMessage).pFlags.media_unread = true;\r\n }\r\n\r\n if(document.sticker && !this.rootScope.premium) {\r\n const effectThumb = getStickerEffectThumb(document);\r\n if(effectThumb) {\r\n (message.media as MessageMedia.messageMediaDocument).pFlags.nopremium = true;\r\n }\r\n }\r\n }\r\n\r\n if(originalMessage.grouped_id) {\r\n const group = groups[originalMessage.grouped_id] ?? (groups[originalMessage.grouped_id] = {tempId: '' + ++this.groupedTempId, messages: []});\r\n group.messages.push(message);\r\n }\r\n\r\n return message;\r\n });\r\n\r\n for(const groupId in groups) {\r\n const group = groups[groupId];\r\n if(group.messages.length > 1) {\r\n group.messages.forEach((message) => {\r\n message.grouped_id = group.tempId;\r\n });\r\n }\r\n }\r\n\r\n newMessages.forEach((message) => {\r\n this.beforeMessageSending(message, {\r\n isScheduled: !!options.scheduleDate || undefined,\r\n sequential: true\r\n });\r\n });\r\n\r\n const sentRequestOptions: PendingAfterMsg = {};\r\n if(this.pendingAfterMsgs[peerId]) {\r\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\r\n }\r\n\r\n const promise = /* true ? Promise.resolve() : */this.apiManager.invokeApiAfter('messages.forwardMessages', {\r\n from_peer: this.appPeersManager.getInputPeerById(fromPeerId),\r\n id: mids.map((mid) => getServerMessageId(mid)),\r\n random_id: newMessages.map((message) => message.random_id),\r\n to_peer: this.appPeersManager.getInputPeerById(peerId),\r\n with_my_score: options.withMyScore,\r\n silent: options.silent,\r\n schedule_date: options.scheduleDate,\r\n drop_author: options.dropAuthor,\r\n drop_media_captions: options.dropCaptions,\r\n send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\r\n }, sentRequestOptions).then((updates) => {\r\n this.log('forwardMessages updates:', updates);\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n }, (error: ApiError) => {\r\n this.onMessagesSendError(newMessages, error);\r\n throw error;\r\n }).finally(() => {\r\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\r\n delete this.pendingAfterMsgs[peerId];\r\n }\r\n });\r\n\r\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\r\n\r\n const promises: (typeof promise)[] = [promise];\r\n if(overflowMids.length) {\r\n promises.push(this.forwardMessages(peerId, fromPeerId, overflowMids, options));\r\n }\r\n\r\n return Promise.all(promises).then(noop);\r\n }\r\n\r\n public generateEmptyMessage(mid: number): Message.message | Message.messageService {\r\n return undefined;\r\n // return {\r\n // _: 'messageEmpty',\r\n // id: getServerMessageId(mid),\r\n // mid,\r\n // deleted: true,\r\n // pFlags: {}\r\n // };\r\n }\r\n\r\n private onMessagesSendError(messages: Message.message[], error?: ApiError) {\r\n messages.forEach((message) => {\r\n if(message.error === error) {\r\n return;\r\n }\r\n\r\n if(error) {\r\n message.error = error;\r\n this.rootScope.dispatchEvent('message_error', {storageKey: message.storageKey, tempId: message.mid, error});\r\n\r\n const dialog = this.getDialogOnly(message.peerId);\r\n if(dialog) {\r\n this.rootScope.dispatchEvent('dialog_unread', {peerId: message.peerId, dialog});\r\n }\r\n } else {\r\n delete message.error;\r\n }\r\n });\r\n }\r\n\r\n public getMessagesStorageByKey(key: MessagesStorageKey) {\r\n const s = key.split('_');\r\n const peerId: PeerId = +s[0];\r\n const type: MessagesStorageType = s[1] as any;\r\n return type === 'scheduled' ? this.getScheduledMessagesStorage(peerId) : this.getHistoryMessagesStorage(peerId);\r\n }\r\n\r\n public getMessageFromStorage(storage: MessagesStorage | MessagesStorageKey, mid: number) {\r\n if(typeof(storage) === 'string') {\r\n storage = this.getMessagesStorageByKey(storage);\r\n }\r\n\r\n return storage && storage.get(mid)/* || this.generateEmptyMessage(mid) */;\r\n }\r\n\r\n private createMessageStorage(peerId: PeerId, type: MessagesStorageType) {\r\n const storage: MessagesStorage = new Map() as any;\r\n storage.peerId = peerId;\r\n storage.type = type;\r\n storage.key = `${peerId}_${type}`;\r\n\r\n /* let num = 0;\r\n Object.defineProperty(storage, 'num', {\r\n get: () => ++num,\r\n set: (_num: number) => num = _num,\r\n enumerable: false\r\n });\r\n\r\n Object.defineProperty(storage, 'generateIndex', {\r\n value: (message: any) => {\r\n if(message.index === undefined) {\r\n message.index = (message.date * 0x10000) + (storage.num & 0xFFFF);\r\n }\r\n },\r\n enumerable: false\r\n }); */\r\n\r\n return storage;\r\n }\r\n\r\n public getHistoryMessagesStorage(peerId: PeerId) {\r\n return this.messagesStorageByPeerId[peerId] ?? (this.messagesStorageByPeerId[peerId] = this.createMessageStorage(peerId, 'history'));\r\n }\r\n\r\n public getMessagesStorage(key: MessagesStorageKey | MessagesStorage): MessagesStorage {\r\n if(typeof(key) === 'object') {\r\n return key;\r\n } else {\r\n return this.getMessagesStorageByKey(key);\r\n }\r\n }\r\n\r\n public getMessageById(messageId: number) {\r\n for(const peerId in this.messagesStorageByPeerId) {\r\n if(this.appPeersManager.isChannel(peerId.toPeerId())) {\r\n continue;\r\n }\r\n\r\n const message = this.messagesStorageByPeerId[peerId].get(messageId);\r\n if(message) {\r\n return message;\r\n }\r\n }\r\n\r\n return this.getMessageFromStorage(null, messageId);\r\n }\r\n\r\n public getMessageByPeer(peerId: PeerId, messageId: number) {\r\n if(!peerId) {\r\n return this.getMessageById(messageId);\r\n }\r\n\r\n return this.getMessageFromStorage(this.getHistoryMessagesStorage(peerId), messageId);\r\n }\r\n\r\n public getMessagePeer(message: any): PeerId {\r\n const toId = message.peer_id && this.appPeersManager.getPeerId(message.peer_id) || NULL_PEER_ID;\r\n\r\n return toId;\r\n }\r\n\r\n public getDialogByPeerId(peerId: PeerId): [Dialog, number] | [] {\r\n return this.dialogsStorage.getDialog(peerId);\r\n }\r\n\r\n public getDialogOnly(peerId: PeerId) {\r\n return this.dialogsStorage.getDialogOnly(peerId);\r\n }\r\n\r\n public cantForwardDeleteMids(storageKey: MessagesStorageKey, mids: number[]) {\r\n const storage = this.getMessagesStorage(storageKey);\r\n let cantForward = !mids.length, cantDelete = !mids.length;\r\n for(const mid of mids) {\r\n const message = this.getMessageFromStorage(storage, mid);\r\n if(!cantForward) {\r\n cantForward = !this.canForward(message);\r\n }\r\n\r\n if(!cantDelete) {\r\n cantDelete = !this.canDeleteMessage(message);\r\n }\r\n\r\n if(cantForward && cantDelete) break;\r\n }\r\n\r\n return {cantForward, cantDelete};\r\n }\r\n\r\n public reloadConversation(inputPeer?: PeerId | InputPeer): CancellablePromise<Dialog>;\r\n public reloadConversation(inputPeer: PeerId | InputPeer) {\r\n let promise: CancellablePromise<Dialog>;\r\n if(inputPeer !== undefined) {\r\n const peerId = this.appPeersManager.getPeerId(inputPeer);\r\n let obj = this.reloadConversationsPeers.get(peerId);\r\n if(obj) {\r\n promise = obj.promise;\r\n }\r\n\r\n if(promise) {\r\n return promise;\r\n }\r\n\r\n promise = deferredPromise();\r\n this.reloadConversationsPeers.set(peerId, obj = {\r\n inputDialogPeer: this.appPeersManager.getInputDialogPeerById(inputPeer),\r\n promise\r\n });\r\n }\r\n\r\n if(this.reloadConversationsPromise) {\r\n return promise || this.reloadConversationsPromise;\r\n }\r\n\r\n this.reloadConversationsPromise = pause(0).then(() => {\r\n const inputDialogPeers: InputDialogPeer[] = [];\r\n const promises: {[peerId: string]: typeof promise} = {};\r\n for(const [peerId, {inputDialogPeer, promise}] of this.reloadConversationsPeers) {\r\n inputDialogPeers.push(inputDialogPeer);\r\n promises[peerId] = promise;\r\n }\r\n\r\n this.reloadConversationsPeers.clear();\r\n\r\n const fullfillLeft = () => {\r\n for(const peerId in promises) {\r\n promises[peerId].resolve(undefined);\r\n }\r\n };\r\n\r\n return this.apiManager.invokeApi('messages.getPeerDialogs', {peers: inputDialogPeers}).then((result) => {\r\n this.dialogsStorage.applyDialogs(result);\r\n\r\n result.dialogs.forEach((dialog) => {\r\n const peerId = dialog.peerId;\r\n if(peerId) {\r\n promises[peerId].resolve(dialog as Dialog);\r\n delete promises[peerId];\r\n }\r\n });\r\n\r\n // fullfillLeft();\r\n // resolve();\r\n }, (err) => {\r\n // fullfillLeft();\r\n // resolve();\r\n // reject(err);\r\n }).then(() => {\r\n fullfillLeft();\r\n\r\n this.reloadConversationsPromise = null;\r\n if(this.reloadConversationsPeers.size) {\r\n this.reloadConversation();\r\n }\r\n });\r\n });\r\n\r\n return promise || this.reloadConversationsPromise;\r\n }\r\n\r\n private doFlushHistory(peer: InputPeer, just_clear?: boolean, revoke?: boolean): Promise<true> {\r\n return this.apiManager.invokeApiSingle('messages.deleteHistory', {\r\n just_clear,\r\n revoke,\r\n peer,\r\n max_id: 0\r\n }).then((affectedHistory) => {\r\n this.apiUpdatesManager.processUpdateMessage({\r\n _: 'updateShort',\r\n update: {\r\n _: 'updatePts',\r\n pts: affectedHistory.pts,\r\n pts_count: affectedHistory.pts_count\r\n }\r\n });\r\n\r\n if(!affectedHistory.offset) {\r\n return true;\r\n }\r\n\r\n return this.doFlushHistory(peer, just_clear, revoke);\r\n });\r\n }\r\n\r\n public async flushHistory(peerId: PeerId, justClear?: boolean, revoke?: boolean) {\r\n if(this.appPeersManager.isChannel(peerId)) {\r\n const promise = this.getHistory(peerId, 0, 1);\r\n\r\n const historyResult = await promise;\r\n\r\n const channelId = peerId.toChatId();\r\n const maxId = historyResult.history[0] || 0;\r\n return this.apiManager.invokeApiSingle('channels.deleteHistory', {\r\n channel: this.appChatsManager.getChannelInput(channelId),\r\n max_id: getServerMessageId(maxId)\r\n }).then((bool) => {\r\n if(bool) {\r\n this.apiUpdatesManager.processLocalUpdate({\r\n _: 'updateChannelAvailableMessages',\r\n channel_id: channelId,\r\n available_min_id: maxId\r\n });\r\n }\r\n\r\n return bool;\r\n });\r\n }\r\n\r\n return this.doFlushHistory(this.appPeersManager.getInputPeerById(peerId), justClear, revoke).then(() => {\r\n this.flushStoragesByPeerId(peerId);\r\n\r\n if(justClear) {\r\n this.rootScope.dispatchEvent('dialog_flush', {peerId, dialog: this.getDialogOnly(peerId)});\r\n } else {\r\n delete this.notificationsToHandle[peerId];\r\n delete this.typings[peerId];\r\n\r\n const c = this.reloadConversationsPeers.get(peerId);\r\n if(c) {\r\n this.reloadConversationsPeers.delete(peerId);\r\n c.promise.resolve(undefined);\r\n }\r\n\r\n this.dialogsStorage.dropDialogOnDeletion(peerId);\r\n }\r\n });\r\n }\r\n\r\n private flushStoragesByPeerId(peerId: PeerId) {\r\n [\r\n this.historiesStorage,\r\n this.threadsStorage,\r\n this.searchesStorage,\r\n this.pinnedMessages,\r\n this.pendingAfterMsgs,\r\n this.pendingTopMsgs\r\n ].forEach((s) => {\r\n delete s[peerId];\r\n });\r\n\r\n const needSingleMessages = this.needSingleMessages.get(peerId);\r\n if(needSingleMessages) {\r\n for(const [mid, promise] of needSingleMessages) {\r\n promise.resolve(this.generateEmptyMessage(mid));\r\n }\r\n\r\n needSingleMessages.clear();\r\n }\r\n\r\n [\r\n this.messagesStorageByPeerId,\r\n this.scheduledMessagesStorage\r\n ].forEach((s) => {\r\n const ss = s[peerId];\r\n if(ss) {\r\n ss.clear();\r\n }\r\n });\r\n }\r\n\r\n public hidePinnedMessages(peerId: PeerId) {\r\n return Promise.all([\r\n this.appStateManager.getState(),\r\n this.getPinnedMessage(peerId)\r\n ])\r\n .then(([state, pinned]) => {\r\n state.hiddenPinnedMessages[peerId] = pinned.maxId;\r\n this.rootScope.dispatchEvent('peer_pinned_hidden', {peerId, maxId: pinned.maxId});\r\n });\r\n }\r\n\r\n public getPinnedMessage(peerId: PeerId) {\r\n const p = this.pinnedMessages[peerId] ?? (this.pinnedMessages[peerId] = {});\r\n if(p.promise) return p.promise;\r\n else if(p.maxId) return Promise.resolve(p);\r\n\r\n return p.promise = this.getSearch({\r\n peerId,\r\n inputFilter: {_: 'inputMessagesFilterPinned'},\r\n maxId: 0,\r\n limit: 1\r\n }).then((result) => {\r\n p.count = result.count;\r\n p.maxId = result.history[0]?.mid;\r\n return p;\r\n }).finally(() => {\r\n delete p.promise;\r\n });\r\n }\r\n\r\n public getPinnedMessagesCount(peerId: PeerId) {\r\n return this.pinnedMessages[peerId]?.count;\r\n }\r\n\r\n public getPinnedMessagesMaxId(peerId: PeerId) {\r\n return this.pinnedMessages[peerId]?.maxId;\r\n }\r\n\r\n public updatePinnedMessage(peerId: PeerId, mid: number, unpin?: boolean, silent?: boolean, pm_oneside?: boolean) {\r\n return this.apiManager.invokeApi('messages.updatePinnedMessage', {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n unpin,\r\n silent,\r\n pm_oneside,\r\n id: getServerMessageId(mid)\r\n }).then((updates) => {\r\n // this.log('pinned updates:', updates);\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n public unpinAllMessages(peerId: PeerId): Promise<boolean> {\r\n return this.apiManager.invokeApiSingle('messages.unpinAllMessages', {\r\n peer: this.appPeersManager.getInputPeerById(peerId)\r\n }).then((affectedHistory) => {\r\n this.apiUpdatesManager.processUpdateMessage({\r\n _: 'updateShort',\r\n update: {\r\n _: 'updatePts',\r\n pts: affectedHistory.pts,\r\n pts_count: affectedHistory.pts_count\r\n }\r\n });\r\n\r\n if(!affectedHistory.offset) {\r\n const storage = this.getHistoryMessagesStorage(peerId);\r\n storage.forEach((message) => {\r\n if((message as Message.message).pFlags.pinned) {\r\n delete (message as Message.message).pFlags.pinned;\r\n }\r\n });\r\n\r\n this.rootScope.dispatchEvent('peer_pinned_messages', {peerId, unpinAll: true});\r\n delete this.pinnedMessages[peerId];\r\n\r\n return true;\r\n }\r\n\r\n return this.unpinAllMessages(peerId);\r\n });\r\n }\r\n\r\n public getAlbumText(grouped_id: string) {\r\n const group = this.groupedMessagesStorage[grouped_id];\r\n return getAlbumText(Array.from(group.values()) as Message.message[]);\r\n }\r\n\r\n public getGroupsFirstMessage(message: Message.message) {\r\n if(!message?.grouped_id) return message;\r\n\r\n const storage = this.groupedMessagesStorage[message.grouped_id];\r\n let minMid = Number.MAX_SAFE_INTEGER;\r\n for(const [mid, message] of storage) {\r\n if(message.mid < minMid) {\r\n minMid = message.mid;\r\n }\r\n }\r\n\r\n return this.getMessageFromStorage(storage, minMid) as Message.message;\r\n }\r\n\r\n public getMidsByAlbum(groupedId: string, sort: 'asc' | 'desc' = 'asc') {\r\n return getObjectKeysAndSort(this.groupedMessagesStorage[groupedId], sort);\r\n }\r\n\r\n public getMessagesByAlbum(groupedId: string) {\r\n const mids = this.getMidsByAlbum(groupedId, 'asc');\r\n const storage = this.groupedMessagesStorage[groupedId];\r\n return mids.map((mid) => this.getMessageFromStorage(storage, mid) as Message.message);\r\n }\r\n\r\n public getMidsByMessage(message: Message) {\r\n if(!message) return [];\r\n else if((message as Message.message).grouped_id) return this.getMidsByAlbum((message as Message.message).grouped_id);\r\n else return [message.mid];\r\n }\r\n\r\n public filterMessages(message: MyMessage, verify: (message: MyMessage) => boolean) {\r\n const out: MyMessage[] = [];\r\n if((message as Message.message).grouped_id) {\r\n const storage = this.groupedMessagesStorage[(message as Message.message).grouped_id];\r\n for(const [mid, message] of storage) {\r\n if(verify(message)) {\r\n out.push(message);\r\n }\r\n }\r\n } else {\r\n if(verify(message)) {\r\n out.push(message);\r\n }\r\n }\r\n\r\n return out;\r\n }\r\n\r\n public generateTempMessageId(peerId: PeerId) {\r\n const dialog = this.getDialogOnly(peerId);\r\n return this.appMessagesIdsManager.generateTempMessageId(dialog?.top_message || 0);\r\n }\r\n\r\n public saveMessage(message: Message, options: Partial<{\r\n storage: MessagesStorage,\r\n isScheduled: true,\r\n isOutgoing: true,\r\n // isNew: boolean, // * new - from update\r\n }> = {}) {\r\n if(!message || message._ === 'messageEmpty') {\r\n return;\r\n }\r\n\r\n message.pFlags ??= {};\r\n\r\n // * exclude from state\r\n // defineNotNumerableProperties(message, ['rReply', 'mid', 'savedFrom', 'fwdFromId', 'fromId', 'peerId', 'reply_to_mid', 'viaBotId']);\r\n\r\n const peerId = this.getMessagePeer(message);\r\n const storage = options.storage || this.getHistoryMessagesStorage(peerId);\r\n const isChannel = message.peer_id._ === 'peerChannel';\r\n const isBroadcast = isChannel && this.appChatsManager.isBroadcast(peerId.toChatId());\r\n const isMessage = message._ === 'message';\r\n\r\n if(options.isOutgoing) {\r\n message.pFlags.is_outgoing = true;\r\n }\r\n\r\n const mid = generateMessageId(message.id);\r\n message.mid = mid;\r\n\r\n if(isMessage) {\r\n if(options.isScheduled) {\r\n message.pFlags.is_scheduled = true;\r\n }\r\n\r\n if(message.grouped_id) {\r\n const storage = this.groupedMessagesStorage[message.grouped_id] ?? (this.groupedMessagesStorage[message.grouped_id] = this.createMessageStorage(peerId, 'grouped'));\r\n storage.set(mid, message);\r\n }\r\n\r\n if(message.via_bot_id) {\r\n // ! WARNING\r\n message.viaBotId = message.via_bot_id as any;\r\n }\r\n }\r\n\r\n const dialog = this.getDialogOnly(peerId);\r\n if(dialog && mid) {\r\n if(mid > dialog[message.pFlags.out ?\r\n 'read_outbox_max_id' :\r\n 'read_inbox_max_id']) {\r\n message.pFlags.unread = true;\r\n }\r\n }\r\n // this.log(dT(), 'msg unread', mid, apiMessage.pFlags.out, dialog && dialog[apiMessage.pFlags.out ? 'read_outbox_max_id' : 'read_inbox_max_id'])\r\n\r\n if(message.reply_to) {\r\n if(message.reply_to.reply_to_msg_id) {\r\n message.reply_to.reply_to_msg_id = message.reply_to_mid = generateMessageId(message.reply_to.reply_to_msg_id);\r\n }\r\n\r\n if(message.reply_to.reply_to_top_id) {\r\n message.reply_to.reply_to_top_id = generateMessageId(message.reply_to.reply_to_top_id);\r\n }\r\n }\r\n\r\n const replies = isMessage && message.replies;\r\n if(replies) {\r\n if(replies.max_id) replies.max_id = generateMessageId(replies.max_id);\r\n if(replies.read_max_id) replies.read_max_id = generateMessageId(replies.read_max_id);\r\n }\r\n\r\n const overwriting = !!peerId;\r\n if(!overwriting) {\r\n message.date -= this.timeManager.getServerTimeOffset();\r\n }\r\n\r\n // storage.generateIndex(message);\r\n const myId = this.appPeersManager.peerId;\r\n\r\n const fwdHeader = isMessage && (message as Message.message).fwd_from;\r\n\r\n message.peerId = peerId;\r\n if(peerId === myId/* && !message.from_id && !message.fwd_from */) {\r\n message.fromId = fwdHeader ? (fwdHeader.from_id ? this.appPeersManager.getPeerId(fwdHeader.from_id) : NULL_PEER_ID) : myId;\r\n } else {\r\n // message.fromId = message.pFlags.post || (!message.pFlags.out && !message.from_id) ? peerId : appPeersManager.getPeerId(message.from_id);\r\n message.fromId = message.pFlags.post || !message.from_id ? peerId : this.appPeersManager.getPeerId(message.from_id);\r\n }\r\n\r\n if(fwdHeader) {\r\n // if(peerId === myID) {\r\n if(fwdHeader.saved_from_msg_id) fwdHeader.saved_from_msg_id = generateMessageId(fwdHeader.saved_from_msg_id);\r\n if(fwdHeader.channel_post) fwdHeader.channel_post = generateMessageId(fwdHeader.channel_post);\r\n\r\n const peer = fwdHeader.saved_from_peer || fwdHeader.from_id;\r\n const msgId = fwdHeader.saved_from_msg_id || fwdHeader.channel_post;\r\n if(peer && msgId) {\r\n const savedFromPeerId = this.appPeersManager.getPeerId(peer);\r\n const savedFromMid = generateMessageId(msgId);\r\n message.savedFrom = savedFromPeerId + '_' + savedFromMid;\r\n }\r\n\r\n /* if(peerId.isAnyChat() || peerId === myID) {\r\n message.fromId = appPeersManager.getPeerID(!message.from_id || deepEqual(message.from_id, fwdHeader.from_id) ? fwdHeader.from_id : message.from_id);\r\n } */\r\n /* } else {\r\n apiMessage.fwdPostID = fwdHeader.channel_post;\r\n } */\r\n\r\n message.fwdFromId = this.appPeersManager.getPeerId(fwdHeader.from_id);\r\n\r\n if(!overwriting) {\r\n fwdHeader.date -= this.timeManager.getServerTimeOffset();\r\n }\r\n }\r\n\r\n const mediaContext: ReferenceContext = {\r\n type: 'message',\r\n peerId,\r\n messageId: mid\r\n };\r\n\r\n /* if(isMessage) {\r\n const entities = message.entities;\r\n if(entities && entities.find((entity) => entity._ === 'messageEntitySpoiler')) {\r\n message.media = {_: 'messageMediaUnsupported'};\r\n }\r\n } */\r\n\r\n let unsupported = false;\r\n const media = isMessage && message.media;\r\n if(media) {\r\n switch(media._) {\r\n case 'messageMediaEmpty': {\r\n delete message.media;\r\n break;\r\n }\r\n\r\n case 'messageMediaPhoto': {\r\n if(media.ttl_seconds) {\r\n unsupported = true;\r\n } else {\r\n media.photo = this.appPhotosManager.savePhoto(media.photo, mediaContext);\r\n }\r\n\r\n if(!(media as MessageMedia.messageMediaPhoto).photo) { // * found this bug on test DC\r\n delete message.media;\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaPoll': {\r\n const result = this.appPollsManager.savePoll(media.poll, media.results, message);\r\n media.poll = result.poll;\r\n media.results = result.results;\r\n break;\r\n }\r\n\r\n case 'messageMediaDocument': {\r\n if(media.ttl_seconds) {\r\n unsupported = true;\r\n } else {\r\n const originalDoc = media.document;\r\n media.document = this.appDocsManager.saveDoc(originalDoc, mediaContext); // 11.04.2020 warning\r\n\r\n if(!media.document && originalDoc._ !== 'documentEmpty') {\r\n unsupported = true;\r\n }\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaWebPage': {\r\n const messageKey = this.appWebPagesManager.getMessageKeyForPendingWebPage(peerId, mid, options.isScheduled);\r\n media.webpage = this.appWebPagesManager.saveWebPage(media.webpage, messageKey, mediaContext);\r\n break;\r\n }\r\n\r\n /* case 'messageMediaGame':\r\n AppGamesManager.saveGame(apiMessage.media.game, apiMessage.mid, mediaContext);\r\n apiMessage.media.handleMessage = true;\r\n break; */\r\n\r\n case 'messageMediaInvoice': {\r\n media.photo = this.appWebDocsManager.saveWebDocument(media.photo);\r\n const extendedMedia = media.extended_media;\r\n if(extendedMedia?._ === 'messageExtendedMedia') {\r\n const extendedMediaMedia = extendedMedia.media;\r\n (extendedMediaMedia as MessageMedia.messageMediaPhoto).photo = this.appPhotosManager.savePhoto((extendedMediaMedia as MessageMedia.messageMediaPhoto).photo, mediaContext);\r\n (extendedMediaMedia as MessageMedia.messageMediaDocument).document = this.appDocsManager.saveDoc((extendedMediaMedia as MessageMedia.messageMediaDocument).document, mediaContext);\r\n }\r\n break;\r\n }\r\n\r\n case 'messageMediaUnsupported': {\r\n unsupported = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // if(isMessage && !unsupported && message.entities) {\r\n // unsupported = message.entities.some((entity) => entity._ === 'messageEntityCustomEmoji');\r\n // }\r\n\r\n if(isMessage && unsupported) {\r\n message.media = {_: 'messageMediaUnsupported'};\r\n message.message = '';\r\n delete message.entities;\r\n delete message.totalEntities;\r\n }\r\n\r\n if(!isMessage && message.action) {\r\n const action = message.action as MessageAction;\r\n const suffix = message.fromId === this.appUsersManager.getSelf().id ? 'You' : '';\r\n let migrateFrom: PeerId, migrateTo: PeerId;\r\n\r\n if((action as MessageAction.messageActionChatEditPhoto).photo) {\r\n (action as MessageAction.messageActionChatEditPhoto).photo = this.appPhotosManager.savePhoto((action as MessageAction.messageActionChatEditPhoto).photo, mediaContext);\r\n }\r\n\r\n if((action as any).document) {\r\n (action as any).document = this.appDocsManager.saveDoc((action as any).photo, mediaContext);\r\n }\r\n\r\n switch(action._) {\r\n // case 'messageActionChannelEditPhoto':\r\n case 'messageActionChatEditPhoto':\r\n // action.photo = appPhotosManager.savePhoto(action.photo, mediaContext);\r\n if((action.photo as Photo.photo)?.video_sizes) {\r\n // @ts-ignore\r\n action._ = isBroadcast ? 'messageActionChannelEditVideo' : 'messageActionChatEditVideo';\r\n } else {\r\n if(isBroadcast) { // ! messageActionChannelEditPhoto не существует в принципе, это используется для перевода.\r\n // @ts-ignore\r\n action._ = 'messageActionChannelEditPhoto';\r\n }\r\n }\r\n break;\r\n\r\n case 'messageActionGroupCall': {\r\n // assumeType<MessageAction.messageActionGroupCall>(action);\r\n\r\n this.appGroupCallsManager.saveGroupCall(action.call);\r\n\r\n let type: string;\r\n if(action.duration === undefined) {\r\n type = 'started';\r\n } else {\r\n type = 'ended'\r\n }\r\n\r\n if(!isBroadcast) {\r\n type += '_by' + suffix;\r\n }\r\n\r\n // @ts-ignore\r\n action.type = type;\r\n\r\n break;\r\n }\r\n\r\n case 'messageActionChatEditTitle':\r\n /* if(options.isNew) {\r\n const chat = appChatsManager.getChat(peerId.toChatId());\r\n chat.title = action.title;\r\n appChatsManager.saveApiChat(chat, true);\r\n } */\r\n\r\n if(isBroadcast) {\r\n // @ts-ignore\r\n action._ = 'messageActionChannelEditTitle';\r\n }\r\n break;\r\n\r\n case 'messageActionChatDeletePhoto':\r\n if(isBroadcast) {\r\n // @ts-ignore\r\n action._ = 'messageActionChannelDeletePhoto';\r\n }\r\n break;\r\n\r\n case 'messageActionChatAddUser':\r\n if(action.users.length === 1) {\r\n // @ts-ignore\r\n action.user_id = action.users[0];\r\n // @ts-ignore\r\n if(message.fromId === action.user_id) {\r\n if(isChannel) {\r\n // @ts-ignore\r\n action._ = 'messageActionChatJoined' + suffix;\r\n } else {\r\n // @ts-ignore\r\n action._ = 'messageActionChatReturn' + suffix;\r\n }\r\n }\r\n } else if(action.users.length > 1) {\r\n // @ts-ignore\r\n action._ = 'messageActionChatAddUsers';\r\n }\r\n break;\r\n\r\n case 'messageActionChatDeleteUser':\r\n if(message.fromId === action.user_id) {\r\n // @ts-ignore\r\n action._ = 'messageActionChatLeave' + suffix;\r\n }\r\n break;\r\n\r\n case 'messageActionChannelMigrateFrom':\r\n migrateFrom = action.chat_id.toPeerId(true);\r\n migrateTo = peerId;\r\n break\r\n\r\n case 'messageActionChatMigrateTo':\r\n migrateFrom = peerId;\r\n migrateTo = action.channel_id.toPeerId(true);\r\n break;\r\n\r\n case 'messageActionHistoryClear':\r\n // apiMessage.deleted = true;\r\n message.clear_history = true;\r\n delete message.pFlags.out;\r\n delete message.pFlags.unread;\r\n break;\r\n\r\n case 'messageActionPhoneCall':\r\n // @ts-ignore\r\n action.type =\r\n (action.pFlags.video ? 'video_' : '') +\r\n (action.duration !== undefined ? (message.pFlags.out ? 'out_' : 'in_') : '') +\r\n (\r\n action.duration !== undefined ? 'ok' : (\r\n action.reason._ === 'phoneCallDiscardReasonMissed' ?\r\n 'missed' :\r\n 'cancelled'\r\n )\r\n );\r\n break;\r\n }\r\n\r\n if(migrateFrom &&\r\n migrateTo &&\r\n !this.migratedFromTo[migrateFrom] &&\r\n !this.migratedToFrom[migrateTo]) {\r\n this.migrateChecks(migrateFrom, migrateTo);\r\n }\r\n }\r\n\r\n /* if(message.grouped_id) {\r\n if(!groups) {\r\n groups = new Set();\r\n }\r\n\r\n groups.add(message.grouped_id);\r\n } else {\r\n message.rReply = this.getRichReplyText(message);\r\n } */\r\n\r\n if(isMessage && message.message.length && !message.totalEntities) {\r\n this.wrapMessageEntities(message);\r\n }\r\n\r\n storage.set(mid, message);\r\n\r\n return message;\r\n }\r\n\r\n public saveMessages(messages: any[], options: Partial<{\r\n storage: MessagesStorage,\r\n isScheduled: true,\r\n isOutgoing: true,\r\n // isNew: boolean, // * new - from update\r\n }> = {}): (Message.message | Message.messageService)[] {\r\n if((messages as any).saved) return messages;\r\n (messages as any).saved = true;\r\n messages.forEach((message, idx, arr) => {\r\n arr[idx] = this.saveMessage(message, options);\r\n });\r\n\r\n return messages;\r\n }\r\n\r\n public async getFirstMessageToEdit(peerId: PeerId, threadId?: number) {\r\n const historyStorage = this.getHistoryStorage(peerId, threadId);\r\n const slice = historyStorage.history.slice;\r\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\r\n let goodMessage: Message.message | Message.messageService;\r\n const myPeerId = this.appPeersManager.peerId;\r\n for(const mid of slice) {\r\n const message = this.getMessageByPeer(peerId, mid);\r\n const good = myPeerId === peerId ? message.fromId === myPeerId : message.pFlags.out;\r\n\r\n if(good) {\r\n if(await this.canEditMessage(message, 'text')) {\r\n goodMessage = message;\r\n break;\r\n }\r\n\r\n // * this check will allow editing only last message\r\n // break;\r\n }\r\n }\r\n\r\n return goodMessage;\r\n }\r\n }\r\n\r\n private wrapMessageEntities(message: Message.message) {\r\n const apiEntities = message.entities ? message.entities.slice() : [];\r\n message.message = fixEmoji(message.message, apiEntities);\r\n\r\n const myEntities = parseEntities(message.message);\r\n message.totalEntities = mergeEntities(apiEntities, myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\r\n }\r\n\r\n public reportMessages(peerId: PeerId, mids: number[], reason: ReportReason['_'], message?: string) {\r\n return this.apiManager.invokeApiSingle('messages.report', {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n id: mids.map((mid) => getServerMessageId(mid)),\r\n reason: {\r\n _: reason\r\n },\r\n message\r\n });\r\n }\r\n\r\n public startBot(botId: BotId, chatId?: ChatId, startParam?: string) {\r\n const peerId = chatId ? chatId.toPeerId(true) : botId.toPeerId();\r\n if(startParam) {\r\n const randomId = randomLong();\r\n\r\n return this.apiManager.invokeApi('messages.startBot', {\r\n bot: this.appUsersManager.getUserInput(botId),\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n random_id: randomId,\r\n start_param: startParam\r\n }).then((updates) => {\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n const str = '/start';\r\n if(chatId) {\r\n let promise: Promise<void>;\r\n if(this.appChatsManager.isChannel(chatId)) {\r\n promise = this.appChatsManager.inviteToChannel(chatId, [botId]);\r\n } else {\r\n promise = this.appChatsManager.addChatUser(chatId, botId, 0);\r\n }\r\n\r\n return promise.catch((error: ApiError) => {\r\n if(error?.type == 'USER_ALREADY_PARTICIPANT') {\r\n error.handled = true;\r\n return;\r\n }\r\n\r\n throw error;\r\n }).then(() => {\r\n const bot = this.appUsersManager.getUser(botId);\r\n return this.sendText(peerId, str + '@' + bot.username);\r\n });\r\n }\r\n\r\n return this.sendText(peerId, str);\r\n }\r\n\r\n public editPeerFolders(peerIds: PeerId[], folderId: number) {\r\n this.apiManager.invokeApi('folders.editPeerFolders', {\r\n folder_peers: peerIds.map((peerId) => {\r\n return {\r\n _: 'inputFolderPeer',\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n folder_id: folderId\r\n };\r\n })\r\n }).then((updates) => {\r\n // this.log('editPeerFolders updates:', updates);\r\n this.apiUpdatesManager.processUpdateMessage(updates); // WARNING! возможно тут нужно добавлять channelId, и вызывать апдейт для каждого канала отдельно\r\n });\r\n }\r\n\r\n public getFilter(filterId: number) {\r\n return this.filtersStorage.getFilter(filterId);\r\n }\r\n\r\n public async toggleDialogPin(peerId: PeerId, filterId?: number) {\r\n if(filterId > 1) {\r\n return this.filtersStorage.toggleDialogPin(peerId, filterId);\r\n }\r\n\r\n const dialog = this.getDialogOnly(peerId);\r\n if(!dialog) return Promise.reject();\r\n\r\n const pinned = dialog.pFlags?.pinned ? undefined : true;\r\n\r\n if(pinned) {\r\n const max = await this.apiManager.getLimit(filterId === 1 ? 'folderPin' : 'pin');\r\n if(this.dialogsStorage.getPinnedOrders(filterId).length >= max) {\r\n return Promise.reject(makeError('PINNED_DIALOGS_TOO_MUCH'));\r\n }\r\n }\r\n\r\n return this.apiManager.invokeApi('messages.toggleDialogPin', {\r\n peer: this.appPeersManager.getInputDialogPeerById(peerId),\r\n pinned\r\n }).then((bool) => {\r\n if(bool) {\r\n const pFlags: Update.updateDialogPinned['pFlags'] = pinned ? {pinned} : {};\r\n this.apiUpdatesManager.saveUpdate({\r\n _: 'updateDialogPinned',\r\n peer: this.appPeersManager.getDialogPeer(peerId),\r\n folder_id: filterId,\r\n pFlags\r\n });\r\n }\r\n });\r\n }\r\n\r\n public markDialogUnread(peerId: PeerId, read?: true) {\r\n const dialog = this.getDialogOnly(peerId);\r\n if(!dialog) return Promise.reject();\r\n\r\n const unread = read || dialog.pFlags?.unread_mark ? undefined : true;\r\n return this.apiManager.invokeApi('messages.markDialogUnread', {\r\n peer: this.appPeersManager.getInputDialogPeerById(peerId),\r\n unread\r\n }).then((bool) => {\r\n if(bool) {\r\n const pFlags: Update.updateDialogUnreadMark['pFlags'] = unread ? {unread} : {};\r\n this.onUpdateDialogUnreadMark({\r\n _: 'updateDialogUnreadMark',\r\n peer: this.appPeersManager.getDialogPeer(peerId),\r\n pFlags\r\n });\r\n }\r\n });\r\n }\r\n\r\n public migrateChecks(migrateFrom: PeerId, migrateTo: PeerId) {\r\n if(!this.migratedFromTo[migrateFrom] &&\r\n !this.migratedToFrom[migrateTo] &&\r\n this.appChatsManager.hasChat(migrateTo.toChatId())) {\r\n const fromChat: Chat.chat = this.appChatsManager.getChat(migrateFrom.toChatId());\r\n if(fromChat?.migrated_to && (fromChat.migrated_to as InputChannel.inputChannel).channel_id === migrateTo.toChatId()) {\r\n this.migratedFromTo[migrateFrom] = migrateTo;\r\n this.migratedToFrom[migrateTo] = migrateFrom;\r\n\r\n this.rootScope.dispatchEvent('dialog_migrate', {migrateFrom, migrateTo});\r\n\r\n this.dialogsStorage.dropDialogWithEvent(migrateFrom);\r\n }\r\n }\r\n }\r\n\r\n private canMessageBeEdited(message: Message, kind: 'text' | 'poll') {\r\n if((message as Message.message)?.pFlags?.is_outgoing) {\r\n return false;\r\n }\r\n\r\n const goodMedias = [\r\n 'messageMediaPhoto',\r\n 'messageMediaDocument',\r\n 'messageMediaWebPage'\r\n ];\r\n\r\n if(kind === 'poll') {\r\n goodMedias.push('messageMediaPoll');\r\n }\r\n\r\n if(!message ||\r\n message._ !== 'message' ||\r\n message.deleted ||\r\n message.fwd_from ||\r\n message.via_bot_id ||\r\n message.media && goodMedias.indexOf(message.media._) === -1 ||\r\n message.fromId && this.appUsersManager.isBot(message.fromId)) {\r\n return false;\r\n }\r\n\r\n if(message.media?._ === 'messageMediaDocument' &&\r\n ((message.media.document as Document.document).sticker || (message.media.document as Document.document).type === 'round')) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public async canEditMessage(message: Message.message | Message.messageService, kind: 'text' | 'poll' = 'text') {\r\n if(!message || !this.canMessageBeEdited(message, kind)) {\r\n return false;\r\n }\r\n\r\n // * second rule for saved messages, because there is no 'out' flag\r\n if(/* message.pFlags.out || */this.getMessagePeer(message) === this.appUsersManager.getSelf().id) {\r\n return true;\r\n }\r\n\r\n if(!message.pFlags.out || (\r\n message.peer_id._ !== 'peerChannel' &&\r\n message.date < (tsNow(true) - (await this.apiManager.getConfig()).edit_time_limit) &&\r\n (message as Message.message).media?._ !== 'messageMediaPoll'\r\n )\r\n ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public canDeleteMessage(message: MyMessage) {\r\n return message && (\r\n message.peerId.isUser() ||\r\n message.pFlags.out ||\r\n this.appChatsManager.getChat(message.peerId.toChatId())._ === 'chat' ||\r\n this.appChatsManager.hasRights(message.peerId.toChatId(), 'delete_messages')\r\n ) && (!message.pFlags.is_outgoing || !!message.error);\r\n }\r\n\r\n public getReplyKeyboard(peerId: PeerId) {\r\n return this.getHistoryStorage(peerId).replyMarkup;\r\n }\r\n\r\n public mergeReplyKeyboard(historyStorage: HistoryStorage, message: Message.messageService | Message.message) {\r\n // this.log('merge', message.mid, message.reply_markup, historyStorage.reply_markup)\r\n if(!message) {\r\n return false;\r\n }\r\n\r\n const messageReplyMarkup = (message as Message.message).reply_markup;\r\n if(!messageReplyMarkup &&\r\n !message.pFlags?.out &&\r\n !(message as Message.messageService).action) {\r\n return false;\r\n }\r\n\r\n if(messageReplyMarkup?._ === 'replyInlineMarkup') {\r\n return false;\r\n }\r\n\r\n const lastReplyMarkup = historyStorage.replyMarkup;\r\n if(messageReplyMarkup) {\r\n if(lastReplyMarkup && lastReplyMarkup.mid >= message.mid) {\r\n return false;\r\n }\r\n\r\n if(messageReplyMarkup.pFlags.selective) {\r\n return false;\r\n }\r\n\r\n if(historyStorage.maxOutId &&\r\n message.mid < historyStorage.maxOutId &&\r\n (messageReplyMarkup as ReplyMarkup.replyKeyboardMarkup | ReplyMarkup.replyKeyboardForceReply).pFlags.single_use) {\r\n (messageReplyMarkup as ReplyMarkup.replyKeyboardMarkup | ReplyMarkup.replyKeyboardForceReply).pFlags.hidden = true;\r\n }\r\n\r\n messageReplyMarkup.mid = message.mid;\r\n /* messageReplyMarkup = Object.assign({\r\n mid: message.mid\r\n }, messageReplyMarkup); */\r\n\r\n if(messageReplyMarkup._ !== 'replyKeyboardHide') {\r\n messageReplyMarkup.fromId = this.appPeersManager.getPeerId(message.from_id);\r\n }\r\n\r\n historyStorage.replyMarkup = messageReplyMarkup;\r\n // this.log('set', historyStorage.reply_markup)\r\n return true;\r\n }\r\n\r\n if(message.pFlags.out) {\r\n if(lastReplyMarkup) {\r\n assumeType<ReplyMarkup.replyKeyboardMarkup>(lastReplyMarkup);\r\n if(lastReplyMarkup.pFlags.single_use &&\r\n !lastReplyMarkup.pFlags.hidden &&\r\n (message.mid > lastReplyMarkup.mid || message.pFlags.is_outgoing) &&\r\n (message as Message.message).message) {\r\n lastReplyMarkup.pFlags.hidden = true;\r\n // this.log('set', historyStorage.reply_markup)\r\n return true;\r\n }\r\n } else if(!historyStorage.maxOutId ||\r\n message.mid > historyStorage.maxOutId) {\r\n historyStorage.maxOutId = message.mid;\r\n }\r\n }\r\n\r\n assumeType<Message.messageService>(message);\r\n if(message.action?._ === 'messageActionChatDeleteUser' &&\r\n (lastReplyMarkup ?\r\n message.action.user_id === (lastReplyMarkup as ReplyMarkup.replyKeyboardMarkup).fromId :\r\n this.appUsersManager.isBot(message.action.user_id)\r\n )\r\n ) {\r\n historyStorage.replyMarkup = {\r\n _: 'replyKeyboardHide',\r\n mid: message.mid,\r\n pFlags: {}\r\n };\r\n // this.log('set', historyStorage.reply_markup)\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public getSearchStorage(peerId: PeerId, inputFilter: MyInputMessagesFilter) {\r\n if(!this.searchesStorage[peerId]) this.searchesStorage[peerId] = {};\r\n if(!this.searchesStorage[peerId][inputFilter]) this.searchesStorage[peerId][inputFilter] = {history: []};\r\n return this.searchesStorage[peerId][inputFilter];\r\n }\r\n\r\n public getSearchCounters(peerId: PeerId, filters: MessagesFilter[], canCache = true): Promise<MessagesSearchCounter[]> {\r\n if(this.appPeersManager.isRestricted(peerId)) {\r\n return Promise.resolve(filters.map((filter) => {\r\n return {\r\n _: 'messages.searchCounter',\r\n pFlags: {},\r\n filter: filter,\r\n count: 0\r\n };\r\n }));\r\n }\r\n\r\n const func = (canCache ? this.apiManager.invokeApiCacheable : this.apiManager.invokeApi).bind(this.apiManager);\r\n return func('messages.getSearchCounters', {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n filters\r\n });\r\n }\r\n\r\n public filterMessagesByInputFilterFromStorage(inputFilter: MyInputMessagesFilter, history: number[], storage: MessagesStorage | MessagesStorageKey, limit: number) {\r\n const _storage = this.getMessagesStorage(storage);\r\n return filterMessagesByInputFilter(inputFilter, history.map((mid) => _storage.get(mid)), limit);\r\n }\r\n\r\n public getSearch({peerId, query, inputFilter, maxId, limit, nextRate, backLimit, threadId, folderId, minDate, maxDate}: {\r\n peerId?: PeerId,\r\n maxId?: number,\r\n limit?: number,\r\n nextRate?: number,\r\n backLimit?: number,\r\n threadId?: number,\r\n folderId?: number,\r\n query?: string,\r\n inputFilter?: {\r\n _: MyInputMessagesFilter\r\n },\r\n minDate?: number,\r\n maxDate?: number\r\n }): Promise<{\r\n count: number,\r\n next_rate: number,\r\n offset_id_offset: number,\r\n history: MyMessage[]\r\n }> {\r\n if(this.appPeersManager.isRestricted(peerId)/* || true */) {\r\n return Promise.resolve({\r\n count: 0,\r\n offset_id_offset: 0,\r\n next_rate: undefined,\r\n history: []\r\n });\r\n }\r\n\r\n if(!query) query = '';\r\n if(!inputFilter) inputFilter = {_: 'inputMessagesFilterEmpty'};\r\n if(limit === undefined) limit = 20;\r\n if(!nextRate) nextRate = 0;\r\n if(!backLimit) backLimit = 0;\r\n\r\n minDate = minDate ? minDate / 1000 | 0 : 0;\r\n maxDate = maxDate ? maxDate / 1000 | 0 : 0;\r\n\r\n let foundMsgs: MyMessage[] = [];\r\n\r\n // this.log('search', maxId);\r\n\r\n if(backLimit) {\r\n limit += backLimit;\r\n }\r\n\r\n // const beta = inputFilter._ === 'inputMessagesFilterPinned' && !backLimit;\r\n const beta = false;\r\n\r\n let storage: {\r\n count?: number;\r\n history: SlicedArray<number>;\r\n };\r\n\r\n // * костыль для limit 1, если нужно и получить сообщение, и узнать количество сообщений\r\n if(peerId && !backLimit && !maxId && !query && limit !== 1 && !threadId/* && inputFilter._ !== 'inputMessagesFilterPinned' */) {\r\n storage = beta ?\r\n this.getSearchStorage(peerId, inputFilter._) as any :\r\n this.getHistoryStorage(peerId);\r\n foundMsgs = this.filterMessagesByInputFilterFromStorage(inputFilter._, storage.history.slice, this.getHistoryMessagesStorage(peerId), limit);\r\n }\r\n\r\n if(foundMsgs.length) {\r\n if(foundMsgs.length < limit && (beta ? storage.count !== storage.history.length : true)) {\r\n maxId = foundMsgs[foundMsgs.length - 1].mid;\r\n limit = limit - foundMsgs.length;\r\n } else {\r\n return Promise.resolve({\r\n count: beta ? storage.count : 0,\r\n next_rate: 0,\r\n offset_id_offset: 0,\r\n history: foundMsgs\r\n });\r\n }\r\n } else if(beta && storage?.count) {\r\n return Promise.resolve({\r\n count: storage.count,\r\n next_rate: 0,\r\n offset_id_offset: 0,\r\n history: []\r\n });\r\n }\r\n\r\n const canCache = false && (['inputMessagesFilterChatPhotos', 'inputMessagesFilterPinned'] as MyInputMessagesFilter[]).includes(inputFilter._);\r\n const method = (canCache ? this.apiManager.invokeApiCacheable : this.apiManager.invokeApi).bind(this.apiManager);\r\n\r\n let apiPromise: Promise<any>;\r\n if(peerId && !nextRate && folderId === undefined/* || !query */) {\r\n apiPromise = method('messages.search', {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n q: query || '',\r\n filter: inputFilter as any as MessagesFilter,\r\n min_date: minDate,\r\n max_date: maxDate,\r\n limit,\r\n offset_id: getServerMessageId(maxId) || 0,\r\n add_offset: backLimit ? -backLimit : 0,\r\n max_id: 0,\r\n min_id: 0,\r\n hash: '',\r\n top_msg_id: getServerMessageId(threadId) || 0\r\n }, {\r\n // timeout: APITIMEOUT,\r\n noErrorBox: true\r\n });\r\n } else {\r\n // var offsetDate = 0;\r\n let offsetPeerId: PeerId;\r\n let offsetId = 0;\r\n const offsetMessage = maxId && this.getMessageByPeer(peerId, maxId);\r\n\r\n if(offsetMessage && offsetMessage.date) {\r\n // offsetDate = offsetMessage.date + timeManager.getServerTimeOffset();\r\n offsetId = offsetMessage.id;\r\n offsetPeerId = this.getMessagePeer(offsetMessage);\r\n }\r\n\r\n apiPromise = method('messages.searchGlobal', {\r\n q: query,\r\n filter: inputFilter as any as MessagesFilter,\r\n min_date: minDate,\r\n max_date: maxDate,\r\n offset_rate: nextRate,\r\n offset_peer: this.appPeersManager.getInputPeerById(offsetPeerId),\r\n offset_id: offsetId,\r\n limit,\r\n folder_id: folderId\r\n }, {\r\n // timeout: APITIMEOUT,\r\n noErrorBox: true\r\n });\r\n }\r\n\r\n return apiPromise.then((searchResult: any) => {\r\n this.appUsersManager.saveApiUsers(searchResult.users);\r\n this.appChatsManager.saveApiChats(searchResult.chats);\r\n this.saveMessages(searchResult.messages);\r\n\r\n /* if(beta && storage && (!maxId || storage.history[storage.history.length - 1] === maxId)) {\r\n const storage = this.getSearchStorage(peerId, inputFilter._);\r\n const add = (searchResult.messages.map((m: any) => m.mid) as number[]).filter((mid) => storage.history.indexOf(mid) === -1);\r\n storage.history.push(...add);\r\n storage.history.sort((a, b) => b - a);\r\n storage.count = searchResult.count;\r\n } */\r\n\r\n if(DEBUG) {\r\n this.log('getSearch result:', inputFilter, searchResult);\r\n }\r\n\r\n const foundCount: number = searchResult.count || (foundMsgs.length + searchResult.messages.length);\r\n\r\n searchResult.messages.forEach((message: MyMessage) => {\r\n const peerId = this.getMessagePeer(message);\r\n if(peerId.isAnyChat()) {\r\n const chat: Chat.chat = this.appChatsManager.getChat(peerId.toChatId());\r\n if(chat.migrated_to) {\r\n this.migrateChecks(peerId, (chat.migrated_to as InputChannel.inputChannel).channel_id.toPeerId(true));\r\n }\r\n }\r\n\r\n foundMsgs.push(message);\r\n });\r\n\r\n return {\r\n count: foundCount,\r\n offset_id_offset: searchResult.offset_id_offset || 0,\r\n next_rate: searchResult.next_rate,\r\n history: foundMsgs\r\n };\r\n });\r\n }\r\n\r\n public subscribeRepliesThread(peerId: PeerId, mid: number) {\r\n const repliesKey = peerId + '_' + mid;\r\n for(const threadKey in this.threadsToReplies) {\r\n if(this.threadsToReplies[threadKey] === repliesKey) return;\r\n }\r\n\r\n this.getDiscussionMessage(peerId, mid);\r\n }\r\n\r\n public generateThreadServiceStartMessage(message: Message.message | Message.messageService) {\r\n const threadKey = message.peerId + '_' + message.mid;\r\n if(this.threadsServiceMessagesIdsStorage[threadKey]) return;\r\n\r\n const maxMessageId = getServerMessageId(Math.max(...this.getMidsByMessage(message)));\r\n const serviceStartMessage: Message.messageService = {\r\n _: 'messageService',\r\n pFlags: {\r\n is_single: true\r\n },\r\n id: this.appMessagesIdsManager.generateTempMessageId(maxMessageId),\r\n date: message.date,\r\n from_id: {_: 'peerUser', user_id: NULL_PEER_ID}/* message.from_id */,\r\n peer_id: message.peer_id,\r\n action: {\r\n _: 'messageActionDiscussionStarted'\r\n },\r\n reply_to: this.generateReplyHeader(message.id)\r\n };\r\n\r\n this.saveMessages([serviceStartMessage], {isOutgoing: true});\r\n this.threadsServiceMessagesIdsStorage[threadKey] = serviceStartMessage.mid;\r\n }\r\n\r\n public getThreadServiceMessageId(peerId: PeerId, threadId: number) {\r\n return this.threadsServiceMessagesIdsStorage[peerId + '_' + threadId];\r\n }\r\n\r\n public getDiscussionMessage(peerId: PeerId, mid: number) {\r\n return this.apiManager.invokeApiSingle('messages.getDiscussionMessage', {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n msg_id: getServerMessageId(mid)\r\n }).then((result) => {\r\n this.appChatsManager.saveApiChats(result.chats);\r\n this.appUsersManager.saveApiUsers(result.users);\r\n this.saveMessages(result.messages);\r\n\r\n const message = this.getMessageWithReplies(result.messages[0] as Message.message);\r\n const threadKey = message.peerId + '_' + message.mid;\r\n\r\n this.generateThreadServiceStartMessage(message);\r\n\r\n const historyStorage = this.getHistoryStorage(message.peerId, message.mid);\r\n result.max_id = historyStorage.maxId = generateMessageId(result.max_id) || 0;\r\n result.read_inbox_max_id = historyStorage.readMaxId = generateMessageId(result.read_inbox_max_id ?? message.mid);\r\n result.read_outbox_max_id = historyStorage.readOutboxMaxId = generateMessageId(result.read_outbox_max_id) || 0;\r\n\r\n this.threadsToReplies[threadKey] = peerId + '_' + mid;\r\n\r\n return message;\r\n });\r\n }\r\n\r\n private handleNewMessage(message: MyMessage) {\r\n this.rootScope.dispatchEvent('history_multiappend', message);\r\n }\r\n\r\n private handleNewDialogs = () => {\r\n let newMaxSeenId = 0;\r\n const map = this.newDialogsToHandle;\r\n for(const [peerId, dialog] of map) {\r\n let good = false;\r\n if(!dialog) {\r\n this.reloadConversation(peerId.toPeerId());\r\n } else if(this.dialogsStorage.getDialogOnly(peerId)) { // * dialog can be already dropped\r\n this.dialogsStorage.pushDialog(dialog);\r\n if(!this.appPeersManager.isChannel(peerId)) {\r\n newMaxSeenId = Math.max(newMaxSeenId, dialog.top_message || 0);\r\n }\r\n\r\n good = true;\r\n }\r\n\r\n if(!good) {\r\n map.delete(peerId);\r\n }\r\n }\r\n\r\n // this.log('after order:', this.dialogsStorage[0].map((d) => d.peerId));\r\n\r\n if(newMaxSeenId !== 0) {\r\n this.incrementMaxSeenId(newMaxSeenId);\r\n }\r\n\r\n this.rootScope.dispatchEvent('dialogs_multiupdate', map);\r\n this.newDialogsToHandle.clear();\r\n };\r\n\r\n public scheduleHandleNewDialogs(peerId?: PeerId, dialog?: Dialog) {\r\n if(peerId !== undefined) {\r\n this.newDialogsToHandle.set(peerId, dialog);\r\n }\r\n\r\n if(this.newDialogsHandlePromise) return this.newDialogsHandlePromise;\r\n return this.newDialogsHandlePromise = pause(0).then(() => {\r\n this.newDialogsHandlePromise = undefined;\r\n this.handleNewDialogs();\r\n });\r\n }\r\n\r\n public async deleteMessages(peerId: PeerId, mids: number[], revoke?: boolean) {\r\n let promise: Promise<any>;\r\n\r\n const config = await this.apiManager.getConfig();\r\n const overflowMids = mids.splice(config.forwarded_count_max, mids.length - config.forwarded_count_max);\r\n\r\n const localMessageIds = mids.map((mid) => getServerMessageId(mid));\r\n\r\n if(peerId.isAnyChat() && this.appPeersManager.isChannel(peerId)) {\r\n const channelId = peerId.toChatId();\r\n const channel: Chat.channel = this.appChatsManager.getChat(channelId);\r\n if(!channel.pFlags.creator && !channel.admin_rights?.pFlags?.delete_messages) {\r\n mids = mids.filter((mid) => {\r\n const message = this.getMessageByPeer(peerId, mid);\r\n return !!message.pFlags.out;\r\n });\r\n\r\n if(!mids.length) {\r\n return;\r\n }\r\n }\r\n\r\n promise = this.apiManager.invokeApi('channels.deleteMessages', {\r\n channel: this.appChatsManager.getChannelInput(channelId),\r\n id: localMessageIds\r\n }).then((affectedMessages) => {\r\n this.apiUpdatesManager.processLocalUpdate({\r\n _: 'updateDeleteChannelMessages',\r\n channel_id: channelId,\r\n messages: mids,\r\n pts: affectedMessages.pts,\r\n pts_count: affectedMessages.pts_count\r\n });\r\n });\r\n } else {\r\n promise = this.apiManager.invokeApi('messages.deleteMessages', {\r\n revoke,\r\n id: localMessageIds\r\n }).then((affectedMessages) => {\r\n this.apiUpdatesManager.processLocalUpdate({\r\n _: 'updateDeleteMessages',\r\n messages: mids,\r\n pts: affectedMessages.pts,\r\n pts_count: affectedMessages.pts_count\r\n });\r\n });\r\n }\r\n\r\n const promises: (typeof promise)[] = [promise];\r\n if(overflowMids.length) {\r\n promises.push(this.deleteMessages(peerId, overflowMids, revoke));\r\n }\r\n\r\n return Promise.all(promises).then(noop);\r\n }\r\n\r\n public readHistory(peerId: PeerId, maxId = 0, threadId?: number, force = false) {\r\n if(DO_NOT_READ_HISTORY) {\r\n return Promise.resolve();\r\n }\r\n\r\n // console.trace('start read')\r\n this.log('readHistory:', peerId, maxId, threadId);\r\n if(!this.getReadMaxIdIfUnread(peerId, threadId)) {\r\n if(!force && !threadId) {\r\n const dialog = this.getDialogOnly(peerId);\r\n if(dialog && this.isDialogUnread(dialog)) {\r\n force = true;\r\n }\r\n }\r\n\r\n if(!force) {\r\n this.log('readHistory: isn\\'t unread');\r\n return Promise.resolve();\r\n }\r\n }\r\n\r\n const historyStorage = this.getHistoryStorage(peerId, threadId);\r\n\r\n if(historyStorage.triedToReadMaxId >= maxId) {\r\n return Promise.resolve();\r\n }\r\n\r\n let apiPromise: Promise<any>;\r\n if(threadId) {\r\n if(!historyStorage.readPromise) {\r\n apiPromise = this.apiManager.invokeApi('messages.readDiscussion', {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n msg_id: getServerMessageId(threadId),\r\n read_max_id: getServerMessageId(maxId)\r\n });\r\n }\r\n\r\n this.apiUpdatesManager.processLocalUpdate({\r\n _: 'updateReadChannelDiscussionInbox',\r\n channel_id: peerId.toChatId(),\r\n top_msg_id: threadId,\r\n read_max_id: maxId\r\n });\r\n } else if(this.appPeersManager.isChannel(peerId)) {\r\n if(!historyStorage.readPromise) {\r\n apiPromise = this.apiManager.invokeApi('channels.readHistory', {\r\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\r\n max_id: getServerMessageId(maxId)\r\n });\r\n }\r\n\r\n this.apiUpdatesManager.processLocalUpdate({\r\n _: 'updateReadChannelInbox',\r\n max_id: maxId,\r\n channel_id: peerId.toChatId(),\r\n still_unread_count: undefined,\r\n pts: undefined\r\n });\r\n } else {\r\n if(!historyStorage.readPromise) {\r\n apiPromise = this.apiManager.invokeApi('messages.readHistory', {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n max_id: getServerMessageId(maxId)\r\n }).then((affectedMessages) => {\r\n this.apiUpdatesManager.processUpdateMessage({\r\n _: 'updateShort',\r\n update: {\r\n _: 'updatePts',\r\n pts: affectedMessages.pts,\r\n pts_count: affectedMessages.pts_count\r\n }\r\n });\r\n });\r\n }\r\n\r\n this.apiUpdatesManager.processLocalUpdate({\r\n _: 'updateReadHistoryInbox',\r\n max_id: maxId,\r\n peer: this.appPeersManager.getOutputPeer(peerId),\r\n still_unread_count: undefined,\r\n pts: undefined,\r\n pts_count: undefined\r\n });\r\n }\r\n\r\n this.rootScope.dispatchEvent('notification_reset', this.appPeersManager.getPeerString(peerId));\r\n\r\n if(historyStorage.readPromise) {\r\n return historyStorage.readPromise;\r\n }\r\n\r\n historyStorage.triedToReadMaxId = maxId;\r\n\r\n apiPromise.finally(() => {\r\n delete historyStorage.readPromise;\r\n\r\n const {readMaxId} = historyStorage;\r\n this.log('readHistory: promise finally', maxId, readMaxId);\r\n\r\n if(readMaxId > maxId) {\r\n this.readHistory(peerId, readMaxId, threadId, true);\r\n }\r\n });\r\n\r\n return historyStorage.readPromise = apiPromise;\r\n }\r\n\r\n public readAllHistory(peerId: PeerId, threadId?: number, force = false) {\r\n const historyStorage = this.getHistoryStorage(peerId, threadId);\r\n if(historyStorage.maxId) {\r\n this.readHistory(peerId, historyStorage.maxId, threadId, force); // lol\r\n }\r\n }\r\n\r\n public fixDialogUnreadMentionsIfNoMessage(peerId: PeerId) {\r\n const dialog = this.getDialogOnly(peerId);\r\n if(dialog?.unread_mentions_count) {\r\n this.reloadConversation(peerId);\r\n }\r\n }\r\n\r\n public modifyCachedMentions(peerId: PeerId, mid: number, add: boolean) {\r\n const slicedArray = this.unreadMentions[peerId];\r\n if(!slicedArray) return;\r\n\r\n if(add) {\r\n if(slicedArray.first.isEnd(SliceEnd.Top)) {\r\n slicedArray.insertSlice([mid]);\r\n }\r\n } else {\r\n slicedArray.delete(mid);\r\n }\r\n }\r\n\r\n private fixUnreadMentionsCountIfNeeded(peerId: PeerId, slicedArray: SlicedArray<number>) {\r\n const dialog = this.getDialogOnly(peerId);\r\n if(!slicedArray.length && dialog?.unread_mentions_count) {\r\n this.reloadConversation(peerId);\r\n }\r\n }\r\n\r\n public goToNextMention(peerId: PeerId) {\r\n /* this.getUnreadMentions(peerId, 1, 2, 0).then((messages) => {\r\n console.log(messages);\r\n }); */\r\n\r\n const promise = this.goToNextMentionPromises[peerId];\r\n if(promise) {\r\n return promise;\r\n }\r\n\r\n const slicedArray = this.unreadMentions[peerId] ?? (this.unreadMentions[peerId] = new SlicedArray());\r\n const length = slicedArray.length;\r\n const isTopEnd = slicedArray.first.isEnd(SliceEnd.Top);\r\n if(!length && isTopEnd) {\r\n this.fixUnreadMentionsCountIfNeeded(peerId, slicedArray);\r\n return Promise.resolve();\r\n }\r\n\r\n let loadNextPromise = Promise.resolve();\r\n if(!isTopEnd && length < 25) {\r\n loadNextPromise = this.loadNextMentions(peerId);\r\n }\r\n\r\n return this.goToNextMentionPromises[peerId] = loadNextPromise.then(() => {\r\n const last = slicedArray.last;\r\n const mid = last && last[last.length - 1];\r\n if(mid) {\r\n slicedArray.delete(mid);\r\n return mid;\r\n } else {\r\n this.fixUnreadMentionsCountIfNeeded(peerId, slicedArray);\r\n }\r\n }).finally(() => {\r\n delete this.goToNextMentionPromises[peerId];\r\n });\r\n }\r\n\r\n public loadNextMentions(peerId: PeerId) {\r\n const slicedArray = this.unreadMentions[peerId];\r\n const maxId = slicedArray.first[0] || 1;\r\n\r\n const backLimit = 50;\r\n const add_offset = -backLimit;\r\n const limit = backLimit;\r\n return this.getUnreadMentions(peerId, maxId, add_offset, limit).then((messages) => {\r\n this.mergeHistoryResult(slicedArray, messages, maxId === 1 ? 0 : maxId, limit, add_offset);\r\n });\r\n }\r\n\r\n public getUnreadMentions(peerId: PeerId, offsetId: number, add_offset: number, limit: number, maxId = 0, minId = 0) {\r\n return this.apiManager.invokeApiSingle('messages.getUnreadMentions', {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n offset_id: getServerMessageId(offsetId),\r\n add_offset,\r\n limit,\r\n max_id: getServerMessageId(maxId),\r\n min_id: getServerMessageId(minId)\r\n }).then((messagesMessages) => {\r\n assumeType<Exclude<MessagesMessages, MessagesMessages.messagesMessagesNotModified>>(messagesMessages);\r\n this.appUsersManager.saveApiUsers(messagesMessages.users);\r\n this.appChatsManager.saveApiChats(messagesMessages.chats);\r\n this.saveMessages(messagesMessages.messages);\r\n\r\n return messagesMessages;\r\n });\r\n }\r\n\r\n public readMessages(peerId: PeerId, msgIds: number[]) {\r\n if(DO_NOT_READ_HISTORY) {\r\n return Promise.resolve();\r\n }\r\n\r\n if(!msgIds.length) {\r\n return Promise.resolve();\r\n }\r\n\r\n msgIds = msgIds.map((mid) => getServerMessageId(mid));\r\n let promise: Promise<any>, update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents;\r\n if(peerId.isAnyChat() && this.appPeersManager.isChannel(peerId)) {\r\n const channelId = peerId.toChatId();\r\n\r\n update = {\r\n _: 'updateChannelReadMessagesContents',\r\n channel_id: channelId,\r\n messages: msgIds\r\n };\r\n\r\n promise = this.apiManager.invokeApi('channels.readMessageContents', {\r\n channel: this.appChatsManager.getChannelInput(channelId),\r\n id: msgIds\r\n });\r\n } else {\r\n update = {\r\n _: 'updateReadMessagesContents',\r\n messages: msgIds,\r\n pts: undefined,\r\n pts_count: undefined\r\n };\r\n\r\n promise = this.apiManager.invokeApi('messages.readMessageContents', {\r\n id: msgIds\r\n }).then((affectedMessages) => {\r\n (update as Update.updateReadMessagesContents).pts = affectedMessages.pts;\r\n (update as Update.updateReadMessagesContents).pts_count = affectedMessages.pts_count;\r\n this.apiUpdatesManager.processLocalUpdate(update);\r\n });\r\n }\r\n\r\n this.apiUpdatesManager.processLocalUpdate(update);\r\n\r\n return promise;\r\n }\r\n\r\n public getHistoryStorage(peerId: PeerId, threadId?: number) {\r\n if(threadId) {\r\n // threadId = this.getLocalMessageId(threadId);\r\n if(!this.threadsStorage[peerId]) this.threadsStorage[peerId] = {};\r\n return this.threadsStorage[peerId][threadId] ?? (this.threadsStorage[peerId][threadId] = {count: null, history: new SlicedArray()});\r\n }\r\n\r\n return this.historiesStorage[peerId] ?? (this.historiesStorage[peerId] = {count: null, history: new SlicedArray()});\r\n }\r\n\r\n public getHistoryStorageTransferable(peerId: PeerId, threadId?: number) {\r\n const historyStorage = this.getHistoryStorage(peerId, threadId);\r\n const {\r\n count,\r\n history,\r\n maxId,\r\n readMaxId,\r\n readOutboxMaxId,\r\n maxOutId,\r\n replyMarkup\r\n } = historyStorage;\r\n\r\n return {\r\n count,\r\n history: undefined as HistoryStorage,\r\n historySerialized: history.toJSON(),\r\n maxId,\r\n readMaxId,\r\n readOutboxMaxId,\r\n maxOutId,\r\n replyMarkup\r\n };\r\n }\r\n\r\n private getNotifyPeerSettings(peerId: PeerId) {\r\n return Promise.all([\r\n this.appNotificationsManager.getNotifyPeerTypeSettings(),\r\n this.appNotificationsManager.getNotifySettings(this.appPeersManager.getInputNotifyPeerById(peerId, true))\r\n ]).then(([_, peerTypeNotifySettings]) => {\r\n return {\r\n muted: this.appNotificationsManager.isPeerLocalMuted(peerId, true),\r\n peerTypeNotifySettings\r\n };\r\n });\r\n }\r\n\r\n private handleNotifications = () => {\r\n ctx.clearTimeout(this.notificationsHandlePromise);\r\n this.notificationsHandlePromise = 0;\r\n\r\n // var timeout = $rootScope.idle.isIDLE && StatusManager.isOtherDeviceActive() ? 30000 : 1000;\r\n // const timeout = 1000;\r\n\r\n for(const _peerId in this.notificationsToHandle) {\r\n const peerId = _peerId.toPeerId();\r\n // if(rootScope.peerId === peerId && !rootScope.idle.isIDLE) {\r\n // continue;\r\n // }\r\n\r\n const notifyPeerToHandle = this.notificationsToHandle[peerId];\r\n this.getNotifyPeerSettings(peerId).then(({muted, peerTypeNotifySettings}) => {\r\n const topMessage = notifyPeerToHandle.topMessage;\r\n if((muted && !topMessage.pFlags.mentioned) || !topMessage.pFlags.unread) {\r\n return;\r\n }\r\n\r\n // setTimeout(() => {\r\n if(topMessage.pFlags.unread) {\r\n this.notifyAboutMessage(topMessage, {\r\n fwdCount: notifyPeerToHandle.fwdCount,\r\n peerTypeNotifySettings\r\n });\r\n }\r\n // }, timeout);\r\n });\r\n }\r\n\r\n this.notificationsToHandle = {};\r\n };\r\n\r\n private onUpdateMessageId = (update: Update.updateMessageID) => {\r\n const randomId = update.random_id;\r\n const pendingData = this.pendingByRandomId[randomId];\r\n // this.log('AMM updateMessageID:', update, pendingData);\r\n if(pendingData) {\r\n const {peerId, tempId, threadId, storage} = pendingData;\r\n const mid = generateMessageId(update.id);\r\n const message = this.getMessageFromStorage(storage, mid);\r\n if(message) {\r\n [this.getHistoryStorage(peerId), threadId ? this.getHistoryStorage(peerId, threadId) : undefined]\r\n .filter(Boolean)\r\n .forEach((storage) => {\r\n storage.history.delete(tempId);\r\n });\r\n\r\n this.finalizePendingMessageCallbacks(storage, tempId, message);\r\n } else {\r\n this.pendingByMessageId[mid] = randomId;\r\n }\r\n }\r\n };\r\n\r\n private onUpdateNewMessage = (update: Update.updateNewDiscussionMessage | Update.updateNewMessage | Update.updateNewChannelMessage) => {\r\n const message = update.message as MyMessage;\r\n const peerId = this.getMessagePeer(message);\r\n const storage = this.getHistoryMessagesStorage(peerId);\r\n const dialog = this.getDialogOnly(peerId);\r\n\r\n // * local update\r\n const isLocalThreadUpdate = update._ === 'updateNewDiscussionMessage';\r\n\r\n // * temporary save the message for info (peerId, reply mids...)\r\n this.saveMessages([message], {storage: this.createMessageStorage(peerId, 'history')});\r\n\r\n const threadKey = this.getThreadKey(message);\r\n const threadId = threadKey ? +threadKey.split('_')[1] : undefined;\r\n if(threadId && !isLocalThreadUpdate && this.threadsStorage[peerId] && this.threadsStorage[peerId][threadId]) {\r\n const update = {\r\n _: 'updateNewDiscussionMessage',\r\n message\r\n } as Update.updateNewDiscussionMessage;\r\n\r\n this.onUpdateNewMessage(update);\r\n }\r\n\r\n if(message._ === 'messageService' && message.action._ === 'messageActionPaymentSent' && message.reply_to) {\r\n this.rootScope.dispatchEvent('payment_sent', {\r\n peerId: message.reply_to.reply_to_peer_id ? this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : message.peerId,\r\n mid: message.reply_to_mid,\r\n receiptMessage: message\r\n });\r\n }\r\n\r\n if(!dialog && !isLocalThreadUpdate) {\r\n let good = true;\r\n if(peerId.isAnyChat()) {\r\n good = this.appChatsManager.isInChat(peerId.toChatId());\r\n }\r\n\r\n if(good) {\r\n const set = this.newUpdatesAfterReloadToHandle[peerId] ?? (this.newUpdatesAfterReloadToHandle[peerId] = new Set());\r\n if(set.has(update)) {\r\n this.log.error('here we go again', peerId);\r\n return;\r\n }\r\n\r\n (update as any).ignoreExisting = true;\r\n set.add(update);\r\n this.scheduleHandleNewDialogs(peerId);\r\n }\r\n\r\n return;\r\n }\r\n\r\n /* if(update._ === 'updateNewChannelMessage') {\r\n const chat = appChatsManager.getChat(peerId.toChatId());\r\n if(chat.pFlags && (chat.pFlags.left || chat.pFlags.kicked)) {\r\n return;\r\n }\r\n } */\r\n\r\n this.saveMessages([message], {storage});\r\n // this.log.warn(dT(), 'message unread', message.mid, message.pFlags.unread)\r\n\r\n /* if((message as Message.message).grouped_id) {\r\n this.log('updateNewMessage', message);\r\n } */\r\n\r\n const pendingMessage = this.checkPendingMessage(message);\r\n const historyStorage = this.getHistoryStorage(peerId, isLocalThreadUpdate ? threadId : undefined);\r\n\r\n if(!isLocalThreadUpdate) {\r\n this.updateMessageRepliesIfNeeded(message);\r\n }\r\n\r\n // * so message can exist if reloadConversation came back earlier with mid\r\n const ignoreExisting: boolean = (update as any).ignoreExisting;\r\n const isExisting = !!historyStorage.history.findSlice(message.mid);\r\n if(isExisting) {\r\n if(!ignoreExisting) {\r\n return false;\r\n }\r\n } else {\r\n // * catch situation with disconnect. if message's id is lower than we already have (in bottom end slice), will sort it\r\n const firstSlice = historyStorage.history.first;\r\n if(firstSlice.isEnd(SliceEnd.Bottom)) {\r\n let i = 0;\r\n for(const length = firstSlice.length; i < length; ++i) {\r\n if(message.mid > firstSlice[i]) {\r\n break;\r\n }\r\n }\r\n\r\n firstSlice.splice(i, 0, message.mid);\r\n } else {\r\n historyStorage.history.unshift(message.mid);\r\n }\r\n\r\n if(historyStorage.count !== null) {\r\n historyStorage.count++;\r\n }\r\n }\r\n\r\n if(this.mergeReplyKeyboard(historyStorage, message)) {\r\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\r\n }\r\n\r\n const fromId = message.fromId;\r\n if(fromId.isUser() && !message.pFlags.out && message.from_id) {\r\n this.appUsersManager.forceUserOnline(fromId, message.date);\r\n\r\n const action: SendMessageAction = {\r\n _: 'sendMessageCancelAction'\r\n };\r\n\r\n let update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping;\r\n if(peerId.isUser()) {\r\n update = {\r\n _: 'updateUserTyping',\r\n action,\r\n user_id: fromId\r\n };\r\n } else if(this.appPeersManager.isChannel(peerId)) {\r\n update = {\r\n _: 'updateChannelUserTyping',\r\n action,\r\n channel_id: peerId.toChatId(),\r\n from_id: this.appPeersManager.getOutputPeer(fromId),\r\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\r\n };\r\n } else {\r\n update = {\r\n _: 'updateChatUserTyping',\r\n action,\r\n chat_id: peerId.toChatId(),\r\n from_id: this.appPeersManager.getOutputPeer(fromId)\r\n };\r\n }\r\n\r\n this.apiUpdatesManager.processLocalUpdate(update);\r\n }\r\n\r\n // commented to render the message if it's been sent faster than history_append came to main thread\r\n // if(!pendingMessage) {\r\n this.handleNewMessage(message);\r\n // }\r\n\r\n if(isLocalThreadUpdate) {\r\n return;\r\n }\r\n\r\n const inboxUnread = !message.pFlags.out && message.pFlags.unread;\r\n if(dialog) {\r\n if(inboxUnread && message.mid > dialog.top_message) {\r\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\r\n\r\n ++dialog.unread_count;\r\n if(message.pFlags.mentioned) {\r\n ++dialog.unread_mentions_count;\r\n this.modifyCachedMentions(peerId, message.mid, true);\r\n }\r\n\r\n releaseUnreadCount();\r\n }\r\n\r\n if(message.mid >= dialog.top_message) {\r\n this.setDialogTopMessage(message, dialog);\r\n }\r\n }\r\n\r\n if(inboxUnread/* && ($rootScope.selectedPeerID != peerID || $rootScope.idle.isIDLE) */) {\r\n const notifyPeer = peerId;\r\n let notifyPeerToHandle = this.notificationsToHandle[notifyPeer];\r\n if(notifyPeerToHandle === undefined) {\r\n notifyPeerToHandle = this.notificationsToHandle[notifyPeer] = {\r\n fwdCount: 0,\r\n fromId: NULL_PEER_ID\r\n };\r\n }\r\n\r\n if(notifyPeerToHandle.fromId !== fromId) {\r\n notifyPeerToHandle.fromId = fromId;\r\n notifyPeerToHandle.fwdCount = 0;\r\n }\r\n\r\n if((message as Message.message).fwd_from) {\r\n ++notifyPeerToHandle.fwdCount;\r\n }\r\n\r\n notifyPeerToHandle.topMessage = message;\r\n\r\n if(!this.notificationsHandlePromise) {\r\n this.notificationsHandlePromise = ctx.setTimeout(this.handleNotifications, 0);\r\n }\r\n }\r\n };\r\n\r\n private onUpdateMessageReactions = (update: Update.updateMessageReactions) => {\r\n const {peer, msg_id, reactions} = update;\r\n const mid = generateMessageId(msg_id);\r\n const peerId = this.appPeersManager.getPeerId(peer);\r\n const message: MyMessage = this.getMessageByPeer(peerId, mid);\r\n\r\n if(message?._ !== 'message') {\r\n return;\r\n }\r\n\r\n const recentReactions = reactions?.recent_reactions;\r\n if(recentReactions?.length && message.pFlags.out) {\r\n const recentReaction = recentReactions[recentReactions.length - 1];\r\n const previousReactions = message.reactions;\r\n const previousRecentReactions = previousReactions?.recent_reactions;\r\n if(\r\n this.appPeersManager.getPeerId(recentReaction.peer_id) !== this.appPeersManager.peerId && (\r\n !previousRecentReactions ||\r\n previousRecentReactions.length <= recentReactions.length\r\n ) && (\r\n !previousRecentReactions ||\r\n !deepEqual(recentReaction, previousRecentReactions[previousRecentReactions.length - 1])\r\n )\r\n ) {\r\n this.getNotifyPeerSettings(peerId).then(({muted, peerTypeNotifySettings}) => {\r\n if(/* muted || */!peerTypeNotifySettings.show_previews) return;\r\n this.notifyAboutMessage(message, {\r\n peerReaction: recentReaction,\r\n peerTypeNotifySettings\r\n });\r\n });\r\n }\r\n }\r\n\r\n const key = message.peerId + '_' + message.mid;\r\n this.pushBatchUpdate('messages_reactions', this.batchUpdateReactions, key, () => copy(message.reactions));\r\n\r\n message.reactions = reactions;\r\n\r\n if(!update.local) {\r\n this.setDialogToStateIfMessageIsTop(message);\r\n }\r\n };\r\n\r\n private onUpdateDialogUnreadMark = (update: Update.updateDialogUnreadMark) => {\r\n // this.log('updateDialogUnreadMark', update);\r\n const peerId = this.appPeersManager.getPeerId((update.peer as DialogPeer.dialogPeer).peer);\r\n const dialog = this.getDialogOnly(peerId);\r\n\r\n if(!dialog) {\r\n this.scheduleHandleNewDialogs(peerId);\r\n } else {\r\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\r\n\r\n if(!update.pFlags.unread) {\r\n delete dialog.pFlags.unread_mark;\r\n } else {\r\n dialog.pFlags.unread_mark = true;\r\n }\r\n\r\n releaseUnreadCount();\r\n this.dialogsStorage.setDialogToState(dialog);\r\n this.rootScope.dispatchEvent('dialogs_multiupdate', new Map([[peerId, dialog]]));\r\n }\r\n };\r\n\r\n private onUpdateEditMessage = (update: Update.updateEditMessage | Update.updateEditChannelMessage) => {\r\n const message = update.message as MyMessage;\r\n const peerId = this.getMessagePeer(message);\r\n const mid = generateMessageId(message.id);\r\n const storage = this.getHistoryMessagesStorage(peerId);\r\n if(!storage.has(mid)) {\r\n // this.fixDialogUnreadMentionsIfNoMessage(peerId);\r\n return;\r\n }\r\n\r\n // console.trace(dT(), 'edit message', message)\r\n\r\n const oldMessage: Message = this.getMessageFromStorage(storage, mid);\r\n this.saveMessages([message], {storage});\r\n const newMessage: Message = this.getMessageFromStorage(storage, mid);\r\n\r\n this.handleEditedMessage(oldMessage, newMessage, storage);\r\n\r\n const dialog = this.getDialogOnly(peerId);\r\n\r\n // if sender erased mention\r\n /* if(dialog.unread_mentions_count && (oldMessage as Message.message)?.pFlags?.mentioned && !message.pFlags.mentioned) {\r\n --dialog.unread_mentions_count;\r\n this.modifyCachedMentions(peerId, mid, false);\r\n } */\r\n\r\n const isTopMessage = dialog && dialog.top_message === mid;\r\n if((message as Message.messageService).clear_history) {\r\n if(isTopMessage) {\r\n this.rootScope.dispatchEvent('dialog_flush', {peerId, dialog});\r\n }\r\n } else {\r\n let dispatchEditEvent = true;\r\n // no sense in dispatching message_edit since only reactions have changed\r\n if(oldMessage?._ === 'message' && !deepEqual(oldMessage.reactions, (newMessage as Message.message).reactions)) {\r\n const newReactions = (newMessage as Message.message).reactions;\r\n (newMessage as Message.message).reactions = oldMessage.reactions;\r\n this.apiUpdatesManager.processLocalUpdate({\r\n _: 'updateMessageReactions',\r\n peer: this.appPeersManager.getOutputPeer(peerId),\r\n msg_id: message.id,\r\n reactions: newReactions\r\n });\r\n\r\n dispatchEditEvent = false;\r\n }\r\n\r\n dispatchEditEvent && this.rootScope.dispatchEvent('message_edit', {\r\n storageKey: storage.key,\r\n peerId,\r\n mid,\r\n message\r\n });\r\n\r\n if(isTopMessage) {\r\n this.dialogsStorage.setDialogToState(dialog);\r\n }\r\n\r\n if((isTopMessage || (message as Message.message).grouped_id) && dialog) {\r\n this.rootScope.dispatchEvent('dialogs_multiupdate', new Map([[peerId, dialog]]));\r\n }\r\n }\r\n };\r\n\r\n private onUpdateReadHistory = (update: Update.updateReadChannelDiscussionInbox | Update.updateReadChannelDiscussionOutbox\r\n | Update.updateReadHistoryInbox | Update.updateReadHistoryOutbox\r\n | Update.updateReadChannelInbox | Update.updateReadChannelOutbox) => {\r\n const channelId = (update as Update.updateReadChannelInbox).channel_id;\r\n const maxId = generateMessageId((update as Update.updateReadChannelInbox).max_id || (update as Update.updateReadChannelDiscussionInbox).read_max_id);\r\n const threadId = generateMessageId((update as Update.updateReadChannelDiscussionInbox).top_msg_id);\r\n const peerId = channelId ? channelId.toPeerId(true) : this.appPeersManager.getPeerId((update as Update.updateReadHistoryInbox).peer);\r\n\r\n const isOut = update._ === 'updateReadHistoryOutbox' || update._ === 'updateReadChannelOutbox' || update._ === 'updateReadChannelDiscussionOutbox' ? true : undefined;\r\n\r\n const storage = this.getHistoryMessagesStorage(peerId);\r\n const history = getObjectKeysAndSort(storage, 'desc');\r\n const foundDialog = this.getDialogOnly(peerId);\r\n const stillUnreadCount = (update as Update.updateReadChannelInbox).still_unread_count;\r\n let newUnreadCount = 0;\r\n let newUnreadMentionsCount = 0;\r\n let foundAffected = false;\r\n\r\n // this.log.warn(dT(), 'read', peerId, isOut ? 'out' : 'in', maxId)\r\n\r\n const historyStorage = this.getHistoryStorage(peerId, threadId);\r\n\r\n if(peerId.isUser() && isOut) {\r\n this.appUsersManager.forceUserOnline(peerId);\r\n }\r\n\r\n if(threadId) {\r\n const repliesKey = this.threadsToReplies[peerId + '_' + threadId];\r\n if(repliesKey) {\r\n const [peerId, mid] = repliesKey.split('_');\r\n this.updateMessage(peerId.toPeerId(), +mid, 'replies_updated');\r\n }\r\n }\r\n\r\n const releaseUnreadCount = !threadId && foundDialog && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\r\n\r\n for(let i = 0, length = history.length; i < length; i++) {\r\n const mid = history[i];\r\n if(mid > maxId) {\r\n continue;\r\n }\r\n\r\n const message: MyMessage = storage.get(mid);\r\n\r\n if(message.pFlags.out !== isOut) {\r\n continue;\r\n }\r\n\r\n if(!message.pFlags.unread) {\r\n break;\r\n }\r\n\r\n if(threadId) {\r\n const replyTo = message.reply_to;\r\n if(!replyTo || (replyTo.reply_to_top_id || replyTo.reply_to_msg_id) !== threadId) {\r\n continue;\r\n }\r\n }\r\n\r\n // this.log.warn('read', messageId, message.pFlags.unread, message)\r\n if(message.pFlags.unread) {\r\n delete message.pFlags.unread;\r\n if(!foundAffected) {\r\n foundAffected = true;\r\n }\r\n\r\n if(!message.pFlags.out && !threadId && foundDialog) {\r\n if(stillUnreadCount === undefined) {\r\n newUnreadCount = --foundDialog.unread_count;\r\n }\r\n\r\n if(message.pFlags.mentioned) {\r\n newUnreadMentionsCount = --foundDialog.unread_mentions_count;\r\n this.modifyCachedMentions(peerId, message.mid, false);\r\n }\r\n }\r\n\r\n this.rootScope.dispatchEvent('notification_cancel', 'msg' + mid);\r\n }\r\n }\r\n\r\n if(isOut) historyStorage.readOutboxMaxId = maxId;\r\n else historyStorage.readMaxId = maxId;\r\n\r\n if(!threadId && foundDialog) {\r\n if(isOut) foundDialog.read_outbox_max_id = maxId;\r\n else foundDialog.read_inbox_max_id = maxId;\r\n\r\n if(!isOut) {\r\n let setCount: number;\r\n if(stillUnreadCount !== undefined) {\r\n setCount = stillUnreadCount;\r\n } else if(newUnreadCount < 0 || !this.getReadMaxIdIfUnread(peerId)) {\r\n setCount = 0;\r\n } else if(newUnreadCount && foundDialog.top_message > maxId) {\r\n setCount = newUnreadCount;\r\n }\r\n\r\n if(setCount !== undefined) {\r\n foundDialog.unread_count = setCount;\r\n }\r\n\r\n if(newUnreadMentionsCount < 0 || !foundDialog.unread_count) {\r\n foundDialog.unread_mentions_count = 0;\r\n }\r\n }\r\n\r\n if(releaseUnreadCount) {\r\n releaseUnreadCount();\r\n }\r\n\r\n this.dialogsStorage.processDialogForFilters(foundDialog);\r\n\r\n this.rootScope.dispatchEvent('dialog_unread', {peerId, dialog: foundDialog});\r\n this.dialogsStorage.setDialogToState(foundDialog);\r\n }\r\n\r\n if(foundAffected) {\r\n this.rootScope.dispatchEvent('messages_read');\r\n }\r\n\r\n if(!threadId && channelId) {\r\n const threadKeyPart = peerId + '_';\r\n for(const threadKey in this.threadsToReplies) {\r\n if(threadKey.indexOf(threadKeyPart) === 0) {\r\n const [peerId, mid] = this.threadsToReplies[threadKey].split('_');\r\n this.rootScope.dispatchEvent('replies_updated', this.getMessageByPeer(peerId.toPeerId(), +mid) as Message.message);\r\n }\r\n }\r\n }\r\n };\r\n\r\n private onUpdateReadMessagesContents = (update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents) => {\r\n const channelId = (update as Update.updateChannelReadMessagesContents).channel_id;\r\n const mids = (update as Update.updateReadMessagesContents).messages.map((id) => generateMessageId(id));\r\n const peerId = channelId ? channelId.toPeerId(true) : this.findPeerIdByMids(mids);\r\n for(let i = 0, length = mids.length; i < length; ++i) {\r\n const mid = mids[i];\r\n const message: MyMessage = this.getMessageByPeer(peerId, mid);\r\n if(message) {\r\n if(message.pFlags.media_unread) {\r\n delete message.pFlags.media_unread;\r\n this.setDialogToStateIfMessageIsTop(message);\r\n\r\n if(!message.pFlags.out && message.pFlags.mentioned) {\r\n this.modifyCachedMentions(peerId, mid, false);\r\n }\r\n }\r\n } else {\r\n this.fixDialogUnreadMentionsIfNoMessage(peerId);\r\n }\r\n }\r\n\r\n this.rootScope.dispatchEvent('messages_media_read', {peerId, mids});\r\n };\r\n\r\n private onUpdateChannelAvailableMessages = (update: Update.updateChannelAvailableMessages) => {\r\n const peerId = update.channel_id.toPeerId(true);\r\n const history = this.getHistoryStorage(peerId).history.slice;\r\n const availableMinId = generateMessageId(update.available_min_id);\r\n const messages = history.filter((mid) => mid <= availableMinId);\r\n\r\n (update as any as Update.updateDeleteChannelMessages).messages = messages;\r\n this.onUpdateDeleteMessages(update as any as Update.updateDeleteChannelMessages);\r\n };\r\n\r\n private onUpdateDeleteMessages = (update: Update.updateDeleteMessages | Update.updateDeleteChannelMessages) => {\r\n const channelId = (update as Update.updateDeleteChannelMessages).channel_id;\r\n // const messages = (update as any as Update.updateDeleteChannelMessages).messages;\r\n const messages = (update as any as Update.updateDeleteChannelMessages).messages.map((id) => generateMessageId(id));\r\n const peerId: PeerId = channelId ? channelId.toPeerId(true) : this.findPeerIdByMids(messages);\r\n\r\n if(!peerId) {\r\n return;\r\n }\r\n\r\n this.apiManager.clearCache('messages.getSearchCounters', (params) => {\r\n return this.appPeersManager.getPeerId(params.peer) === peerId;\r\n });\r\n\r\n const threadKeys: Set<string> = new Set();\r\n for(const mid of messages) {\r\n const message = this.getMessageByPeer(peerId, mid);\r\n const threadKey = this.getThreadKey(message);\r\n if(threadKey && this.threadsStorage[peerId] && this.threadsStorage[peerId][+threadKey.split('_')[1]]) {\r\n threadKeys.add(threadKey);\r\n }\r\n }\r\n\r\n const historyUpdated = this.handleDeletedMessages(peerId, this.getHistoryMessagesStorage(peerId), messages);\r\n\r\n const threadsStorages = Array.from(threadKeys).map((threadKey) => {\r\n const [peerId, mid] = threadKey.split('_');\r\n return this.getHistoryStorage(peerId.toPeerId(), +mid);\r\n });\r\n\r\n const historyStorage = this.getHistoryStorage(peerId);\r\n [historyStorage].concat(threadsStorages).forEach((historyStorage) => {\r\n for(const mid of historyUpdated.msgs) {\r\n historyStorage.history.delete(mid);\r\n }\r\n\r\n if(historyUpdated.count && historyStorage.count) {\r\n historyStorage.count = Math.max(0, historyStorage.count - historyUpdated.count);\r\n }\r\n });\r\n\r\n this.rootScope.dispatchEvent('history_delete', {peerId, msgs: historyUpdated.msgs});\r\n\r\n const foundDialog = this.getDialogOnly(peerId);\r\n if(foundDialog) {\r\n const affected = historyUpdated.unreadMentions || historyUpdated.unread;\r\n const releaseUnreadCount = affected && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\r\n\r\n if(historyUpdated.unread) {\r\n foundDialog.unread_count = Math.max(0, foundDialog.unread_count - historyUpdated.unread);\r\n }\r\n\r\n if(historyUpdated.unreadMentions) {\r\n foundDialog.unread_mentions_count = !foundDialog.unread_count ? 0 : Math.max(0, foundDialog.unread_mentions_count - historyUpdated.unreadMentions);\r\n }\r\n\r\n if(affected) {\r\n releaseUnreadCount();\r\n this.rootScope.dispatchEvent('dialog_unread', {peerId, dialog: foundDialog});\r\n }\r\n\r\n if(historyUpdated.msgs.has(foundDialog.top_message)) {\r\n const slice = historyStorage.history.first;\r\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\r\n const mid = slice[0];\r\n const message = this.getMessageByPeer(peerId, mid);\r\n this.setDialogTopMessage(message, foundDialog);\r\n } else {\r\n this.reloadConversation(peerId);\r\n }\r\n }\r\n }\r\n };\r\n\r\n private onUpdateChannel = (update: Update.updateChannel) => {\r\n const channelId = update.channel_id;\r\n const peerId = channelId.toPeerId(true);\r\n const channel: Chat.channel = this.appChatsManager.getChat(channelId);\r\n\r\n const needDialog = this.appChatsManager.isInChat(channelId);\r\n\r\n const canViewHistory = !!channel.username || !channel.pFlags.left;\r\n const hasHistory = this.historiesStorage[peerId] !== undefined;\r\n\r\n if(canViewHistory !== hasHistory) {\r\n delete this.historiesStorage[peerId];\r\n this.rootScope.dispatchEvent('history_forbidden', peerId);\r\n }\r\n\r\n const dialog = this.getDialogOnly(peerId);\r\n if(!!dialog !== needDialog) {\r\n if(needDialog) {\r\n this.reloadConversation(peerId);\r\n } else {\r\n this.dialogsStorage.dropDialogOnDeletion(peerId);\r\n }\r\n }\r\n\r\n this.rootScope.dispatchEvent('channel_update', channelId);\r\n };\r\n\r\n private onUpdateChannelReload = (update: Update.updateChannelReload) => {\r\n const peerId = update.channel_id.toPeerId(true);\r\n\r\n this.flushStoragesByPeerId(peerId);\r\n this.reloadConversation(peerId).then(() => {\r\n this.rootScope.dispatchEvent('history_reload', peerId);\r\n });\r\n };\r\n\r\n private onUpdateChannelMessageViews = (update: Update.updateChannelMessageViews) => {\r\n const views = update.views;\r\n const peerId = update.channel_id.toPeerId(true);\r\n const mid = generateMessageId(update.id);\r\n const message = this.getMessageByPeer(peerId, mid) as Message.message;\r\n if(message?.views !== undefined && message.views < views) {\r\n message.views = views;\r\n this.pushBatchUpdate('messages_views', this.batchUpdateViews, message.peerId + '_' + message.mid);\r\n this.setDialogToStateIfMessageIsTop(message);\r\n }\r\n };\r\n\r\n private onUpdateServiceNotification = (update: Update.updateServiceNotification) => {\r\n // this.log('updateServiceNotification', update);\r\n if(update.pFlags?.popup) {\r\n this.rootScope.dispatchEvent('service_notification', update);\r\n return;\r\n }\r\n\r\n const fromId = SERVICE_PEER_ID;\r\n const peerId = fromId;\r\n const messageId = this.generateTempMessageId(peerId);\r\n const message: Message.message = {\r\n _: 'message',\r\n id: messageId,\r\n from_id: this.appPeersManager.getOutputPeer(fromId),\r\n peer_id: this.appPeersManager.getOutputPeer(peerId),\r\n pFlags: {unread: true},\r\n date: (update.inbox_date || tsNow(true)) + this.timeManager.getServerTimeOffset(),\r\n message: update.message,\r\n media: update.media,\r\n entities: update.entities\r\n };\r\n if(!this.appUsersManager.hasUser(fromId)) {\r\n this.appUsersManager.saveApiUsers([{\r\n _: 'user',\r\n id: fromId,\r\n pFlags: {verified: true},\r\n access_hash: '0',\r\n first_name: 'Telegram',\r\n phone: '42777'\r\n }]);\r\n }\r\n this.saveMessages([message], {isOutgoing: true});\r\n\r\n if(update.inbox_date) {\r\n this.pendingTopMsgs[peerId] = messageId;\r\n this.onUpdateNewMessage({\r\n _: 'updateNewMessage',\r\n message,\r\n pts: undefined,\r\n pts_count: undefined\r\n });\r\n }\r\n };\r\n\r\n private onUpdatePinnedMessages = (update: Update.updatePinnedMessages | Update.updatePinnedChannelMessages) => {\r\n const channelId = update._ === 'updatePinnedChannelMessages' ? update.channel_id : undefined;\r\n const peerId = channelId ? channelId.toPeerId(true) : this.appPeersManager.getPeerId((update as Update.updatePinnedMessages).peer);\r\n\r\n /* const storage = this.getSearchStorage(peerId, 'inputMessagesFilterPinned');\r\n if(storage.count !== storage.history.length) {\r\n if(storage.count !== undefined) {\r\n delete this.searchesStorage[peerId]['inputMessagesFilterPinned'];\r\n }\r\n\r\n rootScope.broadcast('peer_pinned_messages', peerId);\r\n break;\r\n } */\r\n\r\n const messages = update.messages.map((id) => generateMessageId(id));\r\n\r\n const storage = this.getHistoryMessagesStorage(peerId);\r\n const missingMessages = messages.filter((mid) => !storage.has(mid));\r\n const getMissingPromise = missingMessages.length ? Promise.all(missingMessages.map((mid) => this.reloadMessages(peerId, mid))) : Promise.resolve();\r\n getMissingPromise.finally(() => {\r\n const werePinned = update.pFlags?.pinned;\r\n if(werePinned) {\r\n for(const mid of messages) {\r\n // storage.history.push(mid);\r\n const message = storage.get(mid) as Message.message;\r\n message.pFlags.pinned = true;\r\n }\r\n\r\n /* if(this.pinnedMessages[peerId]?.maxId) {\r\n const maxMid = Math.max(...messages);\r\n this.pinnedMessages\r\n } */\r\n\r\n // storage.history.sort((a, b) => b - a);\r\n } else {\r\n for(const mid of messages) {\r\n // storage.history.findAndSplice((_mid) => _mid === mid);\r\n const message = storage.get(mid) as Message.message;\r\n delete message.pFlags.pinned;\r\n }\r\n }\r\n\r\n /* const info = this.pinnedMessages[peerId];\r\n if(info) {\r\n info.count += messages.length * (werePinned ? 1 : -1);\r\n } */\r\n\r\n delete this.pinnedMessages[peerId];\r\n this.appStateManager.getState().then((state) => {\r\n delete state.hiddenPinnedMessages[peerId];\r\n this.rootScope.dispatchEvent('peer_pinned_messages', {peerId, mids: messages, pinned: werePinned});\r\n });\r\n });\r\n };\r\n\r\n private onUpdateNotifySettings = (update: Update.updateNotifySettings) => {\r\n const {peer, notify_settings} = update;\r\n if(peer._ === 'notifyPeer') {\r\n const peerId = this.appPeersManager.getPeerId((peer as NotifyPeer.notifyPeer).peer);\r\n\r\n const dialog = this.getDialogOnly(peerId);\r\n if(dialog) {\r\n dialog.notify_settings = notify_settings;\r\n this.rootScope.dispatchEvent('dialog_notify_settings', dialog);\r\n this.dialogsStorage.setDialogToState(dialog);\r\n }\r\n }\r\n };\r\n\r\n private onUpdateNewScheduledMessage = (update: Update.updateNewScheduledMessage) => {\r\n const message = update.message as MyMessage;\r\n const peerId = this.getMessagePeer(message);\r\n\r\n const storage = this.scheduledMessagesStorage[peerId];\r\n if(!storage) {\r\n return;\r\n }\r\n\r\n const mid = generateMessageId(message.id);\r\n\r\n const oldMessage = this.getMessageFromStorage(storage, mid);\r\n this.saveMessages([message], {storage, isScheduled: true});\r\n const newMessage = this.getMessageFromStorage(storage, mid);\r\n\r\n if(oldMessage) {\r\n this.handleEditedMessage(oldMessage, newMessage, storage);\r\n this.rootScope.dispatchEvent('message_edit', {storageKey: storage.key, peerId, mid: message.mid, message});\r\n } else {\r\n const pendingMessage = this.checkPendingMessage(message);\r\n if(!pendingMessage) {\r\n this.rootScope.dispatchEvent('scheduled_new', message as Message.message);\r\n }\r\n }\r\n };\r\n\r\n private onUpdateDeleteScheduledMessages = (update: Update.updateDeleteScheduledMessages) => {\r\n const peerId = this.appPeersManager.getPeerId(update.peer);\r\n\r\n const storage = this.scheduledMessagesStorage[peerId];\r\n if(storage) {\r\n const mids = update.messages.map((id) => generateMessageId(id));\r\n this.handleDeletedMessages(peerId, storage, mids);\r\n\r\n this.rootScope.dispatchEvent('scheduled_delete', {peerId, mids});\r\n }\r\n };\r\n\r\n private onUpdateMessageExtendedMedia = (update: Update.updateMessageExtendedMedia) => {\r\n const peerId = this.appPeersManager.getPeerId(update.peer);\r\n const mid = generateMessageId(update.msg_id);\r\n const storage = this.getHistoryMessagesStorage(peerId);\r\n if(!storage.has(mid)) {\r\n // this.fixDialogUnreadMentionsIfNoMessage(peerId);\r\n return;\r\n }\r\n\r\n const message = this.getMessageFromStorage(storage, mid) as Message.message;\r\n const messageMedia = message.media as MessageMedia.messageMediaInvoice;\r\n if(messageMedia.extended_media?._ === 'messageExtendedMedia') {\r\n return;\r\n }\r\n\r\n messageMedia.extended_media = update.extended_media;\r\n this.onUpdateEditMessage({\r\n _: 'updateEditMessage',\r\n message,\r\n pts: 0,\r\n pts_count: 0\r\n });\r\n };\r\n\r\n public setDialogToStateIfMessageIsTop(message: MyMessage) {\r\n if(this.isMessageIsTopMessage(message)) {\r\n this.dialogsStorage.setDialogToState(this.getDialogOnly(message.peerId));\r\n }\r\n }\r\n\r\n public isMessageIsTopMessage(message: MyMessage) {\r\n const dialog = this.getDialogOnly(message.peerId);\r\n return dialog && dialog.top_message === message.mid;\r\n }\r\n\r\n private updateMessageRepliesIfNeeded(threadMessage: MyMessage) {\r\n try { // * на всякий случай, скорее всего это не понадобится\r\n const threadKey = this.getThreadKey(threadMessage);\r\n if(threadKey) {\r\n const repliesKey = this.threadsToReplies[threadKey];\r\n if(repliesKey) {\r\n const [peerId, mid] = repliesKey.split('_');\r\n\r\n this.updateMessage(peerId.toPeerId(), +mid, 'replies_updated');\r\n }\r\n }\r\n } catch(err) {\r\n this.log.error('incrementMessageReplies err', err, threadMessage);\r\n }\r\n }\r\n\r\n private getThreadKey(threadMessage: MyMessage) {\r\n let threadKey = '';\r\n if(threadMessage?.reply_to && threadMessage.peerId?.isAnyChat()) {\r\n const threadId = threadMessage.reply_to.reply_to_top_id || threadMessage.reply_to.reply_to_msg_id;\r\n threadKey = threadMessage.peerId + '_' + threadId;\r\n }\r\n\r\n return threadKey;\r\n }\r\n\r\n public updateMessage(peerId: PeerId, mid: number, broadcastEventName?: 'replies_updated'): Promise<Message.message> {\r\n const promise: Promise<Message.message> = this.reloadMessages(peerId, mid, true).then(() => {\r\n const message = this.getMessageByPeer(peerId, mid) as Message.message;\r\n if(!message) {\r\n return;\r\n }\r\n\r\n if(broadcastEventName) {\r\n this.rootScope.dispatchEvent(broadcastEventName, message);\r\n }\r\n\r\n return message;\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n private checkPendingMessage(message: MyMessage) {\r\n const randomId = this.pendingByMessageId[message.mid];\r\n let pendingMessage: ReturnType<AppMessagesManager['finalizePendingMessage']>;\r\n if(randomId) {\r\n const pendingData = this.pendingByRandomId[randomId];\r\n if(pendingMessage = this.finalizePendingMessage(randomId, message)) {\r\n this.rootScope.dispatchEvent('history_update', {storageKey: pendingData.storage.key, message, sequential: pendingData.sequential});\r\n }\r\n\r\n delete this.pendingByMessageId[message.mid];\r\n }\r\n\r\n return pendingMessage;\r\n }\r\n\r\n public mutePeer(peerId: PeerId, muteUntil: number) {\r\n const settings: InputPeerNotifySettings = {\r\n _: 'inputPeerNotifySettings'\r\n };\r\n\r\n settings.mute_until = muteUntil;\r\n\r\n return this.appNotificationsManager.updateNotifySettings({\r\n _: 'inputNotifyPeer',\r\n peer: this.appPeersManager.getInputPeerById(peerId)\r\n }, settings);\r\n }\r\n\r\n public togglePeerMute(peerId: PeerId, mute?: boolean) {\r\n if(mute === undefined) {\r\n mute = !this.appNotificationsManager.isPeerLocalMuted(peerId, false);\r\n }\r\n\r\n return this.mutePeer(peerId, mute ? MUTE_UNTIL : 0);\r\n }\r\n\r\n private findPeerIdByMids(mids: number[]) {\r\n for(let length = mids.length, i = length - 1; i >= 0; --i) {\r\n const mid = mids[i];\r\n const message = this.getMessageById(mid);\r\n if(message) {\r\n return message.peerId;\r\n }\r\n }\r\n }\r\n\r\n public canSendToPeer(peerId: PeerId, threadId?: number, action: ChatRights = 'send_messages') {\r\n if(this.appPeersManager.isRestricted(peerId)) {\r\n return false;\r\n }\r\n\r\n if(peerId.isAnyChat()) {\r\n // const isChannel = appPeersManager.isChannel(peerId);\r\n const chat: Chat.chat = this.appChatsManager.getChat(peerId.toChatId());\r\n const hasRights = /* isChannel && */this.appChatsManager.hasRights(peerId.toChatId(), action, undefined, !!threadId);\r\n return /* !isChannel || */hasRights && (!chat.pFlags.left || !!threadId);\r\n } else {\r\n return this.appUsersManager.canSendToUser(peerId);\r\n }\r\n }\r\n\r\n public finalizePendingMessage(randomId: Long, finalMessage: MyMessage) {\r\n const pendingData = this.pendingByRandomId[randomId];\r\n // this.log('pdata', randomID, pendingData)\r\n\r\n if(pendingData) {\r\n const {peerId, tempId, threadId, storage} = pendingData;\r\n\r\n [this.getHistoryStorage(peerId), threadId ? this.getHistoryStorage(peerId, threadId) : undefined]\r\n .filter(Boolean)\r\n .forEach((storage) => {\r\n storage.history.delete(tempId);\r\n });\r\n\r\n // this.log('pending', randomID, historyStorage.pending)\r\n\r\n const tempMessage: MyMessage = this.getMessageFromStorage(storage, tempId);\r\n if(tempMessage) {\r\n delete finalMessage.pFlags.is_outgoing;\r\n delete finalMessage.pending;\r\n delete finalMessage.error;\r\n delete finalMessage.random_id;\r\n delete finalMessage.send;\r\n }\r\n\r\n this.rootScope.dispatchEvent('messages_pending');\r\n\r\n delete this.pendingByRandomId[randomId];\r\n\r\n this.finalizePendingMessageCallbacks(storage, tempId, finalMessage);\r\n\r\n return tempMessage;\r\n }\r\n }\r\n\r\n public finalizePendingMessageCallbacks(storage: MessagesStorage, tempId: number, message: MyMessage) {\r\n const callbacks = this.tempFinalizeCallbacks[tempId];\r\n // this.log.warn(callbacks, tempId);\r\n if(callbacks !== undefined) {\r\n for(const name in callbacks) {\r\n const {deferred, callback} = callbacks[name];\r\n // this.log(`finalizePendingMessageCallbacks: will invoke ${name} callback`);\r\n callback(message).then(deferred.resolve, deferred.reject);\r\n }\r\n\r\n delete this.tempFinalizeCallbacks[tempId];\r\n }\r\n\r\n // set cached url to media\r\n if((message as Message.message).media) {\r\n assumeType<Message.message>(message);\r\n const {photo: newPhoto, document: newDoc} = message.media as any;\r\n if(newPhoto) {\r\n const photo = this.appPhotosManager.getPhoto('' + tempId);\r\n if(/* photo._ !== 'photoEmpty' */photo) {\r\n const newPhotoSize = newPhoto.sizes[newPhoto.sizes.length - 1];\r\n const cacheContext = this.thumbsStorage.getCacheContext(newPhoto, newPhotoSize.type);\r\n const oldCacheContext = this.thumbsStorage.getCacheContext(photo, THUMB_TYPE_FULL);\r\n Object.assign(cacheContext, oldCacheContext);\r\n\r\n const photoSize = newPhoto.sizes[newPhoto.sizes.length - 1] as PhotoSize.photoSize;\r\n\r\n const downloadOptions = getPhotoDownloadOptions(newPhoto, photoSize);\r\n const fileName = getFileNameByLocation(downloadOptions.location);\r\n // this.appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\r\n }\r\n } else if(newDoc) {\r\n const oldDoc = this.appDocsManager.getDoc('' + tempId);\r\n if(oldDoc) {\r\n const oldCacheContext = this.thumbsStorage.getCacheContext(oldDoc);\r\n if(\r\n /* doc._ !== 'documentEmpty' && */\r\n oldDoc.type &&\r\n oldDoc.type !== 'sticker' &&\r\n oldDoc.mime_type !== 'image/gif' &&\r\n oldCacheContext.url\r\n ) {\r\n const cacheContext = this.thumbsStorage.getCacheContext(newDoc);\r\n Object.assign(cacheContext, oldCacheContext);\r\n\r\n const fileName = getDocumentInputFileName(newDoc);\r\n // this.appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\r\n }\r\n }\r\n } else if((message.media as MessageMedia.messageMediaPoll).poll) {\r\n delete this.appPollsManager.polls[tempId];\r\n delete this.appPollsManager.results[tempId];\r\n }\r\n }\r\n\r\n const tempMessage = this.getMessageFromStorage(storage, tempId);\r\n storage.delete(tempId);\r\n\r\n if(!(tempMessage as Message.message).reply_markup && (message as Message.message).reply_markup) {\r\n setTimeout(() => { // TODO: refactor it to normal buttons adding\r\n if(!this.getMessageFromStorage(storage, message.mid)) {\r\n return;\r\n }\r\n\r\n this.rootScope.dispatchEvent('message_edit', {storageKey: storage.key, peerId: message.peerId, mid: message.mid, message});\r\n }, 0);\r\n }\r\n\r\n this.handleReleasingMessage(tempMessage, storage);\r\n\r\n this.rootScope.dispatchEvent('message_sent', {storageKey: storage.key, tempId, tempMessage, mid: message.mid, message});\r\n }\r\n\r\n public incrementMaxSeenId(maxId: number) {\r\n if(!maxId || !(!this.maxSeenId || maxId > this.maxSeenId)) {\r\n return false;\r\n }\r\n\r\n this.maxSeenId = maxId;\r\n this.appStateManager.pushToState('maxSeenMsgId', maxId);\r\n\r\n this.apiManager.invokeApi('messages.receivedMessages', {\r\n max_id: getServerMessageId(maxId)\r\n });\r\n }\r\n\r\n public async getMessageReactionsListAndReadParticipants(\r\n message: Message.message,\r\n limit?: number,\r\n reaction?: Reaction,\r\n offset?: string,\r\n skipReadParticipants?: boolean,\r\n skipReactionsList?: boolean\r\n ) {\r\n const emptyMessageReactionsList = {\r\n reactions: [] as MessagePeerReaction[],\r\n count: 0,\r\n next_offset: undefined as string\r\n };\r\n\r\n const canViewMessageReadParticipants = await this.canViewMessageReadParticipants(message);\r\n if(canViewMessageReadParticipants && limit === undefined) {\r\n limit = 100;\r\n } else if(limit === undefined) {\r\n limit = 50;\r\n }\r\n\r\n return Promise.all([\r\n canViewMessageReadParticipants && !reaction && !skipReadParticipants ? this.getMessageReadParticipants(message.peerId, message.mid).catch(() => [] as UserId[]) : [] as UserId[],\r\n\r\n message.reactions?.recent_reactions?.length && !skipReactionsList ? this.appReactionsManager.getMessageReactionsList(message.peerId, message.mid, limit, reaction, offset).catch((err) => emptyMessageReactionsList) : emptyMessageReactionsList\r\n ]).then(([userIds, messageReactionsList]) => {\r\n const readParticipantsPeerIds = userIds.map((userId) => userId.toPeerId());\r\n\r\n const filteredReadParticipants = readParticipantsPeerIds.slice();\r\n forEachReverse(filteredReadParticipants, (peerId, idx, arr) => {\r\n if(messageReactionsList.reactions.some((reaction) => this.appPeersManager.getPeerId(reaction.peer_id) === peerId)) {\r\n arr.splice(idx, 1);\r\n }\r\n });\r\n\r\n let combined: {peerId: PeerId, reaction?: Reaction}[] = messageReactionsList.reactions.map((reaction) => ({peerId: this.appPeersManager.getPeerId(reaction.peer_id), reaction: reaction.reaction}));\r\n combined = combined.concat(filteredReadParticipants.map((readPeerId) => ({peerId: readPeerId})));\r\n\r\n return {\r\n reactions: messageReactionsList.reactions,\r\n reactionsCount: messageReactionsList.count,\r\n readParticipants: readParticipantsPeerIds,\r\n combined: combined,\r\n nextOffset: messageReactionsList.next_offset\r\n };\r\n });\r\n }\r\n\r\n public getMessageReadParticipants(peerId: PeerId, mid: number): Promise<UserId[]> {\r\n return this.apiManager.invokeApiSingle('messages.getMessageReadParticipants', {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n msg_id: getServerMessageId(mid)\r\n }).then((userIds) => { // ! convert long to number\r\n return userIds.map((userId) => userId.toUserId());\r\n });\r\n }\r\n\r\n public async canViewMessageReadParticipants(message: Message) {\r\n if(\r\n message?._ !== 'message' ||\r\n message.pFlags.is_outgoing ||\r\n !message.pFlags.out ||\r\n !this.appPeersManager.isAnyGroup(message.peerId)\r\n ) {\r\n return false;\r\n }\r\n\r\n const chat: Chat.chat | Chat.channel = this.appChatsManager.getChat(message.peerId.toChatId());\r\n const appConfig = await this.apiManager.getAppConfig();\r\n return chat.participants_count <= appConfig.chat_read_mark_size_threshold &&\r\n (tsNow(true) - message.date) < appConfig.chat_read_mark_expire_period;\r\n }\r\n\r\n public incrementMessageViews(peerId: PeerId, mids: number[]) {\r\n if(!mids.length) {\r\n return;\r\n }\r\n\r\n return this.apiManager.invokeApiSingle('messages.getMessagesViews', {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n id: mids.map((mid) => getServerMessageId(mid)),\r\n increment: true\r\n }).then((views) => {\r\n const updates: Update[] = new Array(mids.length);\r\n const channelId = peerId.toChatId();\r\n for(let i = 0, length = mids.length; i < length; ++i) {\r\n updates[i] = {\r\n _: 'updateChannelMessageViews',\r\n channel_id: channelId,\r\n id: mids[i],\r\n views: views.views[i].views\r\n };\r\n }\r\n\r\n this.apiUpdatesManager.processUpdateMessage({\r\n _: 'updates',\r\n updates,\r\n chats: views.chats,\r\n users: views.users\r\n });\r\n });\r\n }\r\n\r\n private notifyAboutMessage(message: MyMessage, options: Partial<{\r\n fwdCount: number,\r\n peerReaction: MessagePeerReaction,\r\n peerTypeNotifySettings: PeerNotifySettings\r\n }> = {}) {\r\n const peerId = this.getMessagePeer(message);\r\n\r\n if(this.appPeersManager.isRestricted(peerId)) {\r\n return;\r\n }\r\n\r\n const tabs = appTabsManager.getTabs();\r\n let tab = tabs.find((tab) => {\r\n const {chatPeerIds} = tab.state;\r\n return chatPeerIds[chatPeerIds.length - 1] === peerId;\r\n });\r\n\r\n if(!tab) {\r\n tabs.sort((a, b) => a.state.idleStartTime - b.state.idleStartTime);\r\n tab = !tabs[0].state.idleStartTime ? tabs[0] : tabs[tabs.length - 1];\r\n }\r\n\r\n const port = MTProtoMessagePort.getInstance<false>();\r\n port.invokeVoid('notificationBuild', {\r\n message,\r\n ...options\r\n }, tab.source);\r\n }\r\n\r\n public getScheduledMessagesStorage(peerId: PeerId) {\r\n return this.scheduledMessagesStorage[peerId] ?? (this.scheduledMessagesStorage[peerId] = this.createMessageStorage(peerId, 'scheduled'));\r\n }\r\n\r\n public getScheduledMessageByPeer(peerId: PeerId, mid: number) {\r\n return this.getMessageFromStorage(this.getScheduledMessagesStorage(peerId), mid);\r\n }\r\n\r\n public getScheduledMessages(peerId: PeerId) {\r\n if(!this.canSendToPeer(peerId)) return;\r\n\r\n const storage = this.getScheduledMessagesStorage(peerId);\r\n if(storage.size) {\r\n return [...storage.keys()];\r\n }\r\n\r\n return this.apiManager.invokeApiSingle('messages.getScheduledHistory', {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n hash: ''\r\n }).then((historyResult) => {\r\n if(historyResult._ !== 'messages.messagesNotModified') {\r\n this.appUsersManager.saveApiUsers(historyResult.users);\r\n this.appChatsManager.saveApiChats(historyResult.chats);\r\n\r\n const storage = this.getScheduledMessagesStorage(peerId);\r\n this.saveMessages(historyResult.messages, {storage, isScheduled: true});\r\n return [...storage.keys()];\r\n }\r\n\r\n return [];\r\n });\r\n }\r\n\r\n public sendScheduledMessages(peerId: PeerId, mids: number[]) {\r\n return this.apiManager.invokeApi('messages.sendScheduledMessages', {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n id: mids.map((mid) => getServerMessageId(mid))\r\n }).then((updates) => {\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n public deleteScheduledMessages(peerId: PeerId, mids: number[]) {\r\n return this.apiManager.invokeApi('messages.deleteScheduledMessages', {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n id: mids.map((mid) => getServerMessageId(mid))\r\n }).then((updates) => {\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n public getMessageWithReplies(message: Message.message) {\r\n return this.filterMessages(message, (message) => !!(message as Message.message).replies)[0] as any;\r\n }\r\n\r\n public getMessageWithCommentReplies(message: Message.message) {\r\n if(message.peerId !== REPLIES_PEER_ID) {\r\n message = this.getMessageWithReplies(message);\r\n const replies = message?.replies;\r\n if(!(replies && replies.pFlags.comments && replies.channel_id.toChatId() !== REPLIES_HIDDEN_CHANNEL_ID)) {\r\n return;\r\n }\r\n }\r\n\r\n return message;\r\n }\r\n\r\n public isFetchIntervalNeeded(peerId: PeerId) {\r\n return peerId.isAnyChat() && !this.appChatsManager.isInChat(peerId.toChatId());\r\n }\r\n\r\n public async getNewHistory(peerId: PeerId, threadId?: number) {\r\n if(!this.isFetchIntervalNeeded(peerId)) {\r\n return;\r\n }\r\n\r\n const historyStorage = this.getHistoryStorage(peerId, threadId);\r\n const slice = historyStorage.history.slice;\r\n if(!slice.isEnd(SliceEnd.Bottom)) {\r\n return;\r\n }\r\n\r\n delete historyStorage.maxId;\r\n slice.unsetEnd(SliceEnd.Bottom);\r\n\r\n // if there is no id - then request by first id because cannot request by id 0 with backLimit\r\n const historyResult = await this.getHistory(peerId, slice[0] ?? 1, 0, 50, threadId);\r\n for(let i = 0, length = historyResult.history.length; i < length; ++i) {\r\n this.handleNewMessage(this.getMessageByPeer(peerId, historyResult.history[i]));\r\n }\r\n\r\n return {isBottomEnd: historyStorage.history.slice.isEnd(SliceEnd.Bottom)};\r\n }\r\n\r\n /**\r\n * * https://core.telegram.org/api/offsets, offset_id is inclusive\r\n */\r\n // public getHistory(peerId: PeerId, maxId?: number, limit?: number, backLimit?: number, threadId?: number, onlyCache?: false): Promise<HistoryResult> | HistoryResult;\r\n // public getHistory(peerId: PeerId, maxId?: number, limit?: number, backLimit?: number, threadId?: number, onlyCache?: true): HistoryResult;\r\n public getHistory(peerId: PeerId, maxId: number = 0, limit?: number, backLimit?: number, threadId?: number/* , onlyCache?: boolean */): Promise<HistoryResult> | HistoryResult {\r\n const historyStorage = this.getHistoryStorage(peerId, threadId);\r\n\r\n if(this.appPeersManager.isRestricted(peerId)) {\r\n const first = historyStorage.history.first;\r\n first.setEnd(SliceEnd.Both);\r\n\r\n const slice = first.slice(0, 0);\r\n slice.setEnd(SliceEnd.Both);\r\n\r\n return {\r\n count: 0,\r\n history: Array.from(slice),\r\n isEnd: slice.getEnds(),\r\n offsetIdOffset: 0\r\n };\r\n }\r\n\r\n let offset = 0;\r\n /*\r\n let offsetFound = true;\r\n\r\n if(maxId) {\r\n offsetFound = false;\r\n for(; offset < historyStorage.history.length; offset++) {\r\n if(maxId > historyStorage.history.slice[offset]) {\r\n offsetFound = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if(offsetFound && (\r\n historyStorage.count !== null && historyStorage.history.length === historyStorage.count ||\r\n historyStorage.history.length >= offset + limit\r\n )) {\r\n if(backLimit) {\r\n backLimit = Math.min(offset, backLimit);\r\n offset = Math.max(0, offset - backLimit);\r\n limit += backLimit;\r\n } else {\r\n limit = limit;\r\n }\r\n\r\n const history = historyStorage.history.slice.slice(offset, offset + limit);\r\n return {\r\n count: historyStorage.count,\r\n history: history,\r\n offsetIdOffset: offset\r\n };\r\n }\r\n\r\n if(offsetFound) {\r\n offset = 0;\r\n } */\r\n\r\n if(backLimit) {\r\n offset = -backLimit;\r\n limit += backLimit;\r\n\r\n /* return this.requestHistory(reqPeerId, maxId, limit, offset, undefined, threadId).then((historyResult) => {\r\n historyStorage.count = (historyResult as MessagesMessages.messagesMessagesSlice).count || historyResult.messages.length;\r\n\r\n const history = (historyResult.messages as MyMessage[]).map((message) => message.mid);\r\n return {\r\n count: historyStorage.count,\r\n history,\r\n offsetIdOffset: (historyResult as MessagesMessages.messagesMessagesSlice).offset_id_offset || 0\r\n };\r\n }); */\r\n }\r\n\r\n const haveSlice = historyStorage.history.sliceMe(maxId, offset, limit);\r\n if(haveSlice && (haveSlice.slice.length === limit || (haveSlice.fulfilled & SliceEnd.Both) === SliceEnd.Both)) {\r\n return {\r\n count: historyStorage.count,\r\n history: Array.from(haveSlice.slice),\r\n isEnd: haveSlice.slice.getEnds(),\r\n offsetIdOffset: haveSlice.offsetIdOffset\r\n };\r\n }\r\n\r\n // if(onlyCache) {\r\n // return;\r\n // }\r\n\r\n return this.fillHistoryStorage(peerId, maxId, limit, offset, historyStorage, threadId).then(() => {\r\n const slice = historyStorage.history.sliceMe(maxId, offset, limit);\r\n const f = slice?.slice || historyStorage.history.constructSlice();\r\n return {\r\n count: historyStorage.count,\r\n history: Array.from(f),\r\n isEnd: f.getEnds(),\r\n offsetIdOffset: slice?.offsetIdOffset || historyStorage.count\r\n };\r\n });\r\n }\r\n\r\n public isHistoryResultEnd(historyResult: Exclude<MessagesMessages, MessagesMessages.messagesMessagesNotModified>, limit: number, add_offset: number) {\r\n const {offset_id_offset, messages} = historyResult as MessagesMessages.messagesMessagesSlice;\r\n\r\n const count = (historyResult as MessagesMessages.messagesMessagesSlice).count || messages.length;\r\n const offsetIdOffset = offset_id_offset || 0;\r\n\r\n const topWasMeantToLoad = add_offset < 0 ? limit + add_offset : limit;\r\n\r\n const isTopEnd = offsetIdOffset >= (count - topWasMeantToLoad) || count < topWasMeantToLoad;\r\n const isBottomEnd = !offsetIdOffset || (add_offset < 0 && (offsetIdOffset + add_offset) <= 0);\r\n\r\n return {count, offsetIdOffset, isTopEnd, isBottomEnd};\r\n }\r\n\r\n public mergeHistoryResult(slicedArray: SlicedArray<number>,\r\n historyResult: Parameters<AppMessagesManager['isHistoryResultEnd']>[0],\r\n offset_id: number,\r\n limit: number,\r\n add_offset: number) {\r\n const {messages} = historyResult as MessagesMessages.messagesMessagesSlice;\r\n const isEnd = this.isHistoryResultEnd(historyResult, limit, add_offset);\r\n const {count, offsetIdOffset, isTopEnd, isBottomEnd} = isEnd;\r\n const mids = messages.map((message) => {\r\n return (message as MyMessage).mid;\r\n });\r\n\r\n // * add bound manually.\r\n // * offset_id will be inclusive only if there is 'add_offset' <= -1 (-1 - will only include the 'offset_id')\r\n // * check that offset_id is not 0\r\n if(offset_id && getServerMessageId(offset_id) && !mids.includes(offset_id) && offsetIdOffset < count) {\r\n let i = 0;\r\n for(const length = mids.length; i < length; ++i) {\r\n if(offset_id > mids[i]) {\r\n break;\r\n }\r\n }\r\n\r\n mids.splice(i, 0, offset_id);\r\n }\r\n\r\n const slice = slicedArray.insertSlice(mids) || slicedArray.slice;\r\n if(isTopEnd) {\r\n slice.setEnd(SliceEnd.Top);\r\n }\r\n\r\n if(isBottomEnd) {\r\n slice.setEnd(SliceEnd.Bottom);\r\n }\r\n\r\n return {slice, mids, messages, ...isEnd};\r\n }\r\n\r\n public fillHistoryStorage(peerId: PeerId, offset_id: number, limit: number, add_offset: number, historyStorage: HistoryStorage, threadId?: number): Promise<void> {\r\n const wasMaxId = historyStorage.maxId;\r\n return this.requestHistory(peerId, offset_id, limit, add_offset, undefined, threadId).then((historyResult) => {\r\n const {count, isBottomEnd, slice, messages} = this.mergeHistoryResult(historyStorage.history, historyResult, offset_id, limit, add_offset);\r\n\r\n historyStorage.count = count;\r\n\r\n /* if(!maxId && historyResult.messages.length) {\r\n maxId = this.incrementMessageId((historyResult.messages[0] as MyMessage).mid, 1);\r\n }\r\n\r\n const wasTotalCount = historyStorage.history.length; */\r\n\r\n for(let i = 0, length = messages.length; i < length; ++i) {\r\n const message = messages[i] as MyMessage;\r\n if(this.mergeReplyKeyboard(historyStorage, message)) {\r\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\r\n }\r\n }\r\n\r\n if(isBottomEnd) {\r\n const newMaxId = slice[0];\r\n\r\n if(historyStorage.maxId === wasMaxId) {\r\n const first = historyStorage.history.first;\r\n if(first !== slice) {\r\n historyStorage.history.deleteSlice(first);\r\n }\r\n\r\n if(historyStorage.maxId !== newMaxId) {\r\n historyStorage.maxId = slice[0]; // ! WARNING\r\n\r\n this.reloadConversation(peerId); // when top_message is deleted but cached\r\n }\r\n }\r\n }\r\n\r\n /* const isBackLimit = offset < 0 && -offset !== fullLimit;\r\n if(isBackLimit) {\r\n return;\r\n }\r\n\r\n const totalCount = historyStorage.history.length;\r\n fullLimit -= (totalCount - wasTotalCount);\r\n\r\n const migratedNextPeer = this.migratedFromTo[peerId];\r\n const migratedPrevPeer = this.migratedToFrom[peerId]\r\n const isMigrated = migratedNextPeer !== undefined || migratedPrevPeer !== undefined;\r\n\r\n if(isMigrated) {\r\n historyStorage.count = Math.max(historyStorage.count, totalCount) + 1;\r\n }\r\n\r\n if(fullLimit > 0) {\r\n maxId = historyStorage.history.slice[totalCount - 1];\r\n if(isMigrated) {\r\n if(!historyResult.messages.length) {\r\n if(migratedPrevPeer) {\r\n maxId = 0;\r\n peerId = migratedPrevPeer;\r\n } else {\r\n historyStorage.count = totalCount;\r\n return true;\r\n }\r\n }\r\n\r\n return this.fillHistoryStorage(peerId, maxId, fullLimit, historyStorage, threadId);\r\n } else if(totalCount < historyStorage.count) {\r\n return this.fillHistoryStorage(peerId, maxId, fullLimit, offset, historyStorage, threadId);\r\n }\r\n } */\r\n });\r\n }\r\n\r\n public requestHistory(peerId: PeerId, maxId: number, limit = 0, offset = 0, offsetDate = 0, threadId = 0): Promise<Exclude<MessagesMessages, MessagesMessages.messagesMessagesNotModified>> {\r\n // console.trace('requestHistory', peerId, maxId, limit, offset);\r\n\r\n // rootScope.broadcast('history_request');\r\n\r\n const options: any = {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n offset_id: getServerMessageId(maxId) || 0,\r\n offset_date: offsetDate,\r\n add_offset: offset,\r\n limit,\r\n max_id: 0,\r\n min_id: 0,\r\n hash: 0\r\n };\r\n\r\n if(threadId) {\r\n options.msg_id = getServerMessageId(threadId) || 0;\r\n }\r\n\r\n const promise: ReturnType<AppMessagesManager['requestHistory']> = this.apiManager.invokeApiSingle(threadId ? 'messages.getReplies' : 'messages.getHistory', options, {\r\n // timeout: APITIMEOUT,\r\n noErrorBox: true\r\n }) as any;\r\n\r\n return promise.then((historyResult) => {\r\n if(DEBUG) {\r\n this.log('requestHistory result:', peerId, historyResult, maxId, limit, offset);\r\n }\r\n\r\n this.appUsersManager.saveApiUsers(historyResult.users);\r\n this.appChatsManager.saveApiChats(historyResult.chats);\r\n this.saveMessages(historyResult.messages);\r\n\r\n if(this.appPeersManager.isChannel(peerId)) {\r\n this.apiUpdatesManager.addChannelState(peerId.toChatId(), (historyResult as MessagesMessages.messagesChannelMessages).pts);\r\n }\r\n\r\n let length = historyResult.messages.length, count = (historyResult as MessagesMessages.messagesMessagesSlice).count;\r\n if(length && !historyResult.messages[length - 1]) {\r\n historyResult.messages.splice(length - 1, 1);\r\n length--;\r\n count--;\r\n }\r\n\r\n // will load more history if last message is album grouped (because it can be not last item)\r\n // historyResult.messages: desc sorted\r\n const historyStorage = this.getHistoryStorage(peerId, threadId);\r\n const oldestMessage: Message.message = historyResult.messages[length - 1] as any;\r\n if(length && oldestMessage.grouped_id) {\r\n const foundSlice = historyStorage.history.findSlice(oldestMessage.mid);\r\n if(foundSlice && (foundSlice.slice.length + historyResult.messages.length) < count) {\r\n return this.requestHistory(peerId, oldestMessage.mid, 10, 0, offsetDate, threadId).then((_historyResult) => {\r\n return historyResult;\r\n });\r\n }\r\n }\r\n\r\n return historyResult;\r\n }, (error) => {\r\n switch(error.type) {\r\n case 'CHANNEL_PRIVATE':\r\n let channel = this.appChatsManager.getChat(peerId.toChatId());\r\n channel = {_: 'channelForbidden', access_hash: channel.access_hash, title: channel.title};\r\n this.apiUpdatesManager.processUpdateMessage({\r\n _: 'updates',\r\n updates: [{\r\n _: 'updateChannel',\r\n channel_id: peerId.toChatId()\r\n }],\r\n chats: [channel],\r\n users: []\r\n });\r\n break;\r\n }\r\n\r\n throw error;\r\n });\r\n }\r\n\r\n public fetchSingleMessages() {\r\n if(this.fetchSingleMessagesPromise) {\r\n return this.fetchSingleMessagesPromise;\r\n }\r\n\r\n return this.fetchSingleMessagesPromise = pause(0).then(() => {\r\n const requestPromises: Promise<void>[] = [];\r\n\r\n for(const [peerId, map] of this.needSingleMessages) {\r\n const mids = [...map.keys()];\r\n const msgIds: InputMessage[] = mids.map((mid) => {\r\n return {\r\n _: 'inputMessageID',\r\n id: getServerMessageId(mid)\r\n };\r\n });\r\n\r\n let promise: Promise<MethodDeclMap['channels.getMessages']['res'] | MethodDeclMap['messages.getMessages']['res']>;\r\n if(peerId.isAnyChat() && this.appPeersManager.isChannel(peerId)) {\r\n promise = this.apiManager.invokeApiSingle('channels.getMessages', {\r\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\r\n id: msgIds\r\n });\r\n } else {\r\n promise = this.apiManager.invokeApiSingle('messages.getMessages', {\r\n id: msgIds\r\n });\r\n }\r\n\r\n const after = promise.then((getMessagesResult) => {\r\n assumeType<Exclude<MessagesMessages.messagesMessages, MessagesMessages.messagesMessagesNotModified>>(getMessagesResult);\r\n\r\n this.appUsersManager.saveApiUsers(getMessagesResult.users);\r\n this.appChatsManager.saveApiChats(getMessagesResult.chats);\r\n const messages = this.saveMessages(getMessagesResult.messages);\r\n\r\n for(let i = 0; i < messages.length; ++i) {\r\n const message = messages[i];\r\n if(!message) {\r\n continue;\r\n }\r\n\r\n const mid = generateMessageId(message.id);\r\n const promise = map.get(mid);\r\n promise.resolve(message);\r\n map.delete(mid);\r\n }\r\n\r\n if(map.size) {\r\n for(const [mid, promise] of map) {\r\n promise.resolve(this.generateEmptyMessage(mid));\r\n }\r\n }\r\n }).finally(() => {\r\n this.rootScope.dispatchEvent('messages_downloaded', {peerId, mids});\r\n });\r\n\r\n requestPromises.push(after);\r\n }\r\n\r\n this.needSingleMessages.clear();\r\n\r\n return Promise.all(requestPromises).then(noop, noop).then(() => {\r\n this.fetchSingleMessagesPromise = null;\r\n if(this.needSingleMessages.size) this.fetchSingleMessages();\r\n });\r\n });\r\n }\r\n\r\n public reloadMessages(peerId: PeerId, mid: number, overwrite?: boolean): Promise<MyMessage>;\r\n public reloadMessages(peerId: PeerId, mid: number[], overwrite?: boolean): Promise<MyMessage[]>;\r\n public reloadMessages(peerId: PeerId, mid: number | number[], overwrite?: boolean): Promise<MyMessage | MyMessage[]> {\r\n if(Array.isArray(mid)) {\r\n return Promise.all(mid.map((mid) => {\r\n return this.reloadMessages(peerId, mid, overwrite);\r\n }));\r\n }\r\n\r\n const message = this.getMessageByPeer(peerId, mid);\r\n if(message && !overwrite) {\r\n this.rootScope.dispatchEvent('messages_downloaded', {peerId, mids: [mid]});\r\n return Promise.resolve(message);\r\n } else {\r\n let map = this.needSingleMessages.get(peerId);\r\n if(!map) {\r\n this.needSingleMessages.set(peerId, map = new Map());\r\n }\r\n\r\n let promise = map.get(mid);\r\n if(promise) {\r\n return promise;\r\n }\r\n\r\n promise = deferredPromise();\r\n map.set(mid, promise);\r\n this.fetchSingleMessages();\r\n return promise;\r\n }\r\n }\r\n\r\n public getExtendedMedia(peerId: PeerId, mids: number[]) {\r\n let map = this.extendedMedia.get(peerId);\r\n if(!map) {\r\n this.extendedMedia.set(peerId, map = new Map());\r\n }\r\n\r\n const deferred = deferredPromise<void>();\r\n const toRequest: number[] = [];\r\n const promises = mids.map((mid) => {\r\n let promise = map.get(mid);\r\n if(!promise) {\r\n map.set(mid, promise = deferred);\r\n toRequest.push(mid);\r\n\r\n promise.then(() => {\r\n map.delete(mid);\r\n if(!map.size && this.extendedMedia.get(peerId) === map) {\r\n this.extendedMedia.delete(peerId);\r\n }\r\n });\r\n }\r\n\r\n return promise;\r\n });\r\n\r\n if(!toRequest.length) {\r\n deferred.resolve();\r\n } else {\r\n this.apiManager.invokeApi('messages.getExtendedMedia', {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n id: toRequest.map((mid) => getServerMessageId(mid))\r\n }).then((updates) => {\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n deferred.resolve();\r\n });\r\n }\r\n\r\n return Promise.all(promises);\r\n }\r\n\r\n public fetchMessageReplyTo(message: MyMessage) {\r\n if(!message.reply_to_mid) return Promise.resolve(this.generateEmptyMessage(0));\r\n const replyToPeerId = message.reply_to.reply_to_peer_id ? this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : message.peerId;\r\n return this.reloadMessages(replyToPeerId, message.reply_to_mid).then((originalMessage) => {\r\n if(!originalMessage) { // ! break the infinite loop\r\n message = this.getMessageByPeer(message.peerId, message.mid); // message can come from other thread\r\n delete message.reply_to_mid; // ! WARNING!\r\n }\r\n\r\n if(message._ === 'messageService') {\r\n const peerId = message.peerId;\r\n this.rootScope.dispatchEvent('message_edit', {\r\n storageKey: `${peerId}_history`,\r\n peerId: peerId,\r\n mid: message.mid,\r\n message\r\n });\r\n\r\n if(this.isMessageIsTopMessage(message)) {\r\n this.rootScope.dispatchEvent('dialogs_multiupdate', new Map([[peerId, this.getDialogOnly(peerId)]]));\r\n }\r\n }\r\n\r\n return originalMessage;\r\n });\r\n }\r\n\r\n public setTyping(peerId: PeerId, action: SendMessageAction, force?: boolean): Promise<boolean> {\r\n let typing = this.typings[peerId];\r\n if(\r\n !peerId ||\r\n !this.canSendToPeer(peerId) ||\r\n peerId === this.appPeersManager.peerId ||\r\n // (!force && deepEqual(typing?.action, action))\r\n (!force && typing?.action?._ === action._)\r\n ) {\r\n return Promise.resolve(false);\r\n }\r\n\r\n if(typing?.timeout) {\r\n clearTimeout(typing.timeout);\r\n }\r\n\r\n typing = this.typings[peerId] = {\r\n action\r\n };\r\n\r\n return this.apiManager.invokeApi('messages.setTyping', {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n action\r\n }).finally(() => {\r\n if(typing === this.typings[peerId]) {\r\n typing.timeout = ctx.setTimeout(() => {\r\n delete this.typings[peerId];\r\n }, 6000);\r\n }\r\n });\r\n }\r\n\r\n private handleReleasingMessage(message: MyMessage, storage: MessagesStorage) {\r\n const media = (message as Message.message).media;\r\n if(media) {\r\n const c = (media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage || media as MessageMedia.messageMediaPhoto | MessageMedia.messageMediaDocument;\r\n const smth: Photo.photo | MyDocument = (c as MessageMedia.messageMediaPhoto).photo as any || (c as MessageMedia.messageMediaDocument).document as any;\r\n\r\n if(smth?.file_reference) {\r\n this.referenceDatabase.deleteContext(smth.file_reference, {type: 'message', peerId: message.peerId, messageId: message.mid});\r\n }\r\n\r\n if('webpage' in media && media.webpage) {\r\n const isScheduled = this.getScheduledMessagesStorage(message.peerId) === storage;\r\n const messageKey = this.appWebPagesManager.getMessageKeyForPendingWebPage(message.peerId, message.mid, isScheduled);\r\n this.appWebPagesManager.deleteWebPageFromPending(media.webpage, messageKey);\r\n }\r\n\r\n if((media as MessageMedia.messageMediaPoll).poll) {\r\n this.appPollsManager.updatePollToMessage(message as Message.message, false);\r\n }\r\n }\r\n }\r\n\r\n private handleDeletedMessages(peerId: PeerId, storage: MessagesStorage, messages: number[]) {\r\n const history: {\r\n count: number,\r\n unread: number,\r\n unreadMentions: number,\r\n msgs: Set<number>,\r\n albums?: {[groupId: string]: Set<number>},\r\n } = {\r\n count: 0,\r\n unread: 0,\r\n unreadMentions: 0,\r\n msgs: new Set()\r\n };\r\n\r\n for(const mid of messages) {\r\n const message: MyMessage = this.getMessageFromStorage(storage, mid);\r\n if(!message) {\r\n this.fixDialogUnreadMentionsIfNoMessage(peerId);\r\n continue;\r\n }\r\n\r\n this.handleReleasingMessage(message, storage);\r\n\r\n this.updateMessageRepliesIfNeeded(message);\r\n\r\n if(!message.pFlags.out && !message.pFlags.is_outgoing && message.pFlags.unread) {\r\n ++history.unread;\r\n this.rootScope.dispatchEvent('notification_cancel', 'msg' + mid);\r\n\r\n if(message.pFlags.mentioned) {\r\n ++history.unreadMentions;\r\n this.modifyCachedMentions(peerId, mid, false);\r\n }\r\n }\r\n\r\n ++history.count;\r\n history.msgs.add(mid);\r\n\r\n message.deleted = true;\r\n\r\n const groupedId = (message as Message.message).grouped_id;\r\n if(groupedId) {\r\n const groupedStorage = this.groupedMessagesStorage[groupedId];\r\n if(groupedStorage) {\r\n groupedStorage.delete(mid);\r\n\r\n if(!history.albums) history.albums = {};\r\n (history.albums[groupedId] || (history.albums[groupedId] = new Set())).add(mid);\r\n\r\n if(!groupedStorage.size) {\r\n delete history.albums;\r\n delete this.groupedMessagesStorage[groupedId];\r\n }\r\n }\r\n }\r\n\r\n storage.delete(mid);\r\n }\r\n\r\n if(history.albums) {\r\n for(const groupedId in history.albums) {\r\n this.dispatchAlbumEdit(groupedId, storage, [...history.albums[groupedId]]);\r\n /* const mids = this.getMidsByAlbum(groupId);\r\n if(mids.length) {\r\n const mid = Math.max(...mids);\r\n rootScope.$broadcast('message_edit', {peerId, mid, justMedia: false});\r\n } */\r\n }\r\n }\r\n\r\n return history;\r\n }\r\n\r\n private handleEditedMessage(oldMessage: Message, newMessage: Message, storage: MessagesStorage) {\r\n if(oldMessage._ === 'message') {\r\n if((oldMessage.media as MessageMedia.messageMediaWebPage)?.webpage) {\r\n const messageKey = this.appWebPagesManager.getMessageKeyForPendingWebPage(oldMessage.peerId, oldMessage.mid, !!oldMessage.pFlags.is_scheduled);\r\n this.appWebPagesManager.deleteWebPageFromPending((oldMessage.media as MessageMedia.messageMediaWebPage).webpage, messageKey);\r\n }\r\n\r\n const groupedId = oldMessage.grouped_id;\r\n if(groupedId) {\r\n this.dispatchAlbumEdit(groupedId, storage, []);\r\n }\r\n }\r\n }\r\n\r\n private dispatchAlbumEdit(groupedId: string, storage: MessagesStorage, deletedMids?: number[]) {\r\n const mids = this.getMidsByAlbum(groupedId);\r\n const messages = mids.map((mid) => this.getMessageFromStorage(storage, mid)) as Message.message[];\r\n this.rootScope.dispatchEvent('album_edit', {peerId: messages[0].peerId, groupId: groupedId, deletedMids: deletedMids || [], messages});\r\n }\r\n\r\n public getDialogUnreadCount(dialog: Dialog) {\r\n return dialog.unread_count || +!!dialog.pFlags.unread_mark;\r\n }\r\n\r\n public isDialogUnread(dialog: Dialog) {\r\n return !!this.getDialogUnreadCount(dialog);\r\n }\r\n\r\n public canForward(message: Message.message | Message.messageService) {\r\n return message?._ === 'message' && !(message as Message.message).pFlags.noforwards && !this.appPeersManager.noForwards(message.peerId);\r\n }\r\n\r\n private pushBatchUpdate<E extends keyof BatchUpdates, C extends BatchUpdates[E]>(\r\n event: E,\r\n callback: C,\r\n key: string,\r\n getElementCallback?: () => MapValueType<ArgumentTypes<C>[0]>\r\n ) {\r\n let details = this.batchUpdates[event];\r\n if(!details) {\r\n // @ts-ignore\r\n details = this.batchUpdates[event] = {\r\n callback,\r\n batch: new Map()\r\n };\r\n }\r\n\r\n if(!details.batch.has(key)) {\r\n // @ts-ignore\r\n details.batch.set(key, getElementCallback ? getElementCallback() : undefined);\r\n this.batchUpdatesDebounced();\r\n }\r\n }\r\n\r\n private getMessagesFromMap<T extends Map<any, any>>(map: T) {\r\n const newMap: Map<Message.message, MapValueType<T>> = new Map();\r\n for(const [key, value] of map) {\r\n const [peerIdStr, mid] = key.split('_');\r\n const message = this.getMessageByPeer(peerIdStr.toPeerId(), +mid) as Message.message;\r\n if(!message) {\r\n continue;\r\n }\r\n\r\n newMap.set(message, value);\r\n }\r\n\r\n return newMap;\r\n }\r\n\r\n private batchUpdateViews = (batch: Map<string, undefined>) => {\r\n const toDispatch: {peerId: PeerId, mid: number, views: number}[] = [];\r\n\r\n const map = this.getMessagesFromMap(batch);\r\n for(const [message] of map) {\r\n toDispatch.push({\r\n peerId: message.peerId,\r\n mid: message.mid,\r\n views: message.views\r\n })\r\n }\r\n\r\n return toDispatch;\r\n };\r\n\r\n private batchUpdateReactions = (batch: Map<string, MessageReactions>) => {\r\n const toDispatch: {message: Message.message, changedResults: ReactionCount.reactionCount[]}[] = [];\r\n\r\n const map = this.getMessagesFromMap(batch);\r\n for(const [message, previousReactions] of map) {\r\n const results = message.reactions?.results ?? [];\r\n const previousResults = previousReactions?.results ?? [];\r\n const changedResults = results.filter((reactionCount) => {\r\n const previousReactionCount = previousResults.find((_reactionCount) => reactionsEqual(_reactionCount.reaction, reactionCount.reaction));\r\n return (\r\n message.pFlags.out && (\r\n !previousReactionCount ||\r\n reactionCount.count > previousReactionCount.count\r\n )\r\n ) || (\r\n reactionCount.chosen_order !== undefined && (\r\n !previousReactionCount ||\r\n previousReactionCount.chosen_order === undefined\r\n )\r\n );\r\n });\r\n\r\n toDispatch.push({message, changedResults});\r\n }\r\n\r\n return toDispatch;\r\n };\r\n\r\n public saveDefaultSendAs(peerId: PeerId, sendAsPeerId: PeerId) {\r\n const channelFull = this.appProfileManager.getCachedFullChat(peerId.toChatId()) as ChatFull.channelFull;\r\n channelFull.default_send_as = this.appPeersManager.getOutputPeer(sendAsPeerId);\r\n return this.apiManager.invokeApi('messages.saveDefaultSendAs', {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n send_as: this.appPeersManager.getInputPeerById(sendAsPeerId)\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {getFileNameByLocation} from '../../../../helpers/fileName';\r\nimport {Document} from '../../../../layer';\r\nimport getDocumentInputFileLocation from './getDocumentInputFileLocation';\r\n\r\nexport default function getDocumentInputFileName(doc: Document.document, thumbSize?: string) {\r\n return getFileNameByLocation(getDocumentInputFileLocation(doc, thumbSize), {fileName: doc.file_name});\r\n}\r\n","export default function convertInputKeyToKey<T extends string>(inputKey: string) {\r\n const str = inputKey.replace('input', '');\r\n return (str[0].toLowerCase() + str.slice(1)) as T;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport tsNow from '../../helpers/tsNow';\r\nimport {InputNotifyPeer, InputPeerNotifySettings, NotifyPeer, PeerNotifySettings, Update} from '../../layer';\r\nimport {MUTE_UNTIL} from '../mtproto/mtproto_config';\r\nimport throttle from '../../helpers/schedulers/throttle';\r\nimport convertInputKeyToKey from '../../helpers/string/convertInputKeyToKey';\r\nimport {AppManager} from './manager';\r\nimport ctx from '../../environment/ctx';\r\nimport assumeType from '../../helpers/assumeType';\r\n\r\ntype ImSadAboutIt = Promise<PeerNotifySettings> | PeerNotifySettings;\r\nexport class AppNotificationsManager extends AppManager {\r\n private peerSettings = {\r\n notifyPeer: {} as {[peerId: PeerId]: ImSadAboutIt},\r\n notifyUsers: null as ImSadAboutIt,\r\n notifyChats: null as ImSadAboutIt,\r\n notifyBroadcasts: null as ImSadAboutIt\r\n };\r\n // private exceptions: {[peerId: string]: PeerNotifySettings} = {};\r\n\r\n private getNotifyPeerTypePromise: Promise<any>;\r\n\r\n private checkMuteUntilTimeout: number;\r\n private checkMuteUntilThrottled: () => void;\r\n\r\n private notifyContactsSignUp: Promise<boolean>;\r\n\r\n protected after() {\r\n this.checkMuteUntilThrottled = throttle(this.checkMuteUntil, 1000, false);\r\n\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updateNotifySettings: (update) => {\r\n const peerId = update.peer._ === 'notifyPeer' && this.appPeersManager.getPeerId(update.peer.peer);\r\n const key = update.peer._ !== 'notifyPeer' ? update.peer._ : undefined;\r\n this.savePeerSettings({\r\n key,\r\n peerId,\r\n settings: update.notify_settings\r\n });\r\n this.rootScope.dispatchEvent('notify_settings', update);\r\n }\r\n });\r\n\r\n return this.appStateManager.getState().then((state) => {\r\n if(state.notifySettings) {\r\n for(const key in state.notifySettings) {\r\n assumeType<Exclude<NotifyPeer['_'], 'notifyPeer'>>(key);\r\n this.savePeerSettings({\r\n key,\r\n settings: state.notifySettings[key]\r\n });\r\n }\r\n }\r\n });\r\n }\r\n\r\n public getNotifySettings(peer: InputNotifyPeer): ImSadAboutIt {\r\n let key: any = convertInputKeyToKey(peer._);\r\n let obj: any = this.peerSettings[key as NotifyPeer['_']];\r\n\r\n let peerId: PeerId;\r\n if(peer._ === 'inputNotifyPeer') {\r\n peerId = key = this.appPeersManager.getPeerId(peer.peer);\r\n obj = obj[key];\r\n }\r\n\r\n if(obj) {\r\n return obj;\r\n }\r\n\r\n return (obj || this.peerSettings)[key] = this.apiManager.invokeApi('account.getNotifySettings', {peer})\r\n .then((settings) => {\r\n this.savePeerSettings({\r\n key,\r\n peerId,\r\n settings\r\n });\r\n\r\n return settings;\r\n });\r\n }\r\n\r\n public getNotifyPeerTypeSettings() {\r\n if(this.getNotifyPeerTypePromise) return this.getNotifyPeerTypePromise;\r\n\r\n const promises = (['inputNotifyBroadcasts', 'inputNotifyUsers', 'inputNotifyChats'] as Exclude<InputNotifyPeer['_'], 'inputNotifyPeer'>[])\r\n .map((inputKey) => {\r\n return this.getNotifySettings({_: inputKey});\r\n });\r\n\r\n return this.getNotifyPeerTypePromise = Promise.all(promises);\r\n }\r\n\r\n public updateNotifySettings(peer: InputNotifyPeer, settings: InputPeerNotifySettings) {\r\n // this.savePeerSettings(peerId, settings);\r\n\r\n /* const inputSettings: InputPeerNotifySettings = copy(settings) as any;\r\n inputSettings._ = 'inputPeerNotifySettings'; */\r\n\r\n return this.apiManager.invokeApi('account.updateNotifySettings', {\r\n peer,\r\n settings\r\n }).then((value) => {\r\n if(value) {\r\n this.apiUpdatesManager.processLocalUpdate({\r\n _: 'updateNotifySettings',\r\n peer: {\r\n ...peer as any,\r\n _: convertInputKeyToKey(peer._)\r\n },\r\n notify_settings: { // ! WOW, IT WORKS !\r\n ...settings,\r\n _: 'peerNotifySettings'\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n // public getNotifyExceptions() {\r\n // apiManager.invokeApi('account.getNotifyExceptions', {compare_sound: true})\r\n // .then((updates) => {\r\n // apiUpdatesManager.processUpdateMessage(updates);\r\n // });\r\n // }\r\n\r\n public getContactSignUpNotification() {\r\n if(this.notifyContactsSignUp) return this.notifyContactsSignUp;\r\n return this.notifyContactsSignUp = this.apiManager.invokeApi('account.getContactSignUpNotification');\r\n }\r\n\r\n public setContactSignUpNotification(silent: boolean) {\r\n this.apiManager.invokeApi('account.setContactSignUpNotification', {silent})\r\n .then((value) => {\r\n this.notifyContactsSignUp = Promise.resolve(!silent);\r\n });\r\n }\r\n\r\n private checkMuteUntil = () => {\r\n if(this.checkMuteUntilTimeout !== undefined) {\r\n clearTimeout(this.checkMuteUntilTimeout);\r\n this.checkMuteUntilTimeout = undefined;\r\n }\r\n\r\n const timestamp = tsNow(true);\r\n let closestMuteUntil = MUTE_UNTIL;\r\n for(const peerId in this.peerSettings.notifyPeer) {\r\n const peerNotifySettings = this.peerSettings.notifyPeer[peerId];\r\n if(peerNotifySettings instanceof Promise) {\r\n continue;\r\n }\r\n\r\n const muteUntil = peerNotifySettings.mute_until;\r\n if(!muteUntil) {\r\n continue;\r\n }\r\n\r\n if(muteUntil <= timestamp) {\r\n // ! do not delete it because peer's unique settings will be overwritten in getPeerLocalSettings with type's settings\r\n peerNotifySettings.mute_until = 0;\r\n\r\n this.apiUpdatesManager.saveUpdate({\r\n _: 'updateNotifySettings',\r\n peer: {\r\n _: 'notifyPeer',\r\n peer: this.appPeersManager.getOutputPeer(peerId.toPeerId())\r\n },\r\n notify_settings: peerNotifySettings\r\n });\r\n } else if(muteUntil < closestMuteUntil) {\r\n closestMuteUntil = muteUntil;\r\n }\r\n }\r\n\r\n const timeout = Math.min(1800e3, (closestMuteUntil - timestamp) * 1000);\r\n this.checkMuteUntilTimeout = ctx.setTimeout(this.checkMuteUntil, timeout);\r\n };\r\n\r\n public savePeerSettings({key, peerId, settings}: {\r\n key?: Exclude<NotifyPeer['_'], 'notifyPeer'>,\r\n peerId?: PeerId,\r\n settings: PeerNotifySettings\r\n }) {\r\n let obj: any;\r\n if(peerId) {\r\n key = peerId as any;\r\n obj = this.peerSettings['notifyPeer'];\r\n }\r\n\r\n (obj || this.peerSettings)[key] = settings;\r\n\r\n if(!peerId) {\r\n this.rootScope.dispatchEvent('notify_peer_type_settings', {key, settings});\r\n this.appStateManager.getState().then((state) => {\r\n const notifySettings = state.notifySettings;\r\n notifySettings[key] = settings;\r\n this.appStateManager.pushToState('notifySettings', notifySettings);\r\n });\r\n } else {\r\n this.checkMuteUntilThrottled();\r\n }\r\n\r\n // rootScope.broadcast('notify_settings', {peerId: peerId});\r\n }\r\n\r\n public isMuted(peerNotifySettings: PeerNotifySettings) {\r\n return peerNotifySettings._ === 'peerNotifySettings' &&\r\n (peerNotifySettings.silent || (peerNotifySettings.mute_until !== undefined && (peerNotifySettings.mute_until * 1000) > tsNow()));\r\n }\r\n\r\n private getPeerMuted(peerId: PeerId) {\r\n const ret = this.getNotifySettings({_: 'inputNotifyPeer', peer: this.appPeersManager.getInputPeerById(peerId)});\r\n return (ret instanceof Promise ? ret : Promise.resolve(ret))\r\n .then((peerNotifySettings) => this.isMuted(peerNotifySettings));\r\n }\r\n\r\n private getPeerLocalSettings(peerId: PeerId, respectType = true): PeerNotifySettings {\r\n const n: PeerNotifySettings = {\r\n _: 'peerNotifySettings'\r\n };\r\n\r\n const notifySettings = this.peerSettings['notifyPeer'][peerId];\r\n // if(!notifySettings || (notifySettings instanceof Promise)) return false;\r\n if(notifySettings && !(notifySettings instanceof Promise)) {\r\n Object.assign(n, notifySettings);\r\n }\r\n\r\n if(respectType) {\r\n const inputNotify = this.appPeersManager.getInputNotifyPeerById(peerId, true);\r\n const key = convertInputKeyToKey(inputNotify._);\r\n const typeNotifySettings = this.peerSettings[key as NotifyPeer['_']];\r\n if(typeNotifySettings && !(typeNotifySettings instanceof Promise)) {\r\n for(const i in typeNotifySettings) {\r\n // @ts-ignore\r\n if(n[i] === undefined) {\r\n // @ts-ignore\r\n n[i] = typeNotifySettings[i];\r\n }\r\n }\r\n }\r\n }\r\n\r\n return n;\r\n }\r\n\r\n public isPeerLocalMuted(peerId: PeerId, respectType = true) {\r\n if(peerId === this.appPeersManager.peerId) return false;\r\n\r\n const notifySettings = this.getPeerLocalSettings(peerId, respectType);\r\n return this.isMuted(notifySettings);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type {Chat, ChatPhoto, DialogPeer, InputChannel, InputDialogPeer, InputNotifyPeer, InputPeer, Peer, Update, User, UserProfilePhoto} from '../../layer';\r\nimport type {LangPackKey} from '../langPack';\r\nimport {getRestrictionReason} from '../../helpers/restrictions';\r\nimport isObject from '../../helpers/object/isObject';\r\nimport {AppManager} from './manager';\r\nimport getPeerId from './utils/peers/getPeerId';\r\nimport isUser from './utils/peers/isUser';\r\nimport isAnyChat from './utils/peers/isAnyChat';\r\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\r\n\r\nexport type PeerType = 'channel' | 'chat' | 'megagroup' | 'group' | 'saved';\r\nexport class AppPeersManager extends AppManager {\r\n public get peerId() {\r\n return this.appUsersManager.userId.toPeerId();\r\n }\r\n /* public savePeerInstance(peerId: PeerId, instance: any) {\r\n if(peerId < 0) appChatsManager.saveApiChat(instance);\r\n else appUsersManager.saveApiUser(instance);\r\n } */\r\n\r\n public canPinMessage(peerId: PeerId) {\r\n return peerId.isUser() || this.appChatsManager.hasRights(peerId.toChatId(), 'pin_messages');\r\n }\r\n\r\n public getPeerPhoto(peerId: PeerId): UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto {\r\n if(this.isRestricted(peerId)) {\r\n return;\r\n }\r\n\r\n const photo = peerId.isUser() ?\r\n this.appUsersManager.getUserPhoto(peerId.toUserId()) :\r\n this.appChatsManager.getChatPhoto(peerId.toChatId());\r\n\r\n return photo._ !== 'chatPhotoEmpty' && photo._ !== 'userProfilePhotoEmpty' ? photo : undefined;\r\n }\r\n\r\n public getPeerMigratedTo(peerId: PeerId) {\r\n if(peerId.isUser()) {\r\n return false;\r\n }\r\n\r\n const chat: Chat.chat = this.appChatsManager.getChat(peerId.toChatId());\r\n if(chat && chat.migrated_to && chat.pFlags.deactivated) {\r\n return getPeerId(chat.migrated_to as InputChannel.inputChannel);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public getOutputPeer(peerId: PeerId): Peer {\r\n if(peerId.isUser()) {\r\n return {_: 'peerUser', user_id: peerId.toUserId()};\r\n }\r\n\r\n const chatId = peerId.toChatId();\r\n if(this.appChatsManager.isChannel(chatId)) {\r\n return {_: 'peerChannel', channel_id: chatId};\r\n }\r\n\r\n return {_: 'peerChat', chat_id: chatId};\r\n }\r\n\r\n public getPeerString(peerId: PeerId) {\r\n if(peerId.isUser()) {\r\n return this.appUsersManager.getUserString(peerId.toUserId());\r\n }\r\n return this.appChatsManager.getChatString(peerId.toChatId());\r\n }\r\n\r\n public getPeerUsername(peerId: PeerId): string {\r\n return this.getPeer(peerId).username || '';\r\n }\r\n\r\n public getPeer(peerId: PeerId) {\r\n return peerId.isUser() ?\r\n this.appUsersManager.getUser(peerId.toUserId()) :\r\n this.appChatsManager.getChat(peerId.toChatId());\r\n }\r\n\r\n public getPeerId(peerId: Parameters<typeof getPeerId>[0]) {\r\n return getPeerId(peerId) || (isObject<InputPeer>(peerId) && peerId._ === 'inputPeerSelf' && this.peerId) || NULL_PEER_ID;\r\n }\r\n\r\n public getDialogPeer(peerId: PeerId): DialogPeer {\r\n return {\r\n _: 'dialogPeer',\r\n peer: this.getOutputPeer(peerId)\r\n };\r\n }\r\n\r\n public isChannel(peerId: PeerId): boolean {\r\n return !peerId.isUser() && this.appChatsManager.isChannel(peerId.toChatId());\r\n }\r\n\r\n public isMegagroup(peerId: PeerId) {\r\n return !peerId.isUser() && this.appChatsManager.isMegagroup(peerId.toChatId());\r\n }\r\n\r\n public isAnyGroup(peerId: PeerId): boolean {\r\n return !peerId.isUser() && !this.appChatsManager.isBroadcast(peerId.toChatId());\r\n }\r\n\r\n public isBroadcast(peerId: PeerId): boolean {\r\n return this.isChannel(peerId) && !this.isMegagroup(peerId);\r\n }\r\n\r\n public isBot(peerId: PeerId): boolean {\r\n return peerId.isUser() && this.appUsersManager.isBot(peerId.toUserId());\r\n }\r\n\r\n public isContact(peerId: PeerId): boolean {\r\n return peerId.isUser() && this.appUsersManager.isContact(peerId.toUserId());\r\n }\r\n\r\n public isUser(peerId: PeerId)/* : peerId is UserId */ {\r\n return isUser(peerId);\r\n }\r\n\r\n public isAnyChat(peerId: PeerId) {\r\n return isAnyChat(peerId);\r\n }\r\n\r\n public isRestricted(peerId: PeerId) {\r\n return peerId.isUser() ? this.appUsersManager.isRestricted(peerId.toUserId()) : this.appChatsManager.isRestricted(peerId.toChatId());\r\n }\r\n\r\n public getRestrictionReasonText(peerId: PeerId) {\r\n const peer: Chat.channel | User.user = this.getPeer(peerId);\r\n const reason = peer.restriction_reason ? getRestrictionReason(peer.restriction_reason) : undefined;\r\n if(reason) {\r\n return reason.text;\r\n } else {\r\n return peerId.isUser() ? 'This user is restricted' : 'This chat is restricted';\r\n }\r\n }\r\n\r\n /* public getInputPeer(peerString: string): InputPeer {\r\n var firstChar = peerString.charAt(0);\r\n var peerParams = peerString.substr(1).split('_');\r\n let id = +peerParams[0];\r\n\r\n if(firstChar === 'u') {\r\n //appUsersManager.saveUserAccess(id, peerParams[1]);\r\n\r\n return {\r\n _: 'inputPeerUser',\r\n user_id: id,\r\n access_hash: peerParams[1]\r\n };\r\n } else if(firstChar === 'c' || firstChar === 's') {\r\n //appChatsManager.saveChannelAccess(id, peerParams[1]);\r\n if(firstChar === 's') {\r\n appChatsManager.saveIsMegagroup(id);\r\n }\r\n\r\n return {\r\n _: 'inputPeerChannel',\r\n channel_id: id,\r\n access_hash: peerParams[1] || '0'\r\n };\r\n } else {\r\n return {\r\n _: 'inputPeerChat',\r\n chat_id: id\r\n };\r\n }\r\n } */\r\n\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId: true): Exclude<InputNotifyPeer, InputNotifyPeer.inputNotifyPeer>;\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: false): InputNotifyPeer.inputNotifyPeer;\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: boolean): InputNotifyPeer {\r\n if(ignorePeerId) {\r\n if(peerId.isUser()) {\r\n return {_: 'inputNotifyUsers'};\r\n } else {\r\n if(this.isBroadcast(peerId)) {\r\n return {_: 'inputNotifyBroadcasts'};\r\n } else {\r\n return {_: 'inputNotifyChats'};\r\n }\r\n }\r\n } else {\r\n return {\r\n _: 'inputNotifyPeer',\r\n peer: this.getInputPeerById(peerId)\r\n };\r\n }\r\n }\r\n\r\n public getInputPeerById(peerId: PeerId): InputPeer {\r\n if(!peerId) {\r\n return {_: 'inputPeerEmpty'};\r\n }\r\n\r\n if(!peerId.isUser()) {\r\n const chatId = peerId.toChatId();\r\n return this.appChatsManager.getInputPeer(chatId);\r\n }\r\n\r\n const userId = peerId.toUserId();\r\n return this.appUsersManager.getUserInputPeer(userId);\r\n }\r\n\r\n /**\r\n * ! use it only in safe places like requests\r\n */\r\n public getInputPeerSelf(): InputPeer.inputPeerSelf {\r\n return {_: 'inputPeerSelf'};\r\n }\r\n\r\n public getInputDialogPeerById(peerId: PeerId | InputPeer): InputDialogPeer {\r\n return {\r\n _: 'inputDialogPeer',\r\n peer: isObject<InputPeer>(peerId) ? peerId : this.getInputPeerById(peerId)\r\n };\r\n }\r\n\r\n public getPeerSearchText(peerId: PeerId) {\r\n let text: string;\r\n if(this.isUser(peerId)) {\r\n text = '%pu ' + this.appUsersManager.getUserSearchText(peerId.toUserId());\r\n } else {\r\n const chat = this.appChatsManager.getChat(peerId.toChatId());\r\n text = '%pg ' + (chat.title || '');\r\n }\r\n\r\n return text;\r\n }\r\n\r\n public getDialogType(peerId: PeerId): PeerType {\r\n if(this.isMegagroup(peerId)) {\r\n return 'megagroup';\r\n } else if(this.isChannel(peerId)) {\r\n return 'channel';\r\n } else if(!this.isUser(peerId)) {\r\n return 'group';\r\n } else {\r\n return peerId === this.peerId ? 'saved' : 'chat';\r\n }\r\n }\r\n\r\n public getDeleteButtonText(peerId: PeerId): Extract<LangPackKey, 'ChannelDelete' | 'ChatList.Context.LeaveChannel' | 'DeleteMega' | 'ChatList.Context.LeaveGroup' | 'ChatList.Context.DeleteChat'> {\r\n switch(this.getDialogType(peerId)) {\r\n case 'channel':\r\n return this.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'ChannelDelete' : 'ChatList.Context.LeaveChannel';\r\n\r\n case 'megagroup':\r\n case 'group':\r\n return this.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'DeleteMega' : 'ChatList.Context.LeaveGroup';\r\n\r\n default:\r\n return 'ChatList.Context.DeleteChat';\r\n }\r\n }\r\n\r\n public noForwards(peerId: PeerId) {\r\n if(peerId.isUser()) return false;\r\n else {\r\n const chat = this.appChatsManager.getChatTyped(peerId.toChatId());\r\n return !!(chat as Chat.chat).pFlags?.noforwards;\r\n }\r\n }\r\n}\r\n\r\nexport type IsPeerType = 'isChannel' | 'isMegagroup' | 'isAnyGroup' | 'isBroadcast' | 'isBot' | 'isContact' | 'isUser' | 'isAnyChat';\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport {Photo, PhotoSize, PhotosPhotos} from '../../layer';\r\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\r\nimport isObject from '../../helpers/object/isObject';\r\nimport safeReplaceArrayInObject from '../../helpers/object/safeReplaceArrayInObject';\r\nimport {AppManager} from './manager';\r\n\r\nexport type MyPhoto = Photo.photo;\r\n\r\n// TIMES = 2 DUE TO SIDEBAR AND CHAT\r\n// let TEST_FILE_REFERENCE = \"5440692274120994569\", TEST_FILE_REFERENCE_TIMES = 2;\r\n\r\nexport class AppPhotosManager extends AppManager {\r\n private photos: {\r\n [id: string]: MyPhoto\r\n } = {};\r\n\r\n public savePhoto(photo: Photo, context?: ReferenceContext) {\r\n if(!photo || photo._ === 'photoEmpty') return;\r\n\r\n /* if(photo.id === TEST_FILE_REFERENCE) {\r\n console.warn('Testing FILE_REFERENCE_EXPIRED');\r\n const bytes = [2, 67, 175, 43, 190, 0, 0, 20, 62, 95, 111, 33, 45, 99, 220, 116, 218, 11, 167, 127, 213, 18, 127, 32, 243, 202, 117, 80, 30];\r\n //photo.file_reference = new Uint8Array(bytes);\r\n photo.file_reference = bytes;\r\n if(!--TEST_FILE_REFERENCE_TIMES) {\r\n TEST_FILE_REFERENCE = '';\r\n }\r\n } */\r\n\r\n const oldPhoto = this.photos[photo.id];\r\n if(photo.file_reference) { // * because we can have a new object w/o the file_reference while sending\r\n safeReplaceArrayInObject('file_reference', oldPhoto, photo);\r\n this.referenceDatabase.saveContext(photo.file_reference, context);\r\n }\r\n\r\n if(photo.sizes?.length) {\r\n // * sometimes photoStrippedSize can be the last item\r\n photo.sizes.sort((a, b) => {\r\n return ((a as PhotoSize.photoSize).size || ((a as PhotoSize.photoSizeProgressive).sizes ? Infinity : 0)) - ((b as PhotoSize.photoSize).size || ((b as PhotoSize.photoSizeProgressive).sizes ? Infinity : 0));\r\n });\r\n\r\n const size = photo.sizes[photo.sizes.length - 1];\r\n if(size._ === 'photoSizeProgressive') {\r\n size.size = size.sizes[size.sizes.length - 1];\r\n }\r\n }\r\n\r\n if(oldPhoto) {\r\n return Object.assign(oldPhoto, photo);\r\n }\r\n\r\n return this.photos[photo.id] = photo;\r\n }\r\n\r\n public getUserPhotos(userId: UserId, maxId: Photo.photo['id'] = '0', limit: number = 20) {\r\n const inputUser = this.appUsersManager.getUserInput(userId);\r\n return this.apiManager.invokeApiCacheable('photos.getUserPhotos', {\r\n user_id: inputUser,\r\n offset: 0,\r\n limit,\r\n max_id: maxId\r\n }, {cacheSeconds: 60}).then((photosResult) => {\r\n this.appUsersManager.saveApiUsers(photosResult.users);\r\n const photoIds = photosResult.photos.map((photo, idx) => {\r\n photosResult.photos[idx] = this.savePhoto(photo, {type: 'profilePhoto', peerId: userId.toPeerId()});\r\n return photo.id;\r\n });\r\n\r\n // ! WARNING !\r\n if(maxId !== '0' && maxId) {\r\n const idx = photoIds.indexOf(maxId);\r\n if(idx !== -1) {\r\n photoIds.splice(idx, 1);\r\n }\r\n }\r\n\r\n return {\r\n count: (photosResult as PhotosPhotos.photosPhotosSlice).count || photoIds.length,\r\n photos: photoIds\r\n };\r\n });\r\n }\r\n\r\n /* public getPhotoURL(photo: MTPhoto | MTMyDocument, photoSize: MTPhotoSize) {\r\n const downloadOptions = this.getPhotoDownloadOptions(photo, photoSize);\r\n\r\n return {url: getFileURL('photo', downloadOptions), location: downloadOptions.location};\r\n } */\r\n\r\n /* public isDownloaded(media: any) {\r\n const isPhoto = media._ === 'photo';\r\n const photo = isPhoto ? this.getPhoto(media.id) : null;\r\n let isDownloaded: boolean;\r\n if(photo) {\r\n isDownloaded = photo.downloaded > 0;\r\n } else {\r\n const cachedThumb = this.getDocumentCachedThumb(media.id);\r\n isDownloaded = cachedThumb?.downloaded > 0;\r\n }\r\n\r\n return isDownloaded;\r\n } */\r\n\r\n public getPhoto(photoId: any/* MyPhoto | string */): MyPhoto {\r\n return isObject(photoId) ? photoId as MyPhoto : this.photos[photoId as any as string];\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport copy from '../../helpers/object/copy';\r\nimport {InputMedia, Message, MessageEntity, MessageMedia, Poll, PollResults} from '../../layer';\r\nimport {logger, LogTypes} from '../logger';\r\nimport parseMarkdown from '../richTextProcessor/parseMarkdown';\r\nimport {AppManager} from './manager';\r\nimport getServerMessageId from './utils/messageId/getServerMessageId';\r\n\r\ntype PollId = Poll['id'];\r\n\r\nexport class AppPollsManager extends AppManager {\r\n public polls: {[id: PollId]: Poll} = {};\r\n public results: {[id: PollId]: PollResults} = {};\r\n public pollToMessages: {[id: PollId]: Set<string>} = {};\r\n\r\n private log = logger('POLLS', LogTypes.Error);\r\n\r\n protected after() {\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updateMessagePoll: (update) => {\r\n this.log('updateMessagePoll:', update);\r\n\r\n let poll: Poll = update.poll || this.polls[update.poll_id];\r\n if(!poll) {\r\n return;\r\n }\r\n\r\n let results = update.results;\r\n const ret = this.savePoll(poll, results as any);\r\n poll = ret.poll;\r\n results = ret.results;\r\n\r\n this.rootScope.dispatchEvent('poll_update', {poll, results: results as any});\r\n }\r\n });\r\n }\r\n\r\n public savePoll(poll: Poll, results: PollResults, message?: Message.message) {\r\n if(message) {\r\n this.updatePollToMessage(message, true);\r\n }\r\n\r\n const id = poll.id;\r\n if(this.polls[id]) {\r\n poll = Object.assign(this.polls[id], poll);\r\n results = this.saveResults(poll, results);\r\n } else {\r\n this.polls[id] = poll;\r\n\r\n poll.chosenIndexes = [];\r\n results = this.saveResults(poll, results);\r\n }\r\n\r\n return {poll, results};\r\n }\r\n\r\n public saveResults(poll: Poll, results: PollResults) {\r\n if(this.results[poll.id]) {\r\n results = Object.assign(this.results[poll.id], results);\r\n } else {\r\n this.results[poll.id] = results;\r\n }\r\n\r\n if(!results.pFlags.min) { // ! https://core.telegram.org/constructor/pollResults - min\r\n poll.chosenIndexes.length = 0;\r\n if(results?.results?.length) {\r\n results.results.forEach((answer, idx) => {\r\n if(answer.pFlags?.chosen) {\r\n poll.chosenIndexes.push(idx);\r\n }\r\n });\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n\r\n public getPoll(pollId: PollId): {poll: Poll, results: PollResults} {\r\n return {\r\n poll: this.polls[pollId],\r\n results: this.results[pollId]\r\n };\r\n }\r\n\r\n public getInputMediaPoll(poll: Poll, correctAnswers?: Uint8Array[], solution?: string, solutionEntities?: MessageEntity[]): InputMedia.inputMediaPoll {\r\n if(solution) {\r\n if(!solutionEntities) {\r\n solutionEntities = [];\r\n }\r\n\r\n solution = parseMarkdown(solution, solutionEntities);\r\n } else {\r\n solution = undefined; // can be string here\r\n }\r\n\r\n return {\r\n _: 'inputMediaPoll',\r\n poll,\r\n correct_answers: correctAnswers,\r\n solution,\r\n solution_entities: solution ? solutionEntities : undefined\r\n };\r\n }\r\n\r\n public updatePollToMessage(message: Message.message, add: boolean) {\r\n const {id} = (message.media as MessageMedia.messageMediaPoll).poll;\r\n let set = this.pollToMessages[id];\r\n\r\n if(!add && !set) {\r\n return;\r\n }\r\n\r\n if(!set) {\r\n set = this.pollToMessages[id] = new Set();\r\n }\r\n\r\n const key = message.peerId + '_' + message.mid;\r\n if(add) set.add(key);\r\n else set.delete(key);\r\n\r\n if(!add && !set.size) {\r\n delete this.polls[id];\r\n delete this.results[id];\r\n delete this.pollToMessages[id];\r\n }\r\n }\r\n\r\n public sendVote(message: Message.message, optionIds: number[]): Promise<void> {\r\n const poll: Poll = (message.media as MessageMedia.messageMediaPoll).poll;\r\n\r\n const options: Uint8Array[] = optionIds.map((index) => {\r\n return poll.answers[index].option;\r\n });\r\n\r\n const messageId = message.mid;\r\n const peerId = message.peerId;\r\n const inputPeer = this.appPeersManager.getInputPeerById(peerId);\r\n\r\n if(message.pFlags.is_outgoing) {\r\n return this.appMessagesManager.invokeAfterMessageIsSent(messageId, 'sendVote', (message) => {\r\n this.log('invoke sendVote callback');\r\n return this.sendVote(message as Message.message, optionIds);\r\n });\r\n }\r\n\r\n return this.apiManager.invokeApi('messages.sendVote', {\r\n peer: inputPeer,\r\n msg_id: getServerMessageId(message.mid),\r\n options\r\n }).then((updates) => {\r\n this.log('sendVote updates:', updates);\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n public getResults(message: Message.message) {\r\n const inputPeer = this.appPeersManager.getInputPeerById(message.peerId);\r\n\r\n return this.apiManager.invokeApi('messages.getPollResults', {\r\n peer: inputPeer,\r\n msg_id: getServerMessageId(message.mid)\r\n }).then((updates) => {\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n this.log('getResults updates:', updates);\r\n });\r\n }\r\n\r\n public getVotes(message: Message.message, option?: Uint8Array, offset?: string, limit = 20) {\r\n return this.apiManager.invokeApi('messages.getPollVotes', {\r\n peer: this.appPeersManager.getInputPeerById(message.peerId),\r\n id: getServerMessageId(message.mid),\r\n option,\r\n offset,\r\n limit\r\n }).then((votesList) => {\r\n this.log('getPollVotes messages:', votesList);\r\n\r\n this.appUsersManager.saveApiUsers(votesList.users);\r\n\r\n return votesList;\r\n });\r\n }\r\n\r\n public stopPoll(message: Message.message) {\r\n const poll: Poll = (message.media as MessageMedia.messageMediaPoll).poll;\r\n\r\n if(poll.pFlags.closed) return Promise.resolve();\r\n\r\n const newPoll = copy(poll);\r\n newPoll.pFlags.closed = true;\r\n return this.appMessagesManager.editMessage(message, undefined, {\r\n newMedia: this.getInputMediaPoll(newPoll)\r\n }).then(() => {\r\n // console.log('stopped poll');\r\n }, err => {\r\n this.log.error('stopPoll error:', err);\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {InputPrivacyKey, InputPrivacyRule, PrivacyRule, PrivacyKey, GlobalPrivacySettings} from '../../layer';\r\nimport convertInputKeyToKey from '../../helpers/string/convertInputKeyToKey';\r\nimport {AppManager} from './manager';\r\n\r\nexport class AppPrivacyManager extends AppManager {\r\n private privacy: Partial<{\r\n [key in PrivacyKey['_']]: PrivacyRule[] | Promise<PrivacyRule[]>\r\n }> = {};\r\n\r\n protected after() {\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updatePrivacy: (update) => {\r\n const key = update.key._;\r\n this.privacy[key] = update.rules;\r\n this.rootScope.dispatchEvent('privacy_update', update);\r\n }\r\n });\r\n }\r\n\r\n public setPrivacy(inputKey: InputPrivacyKey['_'], rules: InputPrivacyRule[]) {\r\n return this.apiManager.invokeApi('account.setPrivacy', {\r\n key: {\r\n _: inputKey\r\n },\r\n rules\r\n }).then((privacyRules) => {\r\n this.appUsersManager.saveApiUsers(privacyRules.users);\r\n this.appChatsManager.saveApiChats(privacyRules.chats);\r\n\r\n this.apiUpdatesManager.processLocalUpdate({\r\n _: 'updatePrivacy',\r\n key: {\r\n _: convertInputKeyToKey(inputKey)\r\n },\r\n rules: rules.map((inputRule) => {\r\n const rule: PrivacyRule = {} as any;\r\n Object.assign(rule, inputRule);\r\n rule._ = convertInputKeyToKey(rule._) as any;\r\n return rule;\r\n })\r\n });\r\n\r\n // console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\r\n\r\n return privacyRules.rules;\r\n });\r\n }\r\n\r\n public getPrivacy(inputKey: InputPrivacyKey['_']) {\r\n const privacyKey: PrivacyKey['_'] = convertInputKeyToKey(inputKey) as any;\r\n const rules = this.privacy[privacyKey];\r\n if(rules) {\r\n return Promise.resolve(rules);\r\n }\r\n\r\n return this.privacy[privacyKey] = this.apiManager.invokeApi('account.getPrivacy', {\r\n key: {\r\n _: inputKey\r\n }\r\n }).then((privacyRules) => {\r\n this.appUsersManager.saveApiUsers(privacyRules.users);\r\n this.appChatsManager.saveApiChats(privacyRules.chats);\r\n\r\n // console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\r\n\r\n return this.privacy[privacyKey] = privacyRules.rules;\r\n });\r\n }\r\n\r\n public getGlobalPrivacySettings() {\r\n return this.apiManager.invokeApi('account.getGlobalPrivacySettings');\r\n }\r\n\r\n public setGlobalPrivacySettings(settings: GlobalPrivacySettings) {\r\n return this.apiManager.invokeApi('account.setGlobalPrivacySettings', {settings});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type {MyTopPeer} from './appUsersManager';\r\nimport tsNow from '../../helpers/tsNow';\r\nimport {ChannelParticipantsFilter, ChannelsChannelParticipants, ChannelParticipant, Chat, ChatFull, ChatParticipants, ChatPhoto, ExportedChatInvite, InputChannel, InputFile, SendMessageAction, Update, UserFull, Photo, PhotoSize, Updates} from '../../layer';\r\nimport SearchIndex from '../searchIndex';\r\nimport {AppManager} from './manager';\r\nimport getServerMessageId from './utils/messageId/getServerMessageId';\r\nimport getPhotoInput from './utils/photos/getPhotoInput';\r\nimport getParticipantPeerId from './utils/chats/getParticipantPeerId';\r\nimport ctx from '../../environment/ctx';\r\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\r\n\r\nexport type UserTyping = Partial<{userId: UserId, action: SendMessageAction, timeout: number}>;\r\n\r\nconst PEER_FULL_TTL = 3 * 60e3;\r\n\r\nexport class AppProfileManager extends AppManager {\r\n // private botInfos: any = {};\r\n private usersFull: {[id: UserId]: UserFull.userFull} = {};\r\n private chatsFull: {[id: ChatId]: ChatFull} = {};\r\n private fullExpiration: {[peerId: PeerId]: number} = {};\r\n private typingsInPeer: {[peerId: PeerId]: UserTyping[]};\r\n\r\n protected after() {\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updateChatParticipants: (update) => {\r\n const participants = update.participants;\r\n if(participants._ === 'chatParticipants') {\r\n const chatId = participants.chat_id;\r\n const chatFull = this.chatsFull[chatId] as ChatFull.chatFull;\r\n if(chatFull !== undefined) {\r\n chatFull.participants = participants;\r\n this.rootScope.dispatchEvent('chat_full_update', chatId);\r\n }\r\n }\r\n },\r\n\r\n updateChatParticipantAdd: (update) => {\r\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\r\n if(chatFull !== undefined) {\r\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\r\n const participants = _participants.participants || [];\r\n for(let i = 0, length = participants.length; i < length; i++) {\r\n if(participants[i].user_id === update.user_id) {\r\n return;\r\n }\r\n }\r\n\r\n participants.push({\r\n _: 'chatParticipant',\r\n user_id: update.user_id,\r\n inviter_id: update.inviter_id,\r\n date: tsNow(true)\r\n });\r\n\r\n _participants.version = update.version;\r\n this.rootScope.dispatchEvent('chat_full_update', update.chat_id);\r\n }\r\n },\r\n\r\n updateChatParticipantDelete: (update) => {\r\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\r\n if(chatFull !== undefined) {\r\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\r\n const participants = _participants.participants || [];\r\n for(let i = 0, length = participants.length; i < length; i++) {\r\n if(participants[i].user_id === update.user_id) {\r\n participants.splice(i, 1);\r\n _participants.version = update.version;\r\n this.rootScope.dispatchEvent('chat_full_update', update.chat_id);\r\n return;\r\n }\r\n }\r\n }\r\n },\r\n\r\n updateUserTyping: this.onUpdateUserTyping,\r\n updateChatUserTyping: this.onUpdateUserTyping,\r\n updateChannelUserTyping: this.onUpdateUserTyping,\r\n\r\n updatePeerBlocked: this.onUpdatePeerBlocked\r\n });\r\n\r\n this.rootScope.addEventListener('chat_update', (chatId) => {\r\n const fullChat = this.chatsFull[chatId];\r\n const chat: Chat.chat | Chat.channel | Chat.chatForbidden | Chat.channelForbidden = this.appChatsManager.getChat(chatId);\r\n if(!fullChat || !chat) {\r\n return;\r\n }\r\n\r\n let updated = false;\r\n if(!!fullChat.call !== !!(chat as Chat.chat).pFlags?.call_active) {\r\n updated = true;\r\n }\r\n\r\n const {photo} = chat as Chat.chat;\r\n if(photo) {\r\n const hasChatPhoto = photo._ !== 'chatPhotoEmpty';\r\n const hasFullChatPhoto = !!(fullChat.chat_photo && fullChat.chat_photo._ !== 'photoEmpty'); // chat_photo can be missing\r\n if(\r\n hasChatPhoto !== hasFullChatPhoto || (\r\n hasChatPhoto &&\r\n photo.photo_id !== fullChat.chat_photo?.id\r\n )\r\n ) {\r\n updated = true;\r\n }\r\n }\r\n\r\n if(updated) {\r\n this.refreshFullPeer(chatId.toPeerId(true));\r\n }\r\n });\r\n\r\n this.rootScope.addEventListener('channel_update', (chatId) => {\r\n this.refreshFullPeer(chatId.toPeerId(true));\r\n });\r\n\r\n // * genius\r\n this.rootScope.addEventListener('chat_full_update', (chatId) => {\r\n this.rootScope.dispatchEvent('peer_full_update', chatId.toPeerId(true));\r\n });\r\n\r\n // * genius\r\n this.rootScope.addEventListener('user_full_update', (userId) => {\r\n this.rootScope.dispatchEvent('peer_full_update', userId.toPeerId(false));\r\n });\r\n\r\n this.rootScope.addEventListener('invalidate_participants', (chatId) => {\r\n this.invalidateChannelParticipants(chatId);\r\n });\r\n\r\n this.typingsInPeer = {};\r\n }\r\n\r\n /* public saveBotInfo(botInfo: any) {\r\n const botId = botInfo && botInfo.user_id;\r\n if(!botId) {\r\n return null;\r\n }\r\n\r\n const commands: any = {};\r\n botInfo.commands.forEach((botCommand: any) => {\r\n commands[botCommand.command] = botCommand.description;\r\n });\r\n\r\n return this.botInfos[botId] = {\r\n id: botId,\r\n version: botInfo.version,\r\n shareText: botInfo.share_text,\r\n description: botInfo.description,\r\n commands: commands\r\n };\r\n } */\r\n\r\n public getProfile(id: UserId, override?: true) {\r\n if(this.usersFull[id] && !override && Date.now() < this.fullExpiration[id.toPeerId()]) {\r\n return this.usersFull[id];\r\n }\r\n\r\n return this.apiManager.invokeApiSingleProcess({\r\n method: 'users.getFullUser',\r\n params: {\r\n id: this.appUsersManager.getUserInput(id)\r\n },\r\n processResult: (usersUserFull) => {\r\n this.appChatsManager.saveApiChats(usersUserFull.chats, true);\r\n this.appUsersManager.saveApiUsers(usersUserFull.users);\r\n\r\n const userFull = usersUserFull.full_user;\r\n const peerId = id.toPeerId(false);\r\n if(userFull.profile_photo) {\r\n userFull.profile_photo = this.appPhotosManager.savePhoto(userFull.profile_photo, {type: 'profilePhoto', peerId});\r\n }\r\n\r\n const botInfo = userFull.bot_info;\r\n if(botInfo) {\r\n const referenceContext: ReferenceContext = {type: 'userFull', userId: id};\r\n botInfo.description_document = this.appDocsManager.saveDoc(botInfo.description_document, referenceContext);\r\n botInfo.description_photo = this.appPhotosManager.savePhoto(botInfo.description_photo, referenceContext);\r\n }\r\n\r\n this.appNotificationsManager.savePeerSettings({\r\n peerId,\r\n settings: userFull.notify_settings\r\n });\r\n\r\n this.usersFull[id] = userFull;\r\n this.fullExpiration[peerId] = Date.now() + PEER_FULL_TTL;\r\n\r\n /* if(userFull.bot_info) {\r\n userFull.bot_info = this.saveBotInfo(userFull.bot_info) as any;\r\n } */\r\n\r\n // appMessagesManager.savePinnedMessage(id, userFull.pinned_msg_id);\r\n\r\n this.rootScope.dispatchEvent('user_full_update', id);\r\n return userFull;\r\n }\r\n });\r\n }\r\n\r\n public getProfileByPeerId(peerId: PeerId, override?: true) {\r\n if(this.appPeersManager.isAnyChat(peerId)) return this.getChatFull(peerId.toChatId(), override);\r\n else return this.getProfile(peerId.toUserId(), override);\r\n }\r\n\r\n public getCachedFullChat(chatId: ChatId) {\r\n return this.chatsFull[chatId];\r\n }\r\n\r\n public getCachedFullUser(userId: UserId) {\r\n return this.usersFull[userId];\r\n }\r\n\r\n public getCachedProfileByPeerId(peerId: PeerId) {\r\n return peerId.isUser() ? this.getCachedFullUser(peerId.toUserId()) : this.getCachedFullChat(peerId.toChatId());\r\n }\r\n\r\n public async getFullPhoto(peerId: PeerId) {\r\n const profile = await this.getProfileByPeerId(peerId);\r\n switch(profile._) {\r\n case 'userFull':\r\n return profile.profile_photo;\r\n case 'channelFull':\r\n case 'chatFull':\r\n return profile.chat_photo;\r\n }\r\n }\r\n\r\n /* public getPeerBots(peerId: PeerId) {\r\n var peerBots: any[] = [];\r\n if(peerId >= 0 && !appUsersManager.isBot(peerId) ||\r\n (appPeersManager.isChannel(peerId) && !appPeersManager.isMegagroup(peerId))) {\r\n return Promise.resolve(peerBots);\r\n }\r\n if(peerId >= 0) {\r\n return this.getProfile(peerId).then((userFull: any) => {\r\n var botInfo = userFull.bot_info;\r\n if(botInfo && botInfo._ !== 'botInfoEmpty') {\r\n peerBots.push(botInfo);\r\n }\r\n return peerBots;\r\n });\r\n }\r\n\r\n return this.getChatFull(peerId.toChatId()).then((chatFull: any) => {\r\n chatFull.bot_info.forEach((botInfo: any) => {\r\n peerBots.push(this.saveBotInfo(botInfo))\r\n });\r\n return peerBots;\r\n });\r\n } */\r\n\r\n public getChatFull(id: ChatId, override?: true) {\r\n if(this.appChatsManager.isChannel(id)) {\r\n return this.getChannelFull(id, override);\r\n }\r\n\r\n const peerId = id.toPeerId(true);\r\n const fullChat = this.chatsFull[id] as ChatFull.chatFull;\r\n if(fullChat && !override && Date.now() < this.fullExpiration[peerId]) {\r\n const chat: Chat.chat = this.appChatsManager.getChat(id);\r\n if(\r\n chat.pFlags.left ||\r\n chat.pFlags.deactivated ||\r\n chat.version === (fullChat.participants as ChatParticipants.chatParticipants).version\r\n ) {\r\n return fullChat as ChatFull;\r\n }\r\n }\r\n\r\n return this.apiManager.invokeApiSingleProcess({\r\n method: 'messages.getFullChat',\r\n params: {\r\n chat_id: id\r\n },\r\n processResult: (result) => {\r\n this.appChatsManager.saveApiChats(result.chats, true);\r\n this.appUsersManager.saveApiUsers(result.users);\r\n const chatFull = result.full_chat as ChatFull.chatFull;\r\n if(chatFull && chatFull.chat_photo && chatFull.chat_photo.id) {\r\n chatFull.chat_photo = this.appPhotosManager.savePhoto(chatFull.chat_photo, {type: 'profilePhoto', peerId});\r\n }\r\n\r\n if(chatFull.call) {\r\n this.appGroupCallsManager.saveGroupCall(chatFull.call, id);\r\n }\r\n\r\n // appMessagesManager.savePinnedMessage(peerId, fullChat.pinned_msg_id);\r\n this.appNotificationsManager.savePeerSettings({\r\n peerId,\r\n settings: chatFull.notify_settings\r\n });\r\n\r\n this.chatsFull[id] = chatFull;\r\n this.fullExpiration[peerId] = Date.now() + PEER_FULL_TTL;\r\n this.rootScope.dispatchEvent('chat_full_update', id);\r\n\r\n return chatFull;\r\n }\r\n });\r\n }\r\n\r\n public async getChatInviteLink(id: ChatId, force?: boolean) {\r\n const chatFull = await this.getChatFull(id);\r\n if(!force &&\r\n chatFull.exported_invite &&\r\n chatFull.exported_invite._ == 'chatInviteExported') {\r\n return chatFull.exported_invite.link;\r\n }\r\n\r\n return this.apiManager.invokeApi('messages.exportChatInvite', {\r\n peer: this.appPeersManager.getInputPeerById(id.toPeerId(true))\r\n }).then((exportedInvite) => {\r\n if(this.chatsFull[id] !== undefined) {\r\n this.chatsFull[id].exported_invite = exportedInvite;\r\n }\r\n\r\n return (exportedInvite as ExportedChatInvite.chatInviteExported).link;\r\n });\r\n }\r\n\r\n public getChannelParticipants(id: ChatId, filter: ChannelParticipantsFilter = {_: 'channelParticipantsRecent'}, limit = 200, offset = 0) {\r\n if(filter._ === 'channelParticipantsRecent') {\r\n const chat = this.appChatsManager.getChat(id);\r\n if(chat &&\r\n chat.pFlags && (\r\n // chat.pFlags.kicked ||\r\n chat.pFlags.broadcast && !chat.pFlags.creator && !chat.admin_rights\r\n )) {\r\n return Promise.reject();\r\n }\r\n }\r\n\r\n return this.apiManager.invokeApiCacheable('channels.getParticipants', {\r\n channel: this.appChatsManager.getChannelInput(id),\r\n filter,\r\n offset,\r\n limit,\r\n hash: '0'\r\n }, {cacheSeconds: 60}).then((result) => {\r\n this.appUsersManager.saveApiUsers((result as ChannelsChannelParticipants.channelsChannelParticipants).users);\r\n return result as ChannelsChannelParticipants.channelsChannelParticipants;\r\n });\r\n /* let maybeAddSelf = (participants: any[]) => {\r\n let chat = appChatsManager.getChat(id);\r\n let selfMustBeFirst = filter._ === 'channelParticipantsRecent' &&\r\n !offset &&\r\n !chat.pFlags.kicked &&\r\n !chat.pFlags.left;\r\n\r\n if(selfMustBeFirst) {\r\n participants = copy(participants);\r\n let myID = appUsersManager.getSelf().id;\r\n let myIndex = participants.findIndex((p) => p.user_id === myID);\r\n let myParticipant;\r\n\r\n if(myIndex !== -1) {\r\n myParticipant = participants[myIndex];\r\n participants.splice(myIndex, 1);\r\n } else {\r\n myParticipant = {_: 'channelParticipantSelf', user_id: myID};\r\n }\r\n\r\n participants.unshift(myParticipant);\r\n }\r\n\r\n return participants;\r\n } */\r\n }\r\n\r\n public getChannelParticipant(id: ChatId, peerId: PeerId) {\r\n return this.apiManager.invokeApiSingle('channels.getParticipant', {\r\n channel: this.appChatsManager.getChannelInput(id),\r\n participant: this.appPeersManager.getInputPeerById(peerId)\r\n }).then((channelParticipant) => {\r\n this.appUsersManager.saveApiUsers(channelParticipant.users);\r\n return channelParticipant.participant;\r\n });\r\n }\r\n\r\n public getChannelFull(id: ChatId, override?: true) {\r\n const peerId = id.toPeerId(true);\r\n if(this.chatsFull[id] !== undefined && !override && Date.now() < this.fullExpiration[peerId]) {\r\n return this.chatsFull[id] as ChatFull.channelFull;\r\n }\r\n\r\n return this.apiManager.invokeApiSingleProcess({\r\n method: 'channels.getFullChannel',\r\n params: {\r\n channel: this.appChatsManager.getChannelInput(id)\r\n },\r\n processResult: (result) => {\r\n this.appChatsManager.saveApiChats(result.chats, true);\r\n this.appUsersManager.saveApiUsers(result.users);\r\n const fullChannel = result.full_chat as ChatFull.channelFull;\r\n if(fullChannel && fullChannel.chat_photo.id) {\r\n fullChannel.chat_photo = this.appPhotosManager.savePhoto(fullChannel.chat_photo, {type: 'profilePhoto', peerId});\r\n // appPhotosManager.savePhoto(fullChannel.chat_photo);\r\n }\r\n\r\n if(fullChannel.call) {\r\n this.appGroupCallsManager.saveGroupCall(fullChannel.call, id);\r\n }\r\n\r\n this.appNotificationsManager.savePeerSettings({\r\n peerId,\r\n settings: fullChannel.notify_settings\r\n });\r\n\r\n this.chatsFull[id] = fullChannel;\r\n this.fullExpiration[peerId] = Date.now() + PEER_FULL_TTL;\r\n this.rootScope.dispatchEvent('chat_full_update', id);\r\n\r\n return fullChannel;\r\n },\r\n processError: (error) => {\r\n switch(error.type) {\r\n case 'CHANNEL_PRIVATE':\r\n const channel: Chat.channel | Chat.channelForbidden = this.appChatsManager.getChat(id);\r\n this.apiUpdatesManager.processUpdateMessage({\r\n _: 'updates',\r\n updates: [{\r\n _: 'updateChannel',\r\n channel_id: id\r\n }],\r\n chats: [{\r\n _: 'channelForbidden',\r\n id,\r\n access_hash: channel.access_hash,\r\n title: channel.title,\r\n pFlags: channel.pFlags\r\n }],\r\n users: []\r\n } as Updates.updates);\r\n break;\r\n }\r\n\r\n throw error;\r\n }\r\n });\r\n }\r\n\r\n public getMentions(chatId: ChatId, query: string, threadId?: number): Promise<PeerId[]> {\r\n const processUserIds = (topPeers: MyTopPeer[]) => {\r\n const startsWithAt = query.charAt(0) === '@';\r\n if(startsWithAt) query = query.slice(1);\r\n /* const startsWithAt = query.charAt(0) === '@';\r\n if(startsWithAt) query = query.slice(1);\r\n\r\n const index = new SearchIndex<number>(!startsWithAt, !startsWithAt); */\r\n const index = new SearchIndex<PeerId>({\r\n ignoreCase: true\r\n });\r\n\r\n const ratingMap: Map<PeerId, number> = new Map();\r\n topPeers.forEach((peer) => {\r\n index.indexObject(peer.id, this.appUsersManager.getUserSearchText(peer.id));\r\n ratingMap.set(peer.id, peer.rating);\r\n });\r\n\r\n const peerIds = Array.from(index.search(query));\r\n peerIds.sort((a, b) => ratingMap.get(b) - ratingMap.get(a));\r\n return peerIds;\r\n };\r\n\r\n let promise: Promise<PeerId[]>;\r\n if(this.appChatsManager.isChannel(chatId)) {\r\n promise = this.getChannelParticipants(chatId, {\r\n _: 'channelParticipantsMentions',\r\n q: query,\r\n top_msg_id: getServerMessageId(threadId)\r\n }, 50, 0).then((cP) => {\r\n return cP.participants.map((p) => getParticipantPeerId(p));\r\n });\r\n } else if(chatId) {\r\n promise = Promise.resolve(this.getChatFull(chatId)).then((chatFull) => {\r\n return ((chatFull as ChatFull.chatFull).participants as ChatParticipants.chatParticipants).participants.map((p) => p.user_id.toPeerId());\r\n });\r\n } else {\r\n promise = Promise.resolve([]);\r\n }\r\n\r\n return Promise.all([\r\n // [],\r\n this.appUsersManager.getTopPeers('bots_inline').catch(() => [] as MyTopPeer[]),\r\n promise\r\n ]).then((results) => {\r\n const peers = results[0].concat(results[1].map((peerId) => ({id: peerId, rating: 0})));\r\n\r\n return processUserIds(peers);\r\n });\r\n }\r\n\r\n private invalidateChannelParticipants(id: ChatId) {\r\n this.apiManager.clearCache('channels.getParticipants', (params) => (params.channel as InputChannel.inputChannel).channel_id === id);\r\n this.refreshFullPeer(id.toPeerId(true));\r\n }\r\n\r\n private refreshFullPeer(peerId: PeerId) {\r\n if(peerId.isUser()) {\r\n const userId = peerId.toUserId();\r\n delete this.usersFull[userId];\r\n this.rootScope.dispatchEvent('user_full_update', userId);\r\n } else {\r\n const chatId = peerId.toChatId();\r\n delete this.chatsFull[chatId];\r\n this.rootScope.dispatchEvent('chat_full_update', chatId);\r\n }\r\n\r\n // ! эта строчка будет создавать race condition:\r\n // ! запрос вернёт chat с установленным флагом call_not_empty, хотя сам апдейт уже будет применён\r\n // this.getProfileByPeerId(peerId, true);\r\n }\r\n\r\n public updateProfile(first_name?: string, last_name?: string, about?: string) {\r\n return this.apiManager.invokeApi('account.updateProfile', {\r\n first_name,\r\n last_name,\r\n about\r\n }).then((user) => {\r\n this.appUsersManager.saveApiUser(user);\r\n\r\n if(about !== undefined) {\r\n const peerId = user.id.toPeerId();\r\n const userFull = this.usersFull[user.id];\r\n if(userFull) {\r\n userFull.about = about;\r\n }\r\n\r\n this.rootScope.dispatchEvent('peer_bio_edit', peerId);\r\n }\r\n\r\n return this.getProfile(user.id, true);\r\n });\r\n }\r\n\r\n public uploadProfilePhoto(inputFile: InputFile) {\r\n return this.apiManager.invokeApi('photos.uploadProfilePhoto', {\r\n file: inputFile\r\n }).then((updateResult) => {\r\n // ! sometimes can have no user in users\r\n const photo = updateResult.photo as Photo.photo;\r\n if(!updateResult.users.length) {\r\n const strippedThumb = photo.sizes.find((size) => size._ === 'photoStrippedSize') as PhotoSize.photoStrippedSize;\r\n updateResult.users.push({\r\n ...this.appUsersManager.getSelf(),\r\n photo: {\r\n _: 'userProfilePhoto',\r\n dc_id: photo.dc_id,\r\n photo_id: photo.id,\r\n stripped_thumb: strippedThumb?.bytes,\r\n pFlags: {\r\n\r\n }\r\n }\r\n });\r\n }\r\n this.appUsersManager.saveApiUsers(updateResult.users);\r\n\r\n const myId = this.appPeersManager.peerId;\r\n this.appPhotosManager.savePhoto(updateResult.photo, {\r\n type: 'profilePhoto',\r\n peerId: myId\r\n });\r\n\r\n const userId = myId.toUserId();\r\n this.apiUpdatesManager.processLocalUpdate({\r\n _: 'updateUserPhoto',\r\n user_id: userId,\r\n date: tsNow(true),\r\n photo: this.appUsersManager.getUser(userId).photo,\r\n previous: true\r\n });\r\n });\r\n }\r\n\r\n public deletePhotos(photoIds: string[]) {\r\n return this.apiManager.invokeApiSingle('photos.deletePhotos', {\r\n id: photoIds.map((photoId) => {\r\n const photo = this.appPhotosManager.getPhoto(photoId);\r\n return getPhotoInput(photo);\r\n })\r\n }).then((deletedList) => {\r\n\r\n });\r\n }\r\n\r\n private verifyParticipantForOnlineCount(participant: {user_id: UserId}) {\r\n const user = this.appUsersManager.getUser(participant.user_id);\r\n return !!(user && user.status && user.status._ === 'userStatusOnline');\r\n }\r\n\r\n private reduceParticipantsForOnlineCount(participants: {user_id: UserId}[]) {\r\n return participants.reduce((acc, participant) => {\r\n return acc + +this.verifyParticipantForOnlineCount(participant);\r\n }, 0);\r\n }\r\n\r\n public async getOnlines(id: ChatId): Promise<number> {\r\n const minOnline = 1;\r\n if(this.appChatsManager.isBroadcast(id)) {\r\n return minOnline;\r\n }\r\n\r\n const chatInfo = await this.getChatFull(id);\r\n if(this.appChatsManager.isMegagroup(id)) {\r\n if((chatInfo as ChatFull.channelFull).participants_count <= 100) {\r\n const channelParticipants = await this.getChannelParticipants(id, {_: 'channelParticipantsRecent'}, 100);\r\n return this.reduceParticipantsForOnlineCount(channelParticipants.participants as ChannelParticipant.channelParticipant[]);\r\n }\r\n\r\n const res = await this.apiManager.invokeApiCacheable('messages.getOnlines', {\r\n peer: this.appChatsManager.getChannelInputPeer(id)\r\n }, {cacheSeconds: 60});\r\n\r\n const onlines = res.onlines ?? minOnline;\r\n return onlines;\r\n }\r\n\r\n const _participants = (chatInfo as ChatFull.chatFull).participants as ChatParticipants.chatParticipants;\r\n if(_participants?.participants) {\r\n return this.reduceParticipantsForOnlineCount(_participants.participants);\r\n } else {\r\n return minOnline;\r\n }\r\n }\r\n\r\n private onUpdateUserTyping = (update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping) => {\r\n const fromId = (update as Update.updateUserTyping).user_id ?\r\n (update as Update.updateUserTyping).user_id.toPeerId() :\r\n this.appPeersManager.getPeerId((update as Update.updateChatUserTyping).from_id);\r\n if(this.appPeersManager.peerId === fromId || update.action._ === 'speakingInGroupCallAction') {\r\n return;\r\n }\r\n\r\n const peerId = this.appPeersManager.getPeerId(update);\r\n const typings = this.typingsInPeer[peerId] ?? (this.typingsInPeer[peerId] = []);\r\n let typing = typings.find((t) => t.userId === fromId);\r\n\r\n const cancelAction = () => {\r\n delete typing.timeout;\r\n // typings.findAndSplice((t) => t === typing);\r\n const idx = typings.indexOf(typing);\r\n if(idx !== -1) {\r\n typings.splice(idx, 1);\r\n }\r\n\r\n this.rootScope.dispatchEvent('peer_typings', {peerId, typings});\r\n\r\n if(!typings.length) {\r\n delete this.typingsInPeer[peerId];\r\n }\r\n };\r\n\r\n if(typing && typing.timeout !== undefined) {\r\n clearTimeout(typing.timeout);\r\n }\r\n\r\n if(update.action._ === 'sendMessageCancelAction') {\r\n if(!typing) {\r\n return;\r\n }\r\n\r\n cancelAction();\r\n return;\r\n }\r\n\r\n if(!typing) {\r\n typing = {\r\n userId: fromId\r\n };\r\n\r\n typings.push(typing);\r\n }\r\n\r\n // console.log('updateChatUserTyping', update, typings);\r\n\r\n typing.action = update.action;\r\n\r\n const hasUser = this.appUsersManager.hasUser(fromId);\r\n if(!hasUser) {\r\n // let's load user here\r\n if(update._ === 'updateChatUserTyping') {\r\n if(update.chat_id && this.appChatsManager.hasChat(update.chat_id) && !this.appChatsManager.isChannel(update.chat_id)) {\r\n Promise.resolve(this.getChatFull(update.chat_id)).then(() => {\r\n if(typing.timeout !== undefined && this.appUsersManager.hasUser(fromId)) {\r\n this.rootScope.dispatchEvent('peer_typings', {peerId, typings});\r\n }\r\n });\r\n }\r\n }\r\n\r\n // return;\r\n } else {\r\n this.appUsersManager.forceUserOnline(fromId);\r\n }\r\n\r\n typing.timeout = ctx.setTimeout(cancelAction, 6000);\r\n if(hasUser) {\r\n this.rootScope.dispatchEvent('peer_typings', {peerId, typings});\r\n }\r\n };\r\n\r\n private onUpdatePeerBlocked = (update: Update.updatePeerBlocked) => {\r\n const peerId = this.appPeersManager.getPeerId(update.peer_id);\r\n if(this.appPeersManager.isUser(peerId)) {\r\n const userId = peerId.toUserId();\r\n const userFull = this.usersFull[userId];\r\n if(userFull) {\r\n if(update.blocked) userFull.pFlags.blocked = true;\r\n else delete userFull.pFlags.blocked;\r\n }\r\n\r\n this.rootScope.dispatchEvent('user_full_update', userId);\r\n }\r\n\r\n this.rootScope.dispatchEvent('peer_block', {peerId, blocked: update.blocked});\r\n };\r\n\r\n public getPeerTypings(peerId: PeerId) {\r\n return this.typingsInPeer[peerId];\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {Awaited} from '../types';\r\n\r\nexport default function callbackifyAll<T extends readonly unknown[] | [], R extends any>(\r\n values: T,\r\n callback: (result: { -readonly [P in keyof T]: Awaited<T[P]> }) => R\r\n): Promise<Awaited<R>> | R {\r\n if(values.some((value) => value instanceof Promise)) {\r\n return Promise.all(values).then(callback as any);\r\n } else {\r\n return callback(values as any);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport findAndSplice from '../../helpers/array/findAndSplice';\r\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\r\nimport assumeType from '../../helpers/assumeType';\r\nimport callbackify from '../../helpers/callbackify';\r\nimport callbackifyAll from '../../helpers/callbackifyAll';\r\nimport copy from '../../helpers/object/copy';\r\nimport pause from '../../helpers/schedulers/pause';\r\nimport {AvailableReaction, Message, MessagePeerReaction, MessagesAvailableReactions, Reaction, ReactionCount, Update, Updates} from '../../layer';\r\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\r\nimport {AppManager} from './manager';\r\nimport getServerMessageId from './utils/messageId/getServerMessageId';\r\nimport reactionsEqual from './utils/reactions/reactionsEqual';\r\n\r\nconst SAVE_DOC_KEYS = [\r\n 'static_icon' as const,\r\n 'appear_animation' as const,\r\n 'select_animation' as const,\r\n 'activate_animation' as const,\r\n 'effect_animation' as const,\r\n 'around_animation' as const,\r\n 'center_icon' as const\r\n];\r\n\r\nconst REFERENCE_CONTEXT: ReferenceContext = {\r\n type: 'reactions'\r\n};\r\n\r\nexport class AppReactionsManager extends AppManager {\r\n private availableReactions: AvailableReaction[];\r\n private sendReactionPromises: Map<string, Promise<any>>;\r\n private lastSendingTimes: Map<string, number>;\r\n\r\n protected after() {\r\n this.rootScope.addEventListener('language_change', () => {\r\n this.availableReactions = undefined;\r\n this.getAvailableReactions();\r\n });\r\n\r\n this.sendReactionPromises = new Map();\r\n this.lastSendingTimes = new Map();\r\n\r\n this.rootScope.addEventListener('user_auth', () => {\r\n setTimeout(() => {\r\n Promise.resolve(this.getAvailableReactions()).then(async(availableReactions) => {\r\n for(const availableReaction of availableReactions) {\r\n await Promise.all([\r\n availableReaction.around_animation && this.apiFileManager.downloadMedia({media: availableReaction.around_animation}),\r\n availableReaction.static_icon && this.apiFileManager.downloadMedia({media: availableReaction.static_icon}),\r\n availableReaction.appear_animation && this.apiFileManager.downloadMedia({media: availableReaction.appear_animation}),\r\n availableReaction.center_icon && this.apiFileManager.downloadMedia({media: availableReaction.center_icon})\r\n ]);\r\n\r\n await pause(1000);\r\n }\r\n });\r\n }, 7.5e3);\r\n });\r\n }\r\n\r\n public getAvailableReactions() {\r\n if(this.availableReactions) return this.availableReactions;\r\n return this.apiManager.invokeApiSingleProcess({\r\n method: 'messages.getAvailableReactions',\r\n processResult: (messagesAvailableReactions) => {\r\n assumeType<MessagesAvailableReactions.messagesAvailableReactions>(messagesAvailableReactions);\r\n\r\n const availableReactions = this.availableReactions = messagesAvailableReactions.reactions;\r\n for(const reaction of availableReactions) {\r\n for(const key of SAVE_DOC_KEYS) {\r\n if(!reaction[key]) {\r\n continue;\r\n }\r\n\r\n reaction[key] = this.appDocsManager.saveDoc(reaction[key], REFERENCE_CONTEXT);\r\n }\r\n }\r\n\r\n return availableReactions;\r\n },\r\n params: {\r\n hash: 0\r\n }\r\n });\r\n }\r\n\r\n public getActiveAvailableReactions() {\r\n return callbackify(this.getAvailableReactions(), (availableReactions) => {\r\n return availableReactions.filter((availableReaction) => !availableReaction.pFlags.inactive);\r\n });\r\n }\r\n\r\n public getAvailableReactionsForPeer(peerId: PeerId) {\r\n const activeAvailableReactions = this.getActiveAvailableReactions();\r\n if(peerId.isUser()) {\r\n return this.unshiftQuickReaction(activeAvailableReactions);\r\n }\r\n\r\n const chatFull = this.appProfileManager.getChatFull(peerId.toChatId());\r\n return callbackifyAll([activeAvailableReactions, chatFull, this.getQuickReaction()], ([activeAvailableReactions, chatFull, quickReaction]) => {\r\n const chatAvailableReactions = chatFull.available_reactions ?? {_: 'chatReactionsNone'};\r\n\r\n let filteredChatAvailableReactions: AvailableReaction[] = [];\r\n if(chatAvailableReactions._ === 'chatReactionsAll') {\r\n filteredChatAvailableReactions = activeAvailableReactions;\r\n } else if(chatAvailableReactions._ === 'chatReactionsSome') {\r\n filteredChatAvailableReactions = chatAvailableReactions.reactions.map((reaction) => {\r\n return activeAvailableReactions.find((availableReaction) => availableReaction.reaction === (reaction as Reaction.reactionEmoji).emoticon);\r\n }).filter(Boolean);\r\n }\r\n\r\n return this.unshiftQuickReactionInner(filteredChatAvailableReactions, quickReaction);\r\n });\r\n }\r\n\r\n private unshiftQuickReactionInner(availableReactions: AvailableReaction[], quickReaction: Reaction | AvailableReaction) {\r\n if(quickReaction && quickReaction._ !== 'reactionEmoji' && quickReaction._ !== 'availableReaction') return availableReactions;\r\n const emoticon = (quickReaction as Reaction.reactionEmoji).emoticon || (quickReaction as AvailableReaction).reaction;\r\n const availableReaction = findAndSplice(availableReactions, (availableReaction) => availableReaction.reaction === emoticon);\r\n if(availableReaction) {\r\n availableReactions.unshift(availableReaction);\r\n }\r\n\r\n return availableReactions;\r\n }\r\n\r\n private unshiftQuickReaction(\r\n availableReactions: AvailableReaction[] | PromiseLike<AvailableReaction.availableReaction[]>,\r\n quickReaction: ReturnType<AppReactionsManager['getQuickReaction']> = this.getQuickReaction()\r\n ) {\r\n return callbackifyAll([\r\n availableReactions,\r\n quickReaction\r\n ], ([availableReactions, quickReaction]) => {\r\n return this.unshiftQuickReactionInner(availableReactions, quickReaction);\r\n });\r\n }\r\n\r\n public getAvailableReactionsByMessage(message: Message.message) {\r\n if(!message) return [];\r\n const peerId = (message.fwd_from?.channel_post && this.appPeersManager.isMegagroup(message.peerId) && message.fwdFromId) || message.peerId;\r\n return this.getAvailableReactionsForPeer(peerId);\r\n }\r\n\r\n public isReactionActive(reaction: string) {\r\n if(!this.availableReactions) return false;\r\n return !!this.availableReactions.find((availableReaction) => availableReaction.reaction === reaction);\r\n }\r\n\r\n public getQuickReaction() {\r\n return callbackifyAll([\r\n this.apiManager.getConfig(),\r\n this.getAvailableReactions()\r\n ], ([config, availableReactions]) => {\r\n const reaction = config.reactions_default;\r\n if(reaction?._ === 'reactionEmoji') {\r\n return availableReactions.find((availableReaction) => availableReaction.reaction === reaction.emoticon);\r\n }\r\n\r\n return reaction as Reaction.reactionCustomEmoji;\r\n });\r\n }\r\n\r\n public getReactionCached(reaction: string) {\r\n return this.availableReactions.find((availableReaction) => availableReaction.reaction === reaction);\r\n }\r\n\r\n public getReaction(reaction: string) {\r\n return callbackify(this.getAvailableReactions(), () => {\r\n return this.getReactionCached(reaction);\r\n });\r\n }\r\n\r\n public getMessagesReactions(peerId: PeerId, mids: number[]) {\r\n return this.apiManager.invokeApiSingleProcess({\r\n method: 'messages.getMessagesReactions',\r\n params: {\r\n id: mids.map((mid) => getServerMessageId(mid)),\r\n peer: this.appPeersManager.getInputPeerById(peerId)\r\n },\r\n processResult: (updates) => {\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n\r\n // const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateMessageReactions') as Update.updateMessageReactions;\r\n // return update.reactions;\r\n }\r\n });\r\n }\r\n\r\n public getMessageReactionsList(peerId: PeerId, mid: number, limit: number, reaction?: Reaction, offset?: string) {\r\n return this.apiManager.invokeApiSingleProcess({\r\n method: 'messages.getMessageReactionsList',\r\n params: {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n id: getServerMessageId(mid),\r\n limit,\r\n reaction,\r\n offset\r\n },\r\n processResult: (messageReactionsList) => {\r\n this.appUsersManager.saveApiUsers(messageReactionsList.users);\r\n return messageReactionsList;\r\n }\r\n });\r\n }\r\n\r\n public setDefaultReaction(reaction: Reaction) {\r\n return this.apiManager.invokeApi('messages.setDefaultReaction', {reaction}).then(async(value) => {\r\n if(value) {\r\n const appConfig = await this.apiManager.getConfig();\r\n if(appConfig) {\r\n appConfig.reactions_default = reaction;\r\n }/* else { // if no config or loading it - overwrite\r\n this.apiManager.getAppConfig(true);\r\n } */\r\n\r\n this.rootScope.dispatchEvent('quick_reaction', reaction);\r\n }\r\n\r\n return value;\r\n });\r\n }\r\n\r\n public async sendReaction(message: Message.message, reaction?: Reaction | AvailableReaction, onlyLocal?: boolean) {\r\n if(reaction._ === 'availableReaction') {\r\n reaction = {\r\n _: 'reactionEmoji',\r\n emoticon: reaction.reaction\r\n };\r\n }\r\n\r\n const limit = await this.apiManager.getLimit('reactions');\r\n\r\n const lastSendingTimeKey = message.peerId + '_' + message.mid;\r\n const lastSendingTime = this.lastSendingTimes.get(lastSendingTimeKey);\r\n if(lastSendingTime) {\r\n return;\r\n } else {\r\n this.lastSendingTimes.set(lastSendingTimeKey, Date.now());\r\n setTimeout(() => {\r\n this.lastSendingTimes.delete(lastSendingTimeKey);\r\n }, 333);\r\n }\r\n\r\n const {peerId, mid} = message;\r\n const myPeerId = this.appPeersManager.peerId;\r\n\r\n const unsetReactionCount = (reactionCount: ReactionCount) => {\r\n --reactionCount.count;\r\n delete reactionCount.chosen_order;\r\n\r\n if(reactionsEqual(reaction as Reaction, reactionCount.reaction)) {\r\n reaction = undefined as Reaction;\r\n }\r\n\r\n if(!reactionCount.count) {\r\n indexOfAndSplice(reactions.results, reactionCount);\r\n }/* else {\r\n insertInDescendSortedArray(reactions.results, chosenReaction, 'count', chosenReactionIdx);\r\n } */\r\n\r\n if(reactions.recent_reactions) {\r\n findAndSplice(reactions.recent_reactions, (recentReaction) => reactionsEqual(recentReaction.reaction, reactionCount.reaction) && this.appPeersManager.getPeerId(recentReaction.peer_id) === myPeerId);\r\n }\r\n\r\n if(!reactions.results.length) {\r\n reactions = undefined;\r\n }\r\n };\r\n\r\n const canSeeList = message.reactions?.pFlags?.can_see_list || !this.appPeersManager.isBroadcast(message.peerId) || message.peerId.isUser();\r\n if(!message.reactions) {\r\n message.reactions = {\r\n _: 'messageReactions',\r\n results: [],\r\n recent_reactions: canSeeList ? [] : undefined,\r\n pFlags: {\r\n can_see_list: canSeeList || undefined\r\n }\r\n };\r\n }\r\n\r\n let reactions = onlyLocal ? message.reactions : copy(message.reactions);\r\n const chosenReactions = reactions.results.filter((reactionCount) => reactionCount.chosen_order !== undefined);\r\n chosenReactions.sort((a, b) => b.chosen_order - a.chosen_order);\r\n const unsetReactions: ReactionCount[] = [];\r\n const chosenReactionIdx = chosenReactions.findIndex((reactionCount) => reactionsEqual(reactionCount.reaction, reaction as Reaction));\r\n if(chosenReactionIdx !== -1) unsetReactions.push(...chosenReactions.splice(chosenReactionIdx, 1));\r\n unsetReactions.push(...chosenReactions.splice(limit - +(chosenReactionIdx === -1)));\r\n unsetReactions.forEach((reactionCount) => {\r\n chosenReactions.forEach((chosenReactionCount) => {\r\n if(chosenReactionCount.chosen_order > reactionCount.chosen_order) {\r\n --chosenReactionCount.chosen_order;\r\n }\r\n });\r\n\r\n unsetReactionCount(reactionCount);\r\n });\r\n\r\n const chosenReactionsLength = chosenReactions.length;\r\n chosenReactions.forEach((reactionCount, idx) => {\r\n reactionCount.chosen_order = chosenReactionsLength - 1 - idx;\r\n });\r\n\r\n if(reaction) {\r\n if(!reactions) {\r\n reactions/* = message.reactions */ = {\r\n _: 'messageReactions',\r\n results: [],\r\n pFlags: {}\r\n };\r\n\r\n if(canSeeList) {\r\n reactions.pFlags.can_see_list = true;\r\n }\r\n }\r\n\r\n let reactionCountIdx = reactions.results.findIndex((reactionCount) => reactionsEqual(reactionCount.reaction, reaction as Reaction));\r\n let reactionCount = reactionCountIdx !== -1 && reactions.results[reactionCountIdx];\r\n if(!reactionCount) {\r\n reactionCount = {\r\n _: 'reactionCount',\r\n count: 0,\r\n reaction\r\n };\r\n\r\n reactionCountIdx = reactions.results.push(reactionCount) - 1;\r\n }\r\n\r\n ++reactionCount.count;\r\n reactionCount.chosen_order = chosenReactions.length ? chosenReactions[0].chosen_order + 1 : 0;\r\n chosenReactions.unshift(reactionCount);\r\n\r\n if(!reactions.recent_reactions && canSeeList) {\r\n reactions.recent_reactions = [];\r\n }\r\n\r\n if(reactions.recent_reactions) {\r\n const peerReaction: MessagePeerReaction = {\r\n _: 'messagePeerReaction',\r\n reaction,\r\n peer_id: this.appPeersManager.getOutputPeer(myPeerId)\r\n };\r\n\r\n if(!this.appPeersManager.isMegagroup(peerId) && false) {\r\n reactions.recent_reactions.push(peerReaction);\r\n reactions.recent_reactions = reactions.recent_reactions.slice(-3);\r\n } else {\r\n reactions.recent_reactions.unshift(peerReaction);\r\n reactions.recent_reactions = reactions.recent_reactions.slice(0, 3);\r\n }\r\n }\r\n\r\n // insertInDescendSortedArray(reactions.results, reactionCount, 'count', reactionCountIdx);\r\n }\r\n\r\n const availableReactions = this.availableReactions;\r\n if(reactions && availableReactions?.length) {\r\n const indexes: Map<DocId | string, number> = new Map();\r\n availableReactions.forEach((availableReaction, idx) => {\r\n indexes.set(availableReaction.reaction, idx);\r\n });\r\n\r\n reactions.results.sort((a, b) => {\r\n const id1 = (a.reaction as Reaction.reactionCustomEmoji).document_id || (a.reaction as Reaction.reactionEmoji).emoticon;\r\n const id2 = (b.reaction as Reaction.reactionCustomEmoji).document_id || (b.reaction as Reaction.reactionEmoji).emoticon;\r\n return (b.count - a.count) || ((indexes.get(id1) ?? 0) - (indexes.get(id2) ?? 0));\r\n });\r\n }\r\n\r\n if(onlyLocal) {\r\n message.reactions = reactions;\r\n this.rootScope.dispatchEvent('messages_reactions', [{message, changedResults: []}]);\r\n return Promise.resolve();\r\n }\r\n\r\n this.apiUpdatesManager.processLocalUpdate({\r\n _: 'updateMessageReactions',\r\n peer: message.peer_id,\r\n msg_id: message.id,\r\n reactions: reactions,\r\n local: true\r\n });\r\n\r\n const promiseKey = [peerId, mid].join('-');\r\n const msgId = getServerMessageId(mid);\r\n const promise = this.apiManager.invokeApi('messages.sendReaction', {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n msg_id: msgId,\r\n reaction: chosenReactions.map((reactionCount) => reactionCount.reaction)\r\n }).then((updates) => {\r\n assumeType<Updates.updates>(updates);\r\n\r\n const editMessageUpdateIdx = updates.updates.findIndex((update) => update._ === 'updateEditMessage' || update._ === 'updateEditChannelMessage');\r\n if(editMessageUpdateIdx !== -1) {\r\n const editMessageUpdate = updates.updates[editMessageUpdateIdx] as Update.updateEditMessage | Update.updateEditChannelMessage;\r\n updates.updates[editMessageUpdateIdx] = {\r\n _: 'updateMessageReactions',\r\n msg_id: msgId,\r\n peer: this.appPeersManager.getOutputPeer(peerId),\r\n reactions: (editMessageUpdate.message as Message.message).reactions,\r\n pts: editMessageUpdate.pts,\r\n pts_count: editMessageUpdate.pts_count\r\n };\r\n }\r\n\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n }).catch((err) => {\r\n if(err.type === 'REACTION_INVALID' && this.sendReactionPromises.get(promiseKey) === promise) {\r\n this.sendReaction(message, chosenReactions[0]?.reaction, true);\r\n }\r\n }).finally(() => {\r\n if(this.sendReactionPromises.get(promiseKey) === promise) {\r\n this.sendReactionPromises.delete(promiseKey);\r\n }\r\n });\r\n\r\n this.sendReactionPromises.set(promiseKey, promise);\r\n return promise;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {MyDocument} from './appDocsManager';\r\nimport type {DownloadOptions} from '../mtproto/apiFileManager';\r\nimport {Document, InputFileLocation, InputStickerSet, MessagesAllStickers, MessagesFavedStickers, MessagesFeaturedStickers, MessagesFoundStickerSets, MessagesRecentStickers, MessagesStickers, MessagesStickerSet, PhotoSize, StickerPack, StickerSet, StickerSetCovered, Update} from '../../layer';\r\nimport {Modify} from '../../types';\r\nimport AppStorage from '../storage';\r\nimport DATABASE_STATE from '../../config/databases/state';\r\nimport assumeType from '../../helpers/assumeType';\r\nimport fixBase64String from '../../helpers/fixBase64String';\r\nimport forEachReverse from '../../helpers/array/forEachReverse';\r\nimport findAndSplice from '../../helpers/array/findAndSplice';\r\nimport {AppManager} from './manager';\r\nimport fixEmoji from '../richTextProcessor/fixEmoji';\r\nimport ctx from '../../environment/ctx';\r\nimport {getEnvironment} from '../../environment/utils';\r\nimport getDocumentInput from './utils/docs/getDocumentInput';\r\nimport getStickerEffectThumb from './utils/stickers/getStickerEffectThumb';\r\n\r\nconst CACHE_TIME = 3600e3;\r\n\r\nconst EMOJI_SET_LOCAL_ID = 'emoji';\r\nconst EMOJI_ANIMATIONS_SET_LOCAL_ID = 'emojiAnimations';\r\nconst LOCAL_IDS_SET = new Set([\r\n EMOJI_SET_LOCAL_ID,\r\n EMOJI_ANIMATIONS_SET_LOCAL_ID\r\n]);\r\n\r\n// let TEST_FILE_REFERENCE_REFRESH = true;\r\n\r\nexport type MyStickerSetInput = {\r\n id: StickerSet.stickerSet['id'],\r\n access_hash?: StickerSet.stickerSet['access_hash']\r\n};\r\n\r\nexport type MyMessagesStickerSet = MessagesStickerSet.messagesStickerSet;\r\n\r\nexport class AppStickersManager extends AppManager {\r\n private storage = new AppStorage<Record<Long, MyMessagesStickerSet>, typeof DATABASE_STATE>(DATABASE_STATE, 'stickerSets');\r\n\r\n private getStickerSetPromises: {[setId: Long]: Promise<MyMessagesStickerSet>};\r\n private getStickersByEmoticonsPromises: {[emoticon: string]: Promise<MyDocument[]>};\r\n\r\n private greetingStickers: MyDocument[];\r\n private getGreetingStickersTimeout: number;\r\n private getGreetingStickersPromise: Promise<void>;\r\n\r\n private sounds: Record<string, MyDocument>;\r\n private getAnimatedEmojiSoundsPromise: Promise<void>;\r\n\r\n private favedStickers: MyDocument[];\r\n private recentStickers: MyDocument[];\r\n\r\n private names: Record<string, InputStickerSet.inputStickerSetID>;\r\n\r\n protected after() {\r\n this.getStickerSetPromises = {};\r\n this.getStickersByEmoticonsPromises = {};\r\n this.sounds = {};\r\n this.names = {};\r\n\r\n this.rootScope.addEventListener('user_auth', () => {\r\n setTimeout(() => {\r\n this.getAnimatedEmojiStickerSet();\r\n // this.getFavedStickersStickers();\r\n }, 1000);\r\n\r\n if(!this.getGreetingStickersPromise && this.getGreetingStickersTimeout === undefined) {\r\n this.getGreetingStickersTimeout = ctx.setTimeout(() => {\r\n this.getGreetingStickersTimeout = undefined;\r\n this.getGreetingSticker(true);\r\n }, 5000);\r\n }\r\n });\r\n\r\n this.rootScope.addEventListener('app_config', () => this.onStickersUpdated('faved', true));\r\n\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updateNewStickerSet: (update) => {\r\n const stickerSet = update.stickerset as MyMessagesStickerSet;\r\n this.saveStickerSet(stickerSet, stickerSet.set.id);\r\n this.rootScope.dispatchEvent('stickers_installed', stickerSet.set);\r\n },\r\n\r\n updateRecentStickers: () => this.onStickersUpdated('recent', true),\r\n\r\n updateFavedStickers: () => this.onStickersUpdated('faved', true),\r\n\r\n updateMoveStickerSetToTop: (update) => {\r\n this.rootScope.dispatchEvent('stickers_top', update.stickerset);\r\n }\r\n });\r\n }\r\n\r\n private async onStickersUpdated(type: 'faved' | 'recent', overwrite: boolean) {\r\n const stickers = await (type === 'faved' ? this.getFavedStickersStickers(overwrite) : this.getRecentStickersStickers(overwrite));\r\n this.rootScope.dispatchEvent('stickers_updated', {\r\n type,\r\n stickers\r\n });\r\n }\r\n\r\n public getGreetingSticker(justPreload = false) {\r\n if(this.getGreetingStickersTimeout) {\r\n clearTimeout(this.getGreetingStickersTimeout);\r\n this.getGreetingStickersTimeout = undefined;\r\n }\r\n\r\n if(!this.getGreetingStickersPromise) {\r\n this.getGreetingStickersPromise = this.getStickersByEmoticon('👋⭐️', false).then((docs) => {\r\n if(!docs.length) throw 'NO_STICKERS';\r\n this.greetingStickers = docs.slice() as Document.document[];\r\n this.greetingStickers.sort((a, b) => Math.random() - Math.random());\r\n });\r\n }\r\n\r\n return this.getGreetingStickersPromise.then(() => {\r\n let doc: Document.document;\r\n if(!justPreload) {\r\n doc = this.greetingStickers.shift();\r\n this.greetingStickers.push(doc);\r\n }\r\n\r\n this.apiFileManager.downloadMedia({media: this.greetingStickers[0]}); // preload next sticker\r\n\r\n return doc;\r\n });\r\n }\r\n\r\n private saveStickers(docs: Document[]) {\r\n forEachReverse(docs, (doc, idx) => {\r\n doc = this.appDocsManager.saveDoc(doc);\r\n\r\n if(!doc) docs.splice(idx, 1);\r\n else docs[idx] = doc;\r\n });\r\n }\r\n\r\n private canUseStickerSetCache(set: MyMessagesStickerSet, useCache?: boolean) {\r\n return set && set.documents?.length && ((Date.now() - set.refreshTime) < CACHE_TIME || useCache);\r\n }\r\n\r\n public getStickerSet(set: MyStickerSetInput, params: Partial<{\r\n overwrite: boolean,\r\n useCache: boolean,\r\n saveById: boolean\r\n }> = {}): Promise<MyMessagesStickerSet> | MyMessagesStickerSet {\r\n let {id} = set;\r\n if(!set.access_hash) {\r\n set = this.names[id] || set;\r\n id = set.id;\r\n }\r\n\r\n if(this.getStickerSetPromises[id]) {\r\n return this.getStickerSetPromises[id];\r\n }\r\n\r\n if(!params.overwrite) {\r\n const cachedSet = this.storage.getFromCache(id);\r\n if(this.canUseStickerSetCache(cachedSet, params.useCache)) {\r\n return cachedSet;\r\n }\r\n }\r\n\r\n const promise = this.getStickerSetPromises[id] = new Promise(async(resolve) => {\r\n if(!params.overwrite) {\r\n const cachedSet = await this.storage.get(id);\r\n if(this.canUseStickerSetCache(cachedSet, params.useCache)) {\r\n this.saveStickers(cachedSet.documents);\r\n resolve(cachedSet);\r\n\r\n if(this.getStickerSetPromises[id] === promise) {\r\n delete this.getStickerSetPromises[id];\r\n }\r\n\r\n return;\r\n }\r\n }\r\n\r\n try {\r\n const stickerSet = await this.apiManager.invokeApi('messages.getStickerSet', {\r\n stickerset: this.getStickerSetInput(set),\r\n hash: 0\r\n }) as MyMessagesStickerSet;\r\n\r\n const saveById = params.saveById ? id : stickerSet.set.id;\r\n this.saveStickerSet(stickerSet, saveById);\r\n\r\n resolve(stickerSet);\r\n } catch(err) {\r\n resolve(null);\r\n }\r\n\r\n if(this.getStickerSetPromises[id] === promise) {\r\n delete this.getStickerSetPromises[id];\r\n }\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n public getAnimatedEmojiStickerSet() {\r\n return Promise.all([\r\n this.getStickerSet({id: EMOJI_SET_LOCAL_ID}, {saveById: true}),\r\n this.getStickerSet({id: EMOJI_ANIMATIONS_SET_LOCAL_ID}, {saveById: true}),\r\n this.getAnimatedEmojiSounds()\r\n ]).then(([emoji, animations]) => {\r\n return {emoji, animations};\r\n });\r\n }\r\n\r\n public getAnimatedEmojiSounds(overwrite?: boolean) {\r\n if(this.getAnimatedEmojiSoundsPromise && !overwrite) return this.getAnimatedEmojiSoundsPromise;\r\n const promise = this.getAnimatedEmojiSoundsPromise = Promise.all([\r\n this.apiManager.getAppConfig(overwrite),\r\n this.apiManager.getConfig()\r\n ]).then(([appConfig, config]) => {\r\n if(this.getAnimatedEmojiSoundsPromise !== promise) {\r\n return;\r\n }\r\n\r\n for(const emoji in appConfig.emojies_sounds) {\r\n const sound = appConfig.emojies_sounds[emoji];\r\n const bytesStr = atob(fixBase64String(sound.file_reference_base64, false));\r\n const bytes = new Uint8Array(bytesStr.length);\r\n for(let i = 0, length = bytes.length; i < length; ++i) {\r\n bytes[i] = bytesStr[i].charCodeAt(0);\r\n }\r\n\r\n // if(TEST_FILE_REFERENCE_REFRESH) {\r\n // bytes[0] = bytes[1] = bytes[2] = bytes[3] = bytes[4] = 0;\r\n // sound.access_hash += '999';\r\n // }\r\n\r\n const doc = this.appDocsManager.saveDoc({\r\n _: 'document',\r\n pFlags: {},\r\n flags: 0,\r\n id: sound.id,\r\n access_hash: sound.access_hash,\r\n attributes: [{\r\n _: 'documentAttributeAudio',\r\n duration: 1,\r\n pFlags: {\r\n voice: true\r\n }\r\n }],\r\n date: 0,\r\n dc_id: config.this_dc,\r\n file_reference: bytes,\r\n mime_type: 'audio/ogg'\r\n // size: 101010 // test loading everytime\r\n }, {\r\n type: 'emojiesSounds'\r\n });\r\n\r\n this.sounds[emoji] = doc;\r\n }\r\n\r\n // if(TEST_FILE_REFERENCE_REFRESH) {\r\n // TEST_FILE_REFERENCE_REFRESH = false;\r\n // }\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n public async getRecentStickers(overwrite?: boolean): Promise<Modify<MessagesRecentStickers.messagesRecentStickers, {\r\n stickers: Document[]\r\n }>> {\r\n const res = await this.apiManager.invokeApiHashable({\r\n method: 'messages.getRecentStickers',\r\n processResult: (res) => {\r\n assumeType<MessagesRecentStickers.messagesRecentStickers>(res);\r\n\r\n this.recentStickers = res.stickers as MyDocument[];\r\n this.saveStickers(res.stickers);\r\n return res;\r\n },\r\n overwrite\r\n });\r\n\r\n return res;\r\n }\r\n\r\n public getRecentStickersStickers(overwrite?: boolean) {\r\n if(overwrite) this.recentStickers = undefined;\r\n else if(this.recentStickers) return this.recentStickers;\r\n return this.getRecentStickers(overwrite).then(() => this.recentStickers);\r\n }\r\n\r\n public saveRecentSticker(docId: DocId, unsave?: boolean, attached?: boolean) {\r\n const doc = this.appDocsManager.getDoc(docId);\r\n\r\n findAndSplice(this.recentStickers, (_doc) => _doc.id === docId);\r\n if(!unsave) {\r\n this.recentStickers.unshift(doc);\r\n\r\n const docEmoticon = fixEmoji(doc.stickerEmojiRaw);\r\n for(const emoticon in this.getStickersByEmoticonsPromises) {\r\n const promise = this.getStickersByEmoticonsPromises[emoticon];\r\n promise.then((stickers) => {\r\n const _doc = findAndSplice(stickers, (_doc) => _doc.id === doc.id);\r\n if(_doc) {\r\n stickers.unshift(_doc);\r\n } else if(emoticon.includes(docEmoticon)) {\r\n stickers.unshift(doc);\r\n }\r\n });\r\n }\r\n }\r\n\r\n this.rootScope.dispatchEvent('sticker_updated', {type: 'recent', faved: !unsave, document: doc});\r\n\r\n if(unsave) {\r\n this.onStickersUpdated('recent', false);\r\n }\r\n\r\n return this.apiManager.invokeApi('messages.saveRecentSticker', {\r\n id: getDocumentInput(doc),\r\n unsave,\r\n attached\r\n });\r\n }\r\n\r\n private cleanEmoji(emoji: string) {\r\n return emoji.replace(/\\ufe0f/g, '').replace(/🏻|🏼|🏽|🏾|🏿/g, '');\r\n }\r\n\r\n public getAnimatedEmojiSticker(emoji: string, isAnimation?: boolean) {\r\n const id = isAnimation ? EMOJI_ANIMATIONS_SET_LOCAL_ID : EMOJI_SET_LOCAL_ID;\r\n const stickerSet = this.storage.getFromCache(id);\r\n // const stickerSet = await this.getStickerSet({id});\r\n if(!stickerSet?.documents) return;\r\n\r\n if(isAnimation) {\r\n if(['🧡', '💛', '💚', '💙', '💜', '🖤', '🤍', '🤎'].includes(emoji)) {\r\n emoji = '❤️';\r\n }\r\n }\r\n\r\n emoji = this.cleanEmoji(emoji);\r\n const pack = stickerSet.packs.find((p) => p.emoticon === emoji);\r\n return pack ? this.appDocsManager.getDoc(pack.documents[0]) : undefined;\r\n }\r\n\r\n public getAnimatedEmojiSoundDocument(emoji: string) {\r\n return this.sounds[this.cleanEmoji(emoji)];\r\n }\r\n\r\n public preloadAnimatedEmojiSticker(emoji: string) {\r\n const preloadEmojiPromise = this.getAnimatedEmojiStickerSet().then(() => {\r\n return this.getAnimatedEmojiSticker(emoji);\r\n });\r\n\r\n return Promise.all([\r\n preloadEmojiPromise,\r\n this.preloadAnimatedEmojiStickerAnimation(emoji)\r\n ]).then(([doc, a]) => {\r\n return {\r\n doc: doc,\r\n animation: a?.doc,\r\n sound: a?.sound\r\n };\r\n });\r\n }\r\n\r\n public preloadAnimatedEmojiStickerAnimation(emoji: string) {\r\n return this.getAnimatedEmojiStickerSet().then(() => {\r\n return this.getAnimatedEmojiSticker(emoji, true);\r\n }).then((doc) => {\r\n if(!doc) {\r\n return;\r\n }\r\n\r\n const sound = this.getAnimatedEmojiSoundDocument(emoji);\r\n return Promise.all([\r\n this.preloadSticker(doc.id),\r\n sound ? this.preloadSticker(sound.id) : undefined\r\n ]).then(() => {\r\n return {doc, sound};\r\n });\r\n });\r\n }\r\n\r\n public preloadSticker(docId: DocId, isPremiumEffect?: boolean) {\r\n const doc = this.appDocsManager.getDoc(docId);\r\n return this.apiFileManager.downloadMedia({media: doc, thumb: isPremiumEffect ? doc.video_thumbs?.[0] : undefined});\r\n }\r\n\r\n private saveStickerSet(res: Omit<MessagesStickerSet.messagesStickerSet, '_'>, id: DocId) {\r\n const newSet: MessagesStickerSet = {\r\n _: 'messages.stickerSet',\r\n set: res.set,\r\n packs: res.packs,\r\n documents: res.documents as Document[],\r\n keywords: res.keywords\r\n };\r\n\r\n let stickerSet = this.storage.getFromCache(id);\r\n if(stickerSet) {\r\n Object.assign(stickerSet, newSet);\r\n } else {\r\n stickerSet = this.storage.setToCache(id, newSet);\r\n }\r\n\r\n if(stickerSet.set.short_name) {\r\n this.names[stickerSet.set.short_name] = this.getStickerSetInput(newSet.set) as any;\r\n }\r\n\r\n this.saveStickers(res.documents);\r\n\r\n // console.log('stickers wrote', this.stickerSets);\r\n const needSave = stickerSet.set.installed_date || LOCAL_IDS_SET.has(id as any);\r\n stickerSet.refreshTime = Date.now();\r\n this.storage.set({[id]: stickerSet}, !needSave);\r\n }\r\n\r\n public getStickerSetThumbDownloadOptions(stickerSet: StickerSet.stickerSet): DownloadOptions {\r\n const thumb = stickerSet.thumbs.find((thumb) => thumb._ === 'photoSize') as PhotoSize.photoSize;\r\n const dcId = stickerSet.thumb_dc_id;\r\n\r\n const isAnimated = stickerSet.pFlags?.animated;\r\n\r\n const input: InputFileLocation.inputStickerSetThumb = {\r\n _: 'inputStickerSetThumb',\r\n stickerset: this.getStickerSetInput(stickerSet),\r\n thumb_version: stickerSet.thumb_version\r\n };\r\n\r\n return {dcId, location: input, size: thumb.size, mimeType: isAnimated ? 'application/x-tgsticker' : 'image/webp'};\r\n }\r\n\r\n /* public getStickerSetThumbURL(stickerSet: MTStickerSet) {\r\n const thumb = stickerSet.thumb;\r\n const dcId = stickerSet.thumb_dc_id;\r\n\r\n const isAnimated = stickerSet.pFlags?.animated;\r\n\r\n const input: inputStickerSetThumb = {\r\n _: 'inputStickerSetThumb',\r\n stickerset: this.getStickerSetInput(stickerSet),\r\n volume_id: thumb.location.volume_id,\r\n local_id: thumb.location.local_id\r\n };\r\n\r\n const url = getFileURL('document', this.getStickerSetThumbDownloadOptions(stickerSet));\r\n return url;\r\n\r\n //return promise;\r\n } */\r\n\r\n public getStickerSetInput(set: MyStickerSetInput): InputStickerSet {\r\n if(set.id === EMOJI_SET_LOCAL_ID) {\r\n return {\r\n _: 'inputStickerSetAnimatedEmoji'\r\n };\r\n } else if(set.id === EMOJI_ANIMATIONS_SET_LOCAL_ID) {\r\n return {\r\n _: 'inputStickerSetAnimatedEmojiAnimations'\r\n };\r\n } else if(!set.access_hash) {\r\n return {\r\n _: 'inputStickerSetShortName',\r\n short_name: '' + set.id\r\n };\r\n } else {\r\n return {\r\n _: 'inputStickerSetID',\r\n id: set.id,\r\n access_hash: set.access_hash\r\n };\r\n }\r\n }\r\n\r\n public async getFeaturedStickers() {\r\n const res = await this.apiManager.invokeApiHashable({\r\n method: 'messages.getFeaturedStickers',\r\n processResult: (res) => {\r\n assumeType<MessagesFeaturedStickers.messagesFeaturedStickers>(res);\r\n\r\n forEachReverse(res.sets, (covered, idx, arr) => {\r\n if(covered.set.pFlags.videos && !getEnvironment().IS_WEBM_SUPPORTED) {\r\n arr.splice(idx, 1);\r\n }\r\n });\r\n\r\n res.sets.forEach((covered) => {\r\n this.saveStickerSet({set: covered.set, documents: [], packs: [], keywords: []}, covered.set.id);\r\n });\r\n\r\n return res;\r\n }\r\n });\r\n\r\n return res.sets;\r\n }\r\n\r\n public getPromoPremiumStickers() {\r\n return this.getStickersByEmoticon('⭐️⭐️', false);\r\n }\r\n\r\n public getPremiumStickers() {\r\n return this.getStickersByEmoticon('📂⭐️', false);\r\n }\r\n\r\n public getFavedStickers(overwrite?: boolean) {\r\n return this.apiManager.invokeApiHashable({\r\n method: 'messages.getFavedStickers',\r\n processResult: (favedStickers) => {\r\n assumeType<MessagesFavedStickers.messagesFavedStickers>(favedStickers);\r\n this.saveStickers(favedStickers.stickers);\r\n this.favedStickers = favedStickers.stickers as MyDocument[];\r\n return favedStickers;\r\n },\r\n overwrite\r\n });\r\n }\r\n\r\n public getFavedStickersStickers(overwrite?: boolean) {\r\n if(overwrite) this.favedStickers = undefined;\r\n else if(this.favedStickers) return this.favedStickers;\r\n return this.getFavedStickers(overwrite).then(() => this.favedStickers);\r\n }\r\n\r\n public getFavedStickersLimit() {\r\n return this.apiManager.getLimit('favedStickers');\r\n }\r\n\r\n public async faveSticker(docId: DocId, unfave?: boolean) {\r\n if(!this.favedStickers) {\r\n await this.getFavedStickersStickers();\r\n }\r\n\r\n const limit = await this.getFavedStickersLimit();\r\n\r\n const doc = this.appDocsManager.getDoc(docId);\r\n findAndSplice(this.favedStickers, (_doc) => _doc.id === doc.id);\r\n\r\n if(!unfave) {\r\n this.favedStickers.unshift(doc);\r\n const spliced = this.favedStickers.splice(limit, this.favedStickers.length - limit);\r\n }\r\n\r\n this.rootScope.dispatchEvent('sticker_updated', {type: 'faved', faved: !unfave, document: doc});\r\n\r\n return this.apiManager.invokeApi('messages.faveSticker', {\r\n id: getDocumentInput(doc),\r\n unfave\r\n }).then(() => {\r\n if(unfave) {\r\n this.onStickersUpdated('faved', true);\r\n }\r\n });\r\n }\r\n\r\n public async toggleStickerSet(set: StickerSet.stickerSet) {\r\n set = this.storage.getFromCache(set.id).set;\r\n\r\n if(set.installed_date) {\r\n const res = await this.apiManager.invokeApi('messages.uninstallStickerSet', {\r\n stickerset: this.getStickerSetInput(set)\r\n });\r\n\r\n if(res) {\r\n delete set.installed_date;\r\n this.rootScope.dispatchEvent('stickers_deleted', set);\r\n this.storage.delete(set.id, true);\r\n return true;\r\n }\r\n } else {\r\n const res = await this.apiManager.invokeApi('messages.installStickerSet', {\r\n stickerset: this.getStickerSetInput(set),\r\n archived: false\r\n });\r\n\r\n if(res) {\r\n set.installed_date = Date.now() / 1000 | 0;\r\n this.rootScope.dispatchEvent('stickers_installed', set);\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public toggleStickerSets(sets: StickerSet.stickerSet[]) {\r\n return Promise.all(sets.map((set) => this.toggleStickerSet(set)));\r\n }\r\n\r\n public async searchStickerSets(query: string, excludeFeatured = true) {\r\n const flags = excludeFeatured ? 1 : 0;\r\n const res = await this.apiManager.invokeApiHashable({\r\n method: 'messages.searchStickerSets',\r\n params: {\r\n flags,\r\n exclude_featured: excludeFeatured || undefined,\r\n q: query\r\n },\r\n processResult: (res) => {\r\n assumeType<MessagesFoundStickerSets.messagesFoundStickerSets>(res);\r\n\r\n forEachReverse(res.sets, (covered, idx, arr) => {\r\n if(covered.set.pFlags.videos && !getEnvironment().IS_WEBM_SUPPORTED) {\r\n arr.splice(idx, 1);\r\n }\r\n });\r\n\r\n res.sets.forEach((covered) => {\r\n this.saveStickerSet({set: covered.set, documents: [], packs: [], keywords: []}, covered.set.id);\r\n });\r\n\r\n return res;\r\n }\r\n });\r\n\r\n const foundSaved: StickerSetCovered[] = [];\r\n const cache = this.storage.getCache();\r\n for(const id in cache) {\r\n const {set} = cache[id];\r\n\r\n if(set.title.toLowerCase().includes(query.toLowerCase()) && !res.sets.find((c) => c.set.id === set.id)) {\r\n foundSaved.push({_: 'stickerSetCovered', set, cover: null});\r\n }\r\n }\r\n\r\n return res.sets.concat(foundSaved);\r\n }\r\n\r\n private processAllStickersResult = (allStickers: MessagesAllStickers) => {\r\n assumeType<MessagesAllStickers.messagesAllStickers>(allStickers);\r\n\r\n forEachReverse(allStickers.sets, (stickerSet, idx, arr) => {\r\n if(stickerSet.pFlags.videos && !getEnvironment().IS_WEBM_SUPPORTED) {\r\n arr.splice(idx, 1);\r\n }\r\n });\r\n\r\n return allStickers;\r\n };\r\n\r\n public getAllStickers() {\r\n return this.apiManager.invokeApiHashable({\r\n method: 'messages.getAllStickers',\r\n processResult: this.processAllStickersResult\r\n });\r\n }\r\n\r\n public getEmojiStickers() {\r\n return this.apiManager.invokeApiHashable({\r\n method: 'messages.getEmojiStickers',\r\n processResult: this.processAllStickersResult\r\n });\r\n }\r\n\r\n public preloadStickerSets() {\r\n return this.getAllStickers().then((allStickers) => {\r\n return Promise.all((allStickers as MessagesAllStickers.messagesAllStickers).sets.map((set) => this.getStickerSet(set, {useCache: true})));\r\n });\r\n }\r\n\r\n // TODO: detect \"🤷\" by \"🤷‍♂️\"\r\n public getStickersByEmoticon(emoticon: string, includeOurStickers = true) {\r\n emoticon = fixEmoji(emoticon);\r\n if(this.getStickersByEmoticonsPromises[emoticon]) return this.getStickersByEmoticonsPromises[emoticon];\r\n\r\n return this.getStickersByEmoticonsPromises[emoticon] = Promise.all([\r\n this.apiManager.invokeApiHashable({\r\n method: 'messages.getStickers',\r\n params: {\r\n emoticon\r\n },\r\n processResult: (stickers) => stickers\r\n }),\r\n includeOurStickers ? this.preloadStickerSets() : [],\r\n includeOurStickers ? this.getRecentStickers() : undefined\r\n ]).then(([messagesStickers, installedSets, recentStickers]) => {\r\n const foundStickers = (messagesStickers as MessagesStickers.messagesStickers).stickers.map((sticker) => this.appDocsManager.saveDoc(sticker));\r\n const cachedStickersAnimated: Document.document[] = [], cachedStickersStatic: Document.document[] = [];\r\n\r\n // console.log('getStickersByEmoticon', messagesStickers, installedSets, recentStickers);\r\n\r\n const iteratePacks = (packs: StickerPack.stickerPack[]) => {\r\n for(const pack of packs) {\r\n const packEmoticon = fixEmoji(pack.emoticon);\r\n if(packEmoticon.includes(emoticon)) {\r\n for(const docId of pack.documents) {\r\n const doc = this.appDocsManager.getDoc(docId);\r\n (doc.animated ? cachedStickersAnimated : cachedStickersStatic).push(doc);\r\n }\r\n }\r\n }\r\n };\r\n\r\n if(recentStickers) {\r\n iteratePacks(recentStickers.packs);\r\n const stickers = recentStickers.stickers;\r\n [cachedStickersAnimated, cachedStickersStatic].forEach((s) => {\r\n s.sort((a, b) => stickers.indexOf(a) - stickers.indexOf(b));\r\n });\r\n }\r\n\r\n for(const set of installedSets) {\r\n iteratePacks(set.packs);\r\n }\r\n\r\n /* const entities = parseEntities(emoticon);\r\n if(entities.length === 1) {\r\n [cachedStickersAnimated, cachedStickersStatic].forEach((s) => {\r\n forEachReverse(s, (doc, idx) => {\r\n const docEmoticon = fixEmoji(doc.stickerEmojiRaw);\r\n if(docEmoticon !== emoticon) {\r\n s.splice(idx, 1);\r\n }\r\n });\r\n });\r\n } */\r\n\r\n const stickers = [...new Set(cachedStickersAnimated.concat(cachedStickersStatic, foundStickers))]/* .filter((doc) => !doc.animated) */;\r\n\r\n forEachReverse(stickers, (sticker, idx, arr) => {\r\n if((sticker.sticker === 3 && !getEnvironment().IS_WEBM_SUPPORTED) ||\r\n (!this.rootScope.premium && getStickerEffectThumb(sticker))) {\r\n arr.splice(idx, 1);\r\n }\r\n });\r\n\r\n return stickers;\r\n });\r\n }\r\n\r\n public clearRecentStickers() {\r\n if(this.recentStickers) {\r\n this.recentStickers.length = 0;\r\n this.onStickersUpdated('recent', false);\r\n }\r\n\r\n return this.apiManager.invokeApi('messages.clearRecentStickers');\r\n }\r\n}\r\n","export default function fixBase64String(str: string, toUrl: boolean) {\r\n if(toUrl) {\r\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\r\n } else {\r\n return str.replace(/-/g, '+').replace(/_/g, '/');\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport default function cleanUsername(username: string) {\r\n return username && username.toLowerCase() || '';\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport filterUnique from '../../helpers/array/filterUnique';\r\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\r\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\r\nimport cleanSearchText from '../../helpers/cleanSearchText';\r\nimport cleanUsername from '../../helpers/cleanUsername';\r\nimport tsNow from '../../helpers/tsNow';\r\nimport isObject from '../../helpers/object/isObject';\r\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\r\nimport {isRestricted} from '../../helpers/restrictions';\r\nimport {Chat, ContactsResolvedPeer, InputContact, InputGeoPoint, InputMedia, InputPeer, InputUser, User as MTUser, UserProfilePhoto, UserStatus} from '../../layer';\r\nimport parseEntities from '../richTextProcessor/parseEntities';\r\nimport wrapUrl from '../richTextProcessor/wrapUrl';\r\nimport SearchIndex from '../searchIndex';\r\nimport {AppManager} from './manager';\r\nimport getPeerId from './utils/peers/getPeerId';\r\nimport canSendToUser from './utils/users/canSendToUser';\r\nimport {AppStoragesManager} from './appStoragesManager';\r\n\r\nexport type User = MTUser.user;\r\nexport type TopPeerType = 'correspondents' | 'bots_inline';\r\nexport type MyTopPeer = {id: PeerId, rating: number};\r\n\r\nexport class AppUsersManager extends AppManager {\r\n private storage: AppStoragesManager['storages']['users'];\r\n\r\n private users: {[userId: UserId]: User};\r\n private usernames: {[username: string]: UserId};\r\n private contactsIndex: SearchIndex<UserId>;\r\n private contactsFillPromise: CancellablePromise<AppUsersManager['contactsList']>;\r\n private contactsList: Set<UserId>;\r\n private updatedContactsList: boolean;\r\n\r\n private getTopPeersPromises: {[type in TopPeerType]?: Promise<MyTopPeer[]>};\r\n\r\n protected after() {\r\n this.clear(true);\r\n\r\n setInterval(this.updateUsersStatuses, 60000);\r\n\r\n this.rootScope.addEventListener('state_synchronized', this.updateUsersStatuses);\r\n\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updateUserStatus: (update) => {\r\n const userId = update.user_id;\r\n const user = this.users[userId];\r\n if(user) {\r\n user.status = update.status;\r\n if(user.status) {\r\n if('expires' in user.status) {\r\n user.status.expires -= this.timeManager.getServerTimeOffset();\r\n }\r\n\r\n if('was_online' in user.status) {\r\n user.status.was_online -= this.timeManager.getServerTimeOffset();\r\n }\r\n }\r\n\r\n // user.sortStatus = this.getUserStatusForSort(user.status);\r\n this.rootScope.dispatchEvent('user_update', userId);\r\n this.setUserToStateIfNeeded(user);\r\n } // ////else console.warn('No user by id:', userId);\r\n },\r\n\r\n updateUserPhoto: (update) => {\r\n const userId = update.user_id;\r\n const user = this.users[userId];\r\n if(user) {\r\n if((user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id === (update.photo as UserProfilePhoto.userProfilePhoto)?.photo_id) {\r\n return;\r\n }\r\n\r\n this.forceUserOnline(userId, update.date);\r\n\r\n if(update.photo._ === 'userProfilePhotoEmpty') {\r\n delete user.photo;\r\n } else {\r\n user.photo = safeReplaceObject(user.photo, update.photo);\r\n }\r\n\r\n this.setUserToStateIfNeeded(user);\r\n\r\n this.rootScope.dispatchEvent('user_update', userId);\r\n this.rootScope.dispatchEvent('avatar_update', userId.toPeerId());\r\n } else console.warn('No user by id:', userId);\r\n },\r\n\r\n updateUserName: (update) => {\r\n const userId = update.user_id;\r\n const user = this.users[userId];\r\n if(user) {\r\n this.forceUserOnline(userId);\r\n\r\n this.saveApiUser({\r\n ...user,\r\n first_name: update.first_name,\r\n last_name: update.last_name,\r\n username: update.username\r\n }, true);\r\n }\r\n }\r\n });\r\n\r\n /* case 'updateContactLink':\r\n this.onContactUpdated(update.user_id, update.my_link._ === 'contactLinkContact');\r\n break; */\r\n\r\n this.rootScope.addEventListener('language_change', (e) => {\r\n const userId = this.getSelf().id;\r\n this.contactsIndex.indexObject(userId, this.getUserSearchText(userId));\r\n });\r\n\r\n return Promise.all([\r\n this.appStateManager.getState(),\r\n this.appStoragesManager.loadStorage('users')\r\n ]).then(([state, {results: users, storage}]) => {\r\n this.storage = storage;\r\n\r\n if(users.length) {\r\n for(let i = 0, length = users.length; i < length; ++i) {\r\n const user = users[i];\r\n if(user) {\r\n this.users[user.id] = user;\r\n this.setUserNameToCache(user);\r\n\r\n this.checkPremium(user);\r\n\r\n if(state.contactsListCachedTime && (user.pFlags.contact || user.pFlags.mutual_contact)) {\r\n this.pushContact(user.id);\r\n\r\n if(!this.contactsFillPromise) {\r\n this.contactsFillPromise = deferredPromise();\r\n this.contactsFillPromise.resolve(this.contactsList);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // const contactsList = state.contactsList;\r\n // if(Array.isArray(contactsList)) {\r\n // contactsList.forEach((userId) => {\r\n // this.pushContact(userId);\r\n // });\r\n\r\n // if(contactsList.length) {\r\n // this.contactsFillPromise = deferredPromise();\r\n // this.contactsFillPromise.resolve(this.contactsList);\r\n // }\r\n // }\r\n\r\n const recentSearch = state.recentSearch || [];\r\n for(let i = 0, length = recentSearch.length; i < length; ++i) {\r\n this.peersStorage.requestPeer(recentSearch[i], 'recentSearch');\r\n }\r\n\r\n this.peersStorage.addEventListener('peerNeeded', (peerId) => {\r\n if(!this.appPeersManager.isUser(peerId)) {\r\n return;\r\n }\r\n\r\n const userId = peerId.toUserId();\r\n if(!this.storage.getFromCache(userId)) {\r\n this.storage.set({\r\n [userId]: this.getUser(userId)\r\n });\r\n }\r\n });\r\n\r\n this.peersStorage.addEventListener('peerUnneeded', (peerId) => {\r\n if(!this.appPeersManager.isUser(peerId)) {\r\n return;\r\n }\r\n\r\n const userId = peerId.toUserId();\r\n if(this.storage.getFromCache(userId)) {\r\n this.storage.delete(userId);\r\n }\r\n });\r\n });\r\n }\r\n\r\n public clear = (init = false) => {\r\n if(!init) {\r\n for(const userId in this.users) {\r\n // const userId = +userId;\r\n if(!userId) continue;\r\n const peerId = userId.toPeerId();\r\n if(!this.peersStorage.isPeerNeeded(peerId)) {\r\n const user = this.users[userId];\r\n if(user.username) {\r\n delete this.usernames[cleanUsername(user.username)];\r\n }\r\n\r\n this.storage.delete(userId);\r\n delete this.users[userId];\r\n }\r\n }\r\n } else {\r\n this.users = {};\r\n this.usernames = {};\r\n }\r\n\r\n this.getTopPeersPromises = {};\r\n this.contactsIndex = this.createSearchIndex();\r\n this.contactsFillPromise = undefined;\r\n this.contactsList = new Set();\r\n this.updatedContactsList = false;\r\n };\r\n\r\n public get userId() {\r\n return this.rootScope.myId.toUserId();\r\n }\r\n\r\n private onContactsModified(fromServer?: boolean) {\r\n // const contactsList = [...this.contactsList];\r\n // this.appStateManager.pushToState('contactsList', contactsList);\r\n\r\n if(fromServer) {\r\n this.appStateManager.pushToState('contactsListCachedTime', tsNow(true));\r\n }\r\n }\r\n\r\n public pushRecentSearch(peerId: PeerId) {\r\n return this.appStateManager.getState().then((state) => {\r\n const recentSearch = state.recentSearch || [];\r\n if(recentSearch[0] !== peerId) {\r\n indexOfAndSplice(recentSearch, peerId);\r\n recentSearch.unshift(peerId);\r\n if(recentSearch.length > 20) {\r\n recentSearch.length = 20;\r\n }\r\n\r\n this.appStateManager.pushToState('recentSearch', recentSearch);\r\n for(const peerId of recentSearch) {\r\n this.peersStorage.requestPeer(peerId, 'recentSearch');\r\n }\r\n }\r\n });\r\n }\r\n\r\n public clearRecentSearch() {\r\n return this.appStateManager.getState().then((state) => {\r\n const recentSearch = state.recentSearch || [];\r\n for(const peerId of recentSearch) {\r\n this.peersStorage.releasePeer(peerId, 'recentSearch');\r\n }\r\n\r\n recentSearch.length = 0;\r\n this.appStateManager.pushToState('recentSearch', recentSearch);\r\n });\r\n }\r\n\r\n public fillContacts() {\r\n if(this.contactsFillPromise && this.updatedContactsList) {\r\n return {\r\n cached: this.contactsFillPromise.isFulfilled,\r\n promise: this.contactsFillPromise\r\n };\r\n }\r\n\r\n this.updatedContactsList = true;\r\n\r\n const promise = deferredPromise<Set<UserId>>();\r\n this.apiManager.invokeApi('contacts.getContacts').then((result) => {\r\n if(result._ === 'contacts.contacts') {\r\n this.contactsList.clear();\r\n\r\n this.saveApiUsers(result.users);\r\n\r\n result.contacts.forEach((contact) => {\r\n this.pushContact(contact.user_id);\r\n });\r\n\r\n this.onContactsModified(true);\r\n\r\n this.contactsFillPromise = promise;\r\n }\r\n\r\n promise.resolve(this.contactsList);\r\n }, () => {\r\n this.updatedContactsList = false;\r\n });\r\n\r\n return {\r\n cached: this.contactsFillPromise?.isFulfilled,\r\n promise: this.contactsFillPromise || (this.contactsFillPromise = promise)\r\n };\r\n }\r\n\r\n public resolveUsername(username: string): Promise<Chat | User> | Chat | User {\r\n if(username[0] === '@') {\r\n username = username.slice(1);\r\n }\r\n\r\n username = username.toLowerCase();\r\n const userId = this.usernames[username];\r\n if(userId) {\r\n return this.users[userId];\r\n }\r\n\r\n return this.apiManager.invokeApi('contacts.resolveUsername', {username}).then((resolvedPeer) => {\r\n return this.processResolvedPeer(resolvedPeer);\r\n });\r\n }\r\n\r\n private processResolvedPeer(resolvedPeer: ContactsResolvedPeer.contactsResolvedPeer) {\r\n this.saveApiUsers(resolvedPeer.users);\r\n this.appChatsManager.saveApiChats(resolvedPeer.chats);\r\n\r\n return this.appPeersManager.getPeer(getPeerId(resolvedPeer.peer)) as Chat | User;\r\n }\r\n\r\n public resolvePhone(phone: string) {\r\n return this.apiManager.invokeApi('contacts.resolvePhone', {phone}).then((resolvedPeer) => {\r\n return this.processResolvedPeer(resolvedPeer) as User;\r\n });\r\n }\r\n\r\n private pushContact(id: UserId) {\r\n this.contactsList.add(id);\r\n this.contactsIndex.indexObject(id, this.getUserSearchText(id));\r\n this.peersStorage.requestPeer(id.toPeerId(), 'contact');\r\n }\r\n\r\n private popContact(id: UserId) {\r\n this.contactsList.delete(id);\r\n this.contactsIndex.indexObject(id, ''); // delete search index\r\n this.peersStorage.releasePeer(id.toPeerId(), 'contact');\r\n }\r\n\r\n public getUserSearchText(id: UserId) {\r\n const user = this.users[id];\r\n if(!user) {\r\n return '';\r\n }\r\n\r\n const arr: string[] = [\r\n user.first_name,\r\n user.last_name,\r\n user.phone,\r\n user.username,\r\n // user.pFlags.self ? I18n.format('SavedMessages', true) : '',\r\n user.pFlags.self ? 'Saved Messages' : ''\r\n ];\r\n\r\n return arr.filter(Boolean).join(' ');\r\n }\r\n\r\n public getContacts(query?: string, includeSaved = false, sortBy: 'name' | 'online' | 'none' = 'name') {\r\n return this.fillContacts().promise.then((_contactsList) => {\r\n let contactsList = [..._contactsList];\r\n if(query) {\r\n const results = this.contactsIndex.search(query);\r\n const filteredContactsList = [...contactsList].filter((id) => results.has(id));\r\n\r\n contactsList = filteredContactsList;\r\n }\r\n\r\n if(sortBy === 'name') {\r\n contactsList.sort((userId1, userId2) => {\r\n const sortName1 = (this.users[userId1] || {}).sortName || '';\r\n const sortName2 = (this.users[userId2] || {}).sortName || '';\r\n return sortName1.localeCompare(sortName2);\r\n });\r\n } else if(sortBy === 'online') {\r\n contactsList.sort((userId1, userId2) => {\r\n const status1 = this.getUserStatusForSort(this.getUser(userId1).status);\r\n const status2 = this.getUserStatusForSort(this.getUser(userId2).status);\r\n return status2 - status1;\r\n });\r\n }\r\n\r\n const myUserId = this.userId;\r\n indexOfAndSplice(contactsList, myUserId);\r\n if(includeSaved) {\r\n if(this.testSelfSearch(query)) {\r\n contactsList.unshift(myUserId);\r\n }\r\n }\r\n\r\n return contactsList;\r\n });\r\n }\r\n\r\n public getContactsPeerIds(\r\n query?: Parameters<AppUsersManager['getContacts']>[0],\r\n includeSaved?: Parameters<AppUsersManager['getContacts']>[1],\r\n sortBy?: Parameters<AppUsersManager['getContacts']>[2],\r\n limit?: number\r\n ) {\r\n return this.getContacts(query, includeSaved, sortBy).then((userIds) => {\r\n const peerIds = userIds.map((userId) => userId.toPeerId(false));\r\n if(limit) {\r\n return peerIds.slice(0, limit);\r\n }\r\n\r\n return peerIds;\r\n });\r\n }\r\n\r\n public toggleBlock(peerId: PeerId, block: boolean) {\r\n return this.apiManager.invokeApiSingle(block ? 'contacts.block' : 'contacts.unblock', {\r\n id: this.appPeersManager.getInputPeerById(peerId)\r\n }).then((value) => {\r\n if(value) {\r\n this.apiUpdatesManager.processLocalUpdate({\r\n _: 'updatePeerBlocked',\r\n peer_id: this.appPeersManager.getOutputPeer(peerId),\r\n blocked: block\r\n });\r\n }\r\n\r\n return value;\r\n });\r\n }\r\n\r\n public testSelfSearch(query: string) {\r\n const user = this.getSelf();\r\n const index = this.createSearchIndex();\r\n index.indexObject(user.id, this.getUserSearchText(user.id));\r\n return index.search(query).has(user.id);\r\n }\r\n\r\n private createSearchIndex() {\r\n return new SearchIndex<UserId>({\r\n clearBadChars: true,\r\n ignoreCase: true,\r\n latinize: true,\r\n includeTag: true\r\n });\r\n }\r\n\r\n public saveApiUsers(apiUsers: MTUser[], override?: boolean) {\r\n if((apiUsers as any).saved) return;\r\n (apiUsers as any).saved = true;\r\n apiUsers.forEach((user) => this.saveApiUser(user, override));\r\n }\r\n\r\n private setUserNameToCache(user: MTUser.user, oldUser?: MTUser.user) {\r\n if(!oldUser || oldUser.username !== user.username) {\r\n if(oldUser?.username) {\r\n const oldSearchUsername = cleanUsername(oldUser.username);\r\n delete this.usernames[oldSearchUsername];\r\n }\r\n\r\n if(user.username) {\r\n const searchUsername = cleanUsername(user.username);\r\n this.usernames[searchUsername] = user.id;\r\n }\r\n }\r\n }\r\n\r\n public saveApiUser(user: MTUser, override?: boolean) {\r\n if(user._ === 'userEmpty') return;\r\n\r\n const userId = user.id;\r\n const oldUser = this.users[userId];\r\n\r\n // ! commented block can affect performance !\r\n // if(oldUser && !override) {\r\n // console.log('saveApiUser same');\r\n // return;\r\n // }\r\n\r\n if(user.pFlags === undefined) {\r\n user.pFlags = {};\r\n }\r\n\r\n if(user.pFlags.min && oldUser !== undefined) {\r\n return;\r\n }\r\n\r\n // * exclude from state\r\n // defineNotNumerableProperties(user, ['initials', 'num', 'rFirstName', 'rFullName', 'rPhone', 'sortName', 'sortStatus']);\r\n\r\n this.setUserNameToCache(user, oldUser);\r\n\r\n if(!oldUser ||\r\n oldUser.sortName === undefined ||\r\n oldUser.first_name !== user.first_name ||\r\n oldUser.last_name !== user.last_name) {\r\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\r\n\r\n user.sortName = user.pFlags.deleted ? '' : cleanSearchText(fullName, false);\r\n } else {\r\n user.sortName = oldUser.sortName;\r\n }\r\n\r\n if(user.status) {\r\n if((user.status as UserStatus.userStatusOnline).expires) {\r\n (user.status as UserStatus.userStatusOnline).expires -= this.timeManager.getServerTimeOffset();\r\n }\r\n\r\n if((user.status as UserStatus.userStatusOffline).was_online) {\r\n (user.status as UserStatus.userStatusOffline).was_online -= this.timeManager.getServerTimeOffset();\r\n }\r\n }\r\n\r\n // user.sortStatus = user.pFlags.bot ? -1 : this.getUserStatusForSort(user.status);\r\n\r\n if(oldUser === undefined) {\r\n this.users[userId] = user;\r\n } else {\r\n const changedTitle = user.first_name !== oldUser.first_name ||\r\n user.last_name !== oldUser.last_name ||\r\n user.username !== oldUser.username;\r\n\r\n const oldPhotoId = (oldUser.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\r\n const newPhotoId = (user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\r\n const changedPhoto = oldPhotoId !== newPhotoId;\r\n\r\n const changedAnyBadge = oldUser.pFlags.premium !== user.pFlags.premium ||\r\n oldUser.pFlags.verified !== user.pFlags.verified ||\r\n oldUser.pFlags.scam !== user.pFlags.scam ||\r\n oldUser.pFlags.fake !== user.pFlags.fake;\r\n\r\n /* if(user.pFlags.bot && user.bot_info_version !== oldUser.bot_info_version) {\r\n\r\n } */\r\n\r\n const wasContact = !!oldUser.pFlags.contact;\r\n const newContact = !!user.pFlags.contact;\r\n\r\n safeReplaceObject(oldUser, user);\r\n this.rootScope.dispatchEvent('user_update', userId);\r\n\r\n if(wasContact !== newContact) {\r\n this.onContactUpdated(userId, newContact, wasContact);\r\n }\r\n\r\n if(changedPhoto) {\r\n this.rootScope.dispatchEvent('avatar_update', user.id.toPeerId());\r\n }\r\n\r\n if(changedTitle || changedAnyBadge) {\r\n this.rootScope.dispatchEvent('peer_title_edit', user.id.toPeerId());\r\n }\r\n }\r\n\r\n this.checkPremium(user);\r\n this.setUserToStateIfNeeded(user);\r\n }\r\n\r\n private checkPremium(user: User) {\r\n if(user.pFlags.self) {\r\n const isPremium = !!user.pFlags.premium;\r\n if(this.rootScope.premium !== isPremium) {\r\n this.rootScope.dispatchEvent('premium_toggle', isPremium);\r\n }\r\n }\r\n }\r\n\r\n private setUserToStateIfNeeded(user: User) {\r\n if(this.peersStorage.isPeerNeeded(user.id.toPeerId())) {\r\n this.storage.set({\r\n [user.id]: user\r\n });\r\n }\r\n }\r\n\r\n public isUserOnlineVisible(id: UserId) {\r\n return this.getUserStatusForSort(id) > 3;\r\n }\r\n\r\n public getUserStatusForSort(status: User['status'] | UserId) {\r\n if(typeof(status) !== 'object') {\r\n status = this.getUser(status).status;\r\n }\r\n\r\n if(status) {\r\n const expires = status._ === 'userStatusOnline' ? status.expires : (status._ === 'userStatusOffline' ? status.was_online : 0);\r\n if(expires) {\r\n return expires;\r\n }\r\n\r\n /* const timeNow = tsNow(true);\r\n switch(status._) {\r\n case 'userStatusRecently':\r\n return timeNow - 86400 * 3;\r\n case 'userStatusLastWeek':\r\n return timeNow - 86400 * 7;\r\n case 'userStatusLastMonth':\r\n return timeNow - 86400 * 30;\r\n } */\r\n switch(status._) {\r\n case 'userStatusRecently':\r\n return 3;\r\n case 'userStatusLastWeek':\r\n return 2;\r\n case 'userStatusLastMonth':\r\n return 1;\r\n }\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n public getUser(id: User | UserId) {\r\n if(isObject<User>(id)) {\r\n return id;\r\n }\r\n\r\n return this.users[id] || {_: 'userEmpty', id, pFlags: {deleted: true}, access_hash: ''} as any as User;\r\n }\r\n\r\n public getSelf() {\r\n return this.getUser(this.userId);\r\n }\r\n\r\n public isBot(id: UserId) {\r\n return this.users[id] && !!this.users[id].pFlags.bot;\r\n }\r\n\r\n public isContact(id: UserId) {\r\n return this.contactsList.has(id) || !!(this.users[id] && this.users[id].pFlags.contact);\r\n }\r\n\r\n public isRegularUser(id: UserId) {\r\n const user = this.users[id];\r\n return user && !this.isBot(id) && !user.pFlags.deleted && !user.pFlags.support;\r\n }\r\n\r\n public isNonContactUser(id: UserId) {\r\n return this.isRegularUser(id) && !this.isContact(id) && id !== this.userId;\r\n }\r\n\r\n public hasUser(id: UserId, allowMin?: boolean) {\r\n const user = this.users[id];\r\n return isObject(user) && (allowMin || !user.pFlags.min);\r\n }\r\n\r\n public getUserPhoto(id: UserId) {\r\n const user = this.getUser(id);\r\n\r\n return user && user.photo || {\r\n _: 'userProfilePhotoEmpty'\r\n };\r\n }\r\n\r\n public getUserString(id: UserId) {\r\n const user = this.getUser(id);\r\n return 'u' + id + (user.access_hash ? '_' + user.access_hash : '');\r\n }\r\n\r\n public getUserInput(id: UserId): InputUser {\r\n const user = this.getUser(id);\r\n if(user.pFlags && user.pFlags.self) {\r\n return {_: 'inputUserSelf'};\r\n }\r\n\r\n return {\r\n _: 'inputUser',\r\n user_id: id,\r\n access_hash: user.access_hash\r\n };\r\n }\r\n\r\n public getUserInputPeer(id: UserId): InputPeer.inputPeerSelf | InputPeer.inputPeerUser {\r\n const user = this.getUser(id);\r\n // ! do not use it, there are places that don't support it. need explicit peer id\r\n // if(user.pFlags?.self) {\r\n // return {_: 'inputPeerSelf'};\r\n // }\r\n\r\n return {\r\n _: 'inputPeerUser',\r\n user_id: id,\r\n access_hash: user.access_hash\r\n };\r\n }\r\n\r\n public getContactMediaInput(id: UserId): InputMedia.inputMediaContact {\r\n const user = this.getUser(id);\r\n\r\n return {\r\n _: 'inputMediaContact',\r\n first_name: user.first_name,\r\n last_name: user.last_name,\r\n phone_number: user.phone,\r\n vcard: '',\r\n user_id: id\r\n };\r\n }\r\n\r\n private updateUsersStatuses = () => {\r\n const timestampNow = tsNow(true);\r\n for(const i in this.users) {\r\n const user = this.users[i];\r\n this.updateUserStatus(user, timestampNow);\r\n }\r\n };\r\n\r\n private updateUserStatus(user: MTUser.user, timestampNow = tsNow(true)) {\r\n if(user.status &&\r\n user.status._ === 'userStatusOnline' &&\r\n user.status.expires < timestampNow) {\r\n user.status = {_: 'userStatusOffline', was_online: user.status.expires};\r\n this.rootScope.dispatchEvent('user_update', user.id);\r\n\r\n this.setUserToStateIfNeeded(user);\r\n }\r\n }\r\n\r\n public forceUserOnline(id: UserId, eventTimestamp?: number) {\r\n if(this.isBot(id)) {\r\n return;\r\n }\r\n\r\n const timestamp = tsNow(true);\r\n const onlineTimeFor = 60;\r\n if(eventTimestamp) {\r\n if((timestamp - eventTimestamp) >= onlineTimeFor) {\r\n return;\r\n }\r\n } else if(this.apiUpdatesManager.updatesState.syncLoading) {\r\n return;\r\n }\r\n\r\n const user = this.getUser(id);\r\n if(user?.status &&\r\n user.status._ !== 'userStatusOnline' &&\r\n user.status._ !== 'userStatusEmpty' &&\r\n !user.pFlags.support &&\r\n !user.pFlags.deleted) {\r\n user.status = {\r\n _: 'userStatusOnline',\r\n expires: timestamp + onlineTimeFor\r\n };\r\n\r\n // user.sortStatus = this.getUserStatusForSort(user.status);\r\n this.rootScope.dispatchEvent('user_update', id);\r\n\r\n this.setUserToStateIfNeeded(user);\r\n }\r\n }\r\n\r\n public importContact(first_name: string, last_name: string, phone: string) {\r\n return this.importContacts([{\r\n first_name,\r\n last_name,\r\n phones: [phone]\r\n }]).then((userIds) => {\r\n if(!userIds.length) {\r\n const error = new Error();\r\n (error as any).type = 'NO_USER';\r\n throw error;\r\n }\r\n\r\n return userIds[0];\r\n });\r\n }\r\n\r\n public importContacts(contacts: {phones: string[], first_name: string, last_name: string}[]) {\r\n const inputContacts: InputContact[] = [];\r\n\r\n for(let i = 0; i < contacts.length; ++i) {\r\n for(let j = 0; j < contacts[i].phones.length; ++j) {\r\n inputContacts.push({\r\n _: 'inputPhoneContact',\r\n client_id: (i << 16 | j).toString(10),\r\n phone: contacts[i].phones[j],\r\n first_name: contacts[i].first_name,\r\n last_name: contacts[i].last_name\r\n });\r\n }\r\n }\r\n\r\n return this.apiManager.invokeApi('contacts.importContacts', {\r\n contacts: inputContacts\r\n }).then((importedContactsResult) => {\r\n this.saveApiUsers(importedContactsResult.users);\r\n\r\n const userIds = importedContactsResult.imported.map((importedContact) => {\r\n this.onContactUpdated(importedContact.user_id, true);\r\n return importedContact.user_id;\r\n });\r\n\r\n return userIds;\r\n });\r\n }\r\n\r\n public getTopPeers(type: TopPeerType) {\r\n if(this.getTopPeersPromises[type]) return this.getTopPeersPromises[type];\r\n\r\n return this.getTopPeersPromises[type] = this.appStateManager.getState().then((state) => {\r\n const cached = state.topPeersCache[type];\r\n if(cached && (cached.cachedTime + 86400e3) > Date.now() && cached.peers) {\r\n return cached.peers;\r\n }\r\n\r\n return this.apiManager.invokeApi('contacts.getTopPeers', {\r\n [type]: true,\r\n offset: 0,\r\n limit: 15,\r\n hash: '0'\r\n }).then((result) => {\r\n let topPeers: MyTopPeer[] = [];\r\n if(result._ === 'contacts.topPeers') {\r\n // console.log(result);\r\n this.saveApiUsers(result.users);\r\n this.appChatsManager.saveApiChats(result.chats);\r\n\r\n if(result.categories.length) {\r\n topPeers = result.categories[0].peers.map((topPeer) => {\r\n const peerId = getPeerId(topPeer.peer);\r\n this.peersStorage.requestPeer(peerId, 'topPeer');\r\n return {id: peerId, rating: topPeer.rating};\r\n });\r\n }\r\n }\r\n\r\n state.topPeersCache[type] = {\r\n peers: topPeers,\r\n cachedTime: Date.now()\r\n };\r\n this.appStateManager.pushToState('topPeersCache', state.topPeersCache);\r\n\r\n return topPeers;\r\n });\r\n });\r\n }\r\n\r\n public getBlocked(offset = 0, limit = 0) {\r\n return this.apiManager.invokeApiSingle('contacts.getBlocked', {offset, limit}).then((contactsBlocked) => {\r\n this.saveApiUsers(contactsBlocked.users);\r\n this.appChatsManager.saveApiChats(contactsBlocked.chats);\r\n const count = contactsBlocked._ === 'contacts.blocked' ? contactsBlocked.users.length + contactsBlocked.chats.length : contactsBlocked.count;\r\n\r\n const peerIds: PeerId[] = contactsBlocked.users.map((u) => u.id.toPeerId()).concat(contactsBlocked.chats.map((c) => c.id.toPeerId(true)));\r\n\r\n return {count, peerIds};\r\n });\r\n }\r\n\r\n public getLocated(\r\n lat: number,\r\n long: number,\r\n accuracy_radius: number,\r\n background: boolean = false,\r\n self_expires: number = 0\r\n ) {\r\n const geo_point: InputGeoPoint = {\r\n _: 'inputGeoPoint',\r\n lat,\r\n long,\r\n accuracy_radius\r\n };\r\n\r\n return this.apiManager.invokeApi('contacts.getLocated', {\r\n geo_point,\r\n background\r\n }).then((updates) => {\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n return updates;\r\n });\r\n }\r\n\r\n /* public searchContacts(query: string, limit = 20) {\r\n return Promise.all([\r\n this.getContacts(query),\r\n apiManager.invokeApi('contacts.search', {\r\n q: query,\r\n limit\r\n })\r\n ]).then((results) => {\r\n const [myContacts, peers] = results;\r\n\r\n this.saveApiUsers(peers.users);\r\n appChatsManager.saveApiChats(peers.chats);\r\n\r\n // * contacts.search returns duplicates in my_results\r\n const myResults = new Set(myContacts.concat(peers.my_results.map((p) => appPeersManager.getPeerID(p))));\r\n\r\n const out = {\r\n my_results: [...myResults].slice(0, limit),\r\n results: peers.results.map((p) => appPeersManager.getPeerID(p))\r\n };\r\n\r\n return out;\r\n });\r\n } */\r\n public searchContacts(query: string, limit = 20) {\r\n // handle 't.me/username' as 'username'\r\n const entities = parseEntities(query);\r\n if(entities.length && entities[0].length === query.trim().length && entities[0]._ === 'messageEntityUrl') {\r\n try {\r\n const url = new URL(wrapUrl(query).url);\r\n const path = url.pathname.slice(1);\r\n if(path) {\r\n query = path;\r\n }\r\n } catch(err) {}\r\n }\r\n\r\n return this.apiManager.invokeApiCacheable('contacts.search', {\r\n q: query,\r\n limit\r\n }, {cacheSeconds: 60}).then((peers) => {\r\n this.saveApiUsers(peers.users);\r\n this.appChatsManager.saveApiChats(peers.chats);\r\n\r\n const out = {\r\n my_results: filterUnique(peers.my_results.map((p) => getPeerId(p))), // ! contacts.search returns duplicates in my_results\r\n results: peers.results.map((p) => getPeerId(p))\r\n };\r\n\r\n return out;\r\n });\r\n }\r\n\r\n private onContactUpdated(userId: UserId, isContact: boolean, curIsContact = this.isContact(userId)) {\r\n if(isContact !== curIsContact) {\r\n if(isContact) {\r\n this.pushContact(userId);\r\n } else {\r\n this.popContact(userId);\r\n }\r\n\r\n this.onContactsModified();\r\n\r\n this.rootScope.dispatchEvent('contacts_update', userId);\r\n }\r\n }\r\n\r\n public updateUsername(username: string) {\r\n return this.apiManager.invokeApi('account.updateUsername', {\r\n username\r\n }).then((user) => {\r\n this.saveApiUser(user);\r\n });\r\n }\r\n\r\n public setUserStatus(userId: UserId, offline: boolean) {\r\n if(this.isBot(userId)) {\r\n return;\r\n }\r\n\r\n const user = this.users[userId];\r\n if(user) {\r\n const status: UserStatus = offline ? {\r\n _: 'userStatusOffline',\r\n was_online: tsNow(true)\r\n } : {\r\n _: 'userStatusOnline',\r\n expires: tsNow(true) + 50\r\n };\r\n\r\n user.status = status;\r\n // user.sortStatus = this.getUserStatusForSort(user.status);\r\n this.rootScope.dispatchEvent('user_update', userId);\r\n\r\n this.setUserToStateIfNeeded(user);\r\n }\r\n }\r\n\r\n public updateMyOnlineStatus(offline: boolean) {\r\n this.setUserStatus(this.getSelf().id, offline);\r\n return this.apiManager.invokeApiSingle('account.updateStatus', {offline});\r\n }\r\n\r\n public addContact(userId: UserId, first_name: string, last_name: string, phone: string, showPhone?: true) {\r\n /* if(!userId) {\r\n return this.importContacts([{\r\n first_name,\r\n last_name,\r\n phones: [phone]\r\n }]);\r\n } */\r\n\r\n return this.apiManager.invokeApi('contacts.addContact', {\r\n id: this.getUserInput(userId),\r\n first_name,\r\n last_name,\r\n phone,\r\n add_phone_privacy_exception: showPhone\r\n }).then((updates) => {\r\n this.apiUpdatesManager.processUpdateMessage(updates, {override: true});\r\n\r\n this.onContactUpdated(userId, true);\r\n });\r\n }\r\n\r\n public deleteContacts(userIds: UserId[]) {\r\n return this.apiManager.invokeApi('contacts.deleteContacts', {\r\n id: userIds.map((userId) => this.getUserInput(userId))\r\n }).then((updates) => {\r\n this.apiUpdatesManager.processUpdateMessage(updates, {override: true});\r\n\r\n userIds.forEach((userId) => {\r\n this.onContactUpdated(userId, false);\r\n });\r\n });\r\n }\r\n\r\n public isRestricted(userId: UserId) {\r\n const user: MTUser.user = this.getUser(userId);\r\n const restrictionReasons = user.restriction_reason;\r\n\r\n return !!(user.pFlags.restricted && restrictionReasons && isRestricted(restrictionReasons));\r\n }\r\n\r\n public checkUsername(username: string) {\r\n return this.apiManager.invokeApi('account.checkUsername', {username});\r\n }\r\n\r\n public canSendToUser(userId: UserId) {\r\n return canSendToUser(this.getUser(userId));\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\r\nimport {WebPage} from '../../layer';\r\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\r\nimport {AppManager} from './manager';\r\n\r\nconst photoTypeSet = new Set(['photo', 'video', 'gif', 'document']);\r\n\r\ntype WebPageMessageKey = `${PeerId}_${number}`;\r\n\r\nexport class AppWebPagesManager extends AppManager {\r\n private webpages: {\r\n [webPageId: string]: WebPage\r\n } = {};\r\n private pendingWebPages: {\r\n [webPageId: string]: Set<WebPageMessageKey>\r\n } = {};\r\n\r\n protected after() {\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updateWebPage: (update) => {\r\n this.saveWebPage(update.webpage);\r\n }\r\n });\r\n }\r\n\r\n public saveWebPage(apiWebPage: WebPage, messageKey?: WebPageMessageKey, mediaContext?: ReferenceContext) {\r\n if(apiWebPage._ === 'webPageNotModified') return;\r\n const {id} = apiWebPage;\r\n\r\n const oldWebPage = this.webpages[id];\r\n const isUpdated = oldWebPage &&\r\n oldWebPage._ === apiWebPage._ &&\r\n (oldWebPage as WebPage.webPage).hash === (oldWebPage as WebPage.webPage).hash;\r\n\r\n if(apiWebPage._ === 'webPage') {\r\n if(apiWebPage.photo?._ === 'photo') {\r\n apiWebPage.photo = this.appPhotosManager.savePhoto(apiWebPage.photo, mediaContext);\r\n } else {\r\n delete apiWebPage.photo;\r\n }\r\n\r\n if(apiWebPage.document?._ === 'document') {\r\n apiWebPage.document = this.appDocsManager.saveDoc(apiWebPage.document, mediaContext);\r\n } else {\r\n if(apiWebPage.type === 'document') {\r\n delete apiWebPage.type;\r\n }\r\n\r\n delete apiWebPage.document;\r\n }\r\n\r\n const siteName = apiWebPage.site_name;\r\n const shortTitle = apiWebPage.title || apiWebPage.author || siteName || '';\r\n if(siteName && shortTitle === siteName) {\r\n delete apiWebPage.site_name;\r\n }\r\n\r\n // delete apiWebPage.description\r\n\r\n if(!photoTypeSet.has(apiWebPage.type) &&\r\n !apiWebPage.description &&\r\n apiWebPage.photo) {\r\n apiWebPage.type = 'photo';\r\n }\r\n }\r\n\r\n let pendingSet = this.pendingWebPages[id];\r\n if(messageKey) {\r\n if(!pendingSet) pendingSet = this.pendingWebPages[id] = new Set();\r\n pendingSet.add(messageKey);\r\n }\r\n\r\n if(oldWebPage === undefined) {\r\n this.webpages[id] = apiWebPage;\r\n } else {\r\n safeReplaceObject(oldWebPage, apiWebPage);\r\n }\r\n\r\n if(!messageKey && pendingSet !== undefined && isUpdated) {\r\n const msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[] = [];\r\n pendingSet.forEach((value) => {\r\n const [peerId, mid, isScheduled] = value.split('_');\r\n msgs.push({\r\n peerId: peerId.toPeerId(),\r\n mid: +mid,\r\n isScheduled: !!isScheduled\r\n });\r\n });\r\n\r\n this.rootScope.dispatchEvent('webpage_updated', {\r\n id,\r\n msgs\r\n });\r\n }\r\n\r\n return apiWebPage;\r\n }\r\n\r\n public getMessageKeyForPendingWebPage(peerId: PeerId, mid: number, isScheduled?: boolean): WebPageMessageKey {\r\n return peerId + '_' + mid + (isScheduled ? '_s' : '') as any;\r\n }\r\n\r\n public deleteWebPageFromPending(webPage: WebPage, messageKey: WebPageMessageKey) {\r\n const id = (webPage as WebPage.webPage).id;\r\n if(!id) return;\r\n\r\n const set = this.pendingWebPages[id];\r\n if(set && set.has(messageKey)) {\r\n set.delete(messageKey);\r\n\r\n if(!set.size) {\r\n delete this.pendingWebPages[id];\r\n }\r\n }\r\n }\r\n\r\n public getCachedWebPage(id: WebPage.webPage['id']) {\r\n return this.webpages[id];\r\n }\r\n\r\n public getWebPage(url: string) {\r\n return this.apiManager.invokeApiHashable({\r\n method: 'messages.getWebPage',\r\n processResult: (webPage) => {\r\n return this.saveWebPage(webPage);\r\n },\r\n params: {\r\n url\r\n }\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport readBlobAs from './readBlobAs';\r\n\r\nexport default function readBlobAsArrayBuffer(blob: Blob) {\r\n return readBlobAs(blob, 'readAsArrayBuffer');\r\n}\r\n","export default function fileNameRFC(fileName: string) {\r\n // Make filename RFC5987 compatible\r\n return encodeURIComponent(fileName).replace(/['()]/g, escape).replace(/\\*/g, '%2A');\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {getServiceMessagePort} from '../mtproto/mtproto.worker';\r\nimport ServiceMessagePort from '../serviceWorker/serviceMessagePort';\r\nimport StreamWriter from './streamWriter';\r\n\r\nexport default class DownloadWriter implements StreamWriter {\r\n constructor(\r\n private serviceMessagePort: ServiceMessagePort<true>,\r\n private downloadId: string\r\n ) {\r\n this.serviceMessagePort = getServiceMessagePort();\r\n }\r\n\r\n public async write(part: Uint8Array, offset?: number) {\r\n return this.serviceMessagePort.invoke('downloadChunk', {\r\n id: this.downloadId,\r\n chunk: part\r\n });\r\n }\r\n\r\n public finalize(saveToStorage?: boolean): Promise<Blob> {\r\n return this.serviceMessagePort.invoke('downloadFinalize', this.downloadId).then(() => undefined);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport deferredPromise from '../../helpers/cancellablePromise';\r\nimport makeError from '../../helpers/makeError';\r\nimport fileNameRFC from '../../helpers/string/fileNameRFC';\r\nimport {getServiceMessagePort} from '../mtproto/mtproto.worker';\r\nimport DownloadWriter from './downloadWriter';\r\nimport FileStorage from './fileStorage';\r\n\r\nexport default class DownloadStorage implements FileStorage {\r\n public getFile(fileName: string): Promise<any> {\r\n return Promise.reject(makeError('NO_ENTRY_FOUND'));\r\n }\r\n\r\n public prepareWriting({fileName, downloadId, size}: {\r\n fileName: string,\r\n downloadId: string,\r\n size: number\r\n }) {\r\n const headers = {\r\n 'Content-Type': 'application/octet-stream; charset=utf-8',\r\n 'Content-Disposition': 'attachment; filename*=UTF-8\\'\\'' + fileNameRFC(fileName),\r\n ...(size ? {'Content-Length': size} : {})\r\n };\r\n\r\n const serviceMessagePort = getServiceMessagePort();\r\n const promise = serviceMessagePort.invoke('download', {\r\n headers,\r\n id: downloadId\r\n });\r\n\r\n const deferred = deferredPromise<void>();\r\n deferred.cancel = () => {\r\n deferred.reject(makeError('DOWNLOAD_CANCELED'));\r\n };\r\n\r\n deferred.catch(() => {\r\n getServiceMessagePort().invoke('downloadCancel', downloadId);\r\n });\r\n\r\n promise.then(deferred.resolve, deferred.reject);\r\n\r\n return {\r\n deferred,\r\n getWriter: () => {\r\n return new DownloadWriter(serviceMessagePort, downloadId);\r\n }\r\n };\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type {ReferenceBytes} from './referenceDatabase';\r\nimport Modes from '../../config/modes';\r\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\r\nimport {randomLong} from '../../helpers/random';\r\nimport {Document, InputFile, InputFileLocation, InputWebFileLocation, Photo, PhotoSize, UploadFile, UploadWebFile, VideoSize, WebDocument} from '../../layer';\r\nimport {DcId} from '../../types';\r\nimport CacheStorageController from '../files/cacheStorage';\r\nimport {logger, LogTypes} from '../logger';\r\nimport assumeType from '../../helpers/assumeType';\r\nimport noop from '../../helpers/noop';\r\nimport readBlobAsArrayBuffer from '../../helpers/blob/readBlobAsArrayBuffer';\r\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\r\nimport findAndSplice from '../../helpers/array/findAndSplice';\r\nimport fixFirefoxSvg from '../../helpers/fixFirefoxSvg';\r\nimport {AppManager} from '../appManagers/manager';\r\nimport {getEnvironment} from '../../environment/utils';\r\nimport MTProtoMessagePort from './mtprotoMessagePort';\r\nimport getFileNameForUpload from '../../helpers/getFileNameForUpload';\r\nimport type {Progress} from '../appManagers/appDownloadManager';\r\nimport getDownloadMediaDetails from '../appManagers/utils/download/getDownloadMediaDetails';\r\n// import networkStats from './networkStats';\r\nimport getDownloadFileNameFromOptions from '../appManagers/utils/download/getDownloadFileNameFromOptions';\r\nimport StreamWriter from '../files/streamWriter';\r\nimport FileStorage from '../files/fileStorage';\r\nimport {MAX_FILE_SAVE_SIZE} from './mtproto_config';\r\nimport throttle from '../../helpers/schedulers/throttle';\r\nimport makeError from '../../helpers/makeError';\r\nimport readBlobAsUint8Array from '../../helpers/blob/readBlobAsUint8Array';\r\nimport DownloadStorage from '../files/downloadStorage';\r\nimport copy from '../../helpers/object/copy';\r\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\r\nimport {MIME_TYPE_EXTENSION_MAP} from '../../environment/mimeTypeMap';\r\nimport {getServiceMessagePort} from './mtproto.worker';\r\n\r\ntype Delayed = {\r\n offset: number,\r\n writePromise: CancellablePromise<void>,\r\n writeDeferred: CancellablePromise<void>\r\n};\r\n\r\nexport type DownloadOptions = {\r\n dcId: DcId,\r\n location: InputFileLocation | InputWebFileLocation,\r\n size?: number,\r\n fileName?: string,\r\n mimeType?: MTMimeType,\r\n limitPart?: number,\r\n queueId?: number,\r\n onlyCache?: boolean,\r\n downloadId?: string\r\n // getFileMethod: Parameters<CacheStorageController['getFile']>[1]\r\n};\r\n\r\nexport type DownloadMediaOptions = {\r\n media: Photo.photo | Document.document | WebDocument,\r\n thumb?: PhotoSize | VideoSize,\r\n queueId?: number,\r\n onlyCache?: boolean,\r\n downloadId?: string\r\n};\r\n\r\ntype DownloadPromise = CancellablePromise<Blob>;\r\n\r\nexport type MyUploadFile = UploadFile.uploadFile | UploadWebFile.uploadWebFile;\r\n\r\n// export interface RefreshReferenceTask extends WorkerTaskVoidTemplate {\r\n// type: 'refreshReference',\r\n// payload: ReferenceBytes,\r\n// };\r\n\r\n// export interface RefreshReferenceTaskResponse extends WorkerTaskVoidTemplate {\r\n// type: 'refreshReference',\r\n// payload: ReferenceBytes,\r\n// originalPayload: ReferenceBytes\r\n// };\r\n\r\nconst MAX_DOWNLOAD_FILE_PART_SIZE = 1 * 1024 * 1024;\r\nconst MAX_UPLOAD_FILE_PART_SIZE = 512 * 1024;\r\nconst MIN_PART_SIZE = 128 * 1024;\r\nconst AVG_PART_SIZE = 512 * 1024;\r\n\r\nconst REGULAR_DOWNLOAD_DELTA = (9 * 512 * 1024) / MIN_PART_SIZE;\r\n// const PREMIUM_DOWNLOAD_DELTA = REGULAR_DOWNLOAD_DELTA * 2;\r\nconst PREMIUM_DOWNLOAD_DELTA = (56 * 512 * 1024) / MIN_PART_SIZE;\r\n\r\nconst IGNORE_ERRORS: Set<ErrorType> = new Set([\r\n 'DOWNLOAD_CANCELED',\r\n 'UPLOAD_CANCELED',\r\n 'UNKNOWN',\r\n 'NO_NEW_CONTEXT'\r\n]);\r\n\r\nexport class ApiFileManager extends AppManager {\r\n private cacheStorage = new CacheStorageController('cachedFiles');\r\n private downloadStorage = new DownloadStorage();\r\n\r\n private downloadPromises: {\r\n [fileName: string]: DownloadPromise\r\n } = {};\r\n\r\n // private downloadToDiscPromises: {\r\n // [fileName: string]: DownloadPromise\r\n // } = {};\r\n\r\n private uploadPromises: {\r\n [fileName: string]: CancellablePromise<InputFile>\r\n } = {};\r\n\r\n private downloadPulls: {\r\n [dcId: string]: Array<{\r\n id: number,\r\n queueId: number,\r\n cb: () => Promise<MyUploadFile | void>,\r\n deferred: {\r\n resolve: (...args: any[]) => void,\r\n reject: (...args: any[]) => void\r\n },\r\n activeDelta: number\r\n }>\r\n } = {};\r\n private downloadActives: {[dcId: string]: number} = {};\r\n\r\n public refreshReferencePromises: {\r\n [referenceHex: string]: {\r\n deferred: CancellablePromise<ReferenceBytes>,\r\n timeout?: number\r\n }\r\n } = {};\r\n\r\n private log: ReturnType<typeof logger> = logger('AFM', LogTypes.Error | LogTypes.Log);\r\n private tempId = 0;\r\n private queueId = 0;\r\n private debug = Modes.debug;\r\n\r\n private maxUploadParts = 4000;\r\n private maxDownloadParts = 8000;\r\n private webFileDcId: DcId;\r\n\r\n protected after() {\r\n setInterval(() => { // clear old promises\r\n for(const hex in this.refreshReferencePromises) {\r\n const {deferred} = this.refreshReferencePromises[hex];\r\n if(deferred.isFulfilled || deferred.isRejected) {\r\n delete this.refreshReferencePromises[hex];\r\n }\r\n }\r\n }, 1800e3);\r\n\r\n this.rootScope.addEventListener('config', (config) => {\r\n this.webFileDcId = config.webfile_dc_id;\r\n });\r\n\r\n this.rootScope.addEventListener('app_config', (appConfig) => {\r\n this.maxUploadParts = this.rootScope.premium ? appConfig.upload_max_fileparts_premium : appConfig.upload_max_fileparts_default;\r\n this.maxDownloadParts = appConfig.upload_max_fileparts_premium;\r\n });\r\n }\r\n\r\n private downloadRequest(dcId: 'upload', id: number, cb: () => Promise<void>, activeDelta: number, queueId?: number): Promise<void>;\r\n private downloadRequest(dcId: number, id: number, cb: () => Promise<MyUploadFile>, activeDelta: number, queueId?: number): Promise<MyUploadFile>;\r\n private downloadRequest(dcId: number | string, id: number, cb: () => Promise<MyUploadFile | void>, activeDelta: number, queueId: number = 0) {\r\n if(this.downloadPulls[dcId] === undefined) {\r\n this.downloadPulls[dcId] = [];\r\n this.downloadActives[dcId] = 0;\r\n }\r\n\r\n const downloadPull = this.downloadPulls[dcId];\r\n\r\n const promise = new Promise<MyUploadFile | void>((resolve, reject) => {\r\n downloadPull.push({id, queueId, cb, deferred: {resolve, reject}, activeDelta});\r\n });\r\n\r\n setTimeout(() => {\r\n this.downloadCheck(dcId);\r\n }, 0);\r\n\r\n return promise;\r\n }\r\n\r\n private downloadCheck(dcId: string | number) {\r\n const downloadPull = this.downloadPulls[dcId];\r\n const downloadLimit = /* dcId === 'upload' ? 24 : */(this.rootScope.premium ? PREMIUM_DOWNLOAD_DELTA : REGULAR_DOWNLOAD_DELTA);\r\n // const downloadLimit = Infinity;\r\n\r\n if(this.downloadActives[dcId] >= downloadLimit || !downloadPull?.length) {\r\n return false;\r\n }\r\n\r\n // const data = downloadPull.shift();\r\n const data = findAndSplice(downloadPull, (d) => d.queueId === 0) || findAndSplice(downloadPull, (d) => d.queueId === this.queueId) || downloadPull.shift();\r\n const activeDelta = data.activeDelta || 1;\r\n\r\n this.downloadActives[dcId] += activeDelta;\r\n\r\n const promise = data.cb();\r\n // const networkPromise = networkStats.waitForChunk(dcId as DcId, activeDelta * MIN_PART_SIZE);\r\n /* Promise.race([\r\n promise\r\n // networkPromise\r\n ]) */promise.then(() => {\r\n this.downloadActives[dcId] -= activeDelta;\r\n this.downloadCheck(dcId);\r\n\r\n // networkPromise.resolve();\r\n }, (error: ApiError) => {\r\n if(!error?.type || !IGNORE_ERRORS.has(error.type)) {\r\n this.log.error('downloadCheck error:', error);\r\n }\r\n\r\n this.downloadActives[dcId] -= activeDelta;\r\n this.downloadCheck(dcId);\r\n\r\n // networkPromise.reject(error);\r\n }).finally(() => {\r\n promise.then(data.deferred.resolve, data.deferred.reject);\r\n });\r\n }\r\n\r\n public setQueueId(queueId: number) {\r\n // this.log.error('setQueueId', queueId);\r\n this.queueId = queueId;\r\n }\r\n\r\n private getFileStorage() {\r\n return this.cacheStorage;\r\n }\r\n\r\n public cancelDownload(fileName: string) {\r\n const promises = [this.downloadPromises[fileName], this.uploadPromises[fileName]].filter(Boolean);\r\n let canceled = false;\r\n for(let i = 0, length = promises.length; i < length; ++i) {\r\n const promise = promises[i];\r\n if(promise && !promise.isRejected && !promise.isFulfilled) {\r\n promise.cancel();\r\n canceled = true;\r\n }\r\n }\r\n\r\n return canceled;\r\n }\r\n\r\n public requestWebFilePart(dcId: DcId, location: InputWebFileLocation, offset: number, limit: number, id = 0, queueId = 0, checkCancel?: () => void) {\r\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\r\n checkCancel?.();\r\n\r\n return this.apiManager.invokeApi('upload.getWebFile', {\r\n location,\r\n offset,\r\n limit\r\n }, {\r\n dcId,\r\n fileDownload: true\r\n });\r\n }, this.getDelta(limit), queueId);\r\n }\r\n\r\n public requestFilePart(\r\n dcId: DcId,\r\n location: InputFileLocation,\r\n offset: number,\r\n limit: number,\r\n id = 0,\r\n queueId = 0,\r\n checkCancel?: () => void\r\n ) {\r\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\r\n checkCancel?.();\r\n\r\n const invoke = async(): Promise<MyUploadFile> => {\r\n checkCancel?.(); // do not remove async, because checkCancel will throw an error\r\n\r\n // * IMPORTANT: reference can be changed in previous request\r\n const reference = (location as InputFileLocation.inputDocumentFileLocation).file_reference?.slice();\r\n\r\n const promise = // pause(offset > (100 * 1024 * 1024) ? 10000000 : 0).then(() =>\r\n this.apiManager.invokeApi('upload.getFile', {\r\n location,\r\n offset,\r\n limit\r\n }, {\r\n dcId,\r\n fileDownload: true\r\n }) as Promise<MyUploadFile>/* ) */;\r\n\r\n return promise.catch((err: ApiError) => {\r\n checkCancel?.();\r\n\r\n if(err.type === 'FILE_REFERENCE_EXPIRED') {\r\n return this.refreshReference(location as InputFileLocation.inputDocumentFileLocation, reference).then(invoke);\r\n }\r\n\r\n throw err;\r\n });\r\n };\r\n\r\n assumeType<InputFileLocation.inputDocumentFileLocation>(location);\r\n const reference = location.file_reference;\r\n if(reference && !location.checkedReference) { // check stream's location because it's new every call\r\n location.checkedReference = true;\r\n const hex = bytesToHex(reference);\r\n if(this.refreshReferencePromises[hex]) {\r\n return this.refreshReference(location, reference).then(invoke);\r\n }\r\n }\r\n\r\n return invoke();\r\n }, this.getDelta(limit), queueId);\r\n }\r\n\r\n /* private convertBlobToBytes(blob: Blob) {\r\n return blob.arrayBuffer().then((buffer) => new Uint8Array(buffer));\r\n } */\r\n\r\n private getDelta(bytes: number) {\r\n return bytes / MIN_PART_SIZE;\r\n }\r\n\r\n private getLimitPart(size: number, isUpload: boolean): number {\r\n if(!size) { // * sometimes size can be 0 (e.g. avatars, webDocuments)\r\n return AVG_PART_SIZE;\r\n }\r\n\r\n // return 1 * 1024 * 1024;\r\n\r\n let bytes = MIN_PART_SIZE;\r\n\r\n const maxParts = isUpload ? this.maxUploadParts : this.maxDownloadParts;\r\n const maxPartSize = isUpload ? MAX_UPLOAD_FILE_PART_SIZE : MAX_DOWNLOAD_FILE_PART_SIZE;\r\n // usually it will stick to 512Kb size if the file is too big\r\n while((size / bytes) > maxParts && bytes < maxPartSize) {\r\n bytes *= 2;\r\n }\r\n /* if(size < 1e6 || !size) bytes = 512;\r\n else if(size < 3e6) bytes = 256;\r\n else bytes = 128; */\r\n\r\n return bytes;\r\n }\r\n\r\n private uncompressTGS = (bytes: Uint8Array, fileName: string) => {\r\n // this.log('uncompressTGS', bytes, bytes.slice().buffer);\r\n // slice нужен потому что в uint8array - 5053 length, в arraybuffer - 5084\r\n return this.cryptoWorker.invokeCrypto('gzipUncompress', bytes.slice().buffer, false) as Promise<Uint8Array>;\r\n };\r\n\r\n private uncompressTGV = (bytes: Uint8Array, fileName: string) => {\r\n // this.log('uncompressTGS', bytes, bytes.slice().buffer);\r\n // slice нужен потому что в uint8array - 5053 length, в arraybuffer - 5084\r\n const buffer = bytes.slice().buffer;\r\n if(getEnvironment().IS_FIREFOX) {\r\n return this.cryptoWorker.invokeCrypto('gzipUncompress', buffer, true).then((text) => {\r\n return fixFirefoxSvg(text as string);\r\n }).then((text) => {\r\n const textEncoder = new TextEncoder();\r\n return textEncoder.encode(text);\r\n });\r\n }\r\n\r\n return this.cryptoWorker.invokeCrypto('gzipUncompress', buffer, false) as Promise<Uint8Array>;\r\n };\r\n\r\n private convertWebp = (bytes: Uint8Array, fileName: string) => {\r\n const instance = MTProtoMessagePort.getInstance<false>();\r\n return instance.invoke('convertWebp', {fileName, bytes});\r\n };\r\n\r\n private convertOpus = (bytes: Uint8Array, fileName: string) => {\r\n const instance = MTProtoMessagePort.getInstance<false>();\r\n return instance.invoke('convertOpus', {fileName, bytes});\r\n };\r\n\r\n private refreshReference(\r\n inputFileLocation: InputFileLocation.inputDocumentFileLocation,\r\n reference: typeof inputFileLocation['file_reference'],\r\n hex = bytesToHex(reference)\r\n ) {\r\n let r = this.refreshReferencePromises[hex];\r\n if(!r) {\r\n const deferred = deferredPromise<ReferenceBytes>();\r\n\r\n r = this.refreshReferencePromises[hex] = {\r\n deferred\r\n\r\n // ! I don't remember what it was for...\r\n // timeout: ctx.setTimeout(() => {\r\n // this.log.error('Didn\\'t refresh the reference:', inputFileLocation);\r\n // deferred.reject(makeError('REFERENCE_IS_NOT_REFRESHED'));\r\n // }, 60000)\r\n };\r\n\r\n // deferred.catch(noop).finally(() => {\r\n // clearTimeout(r.timeout);\r\n // });\r\n\r\n this.referenceDatabase.refreshReference(reference).then((reference) => {\r\n if(hex === bytesToHex(reference)) {\r\n deferred.reject(makeError('REFERENCE_IS_NOT_REFRESHED'));\r\n }\r\n\r\n deferred.resolve(reference);\r\n }, deferred.reject);\r\n }\r\n\r\n // have to replace file_reference in any way, because location can be different everytime if it's stream\r\n return r.deferred.then((reference) => {\r\n inputFileLocation.file_reference = reference;\r\n });\r\n }\r\n\r\n public isDownloading(fileName: string) {\r\n return !!this.downloadPromises[fileName];\r\n }\r\n\r\n public getDownload(fileName: string) {\r\n return this.downloadPromises[fileName];\r\n }\r\n\r\n public getUpload(fileName: string) {\r\n return this.uploadPromises[fileName];\r\n }\r\n\r\n private getConvertMethod(mimeType: MTMimeType) {\r\n let process: ApiFileManager['uncompressTGS'] | ApiFileManager['convertWebp'];\r\n if(mimeType === 'application/x-tgwallpattern') {\r\n process = this.uncompressTGV;\r\n mimeType = 'image/svg+xml';\r\n } else if(mimeType === 'image/webp' && !getEnvironment().IS_WEBP_SUPPORTED) {\r\n process = this.convertWebp;\r\n mimeType = 'image/png';\r\n } else if(mimeType === 'application/x-tgsticker') {\r\n process = this.uncompressTGS;\r\n mimeType = 'application/json';\r\n } else if(mimeType === 'audio/ogg' && !getEnvironment().IS_OPUS_SUPPORTED) {\r\n process = this.convertOpus;\r\n mimeType = 'audio/wav';\r\n }\r\n\r\n return {mimeType, process};\r\n }\r\n\r\n private allocateDeferredPromises(startOffset: number, size: number, limitPart: number) {\r\n const delayed: Delayed[] = [];\r\n let offset = startOffset;\r\n let writePromise: CancellablePromise<void> = Promise.resolve(),\r\n writeDeferred: CancellablePromise<void>;\r\n do {\r\n writeDeferred = deferredPromise<void>();\r\n delayed.push({offset, writePromise, writeDeferred});\r\n writePromise = writeDeferred;\r\n offset += limitPart;\r\n } while(offset < size);\r\n\r\n return delayed;\r\n }\r\n\r\n public download(options: DownloadOptions): DownloadPromise {\r\n const size = options.size ?? 0;\r\n const {dcId, location} = options;\r\n let {downloadId} = options;\r\n if(downloadId && !getServiceMessagePort()) {\r\n this.log.error('download fallback to blob', options);\r\n downloadId = undefined;\r\n }\r\n\r\n const originalMimeType = options.mimeType;\r\n const convertMethod = this.getConvertMethod(originalMimeType);\r\n const {process} = convertMethod;\r\n options.mimeType = convertMethod.mimeType || 'image/jpeg';\r\n\r\n const fileName = getDownloadFileNameFromOptions(options);\r\n const cacheFileName = downloadId ? getDownloadFileNameFromOptions({...copy(options), downloadId: undefined}) : fileName;\r\n const cacheStorage: FileStorage = this.getFileStorage();\r\n const downloadStorage: FileStorage = downloadId ? this.downloadStorage : undefined;\r\n let deferred: DownloadPromise = downloadId ? undefined : this.downloadPromises[fileName];\r\n\r\n this.debug && this.log('downloadFile', fileName, options);\r\n\r\n if(deferred) {\r\n return deferred;\r\n }\r\n\r\n // if(deferred) {\r\n // if(size) {\r\n // return deferred.then(async(blob) => {\r\n // if(blob instanceof Blob && blob.size < size) {\r\n // this.debug && this.log('downloadFile need to deleteFile, wrong size:', blob.size, size);\r\n\r\n // try {\r\n // await this.delete(fileName);\r\n // } finally {\r\n // return this.download(options);\r\n // }\r\n // } else {\r\n // return blob;\r\n // }\r\n // });\r\n // } else {\r\n // return deferred;\r\n // }\r\n // }\r\n\r\n const errorHandler = (item: typeof cachePrepared, error: ApiError) => {\r\n if(item?.error) {\r\n return;\r\n }\r\n\r\n for(const p of prepared) {\r\n if(item && item !== p) {\r\n continue;\r\n }\r\n\r\n p.error = error;\r\n p.deferred.reject(error);\r\n }\r\n };\r\n\r\n const id = this.tempId++;\r\n const limitPart = options.limitPart || this.getLimitPart(size, false);\r\n\r\n let getFile: FileStorage['getFile'] = cacheStorage.getFile.bind(cacheStorage);\r\n\r\n let cachePrepared: ReturnType<FileStorage['prepareWriting']> & {writer?: StreamWriter, error?: ApiError},\r\n downloadPrepared: typeof cachePrepared;\r\n const prepared: (typeof cachePrepared)[] = [];\r\n const possibleSize = size || limitPart;\r\n\r\n const getErrorsCount = () => prepared.reduce((acc, item) => acc + +!!item.error, 0);\r\n\r\n const attach = (item: typeof cachePrepared, fileName: string) => {\r\n const {deferred} = item;\r\n const _errorHandler = errorHandler.bind(null, item);\r\n\r\n deferred.cancel = () => deferred.reject(makeError('DOWNLOAD_CANCELED'));\r\n deferred.catch((error) => {\r\n _errorHandler(error);\r\n item.writer?.truncate?.();\r\n }).finally(() => {\r\n if(this.downloadPromises[fileName] === deferred) {\r\n delete this.downloadPromises[fileName];\r\n }\r\n\r\n delete item.writer;\r\n // indexOfAndSplice(prepared, item);\r\n });\r\n\r\n this.downloadPromises[fileName] = deferred;\r\n\r\n prepared.push(item);\r\n };\r\n\r\n if(cacheStorage && (!downloadStorage || possibleSize <= MAX_FILE_SAVE_SIZE)) {\r\n cachePrepared = cacheStorage.prepareWriting(cacheFileName, possibleSize, options.mimeType)\r\n attach(cachePrepared, cacheFileName);\r\n }\r\n\r\n if(downloadStorage) {\r\n let downloadFileName = options.fileName; // it's doc file_name\r\n if(!downloadFileName) {\r\n downloadFileName = cacheFileName;\r\n const ext = MIME_TYPE_EXTENSION_MAP[options.mimeType];\r\n if(ext) {\r\n downloadFileName += '.' + ext;\r\n }\r\n }\r\n\r\n downloadPrepared = downloadStorage.prepareWriting({\r\n fileName: downloadFileName,\r\n downloadId,\r\n size: possibleSize\r\n });\r\n attach(downloadPrepared, fileName);\r\n\r\n if(cachePrepared) { // cancel cache too\r\n downloadPrepared.deferred.catch((err) => cachePrepared.deferred.reject(err));\r\n }\r\n\r\n // this.downloadToDiscPromises[cacheFileName] = deferred;\r\n // deferred.catch(noop).finally(() => {\r\n // if(this.downloadToDiscPromises[cacheFileName] === deferred) {\r\n // delete this.downloadToDiscPromises[cacheFileName];\r\n // }\r\n // });\r\n }\r\n\r\n deferred = downloadPrepared?.deferred ?? cachePrepared.deferred;\r\n\r\n if(downloadStorage && process) { // then have to load file again\r\n getFile = downloadStorage.getFile.bind(downloadStorage);\r\n }\r\n\r\n getFile(cacheFileName).then(async(blob: Blob) => {\r\n checkCancel();\r\n\r\n // if(blob.size < size) {\r\n // if(!options.onlyCache) {\r\n // await this.delete(cacheFileName);\r\n // checkCancel();\r\n // }\r\n\r\n // throw makeError('NO_ENTRY_FOUND');\r\n // }\r\n\r\n if(downloadPrepared) {\r\n const writer = downloadPrepared.writer = downloadPrepared.getWriter();\r\n checkCancel();\r\n\r\n const arr = await readBlobAsUint8Array(blob);\r\n checkCancel();\r\n await writer.write(arr);\r\n checkCancel();\r\n\r\n downloadPrepared.deferred.resolve(await writer.finalize());\r\n }\r\n\r\n if(cachePrepared) {\r\n cachePrepared.deferred.resolve(blob);\r\n }\r\n }).catch(async(err: ApiError) => {\r\n if(options.onlyCache) {\r\n errorHandler(null, err);\r\n return;\r\n }\r\n\r\n prepared.forEach((p) => {\r\n p.writer = p.getWriter();\r\n });\r\n\r\n const maxRequests = Infinity;\r\n\r\n const isWebFile = location._ === 'inputWebFileLocation';\r\n const requestPart = (isWebFile ? this.requestWebFilePart : this.requestFilePart).bind(this);\r\n\r\n if(isWebFile && this.webFileDcId === undefined) {\r\n await this.apiManager.getConfig();\r\n checkCancel();\r\n }\r\n\r\n const delayed = this.allocateDeferredPromises(0, size, limitPart);\r\n\r\n const progress: Progress = {done: 0, offset: 0, total: size, fileName};\r\n const dispatchProgress = () => {\r\n try {\r\n checkCancel();\r\n progress.done = done;\r\n this.rootScope.dispatchEvent('download_progress', progress);\r\n } catch(err) {}\r\n };\r\n\r\n const throttledDispatchProgress = throttle(dispatchProgress, 50, true);\r\n\r\n let done = 0;\r\n const superpuper = async() => {\r\n const {offset, writePromise, writeDeferred} = delayed.shift();\r\n try {\r\n checkCancel();\r\n\r\n const requestPerf = performance.now();\r\n const result = await requestPart(dcId, location as any, offset, limitPart, id, options.queueId, checkCancel);\r\n const requestTime = performance.now() - requestPerf;\r\n\r\n const bytes = result.bytes;\r\n\r\n if(delayed.length) {\r\n superpuper();\r\n }\r\n\r\n const byteLength = bytes.byteLength;\r\n this.debug && this.log('downloadFile requestFilePart result:', fileName, result);\r\n const isFinal = (offset + limitPart) >= size || !byteLength;\r\n if(byteLength) {\r\n done += byteLength;\r\n\r\n if(isFinal) {\r\n dispatchProgress();\r\n } else {\r\n throttledDispatchProgress();\r\n }\r\n\r\n const writeQueuePerf = performance.now();\r\n await writePromise;\r\n checkCancel();\r\n const writeQueueTime = performance.now() - writeQueuePerf;\r\n\r\n const perf = performance.now();\r\n await Promise.all(prepared.map(({writer}) => writer?.write(bytes, offset)));\r\n checkCancel();\r\n // downloadId && this.log('write time', performance.now() - perf, 'request time', requestTime, 'queue time', writeQueueTime);\r\n }\r\n\r\n if(isFinal) {\r\n if(!size || done < size) {\r\n prepared.forEach(({writer}) => writer?.trim?.(done));\r\n }\r\n }\r\n\r\n if(isFinal && process) {\r\n const promises = prepared\r\n .filter(({writer}) => writer?.getParts && writer.replaceParts)\r\n .map(async({writer}) => {\r\n const bytes = writer.getParts();\r\n const processedResult = await process(bytes, cacheFileName);\r\n writer.replaceParts(processedResult);\r\n });\r\n\r\n await Promise.all(promises);\r\n checkCancel();\r\n }\r\n\r\n writeDeferred.resolve();\r\n\r\n if(isFinal) {\r\n const saveToStorage = done <= MAX_FILE_SAVE_SIZE;\r\n prepared.forEach((item) => {\r\n const {deferred, writer} = item;\r\n if(deferred.isFulfilled || deferred.isRejected || !writer) {\r\n return;\r\n }\r\n\r\n const result = writer.finalize(saveToStorage);\r\n deferred.resolve(result);\r\n });\r\n }\r\n } catch(err) {\r\n errorHandler(null, err as ApiError);\r\n }\r\n };\r\n\r\n for(let i = 0, length = Math.min(maxRequests, delayed.length); i < length; ++i) {\r\n superpuper();\r\n }\r\n }).catch(noop);\r\n\r\n const checkCancel = () => {\r\n if(getErrorsCount() === prepared.length) {\r\n throw prepared[0].error;\r\n }\r\n };\r\n\r\n return deferred;\r\n }\r\n\r\n public downloadMedia(options: DownloadMediaOptions): DownloadPromise {\r\n let {media, thumb} = options;\r\n const isPhoto = media._ === 'photo';\r\n if(isPhoto && !thumb) {\r\n return Promise.reject('preloadPhoto photoEmpty!');\r\n }\r\n\r\n // get original instance with correct file_reference instead of using copies\r\n const isDocument = media._ === 'document';\r\n // const isWebDocument = media._ === 'webDocument';\r\n if(isDocument) media = this.appDocsManager.getDoc((media as Document.document).id);\r\n else if(isPhoto) media = this.appPhotosManager.getPhoto((media as Photo.photo).id);\r\n\r\n const {fileName, downloadOptions} = getDownloadMediaDetails(options);\r\n\r\n let promise = this.getDownload(fileName);\r\n if(!promise) {\r\n promise = this.download(downloadOptions);\r\n\r\n if(isDocument && !thumb) {\r\n this.rootScope.dispatchEvent('document_downloading', (media as Document.document).id);\r\n promise.catch(noop).finally(() => {\r\n this.rootScope.dispatchEvent('document_downloaded', (media as Document.document).id);\r\n });\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public downloadMediaURL(options: DownloadMediaOptions): Promise<string> {\r\n const {media, thumb} = options;\r\n\r\n let cacheContext = this.thumbsStorage.getCacheContext(media as any, thumb?.type);\r\n if((thumb ? (cacheContext.downloaded >= ('size' in thumb ? thumb.size : 0)) : true) && cacheContext.url) {\r\n return Promise.resolve(cacheContext.url);\r\n }\r\n\r\n return this.downloadMedia(options).then((blob) => {\r\n if(!cacheContext.downloaded || cacheContext.downloaded < blob.size) {\r\n const url = URL.createObjectURL(blob);\r\n cacheContext = this.thumbsStorage.setCacheContextURL(media as any, cacheContext.type, url, blob.size);\r\n }\r\n\r\n return cacheContext.url;\r\n });\r\n }\r\n\r\n public downloadMediaVoid(options: DownloadMediaOptions) {\r\n return this.downloadMedia(options).then(noop);\r\n }\r\n\r\n private delete(fileName: string) {\r\n delete this.downloadPromises[fileName];\r\n return this.getFileStorage().delete(fileName);\r\n }\r\n\r\n public upload({file, fileName}: {file: Blob | File, fileName?: string}) {\r\n fileName ||= getFileNameForUpload(file);\r\n\r\n const fileSize = file.size;\r\n const isBigFile = fileSize >= 10485760;\r\n const partSize = this.getLimitPart(fileSize, true);\r\n const activeDelta = this.getDelta(partSize);\r\n const totalParts = Math.ceil(fileSize / partSize);\r\n const fileId = randomLong();\r\n const resultInputFile: InputFile = {\r\n _: isBigFile ? 'inputFileBig' : 'inputFile',\r\n id: fileId as any,\r\n parts: totalParts,\r\n name: fileName,\r\n md5_checksum: ''\r\n };\r\n\r\n const deferred = deferredPromise<typeof resultInputFile>();\r\n if(totalParts > this.maxUploadParts) {\r\n deferred.reject(makeError('FILE_TOO_BIG'));\r\n return deferred;\r\n }\r\n\r\n let canceled = false, resolved = false;\r\n let errorHandler = (error: ApiError) => {\r\n if(error?.type !== 'UPLOAD_CANCELED') {\r\n this.log.error('Up Error', error);\r\n }\r\n\r\n deferred.reject(error);\r\n canceled = true;\r\n errorHandler = noop;\r\n };\r\n\r\n const method = isBigFile ? 'upload.saveBigFilePart' : 'upload.saveFilePart';\r\n const id = this.tempId++;\r\n\r\n const self = this;\r\n function* generator() {\r\n let _part = 0, doneParts = 0;\r\n for(let offset = 0; offset < fileSize; offset += partSize) {\r\n const part = _part++; // 0, 1\r\n yield self.downloadRequest('upload', id, async() => {\r\n checkCancel();\r\n\r\n const blob = file.slice(offset, offset + partSize);\r\n const buffer = await readBlobAsArrayBuffer(blob);\r\n checkCancel();\r\n\r\n self.debug && self.log('Upload file part, isBig:', isBigFile, part, buffer.byteLength, new Uint8Array(buffer).length, new Uint8Array(buffer).slice().length);\r\n\r\n return self.apiManager.invokeApi(method, {\r\n file_id: fileId,\r\n file_part: part,\r\n file_total_parts: totalParts,\r\n bytes: buffer\r\n } as any, {\r\n fileUpload: true\r\n }).then(() => {\r\n if(canceled) {\r\n return;\r\n }\r\n\r\n ++doneParts;\r\n const progress: Progress = {done: doneParts * partSize, offset, total: fileSize, fileName};\r\n deferred.notify(progress);\r\n\r\n if(doneParts >= totalParts) {\r\n deferred.resolve(resultInputFile);\r\n resolved = true;\r\n }\r\n }, errorHandler);\r\n }, activeDelta).catch(errorHandler);\r\n }\r\n }\r\n\r\n const it = generator();\r\n const process = () => {\r\n if(canceled) return;\r\n const r = it.next();\r\n if(r.done || canceled) return;\r\n (r.value as Promise<void>).then(process);\r\n };\r\n\r\n const maxRequests = Infinity;\r\n for(let i = 0, length = Math.min(maxRequests, totalParts); i < length; ++i) {\r\n process();\r\n }\r\n\r\n const checkCancel = () => {\r\n if(canceled) {\r\n throw makeError('UPLOAD_CANCELED');\r\n }\r\n };\r\n\r\n deferred.cancel = () => {\r\n if(!canceled && !resolved) {\r\n canceled = true;\r\n errorHandler(makeError('UPLOAD_CANCELED'));\r\n }\r\n };\r\n\r\n deferred.notify = (progress: Progress) => {\r\n this.rootScope.dispatchEvent('download_progress', progress);\r\n };\r\n\r\n deferred.finally(() => {\r\n if(this.uploadPromises[fileName] === deferred) {\r\n delete this.uploadPromises[fileName];\r\n }\r\n });\r\n\r\n return this.uploadPromises[fileName] = deferred;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function fixFirefoxSvg(text: string) {\r\n const svgIndex = text.indexOf('<svg');\r\n if(svgIndex !== 0) {\r\n text = text.slice(svgIndex);\r\n }\r\n\r\n const [_, __, width, height] = text.match(/viewBox=\"(.+?)\"/)[1].split(' ');\r\n text = text.replace(/>/, ` width=\"${width}\" height=\"${height}\">`).replace(/[^\\x00-\\x7F]/g, '');\r\n return text;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport readBlobAsArrayBuffer from './readBlobAsArrayBuffer';\r\n\r\nexport default function readBlobAsUint8Array(blob: Blob) {\r\n return readBlobAsArrayBuffer(blob).then((buffer) => new Uint8Array(buffer));\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from '../../environment/ctx';\r\nimport callbackify from '../../helpers/callbackify';\r\nimport {ignoreRestrictionReasons} from '../../helpers/restrictions';\r\nimport {Config, MethodDeclMap, User} from '../../layer';\r\nimport {InvokeApiOptions} from '../../types';\r\nimport {AppManager} from '../appManagers/manager';\r\nimport {MTAppConfig} from './appConfig';\r\nimport {UserAuth} from './mtproto_config';\r\nimport {MTMessage} from './networker';\r\n\r\ntype HashResult = {\r\n hash: number,\r\n result: any\r\n};\r\n\r\ntype HashOptions = {\r\n [queryJSON: string]: HashResult\r\n};\r\n\r\nexport type ApiLimitType = 'pin' | 'folderPin' | 'folders' | 'favedStickers' | 'reactions' | 'bio';\r\n\r\nexport default abstract class ApiManagerMethods extends AppManager {\r\n private afterMessageIdTemp: number;\r\n private hashes: {[method: string]: HashOptions} = {};\r\n private apiPromisesSingleProcess: {\r\n [q: string]: Map<any, Promise<any>>\r\n } = {};\r\n private apiPromisesSingle: {\r\n [q: string]: Promise<any>\r\n } = {};\r\n private apiPromisesCacheable: {\r\n [method: string]: {\r\n [queryJSON: string]: {\r\n timestamp: number,\r\n promise: Promise<any>,\r\n fulfilled: boolean,\r\n timeout?: number,\r\n params: any\r\n }\r\n }\r\n } = {};\r\n\r\n protected config: Config;\r\n protected appConfig: MTAppConfig;\r\n\r\n constructor() {\r\n super();\r\n this.afterMessageIdTemp = 0;\r\n }\r\n\r\n abstract setUserAuth(userAuth: UserAuth | UserId): Promise<void>;\r\n\r\n public setUser(user: User) {\r\n // appUsersManager.saveApiUser(user);\r\n return this.setUserAuth(user.id);\r\n }\r\n\r\n abstract invokeApi<T extends keyof MethodDeclMap>(method: T, params?: MethodDeclMap[T]['req'], options?: InvokeApiOptions): Promise<MethodDeclMap[T]['res']>;\r\n\r\n public invokeApiAfter<T extends keyof MethodDeclMap>(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): Promise<MethodDeclMap[T]['res']> {\r\n let o = options;\r\n o.prepareTempMessageId = '' + ++this.afterMessageIdTemp;\r\n\r\n o = {...options};\r\n (options as MTMessage).messageId = o.prepareTempMessageId;\r\n\r\n // console.log('will invokeApi:', method, params, options);\r\n return this.invokeApi(method, params, o);\r\n }\r\n\r\n public invokeApiHashable<T extends keyof MethodDeclMap, R>(o: {\r\n method: T,\r\n processResult?: (response: MethodDeclMap[T]['res']) => R,\r\n processError?: (error: ApiError) => any,\r\n params?: Omit<MethodDeclMap[T]['req'], 'hash'>,\r\n options?: InvokeApiOptions & {cacheKey?: string},\r\n overwrite?: boolean\r\n }) {\r\n // @ts-ignore\r\n o.params ??= {};\r\n o.options ??= {};\r\n // console.log('will invokeApi:', method, params, options);\r\n\r\n const {params, options, method, overwrite} = o;\r\n\r\n const queryJSON = JSON.stringify(params);\r\n let cached: HashResult;\r\n if(this.hashes[method]) {\r\n cached = this.hashes[method][queryJSON];\r\n if(cached) {\r\n if(overwrite) {\r\n delete this.hashes[method][queryJSON];\r\n cached = undefined;\r\n } else {\r\n (params as any).hash = cached.hash;\r\n }\r\n }\r\n }\r\n\r\n return this.invokeApiSingleProcess<T, R>({\r\n method,\r\n processResult: (result) => {\r\n if(result._.includes('NotModified')) {\r\n // this.debug && this.log.warn('NotModified saved!', method, queryJSON);\r\n return cached.result;\r\n }\r\n\r\n if(result.hash/* || result.messages */) {\r\n const hash = result.hash/* || this.computeHash(result.messages) */;\r\n\r\n if(!this.hashes[method]) this.hashes[method] = {};\r\n this.hashes[method][queryJSON] = {\r\n hash,\r\n result\r\n };\r\n }\r\n\r\n if(o.processResult) {\r\n return o.processResult(result);\r\n }\r\n\r\n return result;\r\n },\r\n params,\r\n options\r\n });\r\n }\r\n\r\n public invokeApiSingle<T extends keyof MethodDeclMap>(method: T, params: MethodDeclMap[T]['req'] = {} as any, options: InvokeApiOptions = {}): Promise<MethodDeclMap[T]['res']> {\r\n const q = method + '-' + JSON.stringify(params);\r\n const cache = this.apiPromisesSingle;\r\n if(cache[q]) {\r\n return cache[q];\r\n }\r\n\r\n return cache[q] = this.invokeApi(method, params, options).finally(() => {\r\n delete cache[q];\r\n });\r\n }\r\n\r\n public invokeApiSingleProcess<T extends keyof MethodDeclMap, R>(o: {\r\n method: T,\r\n processResult: (response: MethodDeclMap[T]['res']) => R,\r\n processError?: (error: ApiError) => any,\r\n params?: MethodDeclMap[T]['req'],\r\n options?: InvokeApiOptions & {cacheKey?: string, overwrite?: boolean}\r\n }): Promise<Awaited<R>> {\r\n o.params ??= {};\r\n o.options ??= {};\r\n\r\n const {method, processResult, processError, params, options} = o;\r\n const cache = this.apiPromisesSingleProcess;\r\n const cacheKey = options.cacheKey || JSON.stringify(params);\r\n const map = cache[method] ?? (cache[method] = new Map());\r\n const oldPromise = map.get(cacheKey);\r\n if(oldPromise) {\r\n return oldPromise;\r\n }\r\n\r\n const getNewPromise = () => {\r\n const promise = map.get(cacheKey);\r\n return promise === p ? undefined : promise;\r\n }\r\n\r\n const originalPromise = this.invokeApi(method, params, options);\r\n const newPromise: Promise<Awaited<R>> = originalPromise.then((result) => {\r\n return getNewPromise() || processResult(result);\r\n }, (error) => {\r\n const promise = getNewPromise();\r\n if(promise) {\r\n return promise;\r\n }\r\n\r\n if(!processError) {\r\n throw error;\r\n }\r\n\r\n return processError(error);\r\n });\r\n\r\n const p = newPromise.finally(() => {\r\n if(map.get(cacheKey) !== p) {\r\n return;\r\n }\r\n\r\n map.delete(cacheKey);\r\n if(!map.size) {\r\n delete cache[method];\r\n }\r\n });\r\n\r\n map.set(cacheKey, p);\r\n return p;\r\n }\r\n\r\n public invokeApiCacheable<T extends keyof MethodDeclMap>(method: T, params: MethodDeclMap[T]['req'] = {} as any, options: InvokeApiOptions & Partial<{cacheSeconds: number, override: boolean}> = {}): Promise<MethodDeclMap[T]['res']> {\r\n const cache = this.apiPromisesCacheable[method] ?? (this.apiPromisesCacheable[method] = {});\r\n const queryJSON = JSON.stringify(params);\r\n const item = cache[queryJSON];\r\n if(item && (!options.override || !item.fulfilled)) {\r\n return item.promise;\r\n }\r\n\r\n if(options.override) {\r\n if(item && item.timeout) {\r\n clearTimeout(item.timeout);\r\n delete item.timeout;\r\n }\r\n\r\n delete options.override;\r\n }\r\n\r\n let timeout: number;\r\n if(options.cacheSeconds) {\r\n timeout = ctx.setTimeout(() => {\r\n delete cache[queryJSON];\r\n }, options.cacheSeconds * 1000);\r\n delete options.cacheSeconds;\r\n }\r\n\r\n const promise = this.invokeApi(method, params, options);\r\n\r\n cache[queryJSON] = {\r\n timestamp: Date.now(),\r\n fulfilled: false,\r\n timeout,\r\n promise,\r\n params\r\n };\r\n\r\n return promise;\r\n }\r\n\r\n public clearCache<T extends keyof MethodDeclMap>(method: T, verify: (params: MethodDeclMap[T]['req']) => boolean) {\r\n const cache = this.apiPromisesCacheable[method];\r\n if(cache) {\r\n for(const queryJSON in cache) {\r\n const item = cache[queryJSON];\r\n try {\r\n if(verify(item.params)) {\r\n if(item.timeout) {\r\n clearTimeout(item.timeout);\r\n }\r\n\r\n delete cache[queryJSON];\r\n }\r\n } catch(err) {\r\n // this.log.error('clearCache error:', err, queryJSON, item);\r\n }\r\n }\r\n }\r\n }\r\n\r\n public getConfig(overwrite?: boolean) {\r\n if(this.config && !overwrite) {\r\n return this.config;\r\n }\r\n\r\n return this.invokeApiSingleProcess({\r\n method: 'help.getConfig',\r\n params: {},\r\n processResult: (config) => {\r\n this.config = config;\r\n this.rootScope.dispatchEvent('config', config);\r\n return config;\r\n },\r\n options: {overwrite}\r\n });\r\n }\r\n\r\n public getAppConfig(overwrite?: boolean) {\r\n if(this.appConfig && !overwrite) {\r\n return this.appConfig;\r\n }\r\n\r\n return this.invokeApiSingleProcess({\r\n method: 'help.getAppConfig',\r\n params: {},\r\n processResult: (config: MTAppConfig) => {\r\n this.appConfig = config;\r\n ignoreRestrictionReasons(config.ignore_restriction_reasons ?? []);\r\n this.rootScope.dispatchEvent('app_config', config);\r\n return config;\r\n },\r\n options: {overwrite}\r\n });\r\n }\r\n\r\n public getLimit(type: ApiLimitType, isPremium?: boolean) {\r\n return callbackify(this.getAppConfig(), (appConfig) => {\r\n const map: {[type in ApiLimitType]: [keyof MTAppConfig, keyof MTAppConfig]} = {\r\n pin: ['dialogs_pinned_limit_default', 'dialogs_pinned_limit_premium'],\r\n folderPin: ['dialogs_folder_pinned_limit_default', 'dialogs_folder_pinned_limit_premium'],\r\n folders: ['dialog_filters_limit_default', 'dialog_filters_limit_premium'],\r\n favedStickers: ['stickers_faved_limit_default', 'stickers_faved_limit_premium'],\r\n reactions: ['reactions_user_max_default', 'reactions_user_max_premium'],\r\n bio: ['about_length_limit_default', 'about_length_limit_premium']\r\n };\r\n\r\n isPremium ??= this.rootScope.premium;\r\n\r\n const key = map[type][isPremium ? 1 : 0];\r\n return appConfig[key] as number;\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n \nimport transportController from './transports/controller';\nimport MTTransport from './transports/transport';\n \n\nimport type {UserAuth} from './mtproto_config';\nimport type {DcAuthKey, DcId, DcServerSalt, InvokeApiOptions} from '../../types';\nimport type {MethodDeclMap} from '../../layer';\nimport type TcpObfuscated from './transports/tcpObfuscated';\nimport sessionStorage from '../sessionStorage';\nimport MTPNetworker, {MTMessage} from './networker';\nimport {ConnectionType, constructTelegramWebSocketUrl, DcConfigurator, TransportType} from './dcConfigurator';\nimport {logger} from '../logger';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {IDB} from '../files/idb';\nimport CryptoWorker from '../crypto/cryptoMessagePort';\nimport ctx from '../../environment/ctx';\nimport noop from '../../helpers/noop';\nimport Modes from '../../config/modes';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport isObject from '../../helpers/object/isObject';\nimport pause from '../../helpers/schedulers/pause';\nimport ApiManagerMethods from './api_methods';\nimport {getEnvironment} from '../../environment/utils';\nimport toggleStorages from '../../helpers/toggleStorages';\n\n/* class RotatableArray<T> {\n public array: Array<T> = [];\n private lastIndex = -1;\n\n public get() {\n this.lastIndex = clamp(this.lastIndex + 1, 0, this.array.length - 1);\n return this.array[this.lastIndex];\n }\n} */\n\nconst PREMIUM_FILE_NETWORKERS_COUNT = 6;\nconst REGULAR_FILE_NETWORKERS_COUNT = 3;\n\nexport class ApiManager extends ApiManagerMethods {\n private cachedNetworkers: {\n [transportType in TransportType]: {\n [connectionType in ConnectionType]: {\n [dcId: DcId]: MTPNetworker[]\n }\n }\n };\n\n private cachedExportPromise: {[x: number]: Promise<unknown>};\n private gettingNetworkers: {[dcIdAndType: string]: Promise<MTPNetworker>};\n private baseDcId: DcId;\n\n // public telegramMeNotified = false;\n\n private log: ReturnType<typeof logger>;\n\n private afterMessageTempIds: {\n [tempId: string]: {\n messageId: string,\n promise: Promise<any>\n }\n };\n\n private transportType: TransportType;\n\n private updatesProcessor: (obj: any) => void;\n\n private loggingOut: boolean;\n\n constructor() {\n super();\n this.log = logger('API');\n\n this.cachedNetworkers = {} as any;\n this.cachedExportPromise = {};\n this.gettingNetworkers = {};\n this.baseDcId = 0;\n this.afterMessageTempIds = {};\n\n this.transportType = Modes.transport;\n\n \n transportController.addEventListener('transport', (transportType) => {\n this.changeTransportType(transportType);\n });\n \n }\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateConfig: () => {\n this.getConfig(true);\n this.getAppConfig(true);\n }\n });\n\n this.rootScope.addEventListener('user_auth', () => {\n if(this.config) { // refresh configs if had a config during authorization\n this.apiUpdatesManager.processLocalUpdate({_: 'updateConfig'});\n }\n });\n\n this.rootScope.addEventListener('premium_toggle', (isPremium) => {\n this.iterateNetworkers(({networker, connectionType, dcId, transportType}) => {\n if(connectionType === 'client' || transportType !== 'websocket') {\n return;\n }\n\n const transport = networker.transport;\n if(!transport) {\n this.log.error('wow what, no transport?', networker);\n return;\n }\n\n if((transport as TcpObfuscated).connection) {\n const url = constructTelegramWebSocketUrl(dcId, connectionType, isPremium);\n (transport as TcpObfuscated).changeUrl(url);\n }\n });\n });\n }\n\n // private lol = false;\n\n // constructor() {\n // MtpSingleInstanceService.start();\n\n /* AppStorage.get<number>('dc').then((dcId) => {\n if(dcId) {\n this.baseDcId = dcId;\n }\n }); */\n // }\n\n /* public telegramMeNotify(newValue: boolean) {\n if(this.telegramMeNotified !== newValue) {\n this.telegramMeNotified = newValue;\n //telegramMeWebService.setAuthorized(this.telegramMeNotified);\n }\n } */\n\n private getTransportType(connectionType: ConnectionType) {\n \n \n \n \n \n // @ts-ignore\n const transportType: TransportType = this.transportType;\n \n\n return transportType;\n }\n\n private iterateNetworkers(callback: (o: {networker: MTPNetworker, dcId: DcId, connectionType: ConnectionType, transportType: TransportType, index: number, array: MTPNetworker[]}) => void) {\n for(const transportType in this.cachedNetworkers) {\n const connections = this.cachedNetworkers[transportType as TransportType];\n for(const connectionType in connections) {\n const dcs = connections[connectionType as ConnectionType];\n for(const dcId in dcs) {\n const networkers = dcs[dcId as any as DcId];\n networkers.forEach((networker, idx, arr) => {\n callback({\n networker,\n dcId: +dcId as DcId,\n connectionType: connectionType as ConnectionType,\n transportType: transportType as TransportType,\n index: idx,\n array: arr\n });\n });\n }\n }\n }\n }\n\n private chooseServer(dcId: DcId, connectionType: ConnectionType, transportType: TransportType) {\n return this.dcConfigurator.chooseServer(dcId, connectionType, transportType, connectionType === 'client', this.rootScope.premium);\n }\n\n public changeTransportType(transportType: TransportType) {\n const oldTransportType = this.transportType;\n if(oldTransportType === transportType) {\n return;\n }\n\n this.log('changing transport from', oldTransportType, 'to', transportType);\n\n const oldObject = this.cachedNetworkers[oldTransportType];\n const newObject = this.cachedNetworkers[transportType];\n this.cachedNetworkers[transportType] = oldObject;\n this.cachedNetworkers[oldTransportType] = newObject;\n\n this.transportType = transportType;\n\n for(const oldGetKey in this.gettingNetworkers) {\n const promise = this.gettingNetworkers[oldGetKey];\n delete this.gettingNetworkers[oldGetKey];\n\n const newGetKey = oldGetKey.replace(oldTransportType, transportType);\n this.gettingNetworkers[newGetKey] = promise;\n\n this.log('changed networker getKey from', oldGetKey, 'to', newGetKey)\n }\n\n this.iterateNetworkers((info) => {\n const transportType = this.getTransportType(info.connectionType);\n const transport = this.chooseServer(info.dcId, info.connectionType, transportType);\n this.changeNetworkerTransport(info.networker, transport);\n });\n }\n\n public async getBaseDcId() {\n if(this.baseDcId) {\n return this.baseDcId;\n }\n\n const baseDcId = await sessionStorage.get('dc');\n if(!this.baseDcId) {\n if(!baseDcId) {\n this.setBaseDcId(App.baseDcId);\n } else {\n this.baseDcId = baseDcId;\n }\n }\n\n return this.baseDcId;\n }\n\n public async setUserAuth(userAuth: UserAuth | UserId) {\n if(typeof(userAuth) === 'string' || typeof(userAuth) === 'number') {\n userAuth = {dcID: 0, date: Date.now() / 1000 | 0, id: userAuth.toPeerId(false)};\n }\n\n this.rootScope.dispatchEvent('user_auth', userAuth);\n\n if(!userAuth.dcID) {\n const baseDcId = await this.getBaseDcId();\n userAuth.dcID = baseDcId;\n }\n\n sessionStorage.set({\n user_auth: userAuth\n });\n\n // this.telegramMeNotify(true);\n }\n\n public setBaseDcId(dcId: DcId) {\n const wasDcId = this.baseDcId;\n if(wasDcId) { // if migrated set ondrain\n this.getNetworker(wasDcId).then((networker) => {\n this.setOnDrainIfNeeded(networker);\n });\n }\n\n this.baseDcId = dcId;\n\n sessionStorage.set({\n dc: this.baseDcId\n });\n }\n\n public async logOut() {\n if(this.loggingOut) {\n return;\n }\n\n this.loggingOut = true;\n const storageKeys: Array<DcAuthKey> = [];\n\n const prefix = 'dc';\n for(let dcId = 1; dcId <= 5; dcId++) {\n storageKeys.push(prefix + dcId + '_auth_key' as any);\n }\n\n // WebPushApiManager.forceUnsubscribe(); // WARNING // moved to worker's master\n const storageResult = await Promise.all(storageKeys.map((key) => sessionStorage.get(key)));\n\n const logoutPromises: Promise<any>[] = [];\n for(let i = 0; i < storageResult.length; i++) {\n if(storageResult[i]) {\n logoutPromises.push(this.invokeApi('auth.logOut', {}, {dcId: (i + 1) as DcId, ignoreErrors: true}));\n }\n }\n\n const clear = async() => {\n this.baseDcId = undefined;\n // this.telegramMeNotify(false);\n await toggleStorages(false, true);\n IDB.closeDatabases();\n this.rootScope.dispatchEvent('logging_out');\n };\n\n setTimeout(clear, 1e3);\n\n // return;\n\n return Promise.all(logoutPromises).catch((error) => {\n error.handled = true;\n }).finally(clear)/* .then(() => {\n location.pathname = '/';\n }) */;\n }\n\n private generateNetworkerGetKey(dcId: DcId, transportType: TransportType, connectionType: ConnectionType) {\n return [dcId, transportType, connectionType].join('-');\n }\n\n public getNetworker(dcId: DcId, options: InvokeApiOptions = {}): Promise<MTPNetworker> {\n const connectionType: ConnectionType = options.fileDownload ? 'download' : (options.fileUpload ? 'upload' : 'client');\n // const connectionType: ConnectionType = 'client';\n\n const transportType = this.getTransportType(connectionType);\n if(!this.cachedNetworkers[transportType]) {\n this.cachedNetworkers[transportType] = {\n client: {},\n download: {},\n upload: {}\n };\n }\n\n const cache = this.cachedNetworkers[transportType][connectionType];\n if(!(dcId in cache)) {\n cache[dcId] = [];\n }\n\n const networkers = cache[dcId];\n // @ts-ignore\n const maxNetworkers = connectionType === 'client' || transportType === 'https' ? 1 : (this.rootScope.premium ? PREMIUM_FILE_NETWORKERS_COUNT : REGULAR_FILE_NETWORKERS_COUNT);\n if(networkers.length >= maxNetworkers) {\n let i = maxNetworkers - 1, found = false;\n for(; i >= 0; --i) {\n if(networkers[i].isOnline) {\n found = true;\n break;\n }\n }\n\n const networker = networkers.splice(found ? i : maxNetworkers - 1, 1)[0];\n networkers.unshift(networker);\n return Promise.resolve(networker);\n }\n\n let getKey = this.generateNetworkerGetKey(dcId, transportType, connectionType);\n if(this.gettingNetworkers[getKey]) {\n return this.gettingNetworkers[getKey];\n }\n\n const ak: DcAuthKey = `dc${dcId}_auth_key` as any;\n const ss: DcServerSalt = `dc${dcId}_server_salt` as any;\n\n let transport = this.chooseServer(dcId, connectionType, transportType);\n return this.gettingNetworkers[getKey] = Promise.all([ak, ss].map((key) => sessionStorage.get(key)))\n .then(async([authKeyHex, serverSaltHex]) => {\n let networker: MTPNetworker, error: any;\n if(authKeyHex && authKeyHex.length === 512) {\n if(!serverSaltHex || serverSaltHex.length !== 16) {\n serverSaltHex = 'AAAAAAAAAAAAAAAA';\n }\n\n const authKey = bytesFromHex(authKeyHex);\n const authKeyId = (await CryptoWorker.invokeCrypto('sha1', authKey)).slice(-8);\n const serverSalt = bytesFromHex(serverSaltHex);\n\n networker = this.networkerFactory.getNetworker(dcId, authKey, authKeyId, serverSalt, options);\n } else {\n try { // if no saved state\n const auth = await this.authorizer.auth(dcId);\n\n sessionStorage.set({\n [ak]: bytesToHex(auth.authKey),\n [ss]: bytesToHex(auth.serverSalt)\n });\n\n networker = this.networkerFactory.getNetworker(dcId, auth.authKey, auth.authKeyId, auth.serverSalt, options);\n } catch(_error) {\n error = _error;\n }\n }\n\n // ! cannot get it before this promise because simultaneous changeTransport will change nothing\n const newTransportType = this.getTransportType(connectionType);\n if(newTransportType !== transportType) {\n getKey = this.generateNetworkerGetKey(dcId, newTransportType, connectionType);\n transport.destroy();\n DcConfigurator.removeTransport(this.dcConfigurator.chosenServers, transport);\n\n if(networker) {\n transport = this.chooseServer(dcId, connectionType, newTransportType);\n }\n\n this.log('transport has been changed during authorization from', transportType, 'to', newTransportType);\n }\n\n /* networker.onConnectionStatusChange = (online) => {\n console.log('status:', online);\n }; */\n\n delete this.gettingNetworkers[getKey];\n\n if(error) {\n this.log('get networker error', error, (error as Error).stack);\n throw error;\n }\n\n this.changeNetworkerTransport(networker, transport);\n networkers.unshift(networker);\n this.setOnDrainIfNeeded(networker);\n return networker;\n });\n }\n\n public getNetworkerVoid(dcId: DcId) {\n return this.getNetworker(dcId).then(noop, noop);\n }\n\n private changeNetworkerTransport(networker: MTPNetworker, transport?: MTTransport) {\n const oldTransport = networker.transport;\n if(oldTransport) {\n DcConfigurator.removeTransport(this.dcConfigurator.chosenServers, oldTransport);\n }\n\n networker.changeTransport(transport);\n }\n\n private onNetworkerDrain(networker: MTPNetworker) {\n this.log('networker drain', networker.dcId);\n networker.onDrain = undefined;\n this.changeNetworkerTransport(networker);\n networker.destroy();\n this.networkerFactory.removeNetworker(networker);\n DcConfigurator.removeTransport(this.cachedNetworkers, networker);\n }\n\n public setOnDrainIfNeeded(networker: MTPNetworker) {\n if(networker.onDrain) {\n return;\n }\n\n const checkPromise: Promise<boolean> = networker.isFileNetworker ?\n Promise.resolve(true) :\n this.getBaseDcId().then((baseDcId) => networker.dcId !== baseDcId);\n checkPromise.then((canRelease) => {\n if(networker.onDrain) {\n return;\n }\n\n if(canRelease) {\n networker.onDrain = () => this.onNetworkerDrain(networker);\n networker.setDrainTimeout();\n }\n });\n }\n\n public setUpdatesProcessor(callback: (obj: any) => void) {\n this.updatesProcessor = callback;\n this.networkerFactory.setUpdatesProcessor(callback);\n }\n\n public invokeApi<T extends keyof MethodDeclMap>(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): CancellablePromise<MethodDeclMap[T]['res']> {\n // /////this.log('Invoke api', method, params, options);\n\n /* if(!this.lol) {\n networkerFactory.updatesProcessor({_: 'new_session_created'}, true);\n this.lol = true;\n } */\n\n const deferred = deferredPromise<MethodDeclMap[T]['res']>();\n\n let {afterMessageId, prepareTempMessageId} = options;\n if(prepareTempMessageId) {\n deferred.then(() => {\n delete this.afterMessageTempIds[prepareTempMessageId];\n });\n }\n\n if(MOUNT_CLASS_TO) {\n const startTime = Date.now();\n const interval = ctx.setInterval(() => {\n if(!cachedNetworker || !cachedNetworker.isStopped()) {\n this.log.error('Request is still processing:', method, params, options, 'time:', (Date.now() - startTime) / 1000);\n }\n // this.cachedUploadNetworkers[2].requestMessageStatus();\n }, 5e3);\n\n deferred.catch(noop).finally(() => {\n clearInterval(interval);\n });\n }\n\n const rejectPromise = async(error: ApiError) => {\n if(!error) {\n error = {type: 'ERROR_EMPTY'};\n } else if(!isObject(error)) {\n error = {message: error};\n }\n\n if((error.code === 401 && error.type === 'SESSION_REVOKED') ||\n (error.code === 406 && error.type === 'AUTH_KEY_DUPLICATED')) {\n this.logOut();\n }\n\n if(options.ignoreErrors) {\n throw error;\n }\n\n if(error.code === 406) {\n error.handled = true;\n }\n\n if(!options.noErrorBox) {\n error.input = method;\n error.stack = stack || (error.originalError && error.originalError.stack) || error.stack || (new Error()).stack;\n setTimeout(() => {\n if(!error.handled) {\n if(error.code === 401) {\n this.logOut();\n } else {\n // ErrorService.show({error: error}); // WARNING\n }\n\n error.handled = true;\n }\n }, 100);\n }\n\n throw error;\n };\n\n let dcId: DcId;\n\n let cachedNetworker: MTPNetworker;\n const stack = (new Error()).stack || 'empty stack';\n const performRequest = (): Promise<any> => {\n if(afterMessageId) {\n const after = this.afterMessageTempIds[afterMessageId];\n if(after) {\n options.afterMessageId = after.messageId;\n }\n }\n\n const promise = cachedNetworker.wrapApiCall(method, params, options);\n\n if(prepareTempMessageId) {\n this.afterMessageTempIds[prepareTempMessageId] = {\n messageId: (options as MTMessage).messageId,\n promise: deferred\n };\n }\n\n return promise.catch((error: ApiError) => {\n // if(!options.ignoreErrors) {\n if(error.type !== 'FILE_REFERENCE_EXPIRED'/* && error.type !== 'MSG_WAIT_FAILED' */) {\n this.log.error('Error', error.code, error.type, this.baseDcId, dcId, method, params);\n }\n\n if(error.code === 401 && this.baseDcId === dcId) {\n if(error.type !== 'SESSION_PASSWORD_NEEDED') {\n sessionStorage.delete('dc')\n sessionStorage.delete('user_auth'); // ! возможно тут вообще не нужно это делать, но нужно проверить случай с USER_DEACTIVATED (https://core.telegram.org/api/errors)\n // this.telegramMeNotify(false);\n }\n\n throw error;\n } else if(error.code === 401 && this.baseDcId && dcId !== this.baseDcId) {\n if(this.cachedExportPromise[dcId] === undefined) {\n const promise = new Promise((exportResolve, exportReject) => {\n this.invokeApi('auth.exportAuthorization', {dc_id: dcId}, {noErrorBox: true}).then((exportedAuth) => {\n this.invokeApi('auth.importAuthorization', {\n id: exportedAuth.id,\n bytes: exportedAuth.bytes\n }, {dcId, noErrorBox: true}).then(exportResolve, exportReject);\n }, exportReject);\n });\n\n this.cachedExportPromise[dcId] = promise;\n }\n\n return this.cachedExportPromise[dcId].then(() => performRequest());\n } else if(error.code === 303) {\n const newDcId = +error.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\\d+)/)[2] as DcId;\n if(newDcId !== dcId) {\n if(options.dcId) {\n options.dcId = newDcId;\n } else {\n this.setBaseDcId(newDcId);\n }\n\n return this.invokeApi(method, params, options);\n }\n } else if(error.code === 400 && error.type.indexOf('FILE_MIGRATE') === 0) {\n const newDcId = +error.type.match(/^(FILE_MIGRATE_)(\\d+)/)[2] as DcId;\n if(newDcId !== dcId) {\n options.dcId = newDcId;\n return this.invokeApi(method, params, options);\n } else {\n throw error;\n }\n } else if(error.code === 400 && error.type === 'CONNECTION_NOT_INITED') {\n this.networkerFactory.unsetConnectionInited();\n return performRequest();\n } else if(!options.rawError && error.code === 420) {\n const waitTime = +error.type.match(/^FLOOD_WAIT_(\\d+)/)[1] || 1;\n\n if(waitTime > (options.floodMaxTimeout ?? 60) && !options.prepareTempMessageId) {\n throw error;\n }\n\n return pause(waitTime/* (waitTime + 5) */ * 1000).then(() => performRequest());\n } else if(!options.rawError && ['MSG_WAIT_FAILED', 'MSG_WAIT_TIMEOUT'].includes(error.type)) {\n const after = this.afterMessageTempIds[afterMessageId];\n\n afterMessageId = undefined;\n delete options.afterMessageId;\n\n if(after) return after.promise.then(() => performRequest());\n else return performRequest();\n } else if(!options.rawError && error.code === 500) {\n const now = Date.now();\n if(options.stopTime) {\n if(now >= options.stopTime) {\n throw error;\n }\n }\n\n options.waitTime = options.waitTime ? Math.min(60, options.waitTime * 1.5) : 1;\n return pause(options.waitTime * 1000).then(() => performRequest());\n } else if(error.type === 'UNKNOWN' || error.type === 'MTPROTO_CLUSTER_INVALID') { // cluster invalid - request from regular user to premium endpoint\n return pause(1000).then(() => performRequest());\n } else {\n throw error;\n }\n });\n }\n\n let p: Promise<MTPNetworker>;\n if(dcId = (options.dcId || this.baseDcId)) {\n p = this.getNetworker(dcId, options);\n } else {\n p = this.getBaseDcId().then((baseDcId) => this.getNetworker(dcId = baseDcId, options));\n }\n\n p.then((networker) => {\n cachedNetworker = networker;\n const promise = performRequest();\n cachedNetworker.attachPromise(deferred, options as MTMessage);\n return promise;\n })\n .then(deferred.resolve)\n .catch(rejectPromise)\n .catch(deferred.reject);\n\n return deferred;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport applyMixins from '../../helpers/applyMixins';\r\nimport EventListenerBase from '../../helpers/eventListenerBase';\r\nimport {AppManager} from '../appManagers/manager';\r\n\r\nexport type StatePeerType = 'recentSearch' | 'topPeer' | 'dialog' | 'contact' | 'topMessage' | 'self';\r\n\r\ntype PeersStorageKey = `${StatePeerType}_${string | PeerId}` | StatePeerType;\r\n\r\nclass PeersStorage {\r\n private neededPeers: Map<PeerId, Set<PeersStorageKey>> = new Map();\r\n private singlePeerMap: Map<PeersStorageKey, Set<PeerId>> = new Map();\r\n\r\n constructor() {\r\n this._constructor(false);\r\n }\r\n\r\n protected after() {\r\n this.rootScope.addEventListener('user_auth', () => {\r\n this.requestPeer(this.appPeersManager.peerId, 'self');\r\n });\r\n }\r\n\r\n public requestPeer(peerId: PeerId, key: PeersStorageKey) {\r\n let set = this.neededPeers.get(peerId);\r\n if(set && set.has(key)) {\r\n return;\r\n }\r\n\r\n if(!set) {\r\n set = new Set();\r\n this.neededPeers.set(peerId, set);\r\n }\r\n\r\n set.add(key);\r\n\r\n this.dispatchEvent('peerNeeded', peerId);\r\n }\r\n\r\n public releasePeer(peerId: PeerId, key: PeersStorageKey) {\r\n const set = this.neededPeers.get(peerId);\r\n if(!set) {\r\n return;\r\n }\r\n\r\n set.delete(key);\r\n\r\n if(!set.size) {\r\n this.neededPeers.delete(peerId);\r\n this.dispatchEvent('peerUnneeded', peerId);\r\n }\r\n }\r\n\r\n public requestPeersForKey(peerIds: Set<PeerId> | number[], key: PeersStorageKey) {\r\n if(Array.isArray(peerIds)) {\r\n peerIds = new Set(peerIds);\r\n }\r\n\r\n let set = this.singlePeerMap.get(key);\r\n if(set) {\r\n for(const peerId of set) {\r\n if(peerIds.has(peerId)) {\r\n continue;\r\n }\r\n\r\n this.releasePeer(peerId, key);\r\n set.delete(peerId);\r\n }\r\n\r\n if(!set.size && !peerIds.size) {\r\n this.singlePeerMap.delete(key);\r\n return;\r\n }\r\n }\r\n\r\n if(peerIds.size) {\r\n if(!set) {\r\n set = new Set();\r\n this.singlePeerMap.set(key, set);\r\n }\r\n\r\n for(const peerId of peerIds) {\r\n if(set.has(peerId)) {\r\n continue;\r\n }\r\n\r\n this.requestPeer(peerId, key);\r\n set.add(peerId);\r\n }\r\n }\r\n }\r\n\r\n public isPeerNeeded(peerId: PeerId) {\r\n return this.neededPeers.has(peerId);\r\n }\r\n}\r\n\r\ninterface PeersStorage extends EventListenerBase<{\r\n peerNeeded: (peerId: PeerId) => void,\r\n peerUnneeded: (peerId: PeerId) => void,\r\n}>, AppManager {}\r\napplyMixins(PeersStorage, [EventListenerBase, AppManager]);\r\n\r\nexport default PeersStorage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {WebDocument} from '../../layer';\r\nimport type {MyDocument} from '../appManagers/appDocsManager';\r\nimport type {MyPhoto} from '../appManagers/appPhotosManager';\r\nimport {THUMB_TYPE_FULL} from '../mtproto/mtproto_config';\r\n\r\nexport type ThumbCache = {\r\n downloaded: number,\r\n url: string,\r\n type: string\r\n};\r\n\r\nexport type ThumbsCache = {\r\n [key: string]: {\r\n [size: string]: ThumbCache\r\n }\r\n};\r\n\r\nconst thumbFullSize = THUMB_TYPE_FULL;\r\n\r\nexport type ThumbStorageMedia = MyPhoto | MyDocument | WebDocument;\r\n\r\nexport default class ThumbsStorage {\r\n private thumbsCache: ThumbsCache = {};\r\n\r\n private getKey(media: ThumbStorageMedia) {\r\n return media._ + ((media as MyPhoto).id ?? (media as WebDocument).url);\r\n }\r\n\r\n public getCacheContext(media: ThumbStorageMedia, thumbSize: string = thumbFullSize): ThumbCache {\r\n /* if(media._ === 'photo' && thumbSize !== 'i') {\r\n thumbSize = thumbFullSize;\r\n } */\r\n\r\n const cache = this.thumbsCache[this.getKey(media)] ??= {};\r\n return cache[thumbSize] ??= {downloaded: 0, url: '', type: thumbSize};\r\n }\r\n\r\n public setCacheContextURL(media: ThumbStorageMedia, thumbSize: string = thumbFullSize, url: string, downloaded: number = 0) {\r\n const cacheContext = this.getCacheContext(media, thumbSize);\r\n cacheContext.url = url;\r\n cacheContext.downloaded = downloaded;\r\n return cacheContext;\r\n }\r\n\r\n public deleteCacheContext(media: ThumbStorageMedia, thumbSize: string = thumbFullSize) {\r\n const cache = this.thumbsCache[this.getKey(media)];\r\n if(cache) {\r\n delete cache[thumbSize];\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type MTProtoConstructor = {\r\n id: number,\r\n predicate: string,\r\n params: Array<{\r\n name: string,\r\n type: string\r\n }>,\r\n type: string\r\n};\r\n\r\nexport type MTProtoMethod = {\r\n id: number,\r\n method: string,\r\n params: Array<{\r\n name: string,\r\n type: string\r\n }>,\r\n type: string\r\n};\r\n\r\n// eslint-disable-next-line quotes, comma-spacing\r\nexport default {\"MTProto\":{\"constructors\":[{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":85337187,\"predicate\":\"resPQ\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"server_public_key_fingerprints\",\"type\":\"Vector<long>\"}],\"type\":\"ResPQ\"},{\"id\":-1443537003,\"predicate\":\"p_q_inner_data_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":1459478408,\"predicate\":\"p_q_inner_data_temp_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"},{\"name\":\"expires_in\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":-790100132,\"predicate\":\"server_DH_params_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_answer\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-1249309254,\"predicate\":\"server_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"dh_prime\",\"type\":\"bytes\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"server_time\",\"type\":\"int\"}],\"type\":\"Server_DH_inner_data\"},{\"id\":1715713620,\"predicate\":\"client_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"retry_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"}],\"type\":\"Client_DH_Inner_Data\"},{\"id\":1003222836,\"predicate\":\"dh_gen_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash1\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1188831161,\"predicate\":\"dh_gen_retry\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash2\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":-1499615742,\"predicate\":\"dh_gen_fail\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash3\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1973679973,\"predicate\":\"bind_auth_key_inner\",\"params\":[{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"temp_auth_key_id\",\"type\":\"long\"},{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"temp_session_id\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"}],\"type\":\"BindAuthKeyInner\"},{\"id\":-212046591,\"predicate\":\"rpc_result\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"result\",\"type\":\"Object\"}],\"type\":\"RpcResult\"},{\"id\":558156313,\"predicate\":\"rpc_error\",\"params\":[{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"error_message\",\"type\":\"string\"}],\"type\":\"RpcError\"},{\"id\":1579864942,\"predicate\":\"rpc_answer_unknown\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-847714938,\"predicate\":\"rpc_answer_dropped_running\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-1539647305,\"predicate\":\"rpc_answer_dropped\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seq_no\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"}],\"type\":\"RpcDropAnswer\"},{\"id\":155834844,\"predicate\":\"future_salt\",\"params\":[{\"name\":\"valid_since\",\"type\":\"int\"},{\"name\":\"valid_until\",\"type\":\"int\"},{\"name\":\"salt\",\"type\":\"long\"}],\"type\":\"FutureSalt\"},{\"id\":-1370486635,\"predicate\":\"future_salts\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"now\",\"type\":\"int\"},{\"name\":\"salts\",\"type\":\"vector<future_salt>\"}],\"type\":\"FutureSalts\"},{\"id\":880243653,\"predicate\":\"pong\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-501201412,\"predicate\":\"destroy_session_ok\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":1658015945,\"predicate\":\"destroy_session_none\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1631450872,\"predicate\":\"new_session_created\",\"params\":[{\"name\":\"first_msg_id\",\"type\":\"long\"},{\"name\":\"unique_id\",\"type\":\"long\"},{\"name\":\"server_salt\",\"type\":\"long\"}],\"type\":\"NewSession\"},{\"id\":1945237724,\"predicate\":\"msg_container\",\"params\":[{\"name\":\"messages\",\"type\":\"vector<%Message>\"}],\"type\":\"MessageContainer\"},{\"id\":1538843921,\"predicate\":\"message\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seqno\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"body\",\"type\":\"Object\"}],\"type\":\"Message\"},{\"id\":-530561358,\"predicate\":\"msg_copy\",\"params\":[{\"name\":\"orig_message\",\"type\":\"Message\"}],\"type\":\"MessageCopy\"},{\"id\":812830625,\"predicate\":\"gzip_packed\",\"params\":[{\"name\":\"packed_data\",\"type\":\"bytes\"}],\"type\":\"Object\"},{\"id\":1658238041,\"predicate\":\"msgs_ack\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector<long>\"}],\"type\":\"MsgsAck\"},{\"id\":-1477445615,\"predicate\":\"bad_msg_notification\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"}],\"type\":\"BadMsgNotification\"},{\"id\":-307542917,\"predicate\":\"bad_server_salt\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"new_server_salt\",\"type\":\"long\"}],\"type\":\"BadMsgNotification\"},{\"id\":2105940488,\"predicate\":\"msg_resend_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector<long>\"}],\"type\":\"MsgResendReq\"},{\"id\":-630588590,\"predicate\":\"msgs_state_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector<long>\"}],\"type\":\"MsgsStateReq\"},{\"id\":81704317,\"predicate\":\"msgs_state_info\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsStateInfo\"},{\"id\":-1933520591,\"predicate\":\"msgs_all_info\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector<long>\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsAllInfo\"},{\"id\":661470918,\"predicate\":\"msg_detailed_info\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-2137147681,\"predicate\":\"msg_new_detailed_info\",\"params\":[{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-161422892,\"predicate\":\"destroy_auth_key_ok\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":178201177,\"predicate\":\"destroy_auth_key_none\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":-368010477,\"predicate\":\"destroy_auth_key_fail\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}],\"methods\":[{\"id\":-1099002127,\"method\":\"req_pq_multi\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"}],\"type\":\"ResPQ\"},{\"id\":-686627650,\"method\":\"req_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"public_key_fingerprint\",\"type\":\"long\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-184262881,\"method\":\"set_client_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1491380032,\"method\":\"rpc_drop_answer\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"}],\"type\":\"RpcDropAnswer\"},{\"id\":-1188971260,\"method\":\"get_future_salts\",\"params\":[{\"name\":\"num\",\"type\":\"int\"}],\"type\":\"FutureSalts\"},{\"id\":2059302892,\"method\":\"ping\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-213746804,\"method\":\"ping_delay_disconnect\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"},{\"name\":\"disconnect_delay\",\"type\":\"int\"}],\"type\":\"Pong\"},{\"id\":-414113498,\"method\":\"destroy_session\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1835453025,\"method\":\"http_wait\",\"params\":[{\"name\":\"max_delay\",\"type\":\"int\"},{\"name\":\"wait_after\",\"type\":\"int\"},{\"name\":\"max_wait\",\"type\":\"int\"}],\"type\":\"HttpWait\"},{\"id\":-784117408,\"method\":\"destroy_auth_key\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}]},\"API\":{\"constructors\":[{\"id\":-1132882121,\"predicate\":\"boolFalse\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1720552011,\"predicate\":\"boolTrue\",\"params\":[],\"type\":\"Bool\"},{\"id\":1072550713,\"predicate\":\"true\",\"params\":[],\"type\":\"True\"},{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":-994444869,\"predicate\":\"error\",\"params\":[{\"name\":\"code\",\"type\":\"int\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"Error\"},{\"id\":1450380236,\"predicate\":\"null\",\"params\":[],\"type\":\"Null\"},{\"id\":2134579434,\"predicate\":\"inputPeerEmpty\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":2107670217,\"predicate\":\"inputPeerSelf\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":900291769,\"predicate\":\"inputPeerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1182234929,\"predicate\":\"inputUserEmpty\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-138301121,\"predicate\":\"inputUserSelf\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-208488460,\"predicate\":\"inputPhoneContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"InputContact\"},{\"id\":-181407105,\"predicate\":\"inputFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"md5_checksum\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":-1771768449,\"predicate\":\"inputMediaEmpty\",\"params\":[],\"type\":\"InputMedia\"},{\"id\":505969924,\"predicate\":\"inputMediaUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector<InputDocument>\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":-1279654347,\"predicate\":\"inputMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"InputPhoto\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-104578748,\"predicate\":\"inputMediaGeoPoint\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"}],\"type\":\"InputMedia\"},{\"id\":-122978821,\"predicate\":\"inputMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":480546647,\"predicate\":\"inputChatPhotoEmpty\",\"params\":[],\"type\":\"InputChatPhoto\"},{\"id\":-968723890,\"predicate\":\"inputChatUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"InputChatPhoto\"},{\"id\":-1991004873,\"predicate\":\"inputChatPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputChatPhoto\"},{\"id\":-457104426,\"predicate\":\"inputGeoPointEmpty\",\"params\":[],\"type\":\"InputGeoPoint\"},{\"id\":1210199983,\"predicate\":\"inputGeoPoint\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"accuracy_radius\",\"type\":\"flags.0?int\"}],\"type\":\"InputGeoPoint\"},{\"id\":483901197,\"predicate\":\"inputPhotoEmpty\",\"params\":[],\"type\":\"InputPhoto\"},{\"id\":1001634122,\"predicate\":\"inputPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputPhoto\"},{\"id\":-539317279,\"predicate\":\"inputFileLocation\",\"params\":[{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputFileLocation\"},{\"id\":1498486562,\"predicate\":\"peerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":918946202,\"predicate\":\"peerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":-1432995067,\"predicate\":\"storage.fileUnknown\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1086091090,\"predicate\":\"storage.filePartial\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":8322574,\"predicate\":\"storage.fileJpeg\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-891180321,\"predicate\":\"storage.fileGif\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":172975040,\"predicate\":\"storage.filePng\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-1373745011,\"predicate\":\"storage.filePdf\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1384777335,\"predicate\":\"storage.fileMp3\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1258941372,\"predicate\":\"storage.fileMov\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-1278304028,\"predicate\":\"storage.fileMp4\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":276907596,\"predicate\":\"storage.fileWebp\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-742634630,\"predicate\":\"userEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"User\"},{\"id\":1326562017,\"predicate\":\"userProfilePhotoEmpty\",\"params\":[],\"type\":\"UserProfilePhoto\"},{\"id\":-2100168954,\"predicate\":\"userProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_video\",\"type\":\"flags.0?true\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"stripped_thumb\",\"type\":\"flags.1?bytes\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"UserProfilePhoto\"},{\"id\":164646985,\"predicate\":\"userStatusEmpty\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":-306628279,\"predicate\":\"userStatusOnline\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":9203775,\"predicate\":\"userStatusOffline\",\"params\":[{\"name\":\"was_online\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":693512293,\"predicate\":\"chatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Chat\"},{\"id\":1103884886,\"predicate\":\"chat\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"deactivated\",\"type\":\"flags.5?true\"},{\"name\":\"call_active\",\"type\":\"flags.23?true\"},{\"name\":\"call_not_empty\",\"type\":\"flags.24?true\"},{\"name\":\"noforwards\",\"type\":\"flags.25?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"migrated_to\",\"type\":\"flags.6?InputChannel\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"}],\"type\":\"Chat\"},{\"id\":1704108455,\"predicate\":\"chatForbidden\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Chat\"},{\"id\":-908914376,\"predicate\":\"chatFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_set_username\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants\",\"type\":\"ChatParticipants\"},{\"name\":\"chat_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"flags.13?ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"flags.3?Vector<BotInfo>\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"call\",\"type\":\"flags.12?InputGroupCall\"},{\"name\":\"ttl_period\",\"type\":\"flags.14?int\"},{\"name\":\"groupcall_default_join_as\",\"type\":\"flags.15?Peer\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.16?string\"},{\"name\":\"requests_pending\",\"type\":\"flags.17?int\"},{\"name\":\"recent_requesters\",\"type\":\"flags.17?Vector<long>\"},{\"name\":\"available_reactions\",\"type\":\"flags.18?ChatReactions\"}],\"type\":\"ChatFull\"},{\"id\":-1070776313,\"predicate\":\"chatParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":-2023500831,\"predicate\":\"chatParticipantsForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"self_participant\",\"type\":\"flags.0?ChatParticipant\"}],\"type\":\"ChatParticipants\"},{\"id\":1018991608,\"predicate\":\"chatParticipants\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"participants\",\"type\":\"Vector<ChatParticipant>\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"ChatParticipants\"},{\"id\":935395612,\"predicate\":\"chatPhotoEmpty\",\"params\":[],\"type\":\"ChatPhoto\"},{\"id\":476978193,\"predicate\":\"chatPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_video\",\"type\":\"flags.0?true\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"stripped_thumb\",\"type\":\"flags.1?bytes\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"ChatPhoto\"},{\"id\":-1868117372,\"predicate\":\"messageEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"peer_id\",\"type\":\"flags.0?Peer\"}],\"type\":\"Message\"},{\"id\":940666592,\"predicate\":\"message\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"from_scheduled\",\"type\":\"flags.18?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"edit_hide\",\"type\":\"flags.21?true\"},{\"name\":\"pinned\",\"type\":\"flags.24?true\"},{\"name\":\"noforwards\",\"type\":\"flags.26?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?Peer\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.6?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector<MessageEntity>\"},{\"name\":\"views\",\"type\":\"flags.10?int\"},{\"name\":\"forwards\",\"type\":\"flags.10?int\"},{\"name\":\"replies\",\"type\":\"flags.23?MessageReplies\"},{\"name\":\"edit_date\",\"type\":\"flags.15?int\"},{\"name\":\"post_author\",\"type\":\"flags.16?string\"},{\"name\":\"grouped_id\",\"type\":\"flags.17?long\"},{\"name\":\"reactions\",\"type\":\"flags.20?MessageReactions\"},{\"name\":\"restriction_reason\",\"type\":\"flags.22?Vector<RestrictionReason>\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Message\"},{\"id\":721967202,\"predicate\":\"messageService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?Peer\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"action\",\"type\":\"MessageAction\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Message\"},{\"id\":1038967584,\"predicate\":\"messageMediaEmpty\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":1766936791,\"predicate\":\"messageMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":1457575028,\"predicate\":\"messageMediaGeo\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"}],\"type\":\"MessageMedia\"},{\"id\":1882335561,\"predicate\":\"messageMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageMedia\"},{\"id\":-1618676578,\"predicate\":\"messageMediaUnsupported\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":-1230047312,\"predicate\":\"messageActionEmpty\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1119368275,\"predicate\":\"messageActionChatCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector<long>\"}],\"type\":\"MessageAction\"},{\"id\":-1247687078,\"predicate\":\"messageActionChatEditTitle\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":2144015272,\"predicate\":\"messageActionChatEditPhoto\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"}],\"type\":\"MessageAction\"},{\"id\":-1780220945,\"predicate\":\"messageActionChatDeletePhoto\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":365886720,\"predicate\":\"messageActionChatAddUser\",\"params\":[{\"name\":\"users\",\"type\":\"Vector<long>\"}],\"type\":\"MessageAction\"},{\"id\":-1539362612,\"predicate\":\"messageActionChatDeleteUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-1460809483,\"predicate\":\"dialog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"unread_mark\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"unread_mentions_count\",\"type\":\"int\"},{\"name\":\"unread_reactions_count\",\"type\":\"int\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"},{\"name\":\"draft\",\"type\":\"flags.1?DraftMessage\"},{\"name\":\"folder_id\",\"type\":\"flags.4?int\"}],\"type\":\"Dialog\"},{\"id\":590459437,\"predicate\":\"photoEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Photo\"},{\"id\":-82216347,\"predicate\":\"photo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_stickers\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector<PhotoSize>\"},{\"name\":\"video_sizes\",\"type\":\"flags.1?Vector<VideoSize>\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"Photo\"},{\"id\":236446268,\"predicate\":\"photoSizeEmpty\",\"params\":[{\"name\":\"type\",\"type\":\"string\"}],\"type\":\"PhotoSize\"},{\"id\":1976012384,\"predicate\":\"photoSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"}],\"type\":\"PhotoSize\"},{\"id\":35527382,\"predicate\":\"photoCachedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":286776671,\"predicate\":\"geoPointEmpty\",\"params\":[],\"type\":\"GeoPoint\"},{\"id\":-1297942941,\"predicate\":\"geoPoint\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"accuracy_radius\",\"type\":\"flags.0?int\"}],\"type\":\"GeoPoint\"},{\"id\":1577067778,\"predicate\":\"auth.sentCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"auth.SentCodeType\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"next_type\",\"type\":\"flags.1?auth.CodeType\"},{\"name\":\"timeout\",\"type\":\"flags.2?int\"}],\"type\":\"auth.SentCode\"},{\"id\":872119224,\"predicate\":\"auth.authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"setup_password_required\",\"type\":\"flags.1?true\"},{\"name\":\"otherwise_relogin_days\",\"type\":\"flags.1?int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"auth.Authorization\"},{\"id\":-1271602504,\"predicate\":\"auth.exportedAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":-1195615476,\"predicate\":\"inputNotifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputNotifyPeer\"},{\"id\":423314455,\"predicate\":\"inputNotifyUsers\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":1251338318,\"predicate\":\"inputNotifyChats\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-551616469,\"predicate\":\"inputPeerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"sound\",\"type\":\"flags.3?NotificationSound\"}],\"type\":\"InputPeerNotifySettings\"},{\"id\":-1472527322,\"predicate\":\"peerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"ios_sound\",\"type\":\"flags.3?NotificationSound\"},{\"name\":\"android_sound\",\"type\":\"flags.4?NotificationSound\"},{\"name\":\"other_sound\",\"type\":\"flags.5?NotificationSound\"}],\"type\":\"PeerNotifySettings\"},{\"id\":-1525149427,\"predicate\":\"peerSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"report_spam\",\"type\":\"flags.0?true\"},{\"name\":\"add_contact\",\"type\":\"flags.1?true\"},{\"name\":\"block_contact\",\"type\":\"flags.2?true\"},{\"name\":\"share_contact\",\"type\":\"flags.3?true\"},{\"name\":\"need_contacts_exception\",\"type\":\"flags.4?true\"},{\"name\":\"report_geo\",\"type\":\"flags.5?true\"},{\"name\":\"autoarchived\",\"type\":\"flags.7?true\"},{\"name\":\"invite_members\",\"type\":\"flags.8?true\"},{\"name\":\"request_chat_broadcast\",\"type\":\"flags.10?true\"},{\"name\":\"geo_distance\",\"type\":\"flags.6?int\"},{\"name\":\"request_chat_title\",\"type\":\"flags.9?string\"},{\"name\":\"request_chat_date\",\"type\":\"flags.9?int\"}],\"type\":\"PeerSettings\"},{\"id\":-1539849235,\"predicate\":\"wallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"pattern\",\"type\":\"flags.3?true\"},{\"name\":\"dark\",\"type\":\"flags.4?true\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"Document\"},{\"name\":\"settings\",\"type\":\"flags.2?WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":1490799288,\"predicate\":\"inputReportReasonSpam\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":505595789,\"predicate\":\"inputReportReasonViolence\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":777640226,\"predicate\":\"inputReportReasonPornography\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1376497949,\"predicate\":\"inputReportReasonChildAbuse\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1041980751,\"predicate\":\"inputReportReasonOther\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-994968513,\"predicate\":\"userFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blocked\",\"type\":\"flags.0?true\"},{\"name\":\"phone_calls_available\",\"type\":\"flags.4?true\"},{\"name\":\"phone_calls_private\",\"type\":\"flags.5?true\"},{\"name\":\"can_pin_message\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.12?true\"},{\"name\":\"video_calls_available\",\"type\":\"flags.13?true\"},{\"name\":\"voice_messages_forbidden\",\"type\":\"flags.20?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"flags.1?string\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"profile_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"bot_info\",\"type\":\"flags.3?BotInfo\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"common_chats_count\",\"type\":\"int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"ttl_period\",\"type\":\"flags.14?int\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.15?string\"},{\"name\":\"private_forward_name\",\"type\":\"flags.16?string\"},{\"name\":\"bot_group_admin_rights\",\"type\":\"flags.17?ChatAdminRights\"},{\"name\":\"bot_broadcast_admin_rights\",\"type\":\"flags.18?ChatAdminRights\"},{\"name\":\"premium_gifts\",\"type\":\"flags.19?Vector<PremiumGiftOption>\"}],\"type\":\"UserFull\"},{\"id\":341499403,\"predicate\":\"contact\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"mutual\",\"type\":\"Bool\"}],\"type\":\"Contact\"},{\"id\":-1052885936,\"predicate\":\"importedContact\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"client_id\",\"type\":\"long\"}],\"type\":\"ImportedContact\"},{\"id\":383348795,\"predicate\":\"contactStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"ContactStatus\"},{\"id\":-1219778094,\"predicate\":\"contacts.contactsNotModified\",\"params\":[],\"type\":\"contacts.Contacts\"},{\"id\":-353862078,\"predicate\":\"contacts.contacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector<Contact>\"},{\"name\":\"saved_count\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.Contacts\"},{\"id\":2010127419,\"predicate\":\"contacts.importedContacts\",\"params\":[{\"name\":\"imported\",\"type\":\"Vector<ImportedContact>\"},{\"name\":\"popular_invites\",\"type\":\"Vector<PopularContact>\"},{\"name\":\"retry_contacts\",\"type\":\"Vector<long>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":182326673,\"predicate\":\"contacts.blocked\",\"params\":[{\"name\":\"blocked\",\"type\":\"Vector<PeerBlocked>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.Blocked\"},{\"id\":-513392236,\"predicate\":\"contacts.blockedSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"blocked\",\"type\":\"Vector<PeerBlocked>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.Blocked\"},{\"id\":364538944,\"predicate\":\"messages.dialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector<Dialog>\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.Dialogs\"},{\"id\":1910543603,\"predicate\":\"messages.dialogsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"dialogs\",\"type\":\"Vector<Dialog>\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.Dialogs\"},{\"id\":-1938715001,\"predicate\":\"messages.messages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.Messages\"},{\"id\":978610270,\"predicate\":\"messages.messagesSlice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"next_rate\",\"type\":\"flags.0?int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.2?int\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.Messages\"},{\"id\":1694474197,\"predicate\":\"messages.chats\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector<Chat>\"}],\"type\":\"messages.Chats\"},{\"id\":-438840932,\"predicate\":\"messages.chatFull\",\"params\":[{\"name\":\"full_chat\",\"type\":\"ChatFull\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.ChatFull\"},{\"id\":-1269012015,\"predicate\":\"messages.affectedHistory\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1474492012,\"predicate\":\"inputMessagesFilterEmpty\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1777752804,\"predicate\":\"inputMessagesFilterPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1614803355,\"predicate\":\"inputMessagesFilterVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":1458172132,\"predicate\":\"inputMessagesFilterPhotoVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1629621880,\"predicate\":\"inputMessagesFilterDocument\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":2129714567,\"predicate\":\"inputMessagesFilterUrl\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-3644025,\"predicate\":\"inputMessagesFilterGif\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":522914557,\"predicate\":\"updateNewMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1318109142,\"predicate\":\"updateMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-1576161051,\"predicate\":\"updateDeleteMessages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector<int>\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1071741569,\"predicate\":\"updateUserTyping\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":-2092401936,\"predicate\":\"updateChatUserTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":125178264,\"predicate\":\"updateChatParticipants\",\"params\":[{\"name\":\"participants\",\"type\":\"ChatParticipants\"}],\"type\":\"Update\"},{\"id\":-440534818,\"predicate\":\"updateUserStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"Update\"},{\"id\":-1007549728,\"predicate\":\"updateUserName\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":-232290676,\"predicate\":\"updateUserPhoto\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"photo\",\"type\":\"UserProfilePhoto\"},{\"name\":\"previous\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":-1519637954,\"predicate\":\"updates.state\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"}],\"type\":\"updates.State\"},{\"id\":1567990072,\"predicate\":\"updates.differenceEmpty\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":16030880,\"predicate\":\"updates.difference\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector<Message>\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector<EncryptedMessage>\"},{\"name\":\"other_updates\",\"type\":\"Vector<Update>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":-1459938943,\"predicate\":\"updates.differenceSlice\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector<Message>\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector<EncryptedMessage>\"},{\"name\":\"other_updates\",\"type\":\"Vector<Update>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"intermediate_state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":-484987010,\"predicate\":\"updatesTooLong\",\"params\":[],\"type\":\"Updates\"},{\"id\":826001400,\"predicate\":\"updateShortMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector<MessageEntity>\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":1299050149,\"predicate\":\"updateShortChatMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector<MessageEntity>\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":2027216577,\"predicate\":\"updateShort\",\"params\":[{\"name\":\"update\",\"type\":\"Update\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1918567619,\"predicate\":\"updatesCombined\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector<Update>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq_start\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1957577280,\"predicate\":\"updates\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector<Update>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1916114267,\"predicate\":\"photos.photos\",\"params\":[{\"name\":\"photos\",\"type\":\"Vector<Photo>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"photos.Photos\"},{\"id\":352657236,\"predicate\":\"photos.photosSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"photos\",\"type\":\"Vector<Photo>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"photos.Photos\"},{\"id\":539045032,\"predicate\":\"photos.photo\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"photos.Photo\"},{\"id\":157948117,\"predicate\":\"upload.file\",\"params\":[{\"name\":\"type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.File\"},{\"id\":414687501,\"predicate\":\"dcOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"ipv6\",\"type\":\"flags.0?true\"},{\"name\":\"media_only\",\"type\":\"flags.1?true\"},{\"name\":\"tcpo_only\",\"type\":\"flags.2?true\"},{\"name\":\"cdn\",\"type\":\"flags.3?true\"},{\"name\":\"static\",\"type\":\"flags.4?true\"},{\"name\":\"this_port_only\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"ip_address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"flags.10?bytes\"}],\"type\":\"DcOption\"},{\"id\":589653676,\"predicate\":\"config\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phonecalls_enabled\",\"type\":\"flags.1?true\"},{\"name\":\"default_p2p_contacts\",\"type\":\"flags.3?true\"},{\"name\":\"preload_featured_stickers\",\"type\":\"flags.4?true\"},{\"name\":\"ignore_phone_entities\",\"type\":\"flags.5?true\"},{\"name\":\"revoke_pm_inbox\",\"type\":\"flags.6?true\"},{\"name\":\"blocked_mode\",\"type\":\"flags.8?true\"},{\"name\":\"pfs_enabled\",\"type\":\"flags.13?true\"},{\"name\":\"force_try_ipv6\",\"type\":\"flags.14?true\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"test_mode\",\"type\":\"Bool\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"dc_options\",\"type\":\"Vector<DcOption>\"},{\"name\":\"dc_txt_domain_name\",\"type\":\"string\"},{\"name\":\"chat_size_max\",\"type\":\"int\"},{\"name\":\"megagroup_size_max\",\"type\":\"int\"},{\"name\":\"forwarded_count_max\",\"type\":\"int\"},{\"name\":\"online_update_period_ms\",\"type\":\"int\"},{\"name\":\"offline_blur_timeout_ms\",\"type\":\"int\"},{\"name\":\"offline_idle_timeout_ms\",\"type\":\"int\"},{\"name\":\"online_cloud_timeout_ms\",\"type\":\"int\"},{\"name\":\"notify_cloud_delay_ms\",\"type\":\"int\"},{\"name\":\"notify_default_delay_ms\",\"type\":\"int\"},{\"name\":\"push_chat_period_ms\",\"type\":\"int\"},{\"name\":\"push_chat_limit\",\"type\":\"int\"},{\"name\":\"saved_gifs_limit\",\"type\":\"int\"},{\"name\":\"edit_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_pm_time_limit\",\"type\":\"int\"},{\"name\":\"rating_e_decay\",\"type\":\"int\"},{\"name\":\"stickers_recent_limit\",\"type\":\"int\"},{\"name\":\"stickers_faved_limit\",\"type\":\"int\"},{\"name\":\"channels_read_media_period\",\"type\":\"int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"pinned_dialogs_count_max\",\"type\":\"int\"},{\"name\":\"pinned_infolder_count_max\",\"type\":\"int\"},{\"name\":\"call_receive_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_ring_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_connect_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_packet_timeout_ms\",\"type\":\"int\"},{\"name\":\"me_url_prefix\",\"type\":\"string\"},{\"name\":\"autoupdate_url_prefix\",\"type\":\"flags.7?string\"},{\"name\":\"gif_search_username\",\"type\":\"flags.9?string\"},{\"name\":\"venue_search_username\",\"type\":\"flags.10?string\"},{\"name\":\"img_search_username\",\"type\":\"flags.11?string\"},{\"name\":\"static_maps_provider\",\"type\":\"flags.12?string\"},{\"name\":\"caption_length_max\",\"type\":\"int\"},{\"name\":\"message_length_max\",\"type\":\"int\"},{\"name\":\"webfile_dc_id\",\"type\":\"int\"},{\"name\":\"suggested_lang_code\",\"type\":\"flags.2?string\"},{\"name\":\"lang_pack_version\",\"type\":\"flags.2?int\"},{\"name\":\"base_lang_pack_version\",\"type\":\"flags.2?int\"},{\"name\":\"reactions_default\",\"type\":\"flags.15?Reaction\"}],\"type\":\"Config\"},{\"id\":-1910892683,\"predicate\":\"nearestDc\",\"params\":[{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"nearest_dc\",\"type\":\"int\"}],\"type\":\"NearestDc\"},{\"id\":-860107216,\"predicate\":\"help.appUpdate\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_not_skip\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector<MessageEntity>\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"sticker\",\"type\":\"flags.3?Document\"}],\"type\":\"help.AppUpdate\"},{\"id\":-1000708810,\"predicate\":\"help.noAppUpdate\",\"params\":[],\"type\":\"help.AppUpdate\"},{\"id\":415997816,\"predicate\":\"help.inviteText\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"help.InviteText\"},{\"id\":314359194,\"predicate\":\"updateNewEncryptedMessage\",\"params\":[{\"name\":\"message\",\"type\":\"EncryptedMessage\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":386986326,\"predicate\":\"updateEncryptedChatTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1264392051,\"predicate\":\"updateEncryption\",\"params\":[{\"name\":\"chat\",\"type\":\"EncryptedChat\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":956179895,\"predicate\":\"updateEncryptedMessagesRead\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1417756512,\"predicate\":\"encryptedChatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":1722964307,\"predicate\":\"encryptedChatWaiting\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":1223809356,\"predicate\":\"encryptedChatRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":1643173063,\"predicate\":\"encryptedChat\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":505183301,\"predicate\":\"encryptedChatDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"history_deleted\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":-247351839,\"predicate\":\"inputEncryptedChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedChat\"},{\"id\":-1038136962,\"predicate\":\"encryptedFileEmpty\",\"params\":[],\"type\":\"EncryptedFile\"},{\"id\":-1476358952,\"predicate\":\"encryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"long\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"EncryptedFile\"},{\"id\":406307684,\"predicate\":\"inputEncryptedFileEmpty\",\"params\":[],\"type\":\"InputEncryptedFile\"},{\"id\":1690108678,\"predicate\":\"inputEncryptedFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":1511503333,\"predicate\":\"inputEncryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedFile\"},{\"id\":-182231723,\"predicate\":\"inputEncryptedFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":-317144808,\"predicate\":\"encryptedMessage\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"EncryptedMessage\"},{\"id\":594758406,\"predicate\":\"encryptedMessageService\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"EncryptedMessage\"},{\"id\":-1058912715,\"predicate\":\"messages.dhConfigNotModified\",\"params\":[{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":740433629,\"predicate\":\"messages.dhConfig\",\"params\":[{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":1443858741,\"predicate\":\"messages.sentEncryptedMessage\",\"params\":[{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":-1802240206,\"predicate\":\"messages.sentEncryptedFile\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":-95482955,\"predicate\":\"inputFileBig\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":767652808,\"predicate\":\"inputEncryptedFileBigUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":1037718609,\"predicate\":\"updateChatParticipantAdd\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-483443337,\"predicate\":\"updateChatParticipantDelete\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1906403213,\"predicate\":\"updateDcOptions\",\"params\":[{\"name\":\"dc_options\",\"type\":\"Vector<DcOption>\"}],\"type\":\"Update\"},{\"id\":1530447553,\"predicate\":\"inputMediaUploadedDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"nosound_video\",\"type\":\"flags.3?true\"},{\"name\":\"force_file\",\"type\":\"flags.4?true\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.2?InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector<DocumentAttribute>\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector<InputDocument>\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":860303448,\"predicate\":\"inputMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"},{\"name\":\"query\",\"type\":\"flags.1?string\"}],\"type\":\"InputMedia\"},{\"id\":-1666158377,\"predicate\":\"messageMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"nopremium\",\"type\":\"flags.3?true\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":1928391342,\"predicate\":\"inputDocumentEmpty\",\"params\":[],\"type\":\"InputDocument\"},{\"id\":448771445,\"predicate\":\"inputDocument\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputDocument\"},{\"id\":-1160743548,\"predicate\":\"inputDocumentFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":922273905,\"predicate\":\"documentEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Document\"},{\"id\":-1881881384,\"predicate\":\"document\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"long\"},{\"name\":\"thumbs\",\"type\":\"flags.0?Vector<PhotoSize>\"},{\"name\":\"video_thumbs\",\"type\":\"flags.1?Vector<VideoSize>\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"attributes\",\"type\":\"Vector<DocumentAttribute>\"}],\"type\":\"Document\"},{\"id\":398898678,\"predicate\":\"help.support\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"help.Support\"},{\"id\":-1613493288,\"predicate\":\"notifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"NotifyPeer\"},{\"id\":-1261946036,\"predicate\":\"notifyUsers\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-1073230141,\"predicate\":\"notifyChats\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-1094555409,\"predicate\":\"updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"NotifyPeer\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"}],\"type\":\"Update\"},{\"id\":381645902,\"predicate\":\"sendMessageTypingAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-44119819,\"predicate\":\"sendMessageCancelAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-1584933265,\"predicate\":\"sendMessageRecordVideoAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-378127636,\"predicate\":\"sendMessageUploadVideoAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-718310409,\"predicate\":\"sendMessageRecordAudioAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-212740181,\"predicate\":\"sendMessageUploadAudioAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-774682074,\"predicate\":\"sendMessageUploadPhotoAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-1441998364,\"predicate\":\"sendMessageUploadDocumentAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":393186209,\"predicate\":\"sendMessageGeoLocationAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":1653390447,\"predicate\":\"sendMessageChooseContactAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-1290580579,\"predicate\":\"contacts.found\",\"params\":[{\"name\":\"my_results\",\"type\":\"Vector<Peer>\"},{\"name\":\"results\",\"type\":\"Vector<Peer>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.Found\"},{\"id\":-337352679,\"predicate\":\"updateServiceNotification\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"inbox_date\",\"type\":\"flags.1?int\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"MessageMedia\"},{\"name\":\"entities\",\"type\":\"Vector<MessageEntity>\"}],\"type\":\"Update\"},{\"id\":-496024847,\"predicate\":\"userStatusRecently\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":129960444,\"predicate\":\"userStatusLastWeek\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":2011940674,\"predicate\":\"userStatusLastMonth\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":-298113238,\"predicate\":\"updatePrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"PrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector<PrivacyRule>\"}],\"type\":\"Update\"},{\"id\":1335282456,\"predicate\":\"inputPrivacyKeyStatusTimestamp\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1137792208,\"predicate\":\"privacyKeyStatusTimestamp\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":218751099,\"predicate\":\"inputPrivacyValueAllowContacts\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":407582158,\"predicate\":\"inputPrivacyValueAllowAll\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":320652927,\"predicate\":\"inputPrivacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector<InputUser>\"}],\"type\":\"InputPrivacyRule\"},{\"id\":195371015,\"predicate\":\"inputPrivacyValueDisallowContacts\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":-697604407,\"predicate\":\"inputPrivacyValueDisallowAll\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":-1877932953,\"predicate\":\"inputPrivacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector<InputUser>\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-123988,\"predicate\":\"privacyValueAllowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":1698855810,\"predicate\":\"privacyValueAllowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-1198497870,\"predicate\":\"privacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector<long>\"}],\"type\":\"PrivacyRule\"},{\"id\":-125240806,\"predicate\":\"privacyValueDisallowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-1955338397,\"predicate\":\"privacyValueDisallowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-463335103,\"predicate\":\"privacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector<long>\"}],\"type\":\"PrivacyRule\"},{\"id\":1352683077,\"predicate\":\"account.privacyRules\",\"params\":[{\"name\":\"rules\",\"type\":\"Vector<PrivacyRule>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-1194283041,\"predicate\":\"accountDaysTTL\",\"params\":[{\"name\":\"days\",\"type\":\"int\"}],\"type\":\"AccountDaysTTL\"},{\"id\":88680979,\"predicate\":\"updateUserPhone\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":1815593308,\"predicate\":\"documentAttributeImageSize\",\"params\":[{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":297109817,\"predicate\":\"documentAttributeAnimated\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":1662637586,\"predicate\":\"documentAttributeSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"mask\",\"type\":\"flags.1?true\"},{\"name\":\"alt\",\"type\":\"string\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"DocumentAttribute\"},{\"id\":250621158,\"predicate\":\"documentAttributeVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"round_message\",\"type\":\"flags.0?true\"},{\"name\":\"supports_streaming\",\"type\":\"flags.1?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":-1739392570,\"predicate\":\"documentAttributeAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"voice\",\"type\":\"flags.10?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"performer\",\"type\":\"flags.1?string\"},{\"name\":\"waveform\",\"type\":\"flags.2?bytes\"}],\"type\":\"DocumentAttribute\"},{\"id\":358154344,\"predicate\":\"documentAttributeFilename\",\"params\":[{\"name\":\"file_name\",\"type\":\"string\"}],\"type\":\"DocumentAttribute\"},{\"id\":-244016606,\"predicate\":\"messages.stickersNotModified\",\"params\":[],\"type\":\"messages.Stickers\"},{\"id\":816245886,\"predicate\":\"messages.stickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"stickers\",\"type\":\"Vector<Document>\"}],\"type\":\"messages.Stickers\"},{\"id\":313694676,\"predicate\":\"stickerPack\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"documents\",\"type\":\"Vector<long>\"}],\"type\":\"StickerPack\"},{\"id\":-395967805,\"predicate\":\"messages.allStickersNotModified\",\"params\":[],\"type\":\"messages.AllStickers\"},{\"id\":-843329861,\"predicate\":\"messages.allStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"sets\",\"type\":\"Vector<StickerSet>\"}],\"type\":\"messages.AllStickers\"},{\"id\":-1667805217,\"predicate\":\"updateReadHistoryInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":791617983,\"predicate\":\"updateReadHistoryOutbox\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-2066640507,\"predicate\":\"messages.affectedMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":2139689491,\"predicate\":\"updateWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-350980120,\"predicate\":\"webPageEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"WebPage\"},{\"id\":-981018084,\"predicate\":\"webPagePending\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":-392411726,\"predicate\":\"webPage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"display_url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"type\",\"type\":\"flags.0?string\"},{\"name\":\"site_name\",\"type\":\"flags.1?string\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"photo\",\"type\":\"flags.4?Photo\"},{\"name\":\"embed_url\",\"type\":\"flags.5?string\"},{\"name\":\"embed_type\",\"type\":\"flags.5?string\"},{\"name\":\"embed_width\",\"type\":\"flags.6?int\"},{\"name\":\"embed_height\",\"type\":\"flags.6?int\"},{\"name\":\"duration\",\"type\":\"flags.7?int\"},{\"name\":\"author\",\"type\":\"flags.8?string\"},{\"name\":\"document\",\"type\":\"flags.9?Document\"},{\"name\":\"cached_page\",\"type\":\"flags.10?Page\"},{\"name\":\"attributes\",\"type\":\"flags.12?Vector<WebPageAttribute>\"}],\"type\":\"WebPage\"},{\"id\":-1557277184,\"predicate\":\"messageMediaWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"}],\"type\":\"MessageMedia\"},{\"id\":-1392388579,\"predicate\":\"authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"current\",\"type\":\"flags.0?true\"},{\"name\":\"official_app\",\"type\":\"flags.1?true\"},{\"name\":\"password_pending\",\"type\":\"flags.2?true\"},{\"name\":\"encrypted_requests_disabled\",\"type\":\"flags.3?true\"},{\"name\":\"call_requests_disabled\",\"type\":\"flags.4?true\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"app_name\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"Authorization\"},{\"id\":1275039392,\"predicate\":\"account.authorizations\",\"params\":[{\"name\":\"authorization_ttl_days\",\"type\":\"int\"},{\"name\":\"authorizations\",\"type\":\"Vector<Authorization>\"}],\"type\":\"account.Authorizations\"},{\"id\":-1787080453,\"predicate\":\"account.password\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_recovery\",\"type\":\"flags.0?true\"},{\"name\":\"has_secure_values\",\"type\":\"flags.1?true\"},{\"name\":\"has_password\",\"type\":\"flags.2?true\"},{\"name\":\"current_algo\",\"type\":\"flags.2?PasswordKdfAlgo\"},{\"name\":\"srp_B\",\"type\":\"flags.2?bytes\"},{\"name\":\"srp_id\",\"type\":\"flags.2?long\"},{\"name\":\"hint\",\"type\":\"flags.3?string\"},{\"name\":\"email_unconfirmed_pattern\",\"type\":\"flags.4?string\"},{\"name\":\"new_algo\",\"type\":\"PasswordKdfAlgo\"},{\"name\":\"new_secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_random\",\"type\":\"bytes\"},{\"name\":\"pending_reset_date\",\"type\":\"flags.5?int\"},{\"name\":\"login_email_pattern\",\"type\":\"flags.6?string\"}],\"type\":\"account.Password\"},{\"id\":-1705233435,\"predicate\":\"account.passwordSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"email\",\"type\":\"flags.0?string\"},{\"name\":\"secure_settings\",\"type\":\"flags.1?SecureSecretSettings\"}],\"type\":\"account.PasswordSettings\"},{\"id\":-1036572727,\"predicate\":\"account.passwordInputSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"new_algo\",\"type\":\"flags.0?PasswordKdfAlgo\"},{\"name\":\"new_password_hash\",\"type\":\"flags.0?bytes\"},{\"name\":\"hint\",\"type\":\"flags.0?string\"},{\"name\":\"email\",\"type\":\"flags.1?string\"},{\"name\":\"new_secure_settings\",\"type\":\"flags.2?SecureSecretSettings\"}],\"type\":\"account.PasswordInputSettings\"},{\"id\":326715557,\"predicate\":\"auth.passwordRecovery\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"}],\"type\":\"auth.PasswordRecovery\"},{\"id\":-1052959727,\"predicate\":\"inputMediaVenue\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":784356159,\"predicate\":\"messageMediaVenue\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-1551583367,\"predicate\":\"receivedNotifyMessage\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"flags\",\"type\":\"int\"}],\"type\":\"ReceivedNotifyMessage\"},{\"id\":179611673,\"predicate\":\"chatInviteExported\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.0?true\"},{\"name\":\"permanent\",\"type\":\"flags.5?true\"},{\"name\":\"request_needed\",\"type\":\"flags.6?true\"},{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"start_date\",\"type\":\"flags.4?int\"},{\"name\":\"expire_date\",\"type\":\"flags.1?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.2?int\"},{\"name\":\"usage\",\"type\":\"flags.3?int\"},{\"name\":\"requested\",\"type\":\"flags.7?int\"},{\"name\":\"title\",\"type\":\"flags.8?string\"}],\"type\":\"ExportedChatInvite\"},{\"id\":1516793212,\"predicate\":\"chatInviteAlready\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"}],\"type\":\"ChatInvite\"},{\"id\":806110401,\"predicate\":\"chatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"flags.0?true\"},{\"name\":\"broadcast\",\"type\":\"flags.1?true\"},{\"name\":\"public\",\"type\":\"flags.2?true\"},{\"name\":\"megagroup\",\"type\":\"flags.3?true\"},{\"name\":\"request_needed\",\"type\":\"flags.6?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"about\",\"type\":\"flags.5?string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"flags.4?Vector<User>\"}],\"type\":\"ChatInvite\"},{\"id\":51520707,\"predicate\":\"messageActionChatJoinedByLink\",\"params\":[{\"name\":\"inviter_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":1757493555,\"predicate\":\"updateReadMessagesContents\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector<int>\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-4838507,\"predicate\":\"inputStickerSetEmpty\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-1645763991,\"predicate\":\"inputStickerSetID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputStickerSet\"},{\"id\":-2044933984,\"predicate\":\"inputStickerSetShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":768691932,\"predicate\":\"stickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archived\",\"type\":\"flags.1?true\"},{\"name\":\"official\",\"type\":\"flags.2?true\"},{\"name\":\"masks\",\"type\":\"flags.3?true\"},{\"name\":\"animated\",\"type\":\"flags.5?true\"},{\"name\":\"videos\",\"type\":\"flags.6?true\"},{\"name\":\"emojis\",\"type\":\"flags.7?true\"},{\"name\":\"installed_date\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumbs\",\"type\":\"flags.4?Vector<PhotoSize>\"},{\"name\":\"thumb_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"thumb_version\",\"type\":\"flags.4?int\"},{\"name\":\"thumb_document_id\",\"type\":\"flags.8?long\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"StickerSet\"},{\"id\":1846886166,\"predicate\":\"messages.stickerSet\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector<StickerPack>\"},{\"name\":\"keywords\",\"type\":\"Vector<StickerKeyword>\"},{\"name\":\"documents\",\"type\":\"Vector<Document>\"}],\"type\":\"messages.StickerSet\"},{\"id\":1570352622,\"predicate\":\"user\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"self\",\"type\":\"flags.10?true\"},{\"name\":\"contact\",\"type\":\"flags.11?true\"},{\"name\":\"mutual_contact\",\"type\":\"flags.12?true\"},{\"name\":\"deleted\",\"type\":\"flags.13?true\"},{\"name\":\"bot\",\"type\":\"flags.14?true\"},{\"name\":\"bot_chat_history\",\"type\":\"flags.15?true\"},{\"name\":\"bot_nochats\",\"type\":\"flags.16?true\"},{\"name\":\"verified\",\"type\":\"flags.17?true\"},{\"name\":\"restricted\",\"type\":\"flags.18?true\"},{\"name\":\"min\",\"type\":\"flags.20?true\"},{\"name\":\"bot_inline_geo\",\"type\":\"flags.21?true\"},{\"name\":\"support\",\"type\":\"flags.23?true\"},{\"name\":\"scam\",\"type\":\"flags.24?true\"},{\"name\":\"apply_min_photo\",\"type\":\"flags.25?true\"},{\"name\":\"fake\",\"type\":\"flags.26?true\"},{\"name\":\"bot_attach_menu\",\"type\":\"flags.27?true\"},{\"name\":\"premium\",\"type\":\"flags.28?true\"},{\"name\":\"attach_menu_enabled\",\"type\":\"flags.29?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"flags.0?long\"},{\"name\":\"first_name\",\"type\":\"flags.1?string\"},{\"name\":\"last_name\",\"type\":\"flags.2?string\"},{\"name\":\"username\",\"type\":\"flags.3?string\"},{\"name\":\"phone\",\"type\":\"flags.4?string\"},{\"name\":\"photo\",\"type\":\"flags.5?UserProfilePhoto\"},{\"name\":\"status\",\"type\":\"flags.6?UserStatus\"},{\"name\":\"bot_info_version\",\"type\":\"flags.14?int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.18?Vector<RestrictionReason>\"},{\"name\":\"bot_inline_placeholder\",\"type\":\"flags.19?string\"},{\"name\":\"lang_code\",\"type\":\"flags.22?string\"},{\"name\":\"emoji_status\",\"type\":\"flags.30?EmojiStatus\"}],\"type\":\"User\"},{\"id\":-1032140601,\"predicate\":\"botCommand\",\"params\":[{\"name\":\"command\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"BotCommand\"},{\"id\":-1892676777,\"predicate\":\"botInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"flags.0?long\"},{\"name\":\"description\",\"type\":\"flags.1?string\"},{\"name\":\"description_photo\",\"type\":\"flags.4?Photo\"},{\"name\":\"description_document\",\"type\":\"flags.5?Document\"},{\"name\":\"commands\",\"type\":\"flags.2?Vector<BotCommand>\"},{\"name\":\"menu_button\",\"type\":\"flags.3?BotMenuButton\"}],\"type\":\"BotInfo\"},{\"id\":-1560655744,\"predicate\":\"keyboardButton\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":2002815875,\"predicate\":\"keyboardButtonRow\",\"params\":[{\"name\":\"buttons\",\"type\":\"Vector<KeyboardButton>\"}],\"type\":\"KeyboardButtonRow\"},{\"id\":-1606526075,\"predicate\":\"replyKeyboardHide\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"}],\"type\":\"ReplyMarkup\"},{\"id\":-2035021048,\"predicate\":\"replyKeyboardForceReply\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"},{\"name\":\"placeholder\",\"type\":\"flags.3?string\"}],\"type\":\"ReplyMarkup\"},{\"id\":-2049074735,\"predicate\":\"replyKeyboardMarkup\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"resize\",\"type\":\"flags.0?true\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"},{\"name\":\"rows\",\"type\":\"Vector<KeyboardButtonRow>\"},{\"name\":\"placeholder\",\"type\":\"flags.3?string\"}],\"type\":\"ReplyMarkup\"},{\"id\":-571955892,\"predicate\":\"inputPeerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-233744186,\"predicate\":\"inputUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":-1148011883,\"predicate\":\"messageEntityUnknown\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-100378723,\"predicate\":\"messageEntityMention\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1868782349,\"predicate\":\"messageEntityHashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1827637959,\"predicate\":\"messageEntityBotCommand\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1859134776,\"predicate\":\"messageEntityUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1692693954,\"predicate\":\"messageEntityEmail\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1117713463,\"predicate\":\"messageEntityBold\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-2106619040,\"predicate\":\"messageEntityItalic\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":681706865,\"predicate\":\"messageEntityCode\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1938967520,\"predicate\":\"messageEntityPre\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":1990644519,\"predicate\":\"messageEntityTextUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":-1877614335,\"predicate\":\"updateShortSentMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector<MessageEntity>\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":-292807034,\"predicate\":\"inputChannelEmpty\",\"params\":[],\"type\":\"InputChannel\"},{\"id\":-212145112,\"predicate\":\"inputChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":-1566230754,\"predicate\":\"peerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":666680316,\"predicate\":\"inputPeerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-2107528095,\"predicate\":\"channel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"verified\",\"type\":\"flags.7?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"restricted\",\"type\":\"flags.9?true\"},{\"name\":\"signatures\",\"type\":\"flags.11?true\"},{\"name\":\"min\",\"type\":\"flags.12?true\"},{\"name\":\"scam\",\"type\":\"flags.19?true\"},{\"name\":\"has_link\",\"type\":\"flags.20?true\"},{\"name\":\"has_geo\",\"type\":\"flags.21?true\"},{\"name\":\"slowmode_enabled\",\"type\":\"flags.22?true\"},{\"name\":\"call_active\",\"type\":\"flags.23?true\"},{\"name\":\"call_not_empty\",\"type\":\"flags.24?true\"},{\"name\":\"fake\",\"type\":\"flags.25?true\"},{\"name\":\"gigagroup\",\"type\":\"flags.26?true\"},{\"name\":\"noforwards\",\"type\":\"flags.27?true\"},{\"name\":\"join_to_send\",\"type\":\"flags.28?true\"},{\"name\":\"join_request\",\"type\":\"flags.29?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"flags.13?long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"username\",\"type\":\"flags.6?string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.9?Vector<RestrictionReason>\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"banned_rights\",\"type\":\"flags.15?ChatBannedRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"},{\"name\":\"participants_count\",\"type\":\"flags.17?int\"}],\"type\":\"Chat\"},{\"id\":399807445,\"predicate\":\"channelForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"until_date\",\"type\":\"flags.16?int\"}],\"type\":\"Chat\"},{\"id\":2131196633,\"predicate\":\"contacts.resolvedPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":-231385849,\"predicate\":\"channelFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_view_participants\",\"type\":\"flags.3?true\"},{\"name\":\"can_set_username\",\"type\":\"flags.6?true\"},{\"name\":\"can_set_stickers\",\"type\":\"flags.7?true\"},{\"name\":\"hidden_prehistory\",\"type\":\"flags.10?true\"},{\"name\":\"can_set_location\",\"type\":\"flags.16?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.19?true\"},{\"name\":\"can_view_stats\",\"type\":\"flags.20?true\"},{\"name\":\"blocked\",\"type\":\"flags.22?true\"},{\"name\":\"flags2\",\"type\":\"#\"},{\"name\":\"can_delete_channel\",\"type\":\"flags2.0?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants_count\",\"type\":\"flags.0?int\"},{\"name\":\"admins_count\",\"type\":\"flags.1?int\"},{\"name\":\"kicked_count\",\"type\":\"flags.2?int\"},{\"name\":\"banned_count\",\"type\":\"flags.2?int\"},{\"name\":\"online_count\",\"type\":\"flags.13?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chat_photo\",\"type\":\"Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"flags.23?ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"Vector<BotInfo>\"},{\"name\":\"migrated_from_chat_id\",\"type\":\"flags.4?long\"},{\"name\":\"migrated_from_max_id\",\"type\":\"flags.4?int\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.5?int\"},{\"name\":\"stickerset\",\"type\":\"flags.8?StickerSet\"},{\"name\":\"available_min_id\",\"type\":\"flags.9?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"linked_chat_id\",\"type\":\"flags.14?long\"},{\"name\":\"location\",\"type\":\"flags.15?ChannelLocation\"},{\"name\":\"slowmode_seconds\",\"type\":\"flags.17?int\"},{\"name\":\"slowmode_next_send_date\",\"type\":\"flags.18?int\"},{\"name\":\"stats_dc\",\"type\":\"flags.12?int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"call\",\"type\":\"flags.21?InputGroupCall\"},{\"name\":\"ttl_period\",\"type\":\"flags.24?int\"},{\"name\":\"pending_suggestions\",\"type\":\"flags.25?Vector<string>\"},{\"name\":\"groupcall_default_join_as\",\"type\":\"flags.26?Peer\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.27?string\"},{\"name\":\"requests_pending\",\"type\":\"flags.28?int\"},{\"name\":\"recent_requesters\",\"type\":\"flags.28?Vector<long>\"},{\"name\":\"default_send_as\",\"type\":\"flags.29?Peer\"},{\"name\":\"available_reactions\",\"type\":\"flags.30?ChatReactions\"}],\"type\":\"ChatFull\"},{\"id\":182649427,\"predicate\":\"messageRange\",\"params\":[{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"MessageRange\"},{\"id\":1682413576,\"predicate\":\"messages.channelMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.2?int\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.Messages\"},{\"id\":-1781355374,\"predicate\":\"messageActionChannelCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":277713951,\"predicate\":\"updateChannelTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":1666927625,\"predicate\":\"updateChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":1656358105,\"predicate\":\"updateNewChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1842450928,\"predicate\":\"updateReadChannelInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1020437742,\"predicate\":\"updateDeleteChannelMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector<int>\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-232346616,\"predicate\":\"updateChannelMessageViews\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"views\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1041346555,\"predicate\":\"updates.channelDifferenceEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1531132162,\"predicate\":\"updates.channelDifferenceTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"dialog\",\"type\":\"Dialog\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":543450958,\"predicate\":\"updates.channelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"new_messages\",\"type\":\"Vector<Message>\"},{\"name\":\"other_updates\",\"type\":\"Vector<Update>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1798033689,\"predicate\":\"channelMessagesFilterEmpty\",\"params\":[],\"type\":\"ChannelMessagesFilter\"},{\"id\":-847783593,\"predicate\":\"channelMessagesFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_new_messages\",\"type\":\"flags.1?true\"},{\"name\":\"ranges\",\"type\":\"Vector<MessageRange>\"}],\"type\":\"ChannelMessagesFilter\"},{\"id\":-1072953408,\"predicate\":\"channelParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":900251559,\"predicate\":\"channelParticipantSelf\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"via_request\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":803602899,\"predicate\":\"channelParticipantCreator\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"flags.0?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":-566281095,\"predicate\":\"channelParticipantsRecent\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1268741783,\"predicate\":\"channelParticipantsAdmins\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1548400251,\"predicate\":\"channelParticipantsKicked\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1699676497,\"predicate\":\"channels.channelParticipants\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector<ChannelParticipant>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":-541588713,\"predicate\":\"channels.channelParticipant\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":-462696732,\"predicate\":\"chatParticipantCreator\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"ChatParticipant\"},{\"id\":-1600962725,\"predicate\":\"chatParticipantAdmin\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":-674602590,\"predicate\":\"updateChatParticipantAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"is_admin\",\"type\":\"Bool\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-519864430,\"predicate\":\"messageActionChatMigrateTo\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-365344535,\"predicate\":\"messageActionChannelMigrateFrom\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-1328445861,\"predicate\":\"channelParticipantsBots\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":2013922064,\"predicate\":\"help.termsOfService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"DataJSON\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector<MessageEntity>\"},{\"name\":\"min_age_confirm\",\"type\":\"flags.1?int\"}],\"type\":\"help.TermsOfService\"},{\"id\":1753886890,\"predicate\":\"updateNewStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"messages.StickerSet\"}],\"type\":\"Update\"},{\"id\":196268545,\"predicate\":\"updateStickerSetsOrder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"order\",\"type\":\"Vector<long>\"}],\"type\":\"Update\"},{\"id\":834816008,\"predicate\":\"updateStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"}],\"type\":\"Update\"},{\"id\":-402498398,\"predicate\":\"messages.savedGifsNotModified\",\"params\":[],\"type\":\"messages.SavedGifs\"},{\"id\":-2069878259,\"predicate\":\"messages.savedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"gifs\",\"type\":\"Vector<Document>\"}],\"type\":\"messages.SavedGifs\"},{\"id\":-1821035490,\"predicate\":\"updateSavedGifs\",\"params\":[],\"type\":\"Update\"},{\"id\":864077702,\"predicate\":\"inputBotInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector<MessageEntity>\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1036876423,\"predicate\":\"inputBotInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector<MessageEntity>\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-2000710887,\"predicate\":\"inputBotInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?InputWebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?InputWebDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":1984755728,\"predicate\":\"botInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector<MessageEntity>\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1937807902,\"predicate\":\"botInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector<MessageEntity>\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":295067450,\"predicate\":\"botInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?WebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?WebDocument\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":-1803769784,\"predicate\":\"messages.botResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"next_offset\",\"type\":\"flags.1?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.2?InlineBotSwitchPM\"},{\"name\":\"results\",\"type\":\"Vector<BotInlineResult>\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.BotResults\"},{\"id\":1232025500,\"predicate\":\"updateBotInlineQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"peer_type\",\"type\":\"flags.1?InlineQueryPeerType\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":317794823,\"predicate\":\"updateBotInlineSend\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"msg_id\",\"type\":\"flags.1?InputBotInlineMessageID\"}],\"type\":\"Update\"},{\"id\":1358283666,\"predicate\":\"inputMessagesFilterVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":928101534,\"predicate\":\"inputMessagesFilterMusic\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1107622874,\"predicate\":\"inputPrivacyKeyChatInvite\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1343122938,\"predicate\":\"privacyKeyChatInvite\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1571494644,\"predicate\":\"exportedMessageLink\",\"params\":[{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"html\",\"type\":\"string\"}],\"type\":\"ExportedMessageLink\"},{\"id\":1601666510,\"predicate\":\"messageFwdHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"imported\",\"type\":\"flags.7?true\"},{\"name\":\"from_id\",\"type\":\"flags.0?Peer\"},{\"name\":\"from_name\",\"type\":\"flags.5?string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"channel_post\",\"type\":\"flags.2?int\"},{\"name\":\"post_author\",\"type\":\"flags.3?string\"},{\"name\":\"saved_from_peer\",\"type\":\"flags.4?Peer\"},{\"name\":\"saved_from_msg_id\",\"type\":\"flags.4?int\"},{\"name\":\"psa_type\",\"type\":\"flags.6?string\"}],\"type\":\"MessageFwdHeader\"},{\"id\":457133559,\"predicate\":\"updateEditChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1799538451,\"predicate\":\"messageActionPinMessage\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":1923290508,\"predicate\":\"auth.codeTypeSms\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":1948046307,\"predicate\":\"auth.codeTypeCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":577556219,\"predicate\":\"auth.codeTypeFlashCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":1035688326,\"predicate\":\"auth.sentCodeTypeApp\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1073693790,\"predicate\":\"auth.sentCodeTypeSms\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":1398007207,\"predicate\":\"auth.sentCodeTypeCall\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1425815847,\"predicate\":\"auth.sentCodeTypeFlashCall\",\"params\":[{\"name\":\"pattern\",\"type\":\"string\"}],\"type\":\"auth.SentCodeType\"},{\"id\":629866245,\"predicate\":\"keyboardButtonUrl\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":901503851,\"predicate\":\"keyboardButtonCallback\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requires_password\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"KeyboardButton\"},{\"id\":-1318425559,\"predicate\":\"keyboardButtonRequestPhone\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-59151553,\"predicate\":\"keyboardButtonRequestGeoLocation\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":90744648,\"predicate\":\"keyboardButtonSwitchInline\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"same_peer\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"query\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1218642516,\"predicate\":\"replyInlineMarkup\",\"params\":[{\"name\":\"rows\",\"type\":\"Vector<KeyboardButtonRow>\"}],\"type\":\"ReplyMarkup\"},{\"id\":911761060,\"predicate\":\"messages.botCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"has_url\",\"type\":\"flags.3?true\"},{\"name\":\"native_ui\",\"type\":\"flags.4?true\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":-1177566067,\"predicate\":\"updateBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":649453030,\"predicate\":\"messages.messageEditData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"caption\",\"type\":\"flags.0?true\"}],\"type\":\"messages.MessageEditData\"},{\"id\":-469536605,\"predicate\":\"updateEditMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1768777083,\"predicate\":\"inputBotInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1098628881,\"predicate\":\"inputBotInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-1494368259,\"predicate\":\"inputBotInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":85477117,\"predicate\":\"botInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1970903652,\"predicate\":\"botInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":416402882,\"predicate\":\"botInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1462213465,\"predicate\":\"inputBotInlineResultPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"InputPhoto\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":-459324,\"predicate\":\"inputBotInlineResultDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":400266251,\"predicate\":\"botInlineMediaResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":-1995686519,\"predicate\":\"inputBotInlineMessageID\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"id\":1763610706,\"predicate\":\"updateInlineBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"msg_id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":1008755359,\"predicate\":\"inlineBotSwitchPM\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"InlineBotSwitchPM\"},{\"id\":863093588,\"predicate\":\"messages.peerDialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector<Dialog>\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-305282981,\"predicate\":\"topPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"rating\",\"type\":\"double\"}],\"type\":\"TopPeer\"},{\"id\":-1419371685,\"predicate\":\"topPeerCategoryBotsPM\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":344356834,\"predicate\":\"topPeerCategoryBotsInline\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":104314861,\"predicate\":\"topPeerCategoryCorrespondents\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-1122524854,\"predicate\":\"topPeerCategoryGroups\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":371037736,\"predicate\":\"topPeerCategoryChannels\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-75283823,\"predicate\":\"topPeerCategoryPeers\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"peers\",\"type\":\"Vector<TopPeer>\"}],\"type\":\"TopPeerCategoryPeers\"},{\"id\":-567906571,\"predicate\":\"contacts.topPeersNotModified\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":1891070632,\"predicate\":\"contacts.topPeers\",\"params\":[{\"name\":\"categories\",\"type\":\"Vector<TopPeerCategoryPeers>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.TopPeers\"},{\"id\":-595914432,\"predicate\":\"messageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageEntity\"},{\"id\":546203849,\"predicate\":\"inputMessageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"MessageEntity\"},{\"id\":975236280,\"predicate\":\"inputMessagesFilterChatPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1218471511,\"predicate\":\"updateReadChannelOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-299124375,\"predicate\":\"updateDraftMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"draft\",\"type\":\"DraftMessage\"}],\"type\":\"Update\"},{\"id\":453805082,\"predicate\":\"draftMessageEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"flags.0?int\"}],\"type\":\"DraftMessage\"},{\"id\":-40996577,\"predicate\":\"draftMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"DraftMessage\"},{\"id\":-1615153660,\"predicate\":\"messageActionHistoryClear\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-958657434,\"predicate\":\"messages.featuredStickersNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-1103615738,\"predicate\":\"messages.featuredStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"premium\",\"type\":\"flags.0?true\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector<StickerSetCovered>\"},{\"name\":\"unread\",\"type\":\"Vector<long>\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":1461528386,\"predicate\":\"updateReadFeaturedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":186120336,\"predicate\":\"messages.recentStickersNotModified\",\"params\":[],\"type\":\"messages.RecentStickers\"},{\"id\":-1999405994,\"predicate\":\"messages.recentStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"packs\",\"type\":\"Vector<StickerPack>\"},{\"name\":\"stickers\",\"type\":\"Vector<Document>\"},{\"name\":\"dates\",\"type\":\"Vector<int>\"}],\"type\":\"messages.RecentStickers\"},{\"id\":-1706939360,\"predicate\":\"updateRecentStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":1338747336,\"predicate\":\"messages.archivedStickers\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector<StickerSetCovered>\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":946083368,\"predicate\":\"messages.stickerSetInstallResultSuccess\",\"params\":[],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":904138920,\"predicate\":\"messages.stickerSetInstallResultArchive\",\"params\":[{\"name\":\"sets\",\"type\":\"Vector<StickerSetCovered>\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":1678812626,\"predicate\":\"stickerSetCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"cover\",\"type\":\"Document\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1574314746,\"predicate\":\"updateConfig\",\"params\":[],\"type\":\"Update\"},{\"id\":861169551,\"predicate\":\"updatePtsChanged\",\"params\":[],\"type\":\"Update\"},{\"id\":-440664550,\"predicate\":\"inputMediaPhotoExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-78455655,\"predicate\":\"inputMediaDocumentExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":872932635,\"predicate\":\"stickerSetMultiCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"covers\",\"type\":\"Vector<Document>\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1361650766,\"predicate\":\"maskCoords\",\"params\":[{\"name\":\"n\",\"type\":\"int\"},{\"name\":\"x\",\"type\":\"double\"},{\"name\":\"y\",\"type\":\"double\"},{\"name\":\"zoom\",\"type\":\"double\"}],\"type\":\"MaskCoords\"},{\"id\":-1744710921,\"predicate\":\"documentAttributeHasStickers\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":1251549527,\"predicate\":\"inputStickeredMediaPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputStickeredMedia\"},{\"id\":70813275,\"predicate\":\"inputStickeredMediaDocument\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"}],\"type\":\"InputStickeredMedia\"},{\"id\":-1107729093,\"predicate\":\"game\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"}],\"type\":\"Game\"},{\"id\":1336154098,\"predicate\":\"inputBotInlineResultGame\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":1262639204,\"predicate\":\"inputBotInlineMessageGame\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-38694904,\"predicate\":\"messageMediaGame\",\"params\":[{\"name\":\"game\",\"type\":\"Game\"}],\"type\":\"MessageMedia\"},{\"id\":-750828557,\"predicate\":\"inputMediaGame\",\"params\":[{\"name\":\"id\",\"type\":\"InputGame\"}],\"type\":\"InputMedia\"},{\"id\":53231223,\"predicate\":\"inputGameID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputGame\"},{\"id\":-1020139510,\"predicate\":\"inputGameShortName\",\"params\":[{\"name\":\"bot_id\",\"type\":\"InputUser\"},{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputGame\"},{\"id\":1358175439,\"predicate\":\"keyboardButtonGame\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1834538890,\"predicate\":\"messageActionGameScore\",\"params\":[{\"name\":\"game_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":1940093419,\"predicate\":\"highScore\",\"params\":[{\"name\":\"pos\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"HighScore\"},{\"id\":-1707344487,\"predicate\":\"messages.highScores\",\"params\":[{\"name\":\"scores\",\"type\":\"Vector<HighScore>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.HighScores\"},{\"id\":1258196845,\"predicate\":\"updates.differenceTooLong\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":791390623,\"predicate\":\"updateChannelWebPage\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1663561404,\"predicate\":\"messages.chatsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"}],\"type\":\"messages.Chats\"},{\"id\":-599948721,\"predicate\":\"textEmpty\",\"params\":[],\"type\":\"RichText\"},{\"id\":1950782688,\"predicate\":\"textPlain\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":1730456516,\"predicate\":\"textBold\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-653089380,\"predicate\":\"textItalic\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-1054465340,\"predicate\":\"textUnderline\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-1678197867,\"predicate\":\"textStrike\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":1816074681,\"predicate\":\"textFixed\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":1009288385,\"predicate\":\"textUrl\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"}],\"type\":\"RichText\"},{\"id\":-564523562,\"predicate\":\"textEmail\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":2120376535,\"predicate\":\"textConcat\",\"params\":[{\"name\":\"texts\",\"type\":\"Vector<RichText>\"}],\"type\":\"RichText\"},{\"id\":324435594,\"predicate\":\"pageBlockUnsupported\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":1890305021,\"predicate\":\"pageBlockTitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1879401953,\"predicate\":\"pageBlockSubtitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1162877472,\"predicate\":\"pageBlockAuthorDate\",\"params\":[{\"name\":\"author\",\"type\":\"RichText\"},{\"name\":\"published_date\",\"type\":\"int\"}],\"type\":\"PageBlock\"},{\"id\":-1076861716,\"predicate\":\"pageBlockHeader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-248793375,\"predicate\":\"pageBlockSubheader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":1182402406,\"predicate\":\"pageBlockParagraph\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1066346178,\"predicate\":\"pageBlockPreformatted\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":1216809369,\"predicate\":\"pageBlockFooter\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-618614392,\"predicate\":\"pageBlockDivider\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":-837994576,\"predicate\":\"pageBlockAnchor\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":-454524911,\"predicate\":\"pageBlockList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector<PageListItem>\"}],\"type\":\"PageBlock\"},{\"id\":641563686,\"predicate\":\"pageBlockBlockquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":1329878739,\"predicate\":\"pageBlockPullquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":391759200,\"predicate\":\"pageBlockPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"},{\"name\":\"url\",\"type\":\"flags.0?string\"},{\"name\":\"webpage_id\",\"type\":\"flags.0?long\"}],\"type\":\"PageBlock\"},{\"id\":2089805750,\"predicate\":\"pageBlockVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autoplay\",\"type\":\"flags.0?true\"},{\"name\":\"loop\",\"type\":\"flags.1?true\"},{\"name\":\"video_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":972174080,\"predicate\":\"pageBlockCover\",\"params\":[{\"name\":\"cover\",\"type\":\"PageBlock\"}],\"type\":\"PageBlock\"},{\"id\":-1468953147,\"predicate\":\"pageBlockEmbed\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"full_width\",\"type\":\"flags.0?true\"},{\"name\":\"allow_scrolling\",\"type\":\"flags.3?true\"},{\"name\":\"url\",\"type\":\"flags.1?string\"},{\"name\":\"html\",\"type\":\"flags.2?string\"},{\"name\":\"poster_photo_id\",\"type\":\"flags.4?long\"},{\"name\":\"w\",\"type\":\"flags.5?int\"},{\"name\":\"h\",\"type\":\"flags.5?int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-229005301,\"predicate\":\"pageBlockEmbedPost\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"author_photo_id\",\"type\":\"long\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"blocks\",\"type\":\"Vector<PageBlock>\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1705048653,\"predicate\":\"pageBlockCollage\",\"params\":[{\"name\":\"items\",\"type\":\"Vector<PageBlock>\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":52401552,\"predicate\":\"pageBlockSlideshow\",\"params\":[{\"name\":\"items\",\"type\":\"Vector<PageBlock>\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1930545681,\"predicate\":\"webPageNotModified\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"cached_page_views\",\"type\":\"flags.0?int\"}],\"type\":\"WebPage\"},{\"id\":-88417185,\"predicate\":\"inputPrivacyKeyPhoneCall\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1030105979,\"predicate\":\"privacyKeyPhoneCall\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-580219064,\"predicate\":\"sendMessageGamePlayAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-2048646399,\"predicate\":\"phoneCallDiscardReasonMissed\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":-527056480,\"predicate\":\"phoneCallDiscardReasonDisconnect\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":1471006352,\"predicate\":\"phoneCallDiscardReasonHangup\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":-84416311,\"predicate\":\"phoneCallDiscardReasonBusy\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":1852826908,\"predicate\":\"updateDialogPinned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":-99664734,\"predicate\":\"updatePinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"order\",\"type\":\"flags.0?Vector<DialogPeer>\"}],\"type\":\"Update\"},{\"id\":2104790276,\"predicate\":\"dataJSON\",\"params\":[{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"DataJSON\"},{\"id\":-2095595325,\"predicate\":\"updateBotWebhookJSON\",\"params\":[{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":-1684914010,\"predicate\":\"updateBotWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"},{\"name\":\"timeout\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-886477832,\"predicate\":\"labeledPrice\",\"params\":[{\"name\":\"label\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"}],\"type\":\"LabeledPrice\"},{\"id\":1048946971,\"predicate\":\"invoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"test\",\"type\":\"flags.0?true\"},{\"name\":\"name_requested\",\"type\":\"flags.1?true\"},{\"name\":\"phone_requested\",\"type\":\"flags.2?true\"},{\"name\":\"email_requested\",\"type\":\"flags.3?true\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.4?true\"},{\"name\":\"flexible\",\"type\":\"flags.5?true\"},{\"name\":\"phone_to_provider\",\"type\":\"flags.6?true\"},{\"name\":\"email_to_provider\",\"type\":\"flags.7?true\"},{\"name\":\"recurring\",\"type\":\"flags.9?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector<LabeledPrice>\"},{\"name\":\"max_tip_amount\",\"type\":\"flags.8?long\"},{\"name\":\"suggested_tip_amounts\",\"type\":\"flags.8?Vector<long>\"},{\"name\":\"recurring_terms_url\",\"type\":\"flags.9?string\"}],\"type\":\"Invoice\"},{\"id\":-1900697899,\"predicate\":\"inputMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"start_param\",\"type\":\"flags.1?string\"},{\"name\":\"extended_media\",\"type\":\"flags.2?InputMedia\"}],\"type\":\"InputMedia\"},{\"id\":-368917890,\"predicate\":\"paymentCharge\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"provider_charge_id\",\"type\":\"string\"}],\"type\":\"PaymentCharge\"},{\"id\":-1892568281,\"predicate\":\"messageActionPaymentSentMe\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"recurring_init\",\"type\":\"flags.2?true\"},{\"name\":\"recurring_used\",\"type\":\"flags.3?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"charge\",\"type\":\"PaymentCharge\"}],\"type\":\"MessageAction\"},{\"id\":-156940077,\"predicate\":\"messageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"receipt_msg_id\",\"type\":\"flags.2?int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"},{\"name\":\"extended_media\",\"type\":\"flags.4?MessageExtendedMedia\"}],\"type\":\"MessageMedia\"},{\"id\":512535275,\"predicate\":\"postAddress\",\"params\":[{\"name\":\"street_line1\",\"type\":\"string\"},{\"name\":\"street_line2\",\"type\":\"string\"},{\"name\":\"city\",\"type\":\"string\"},{\"name\":\"state\",\"type\":\"string\"},{\"name\":\"country_iso2\",\"type\":\"string\"},{\"name\":\"post_code\",\"type\":\"string\"}],\"type\":\"PostAddress\"},{\"id\":-1868808300,\"predicate\":\"paymentRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"name\",\"type\":\"flags.0?string\"},{\"name\":\"phone\",\"type\":\"flags.1?string\"},{\"name\":\"email\",\"type\":\"flags.2?string\"},{\"name\":\"shipping_address\",\"type\":\"flags.3?PostAddress\"}],\"type\":\"PaymentRequestedInfo\"},{\"id\":-1344716869,\"predicate\":\"keyboardButtonBuy\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1776926890,\"predicate\":\"messageActionPaymentSent\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"recurring_init\",\"type\":\"flags.2?true\"},{\"name\":\"recurring_used\",\"type\":\"flags.3?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"invoice_slug\",\"type\":\"flags.0?string\"}],\"type\":\"MessageAction\"},{\"id\":-842892769,\"predicate\":\"paymentSavedCredentialsCard\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"PaymentSavedCredentials\"},{\"id\":475467473,\"predicate\":\"webDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector<DocumentAttribute>\"}],\"type\":\"WebDocument\"},{\"id\":-1678949555,\"predicate\":\"inputWebDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector<DocumentAttribute>\"}],\"type\":\"InputWebDocument\"},{\"id\":-1036396922,\"predicate\":\"inputWebFileLocation\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWebFileLocation\"},{\"id\":568808380,\"predicate\":\"upload.webFile\",\"params\":[{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"file_type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.WebFile\"},{\"id\":-1610250415,\"predicate\":\"payments.paymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_save_credentials\",\"type\":\"flags.2?true\"},{\"name\":\"password_missing\",\"type\":\"flags.3?true\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.5?WebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"provider_id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"native_provider\",\"type\":\"flags.4?string\"},{\"name\":\"native_params\",\"type\":\"flags.4?DataJSON\"},{\"name\":\"additional_methods\",\"type\":\"flags.6?Vector<PaymentFormMethod>\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"saved_credentials\",\"type\":\"flags.1?Vector<PaymentSavedCredentials>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"payments.PaymentForm\"},{\"id\":-784000893,\"predicate\":\"payments.validatedRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector<ShippingOption>\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":1314881805,\"predicate\":\"payments.paymentResult\",\"params\":[{\"name\":\"updates\",\"type\":\"Updates\"}],\"type\":\"payments.PaymentResult\"},{\"id\":1891958275,\"predicate\":\"payments.paymentReceipt\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"provider_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.2?WebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping\",\"type\":\"flags.1?ShippingOption\"},{\"name\":\"tip_amount\",\"type\":\"flags.3?long\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"credentials_title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":-74456004,\"predicate\":\"payments.savedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_saved_credentials\",\"type\":\"flags.1?true\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"}],\"type\":\"payments.SavedInfo\"},{\"id\":-1056001329,\"predicate\":\"inputPaymentCredentialsSaved\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"tmp_password\",\"type\":\"bytes\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":873977640,\"predicate\":\"inputPaymentCredentials\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-614138572,\"predicate\":\"account.tmpPassword\",\"params\":[{\"name\":\"tmp_password\",\"type\":\"bytes\"},{\"name\":\"valid_until\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":-1239335713,\"predicate\":\"shippingOption\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector<LabeledPrice>\"}],\"type\":\"ShippingOption\"},{\"id\":-1246823043,\"predicate\":\"updateBotShippingQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"shipping_address\",\"type\":\"PostAddress\"}],\"type\":\"Update\"},{\"id\":-1934976362,\"predicate\":\"updateBotPrecheckoutQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-6249322,\"predicate\":\"inputStickerSetItem\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"emoji\",\"type\":\"string\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"InputStickerSetItem\"},{\"id\":-1425052898,\"predicate\":\"updatePhoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"}],\"type\":\"Update\"},{\"id\":506920429,\"predicate\":\"inputPhoneCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPhoneCall\"},{\"id\":1399245077,\"predicate\":\"phoneCallEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"PhoneCall\"},{\"id\":-987599081,\"predicate\":\"phoneCallWaiting\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"receive_date\",\"type\":\"flags.0?int\"}],\"type\":\"PhoneCall\"},{\"id\":347139340,\"predicate\":\"phoneCallRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":912311057,\"predicate\":\"phoneCallAccepted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":-1770029977,\"predicate\":\"phoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"p2p_allowed\",\"type\":\"flags.5?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"connections\",\"type\":\"Vector<PhoneConnection>\"},{\"name\":\"start_date\",\"type\":\"int\"}],\"type\":\"PhoneCall\"},{\"id\":1355435489,\"predicate\":\"phoneCallDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"need_rating\",\"type\":\"flags.2?true\"},{\"name\":\"need_debug\",\"type\":\"flags.3?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"PhoneCall\"},{\"id\":-1665063993,\"predicate\":\"phoneConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"tcp\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"peer_tag\",\"type\":\"bytes\"}],\"type\":\"PhoneConnection\"},{\"id\":-58224696,\"predicate\":\"phoneCallProtocol\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"udp_p2p\",\"type\":\"flags.0?true\"},{\"name\":\"udp_reflector\",\"type\":\"flags.1?true\"},{\"name\":\"min_layer\",\"type\":\"int\"},{\"name\":\"max_layer\",\"type\":\"int\"},{\"name\":\"library_versions\",\"type\":\"Vector<string>\"}],\"type\":\"PhoneCallProtocol\"},{\"id\":-326966976,\"predicate\":\"phone.phoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"phone.PhoneCall\"},{\"id\":-2134272152,\"predicate\":\"inputMessagesFilterPhoneCalls\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"missed\",\"type\":\"flags.0?true\"}],\"type\":\"MessagesFilter\"},{\"id\":-2132731265,\"predicate\":\"messageActionPhoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.2?true\"},{\"name\":\"call_id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"MessageAction\"},{\"id\":2054952868,\"predicate\":\"inputMessagesFilterRoundVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1253451181,\"predicate\":\"inputMessagesFilterRoundVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1997373508,\"predicate\":\"sendMessageRecordRoundAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":608050278,\"predicate\":\"sendMessageUploadRoundAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-242427324,\"predicate\":\"upload.fileCdnRedirect\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"encryption_key\",\"type\":\"bytes\"},{\"name\":\"encryption_iv\",\"type\":\"bytes\"},{\"name\":\"file_hashes\",\"type\":\"Vector<FileHash>\"}],\"type\":\"upload.File\"},{\"id\":-290921362,\"predicate\":\"upload.cdnFileReuploadNeeded\",\"params\":[{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":-1449145777,\"predicate\":\"upload.cdnFile\",\"params\":[{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":-914167110,\"predicate\":\"cdnPublicKey\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"CdnPublicKey\"},{\"id\":1462101002,\"predicate\":\"cdnConfig\",\"params\":[{\"name\":\"public_keys\",\"type\":\"Vector<CdnPublicKey>\"}],\"type\":\"CdnConfig\"},{\"id\":-283684427,\"predicate\":\"pageBlockChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"Chat\"}],\"type\":\"PageBlock\"},{\"id\":-892239370,\"predicate\":\"langPackString\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":1816636575,\"predicate\":\"langPackStringPluralized\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"zero_value\",\"type\":\"flags.0?string\"},{\"name\":\"one_value\",\"type\":\"flags.1?string\"},{\"name\":\"two_value\",\"type\":\"flags.2?string\"},{\"name\":\"few_value\",\"type\":\"flags.3?string\"},{\"name\":\"many_value\",\"type\":\"flags.4?string\"},{\"name\":\"other_value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":695856818,\"predicate\":\"langPackStringDeleted\",\"params\":[{\"name\":\"key\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":-209337866,\"predicate\":\"langPackDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"strings\",\"type\":\"Vector<LangPackString>\"}],\"type\":\"LangPackDifference\"},{\"id\":-288727837,\"predicate\":\"langPackLanguage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"official\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.2?true\"},{\"name\":\"beta\",\"type\":\"flags.3?true\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"native_name\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"base_lang_code\",\"type\":\"flags.1?string\"},{\"name\":\"plural_code\",\"type\":\"string\"},{\"name\":\"strings_count\",\"type\":\"int\"},{\"name\":\"translated_count\",\"type\":\"int\"},{\"name\":\"translations_url\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":1180041828,\"predicate\":\"updateLangPackTooLong\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":1442983757,\"predicate\":\"updateLangPack\",\"params\":[{\"name\":\"difference\",\"type\":\"LangPackDifference\"}],\"type\":\"Update\"},{\"id\":885242707,\"predicate\":\"channelParticipantAdmin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_edit\",\"type\":\"flags.0?true\"},{\"name\":\"self\",\"type\":\"flags.1?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"flags.1?long\"},{\"name\":\"promoted_by\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"flags.2?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":1844969806,\"predicate\":\"channelParticipantBanned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"left\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"kicked_by\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelParticipant\"},{\"id\":338142689,\"predicate\":\"channelParticipantsBanned\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":106343499,\"predicate\":\"channelParticipantsSearch\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-421545947,\"predicate\":\"channelAdminLogEventActionChangeTitle\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1427671598,\"predicate\":\"channelAdminLogEventActionChangeAbout\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1783299128,\"predicate\":\"channelAdminLogEventActionChangeUsername\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1129042607,\"predicate\":\"channelAdminLogEventActionChangePhoto\",\"params\":[{\"name\":\"prev_photo\",\"type\":\"Photo\"},{\"name\":\"new_photo\",\"type\":\"Photo\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":460916654,\"predicate\":\"channelAdminLogEventActionToggleInvites\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":648939889,\"predicate\":\"channelAdminLogEventActionToggleSignatures\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-370660328,\"predicate\":\"channelAdminLogEventActionUpdatePinned\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1889215493,\"predicate\":\"channelAdminLogEventActionEditMessage\",\"params\":[{\"name\":\"prev_message\",\"type\":\"Message\"},{\"name\":\"new_message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1121994683,\"predicate\":\"channelAdminLogEventActionDeleteMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":405815507,\"predicate\":\"channelAdminLogEventActionParticipantJoin\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-124291086,\"predicate\":\"channelAdminLogEventActionParticipantLeave\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-484690728,\"predicate\":\"channelAdminLogEventActionParticipantInvite\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-422036098,\"predicate\":\"channelAdminLogEventActionParticipantToggleBan\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-714643696,\"predicate\":\"channelAdminLogEventActionParticipantToggleAdmin\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":531458253,\"predicate\":\"channelAdminLogEvent\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"action\",\"type\":\"ChannelAdminLogEventAction\"}],\"type\":\"ChannelAdminLogEvent\"},{\"id\":-309659827,\"predicate\":\"channels.adminLogResults\",\"params\":[{\"name\":\"events\",\"type\":\"Vector<ChannelAdminLogEvent>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":-368018716,\"predicate\":\"channelAdminLogEventsFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"join\",\"type\":\"flags.0?true\"},{\"name\":\"leave\",\"type\":\"flags.1?true\"},{\"name\":\"invite\",\"type\":\"flags.2?true\"},{\"name\":\"ban\",\"type\":\"flags.3?true\"},{\"name\":\"unban\",\"type\":\"flags.4?true\"},{\"name\":\"kick\",\"type\":\"flags.5?true\"},{\"name\":\"unkick\",\"type\":\"flags.6?true\"},{\"name\":\"promote\",\"type\":\"flags.7?true\"},{\"name\":\"demote\",\"type\":\"flags.8?true\"},{\"name\":\"info\",\"type\":\"flags.9?true\"},{\"name\":\"settings\",\"type\":\"flags.10?true\"},{\"name\":\"pinned\",\"type\":\"flags.11?true\"},{\"name\":\"edit\",\"type\":\"flags.12?true\"},{\"name\":\"delete\",\"type\":\"flags.13?true\"},{\"name\":\"group_call\",\"type\":\"flags.14?true\"},{\"name\":\"invites\",\"type\":\"flags.15?true\"},{\"name\":\"send\",\"type\":\"flags.16?true\"},{\"name\":\"forums\",\"type\":\"flags.17?true\"}],\"type\":\"ChannelAdminLogEventsFilter\"},{\"id\":511092620,\"predicate\":\"topPeerCategoryPhoneCalls\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-2143067670,\"predicate\":\"pageBlockAudio\",\"params\":[{\"name\":\"audio_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1558266229,\"predicate\":\"popularContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"importers\",\"type\":\"int\"}],\"type\":\"PopularContact\"},{\"id\":1200788123,\"predicate\":\"messageActionScreenshotTaken\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1634752813,\"predicate\":\"messages.favedStickersNotModified\",\"params\":[],\"type\":\"messages.FavedStickers\"},{\"id\":750063767,\"predicate\":\"messages.favedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"packs\",\"type\":\"Vector<StickerPack>\"},{\"name\":\"stickers\",\"type\":\"Vector<Document>\"}],\"type\":\"messages.FavedStickers\"},{\"id\":-451831443,\"predicate\":\"updateFavedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":1153291573,\"predicate\":\"updateChannelReadMessagesContents\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector<int>\"}],\"type\":\"Update\"},{\"id\":-1040652646,\"predicate\":\"inputMessagesFilterMyMentions\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":1887741886,\"predicate\":\"updateContactsReset\",\"params\":[],\"type\":\"Update\"},{\"id\":-1312568665,\"predicate\":\"channelAdminLogEventActionChangeStickerSet\",\"params\":[{\"name\":\"prev_stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"new_stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-85549226,\"predicate\":\"messageActionCustomAction\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":178373535,\"predicate\":\"inputPaymentCredentialsApplePay\",\"params\":[{\"name\":\"payment_data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-419271411,\"predicate\":\"inputMessagesFilterGeo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-530392189,\"predicate\":\"inputMessagesFilterContacts\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1304443240,\"predicate\":\"updateChannelAvailableMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"available_min_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1599903217,\"predicate\":\"channelAdminLogEventActionTogglePreHistoryHidden\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1759532989,\"predicate\":\"inputMediaGeoLive\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"stopped\",\"type\":\"flags.0?true\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.2?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"}],\"type\":\"InputMedia\"},{\"id\":-1186937242,\"predicate\":\"messageMediaGeoLive\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.1?int\"}],\"type\":\"MessageMedia\"},{\"id\":1189204285,\"predicate\":\"recentMeUrlUnknown\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1188296222,\"predicate\":\"recentMeUrlUser\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1294306862,\"predicate\":\"recentMeUrlChat\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"RecentMeUrl\"},{\"id\":-347535331,\"predicate\":\"recentMeUrlChatInvite\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_invite\",\"type\":\"ChatInvite\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1140172836,\"predicate\":\"recentMeUrlStickerSet\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"set\",\"type\":\"StickerSetCovered\"}],\"type\":\"RecentMeUrl\"},{\"id\":235081943,\"predicate\":\"help.recentMeUrls\",\"params\":[{\"name\":\"urls\",\"type\":\"Vector<RecentMeUrl>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":-266911767,\"predicate\":\"channels.channelParticipantsNotModified\",\"params\":[],\"type\":\"channels.ChannelParticipants\"},{\"id\":1951620897,\"predicate\":\"messages.messagesNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":482797855,\"predicate\":\"inputSingleMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.0?Vector<MessageEntity>\"}],\"type\":\"InputSingleMedia\"},{\"id\":-1493633966,\"predicate\":\"webAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"domain\",\"type\":\"string\"},{\"name\":\"browser\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"WebAuthorization\"},{\"id\":-313079300,\"predicate\":\"account.webAuthorizations\",\"params\":[{\"name\":\"authorizations\",\"type\":\"Vector<WebAuthorization>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"account.WebAuthorizations\"},{\"id\":-1502174430,\"predicate\":\"inputMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":-1160215659,\"predicate\":\"inputMessageReplyTo\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":-2037963464,\"predicate\":\"inputMessagePinned\",\"params\":[],\"type\":\"InputMessage\"},{\"id\":-1687559349,\"predicate\":\"messageEntityPhone\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1280209983,\"predicate\":\"messageEntityCashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1410748418,\"predicate\":\"messageActionBotAllowed\",\"params\":[{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-55902537,\"predicate\":\"inputDialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputDialogPeer\"},{\"id\":-445792507,\"predicate\":\"dialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"DialogPeer\"},{\"id\":223655517,\"predicate\":\"messages.foundStickerSetsNotModified\",\"params\":[],\"type\":\"messages.FoundStickerSets\"},{\"id\":-1963942446,\"predicate\":\"messages.foundStickerSets\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"sets\",\"type\":\"Vector<StickerSetCovered>\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":-207944868,\"predicate\":\"fileHash\",\"params\":[{\"name\":\"offset\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"FileHash\"},{\"id\":-104284986,\"predicate\":\"webDocumentNoProxy\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector<DocumentAttribute>\"}],\"type\":\"WebDocument\"},{\"id\":1968737087,\"predicate\":\"inputClientProxy\",\"params\":[{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"}],\"type\":\"InputClientProxy\"},{\"id\":-483352705,\"predicate\":\"help.termsOfServiceUpdateEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":686618977,\"predicate\":\"help.termsOfServiceUpdate\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"terms_of_service\",\"type\":\"help.TermsOfService\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":859091184,\"predicate\":\"inputSecureFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"InputSecureFile\"},{\"id\":1399317950,\"predicate\":\"inputSecureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputSecureFile\"},{\"id\":-876089816,\"predicate\":\"inputSecureFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":1679398724,\"predicate\":\"secureFileEmpty\",\"params\":[],\"type\":\"SecureFile\"},{\"id\":2097791614,\"predicate\":\"secureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"long\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureFile\"},{\"id\":-1964327229,\"predicate\":\"secureData\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureData\"},{\"id\":2103482845,\"predicate\":\"securePlainPhone\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":569137759,\"predicate\":\"securePlainEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":-1658158621,\"predicate\":\"secureValueTypePersonalDetails\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":1034709504,\"predicate\":\"secureValueTypePassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":115615172,\"predicate\":\"secureValueTypeDriverLicense\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1596951477,\"predicate\":\"secureValueTypeIdentityCard\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1717268701,\"predicate\":\"secureValueTypeInternalPassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-874308058,\"predicate\":\"secureValueTypeAddress\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-63531698,\"predicate\":\"secureValueTypeUtilityBill\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1995211763,\"predicate\":\"secureValueTypeBankStatement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1954007928,\"predicate\":\"secureValueTypeRentalAgreement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1713143702,\"predicate\":\"secureValueTypePassportRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-368907213,\"predicate\":\"secureValueTypeTemporaryRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1289704741,\"predicate\":\"secureValueTypePhone\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1908627474,\"predicate\":\"secureValueTypeEmail\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":411017418,\"predicate\":\"secureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?SecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?SecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?SecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector<SecureFile>\"},{\"name\":\"files\",\"type\":\"flags.4?Vector<SecureFile>\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValue\"},{\"id\":-618540889,\"predicate\":\"inputSecureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?InputSecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?InputSecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?InputSecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector<InputSecureFile>\"},{\"name\":\"files\",\"type\":\"flags.4?Vector<InputSecureFile>\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"}],\"type\":\"InputSecureValue\"},{\"id\":-316748368,\"predicate\":\"secureValueHash\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValueHash\"},{\"id\":-391902247,\"predicate\":\"secureValueErrorData\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"field\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":12467706,\"predicate\":\"secureValueErrorFrontSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-2037765467,\"predicate\":\"secureValueErrorReverseSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-449327402,\"predicate\":\"secureValueErrorSelfie\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":2054162547,\"predicate\":\"secureValueErrorFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":1717706985,\"predicate\":\"secureValueErrorFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector<bytes>\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":871426631,\"predicate\":\"secureCredentialsEncrypted\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureCredentialsEncrypted\"},{\"id\":-1389486888,\"predicate\":\"account.authorizationForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"required_types\",\"type\":\"Vector<SecureRequiredType>\"},{\"name\":\"values\",\"type\":\"Vector<SecureValue>\"},{\"name\":\"errors\",\"type\":\"Vector<SecureValueError>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"privacy_policy_url\",\"type\":\"flags.0?string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":-2128640689,\"predicate\":\"account.sentEmailCode\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"account.SentEmailCode\"},{\"id\":455635795,\"predicate\":\"messageActionSecureValuesSentMe\",\"params\":[{\"name\":\"values\",\"type\":\"Vector<SecureValue>\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"MessageAction\"},{\"id\":-648257196,\"predicate\":\"messageActionSecureValuesSent\",\"params\":[{\"name\":\"types\",\"type\":\"Vector<SecureValueType>\"}],\"type\":\"MessageAction\"},{\"id\":1722786150,\"predicate\":\"help.deepLinkInfoEmpty\",\"params\":[],\"type\":\"help.DeepLinkInfo\"},{\"id\":1783556146,\"predicate\":\"help.deepLinkInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"update_app\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector<MessageEntity>\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":289586518,\"predicate\":\"savedPhoneContact\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"SavedContact\"},{\"id\":1304052993,\"predicate\":\"account.takeout\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"account.Takeout\"},{\"id\":700340377,\"predicate\":\"inputTakeoutFileLocation\",\"params\":[],\"type\":\"InputFileLocation\"},{\"id\":-513517117,\"predicate\":\"updateDialogUnreadMark\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":-253500010,\"predicate\":\"messages.dialogsNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Dialogs\"},{\"id\":-1625153079,\"predicate\":\"inputWebFileGeoPointLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"scale\",\"type\":\"int\"}],\"type\":\"InputWebFileLocation\"},{\"id\":-1255369827,\"predicate\":\"contacts.topPeersDisabled\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":-1685456582,\"predicate\":\"inputReportReasonCopyright\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-732254058,\"predicate\":\"passwordKdfAlgoUnknown\",\"params\":[],\"type\":\"PasswordKdfAlgo\"},{\"id\":4883767,\"predicate\":\"securePasswordKdfAlgoUnknown\",\"params\":[],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":-1141711456,\"predicate\":\"securePasswordKdfAlgoPBKDF2HMACSHA512iter100000\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":-2042159726,\"predicate\":\"securePasswordKdfAlgoSHA512\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":354925740,\"predicate\":\"secureSecretSettings\",\"params\":[{\"name\":\"secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_secret\",\"type\":\"bytes\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureSecretSettings\"},{\"id\":982592842,\"predicate\":\"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow\",\"params\":[{\"name\":\"salt1\",\"type\":\"bytes\"},{\"name\":\"salt2\",\"type\":\"bytes\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"}],\"type\":\"PasswordKdfAlgo\"},{\"id\":-1736378792,\"predicate\":\"inputCheckPasswordEmpty\",\"params\":[],\"type\":\"InputCheckPasswordSRP\"},{\"id\":-763367294,\"predicate\":\"inputCheckPasswordSRP\",\"params\":[{\"name\":\"srp_id\",\"type\":\"long\"},{\"name\":\"A\",\"type\":\"bytes\"},{\"name\":\"M1\",\"type\":\"bytes\"}],\"type\":\"InputCheckPasswordSRP\"},{\"id\":-2036501105,\"predicate\":\"secureValueError\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-1592506512,\"predicate\":\"secureValueErrorTranslationFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":878931416,\"predicate\":\"secureValueErrorTranslationFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector<bytes>\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-2103600678,\"predicate\":\"secureRequiredType\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"native_names\",\"type\":\"flags.0?true\"},{\"name\":\"selfie_required\",\"type\":\"flags.1?true\"},{\"name\":\"translation_required\",\"type\":\"flags.2?true\"},{\"name\":\"type\",\"type\":\"SecureValueType\"}],\"type\":\"SecureRequiredType\"},{\"id\":41187252,\"predicate\":\"secureRequiredTypeOneOf\",\"params\":[{\"name\":\"types\",\"type\":\"Vector<SecureRequiredType>\"}],\"type\":\"SecureRequiredType\"},{\"id\":-1078332329,\"predicate\":\"help.passportConfigNotModified\",\"params\":[],\"type\":\"help.PassportConfig\"},{\"id\":-1600596305,\"predicate\":\"help.passportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"countries_langs\",\"type\":\"DataJSON\"}],\"type\":\"help.PassportConfig\"},{\"id\":488313413,\"predicate\":\"inputAppEvent\",\"params\":[{\"name\":\"time\",\"type\":\"double\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"peer\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"JSONValue\"}],\"type\":\"InputAppEvent\"},{\"id\":-1059185703,\"predicate\":\"jsonObjectValue\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"JSONValue\"}],\"type\":\"JSONObjectValue\"},{\"id\":1064139624,\"predicate\":\"jsonNull\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":-952869270,\"predicate\":\"jsonBool\",\"params\":[{\"name\":\"value\",\"type\":\"Bool\"}],\"type\":\"JSONValue\"},{\"id\":736157604,\"predicate\":\"jsonNumber\",\"params\":[{\"name\":\"value\",\"type\":\"double\"}],\"type\":\"JSONValue\"},{\"id\":-1222740358,\"predicate\":\"jsonString\",\"params\":[{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"JSONValue\"},{\"id\":-146520221,\"predicate\":\"jsonArray\",\"params\":[{\"name\":\"value\",\"type\":\"Vector<JSONValue>\"}],\"type\":\"JSONValue\"},{\"id\":-1715350371,\"predicate\":\"jsonObject\",\"params\":[{\"name\":\"value\",\"type\":\"Vector<JSONObjectValue>\"}],\"type\":\"JSONValue\"},{\"id\":-1311015810,\"predicate\":\"inputNotifyBroadcasts\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-703403793,\"predicate\":\"notifyBroadcasts\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-311786236,\"predicate\":\"textSubscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-939827711,\"predicate\":\"textSuperscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":55281185,\"predicate\":\"textMarked\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":483104362,\"predicate\":\"textPhone\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":136105807,\"predicate\":\"textImage\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"RichText\"},{\"id\":504660880,\"predicate\":\"pageBlockKicker\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":878078826,\"predicate\":\"pageTableCell\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"header\",\"type\":\"flags.0?true\"},{\"name\":\"align_center\",\"type\":\"flags.3?true\"},{\"name\":\"align_right\",\"type\":\"flags.4?true\"},{\"name\":\"valign_middle\",\"type\":\"flags.5?true\"},{\"name\":\"valign_bottom\",\"type\":\"flags.6?true\"},{\"name\":\"text\",\"type\":\"flags.7?RichText\"},{\"name\":\"colspan\",\"type\":\"flags.1?int\"},{\"name\":\"rowspan\",\"type\":\"flags.2?int\"}],\"type\":\"PageTableCell\"},{\"id\":-524237339,\"predicate\":\"pageTableRow\",\"params\":[{\"name\":\"cells\",\"type\":\"Vector<PageTableCell>\"}],\"type\":\"PageTableRow\"},{\"id\":-1085412734,\"predicate\":\"pageBlockTable\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bordered\",\"type\":\"flags.0?true\"},{\"name\":\"striped\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"rows\",\"type\":\"Vector<PageTableRow>\"}],\"type\":\"PageBlock\"},{\"id\":1869903447,\"predicate\":\"pageCaption\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"credit\",\"type\":\"RichText\"}],\"type\":\"PageCaption\"},{\"id\":-1188055347,\"predicate\":\"pageListItemText\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListItem\"},{\"id\":635466748,\"predicate\":\"pageListItemBlocks\",\"params\":[{\"name\":\"blocks\",\"type\":\"Vector<PageBlock>\"}],\"type\":\"PageListItem\"},{\"id\":1577484359,\"predicate\":\"pageListOrderedItemText\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListOrderedItem\"},{\"id\":-1730311882,\"predicate\":\"pageListOrderedItemBlocks\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector<PageBlock>\"}],\"type\":\"PageListOrderedItem\"},{\"id\":-1702174239,\"predicate\":\"pageBlockOrderedList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector<PageListOrderedItem>\"}],\"type\":\"PageBlock\"},{\"id\":1987480557,\"predicate\":\"pageBlockDetails\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"open\",\"type\":\"flags.0?true\"},{\"name\":\"blocks\",\"type\":\"Vector<PageBlock>\"},{\"name\":\"title\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1282352120,\"predicate\":\"pageRelatedArticle\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"description\",\"type\":\"flags.1?string\"},{\"name\":\"photo_id\",\"type\":\"flags.2?long\"},{\"name\":\"author\",\"type\":\"flags.3?string\"},{\"name\":\"published_date\",\"type\":\"flags.4?int\"}],\"type\":\"PageRelatedArticle\"},{\"id\":370236054,\"predicate\":\"pageBlockRelatedArticles\",\"params\":[{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"articles\",\"type\":\"Vector<PageRelatedArticle>\"}],\"type\":\"PageBlock\"},{\"id\":-1538310410,\"predicate\":\"pageBlockMap\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-1738178803,\"predicate\":\"page\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"part\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.1?true\"},{\"name\":\"v2\",\"type\":\"flags.2?true\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector<PageBlock>\"},{\"name\":\"photos\",\"type\":\"Vector<Photo>\"},{\"name\":\"documents\",\"type\":\"Vector<Document>\"},{\"name\":\"views\",\"type\":\"flags.3?int\"}],\"type\":\"Page\"},{\"id\":-610373422,\"predicate\":\"inputPrivacyKeyPhoneP2P\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":961092808,\"predicate\":\"privacyKeyPhoneP2P\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":894777186,\"predicate\":\"textAnchor\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":-1945767479,\"predicate\":\"help.supportName\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"help.SupportName\"},{\"id\":-206688531,\"predicate\":\"help.userInfoEmpty\",\"params\":[],\"type\":\"help.UserInfo\"},{\"id\":32192344,\"predicate\":\"help.userInfo\",\"params\":[{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector<MessageEntity>\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"help.UserInfo\"},{\"id\":-202219658,\"predicate\":\"messageActionContactSignUp\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1398708869,\"predicate\":\"updateMessagePoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"poll_id\",\"type\":\"long\"},{\"name\":\"poll\",\"type\":\"flags.0?Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"Update\"},{\"id\":1823064809,\"predicate\":\"pollAnswer\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"option\",\"type\":\"bytes\"}],\"type\":\"PollAnswer\"},{\"id\":-2032041631,\"predicate\":\"poll\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"closed\",\"type\":\"flags.0?true\"},{\"name\":\"public_voters\",\"type\":\"flags.1?true\"},{\"name\":\"multiple_choice\",\"type\":\"flags.2?true\"},{\"name\":\"quiz\",\"type\":\"flags.3?true\"},{\"name\":\"question\",\"type\":\"string\"},{\"name\":\"answers\",\"type\":\"Vector<PollAnswer>\"},{\"name\":\"close_period\",\"type\":\"flags.4?int\"},{\"name\":\"close_date\",\"type\":\"flags.5?int\"}],\"type\":\"Poll\"},{\"id\":997055186,\"predicate\":\"pollAnswerVoters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen\",\"type\":\"flags.0?true\"},{\"name\":\"correct\",\"type\":\"flags.1?true\"},{\"name\":\"option\",\"type\":\"bytes\"},{\"name\":\"voters\",\"type\":\"int\"}],\"type\":\"PollAnswerVoters\"},{\"id\":-591909213,\"predicate\":\"pollResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"min\",\"type\":\"flags.0?true\"},{\"name\":\"results\",\"type\":\"flags.1?Vector<PollAnswerVoters>\"},{\"name\":\"total_voters\",\"type\":\"flags.2?int\"},{\"name\":\"recent_voters\",\"type\":\"flags.3?Vector<long>\"},{\"name\":\"solution\",\"type\":\"flags.4?string\"},{\"name\":\"solution_entities\",\"type\":\"flags.4?Vector<MessageEntity>\"}],\"type\":\"PollResults\"},{\"id\":261416433,\"predicate\":\"inputMediaPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"correct_answers\",\"type\":\"flags.0?Vector<bytes>\"},{\"name\":\"solution\",\"type\":\"flags.1?string\"},{\"name\":\"solution_entities\",\"type\":\"flags.1?Vector<MessageEntity>\"}],\"type\":\"InputMedia\"},{\"id\":1272375192,\"predicate\":\"messageMediaPoll\",\"params\":[{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"MessageMedia\"},{\"id\":-264117680,\"predicate\":\"chatOnlines\",\"params\":[{\"name\":\"onlines\",\"type\":\"int\"}],\"type\":\"ChatOnlines\"},{\"id\":1202287072,\"predicate\":\"statsURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"StatsURL\"},{\"id\":-525288402,\"predicate\":\"photoStrippedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":1605510357,\"predicate\":\"chatAdminRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"change_info\",\"type\":\"flags.0?true\"},{\"name\":\"post_messages\",\"type\":\"flags.1?true\"},{\"name\":\"edit_messages\",\"type\":\"flags.2?true\"},{\"name\":\"delete_messages\",\"type\":\"flags.3?true\"},{\"name\":\"ban_users\",\"type\":\"flags.4?true\"},{\"name\":\"invite_users\",\"type\":\"flags.5?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.7?true\"},{\"name\":\"add_admins\",\"type\":\"flags.9?true\"},{\"name\":\"anonymous\",\"type\":\"flags.10?true\"},{\"name\":\"manage_call\",\"type\":\"flags.11?true\"},{\"name\":\"other\",\"type\":\"flags.12?true\"}],\"type\":\"ChatAdminRights\"},{\"id\":-1626209256,\"predicate\":\"chatBannedRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"view_messages\",\"type\":\"flags.0?true\"},{\"name\":\"send_messages\",\"type\":\"flags.1?true\"},{\"name\":\"send_media\",\"type\":\"flags.2?true\"},{\"name\":\"send_stickers\",\"type\":\"flags.3?true\"},{\"name\":\"send_gifs\",\"type\":\"flags.4?true\"},{\"name\":\"send_games\",\"type\":\"flags.5?true\"},{\"name\":\"send_inline\",\"type\":\"flags.6?true\"},{\"name\":\"embed_links\",\"type\":\"flags.7?true\"},{\"name\":\"send_polls\",\"type\":\"flags.8?true\"},{\"name\":\"change_info\",\"type\":\"flags.10?true\"},{\"name\":\"invite_users\",\"type\":\"flags.15?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.17?true\"},{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"ChatBannedRights\"},{\"id\":1421875280,\"predicate\":\"updateChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"default_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-433014407,\"predicate\":\"inputWallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"id\":1913199744,\"predicate\":\"inputWallPaperSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputWallPaper\"},{\"id\":-1150621555,\"predicate\":\"channelParticipantsContacts\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":771095562,\"predicate\":\"channelAdminLogEventActionDefaultBannedRights\",\"params\":[{\"name\":\"prev_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"new_banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1895328189,\"predicate\":\"channelAdminLogEventActionStopPoll\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":471437699,\"predicate\":\"account.wallPapersNotModified\",\"params\":[],\"type\":\"account.WallPapers\"},{\"id\":-842824308,\"predicate\":\"account.wallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"wallpapers\",\"type\":\"Vector<WallPaper>\"}],\"type\":\"account.WallPapers\"},{\"id\":-1973130814,\"predicate\":\"codeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"allow_flashcall\",\"type\":\"flags.0?true\"},{\"name\":\"current_number\",\"type\":\"flags.1?true\"},{\"name\":\"allow_app_hash\",\"type\":\"flags.4?true\"},{\"name\":\"allow_missed_call\",\"type\":\"flags.5?true\"},{\"name\":\"logout_tokens\",\"type\":\"flags.6?Vector<bytes>\"}],\"type\":\"CodeSettings\"},{\"id\":499236004,\"predicate\":\"wallPaperSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blur\",\"type\":\"flags.1?true\"},{\"name\":\"motion\",\"type\":\"flags.2?true\"},{\"name\":\"background_color\",\"type\":\"flags.0?int\"},{\"name\":\"second_background_color\",\"type\":\"flags.4?int\"},{\"name\":\"third_background_color\",\"type\":\"flags.5?int\"},{\"name\":\"fourth_background_color\",\"type\":\"flags.6?int\"},{\"name\":\"intensity\",\"type\":\"flags.3?int\"},{\"name\":\"rotation\",\"type\":\"flags.4?int\"}],\"type\":\"WallPaperSettings\"},{\"id\":-1896171181,\"predicate\":\"autoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"disabled\",\"type\":\"flags.0?true\"},{\"name\":\"video_preload_large\",\"type\":\"flags.1?true\"},{\"name\":\"audio_preload_next\",\"type\":\"flags.2?true\"},{\"name\":\"phonecalls_less_data\",\"type\":\"flags.3?true\"},{\"name\":\"photo_size_max\",\"type\":\"int\"},{\"name\":\"video_size_max\",\"type\":\"long\"},{\"name\":\"file_size_max\",\"type\":\"long\"},{\"name\":\"video_upload_maxbitrate\",\"type\":\"int\"}],\"type\":\"AutoDownloadSettings\"},{\"id\":1674235686,\"predicate\":\"account.autoDownloadSettings\",\"params\":[{\"name\":\"low\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"medium\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"high\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"account.AutoDownloadSettings\"},{\"id\":-709641735,\"predicate\":\"emojiKeyword\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector<string>\"}],\"type\":\"EmojiKeyword\"},{\"id\":594408994,\"predicate\":\"emojiKeywordDeleted\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector<string>\"}],\"type\":\"EmojiKeyword\"},{\"id\":1556570557,\"predicate\":\"emojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"keywords\",\"type\":\"Vector<EmojiKeyword>\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":-1519029347,\"predicate\":\"emojiURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":-1275374751,\"predicate\":\"emojiLanguage\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiLanguage\"},{\"id\":-1529000952,\"predicate\":\"inputPrivacyKeyForwards\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1777096355,\"predicate\":\"privacyKeyForwards\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1461304012,\"predicate\":\"inputPrivacyKeyProfilePhoto\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1777000467,\"predicate\":\"privacyKeyProfilePhoto\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1075322878,\"predicate\":\"inputPhotoFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":-667654413,\"predicate\":\"inputPhotoLegacyFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":925204121,\"predicate\":\"inputPeerPhotoFileLocation\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"photo_id\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":-1652231205,\"predicate\":\"inputStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb_version\",\"type\":\"int\"}],\"type\":\"InputFileLocation\"},{\"id\":-11252123,\"predicate\":\"folder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autofill_new_broadcasts\",\"type\":\"flags.0?true\"},{\"name\":\"autofill_public_groups\",\"type\":\"flags.1?true\"},{\"name\":\"autofill_new_correspondents\",\"type\":\"flags.2?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.3?ChatPhoto\"}],\"type\":\"Folder\"},{\"id\":1908216652,\"predicate\":\"dialogFolder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"folder\",\"type\":\"Folder\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"unread_muted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_muted_messages_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_messages_count\",\"type\":\"int\"}],\"type\":\"Dialog\"},{\"id\":1684014375,\"predicate\":\"inputDialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputDialogPeer\"},{\"id\":1363483106,\"predicate\":\"dialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"DialogPeer\"},{\"id\":-70073706,\"predicate\":\"inputFolderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputFolderPeer\"},{\"id\":-373643672,\"predicate\":\"folderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"FolderPeer\"},{\"id\":422972864,\"predicate\":\"updateFolderPeers\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector<FolderPeer>\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":497305826,\"predicate\":\"inputUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":1536380829,\"predicate\":\"inputChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":-1468331492,\"predicate\":\"inputPeerUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1121318848,\"predicate\":\"inputPeerChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":55761658,\"predicate\":\"inputPrivacyKeyPhoneNumber\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-778378131,\"predicate\":\"privacyKeyPhoneNumber\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-1472172887,\"predicate\":\"topPeerCategoryForwardUsers\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-68239120,\"predicate\":\"topPeerCategoryForwardChats\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":84703944,\"predicate\":\"channelAdminLogEventActionChangeLinkedChat\",\"params\":[{\"name\":\"prev_value\",\"type\":\"long\"},{\"name\":\"new_value\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-398136321,\"predicate\":\"messages.searchCounter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.SearchCounter\"},{\"id\":280464681,\"predicate\":\"keyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"button_id\",\"type\":\"int\"}],\"type\":\"KeyboardButton\"},{\"id\":-802258988,\"predicate\":\"inputKeyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.1?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"bot\",\"type\":\"InputUser\"}],\"type\":\"KeyboardButton\"},{\"id\":-1831650802,\"predicate\":\"urlAuthResultRequest\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"bot\",\"type\":\"User\"},{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1886646706,\"predicate\":\"urlAuthResultAccepted\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1445536993,\"predicate\":\"urlAuthResultDefault\",\"params\":[],\"type\":\"UrlAuthResult\"},{\"id\":-2079962673,\"predicate\":\"inputPrivacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector<long>\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-380694650,\"predicate\":\"inputPrivacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector<long>\"}],\"type\":\"InputPrivacyRule\"},{\"id\":1796427406,\"predicate\":\"privacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector<long>\"}],\"type\":\"PrivacyRule\"},{\"id\":1103656293,\"predicate\":\"privacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector<long>\"}],\"type\":\"PrivacyRule\"},{\"id\":-1672577397,\"predicate\":\"messageEntityUnderline\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1090087980,\"predicate\":\"messageEntityStrike\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":34469328,\"predicate\":\"messageEntityBlockquote\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1786671974,\"predicate\":\"updatePeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"}],\"type\":\"Update\"},{\"id\":-1078612597,\"predicate\":\"channelLocationEmpty\",\"params\":[],\"type\":\"ChannelLocation\"},{\"id\":547062491,\"predicate\":\"channelLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"GeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"ChannelLocation\"},{\"id\":-901375139,\"predicate\":\"peerLocated\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"id\":-1263546448,\"predicate\":\"updatePeerLocated\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector<PeerLocated>\"}],\"type\":\"Update\"},{\"id\":241923758,\"predicate\":\"channelAdminLogEventActionChangeLocation\",\"params\":[{\"name\":\"prev_value\",\"type\":\"ChannelLocation\"},{\"name\":\"new_value\",\"type\":\"ChannelLocation\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-606798099,\"predicate\":\"inputReportReasonGeoIrrelevant\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":1401984889,\"predicate\":\"channelAdminLogEventActionToggleSlowMode\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1148485274,\"predicate\":\"auth.authorizationSignUpRequired\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"terms_of_service\",\"type\":\"flags.0?help.TermsOfService\"}],\"type\":\"auth.Authorization\"},{\"id\":-666824391,\"predicate\":\"payments.paymentVerificationNeeded\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"payments.PaymentResult\"},{\"id\":42402760,\"predicate\":\"inputStickerSetAnimatedEmoji\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":967122427,\"predicate\":\"updateNewScheduledMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"Update\"},{\"id\":-1870238482,\"predicate\":\"updateDeleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"messages\",\"type\":\"Vector<int>\"}],\"type\":\"Update\"},{\"id\":-797791052,\"predicate\":\"restrictionReason\",\"params\":[{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"reason\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RestrictionReason\"},{\"id\":1012306921,\"predicate\":\"inputTheme\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputTheme\"},{\"id\":-175567375,\"predicate\":\"inputThemeSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputTheme\"},{\"id\":-1609668650,\"predicate\":\"theme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"for_chat\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"flags.2?Document\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector<ThemeSettings>\"},{\"name\":\"emoticon\",\"type\":\"flags.6?string\"},{\"name\":\"installs_count\",\"type\":\"flags.4?int\"}],\"type\":\"Theme\"},{\"id\":-199313886,\"predicate\":\"account.themesNotModified\",\"params\":[],\"type\":\"account.Themes\"},{\"id\":-1707242387,\"predicate\":\"account.themes\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"themes\",\"type\":\"Vector<Theme>\"}],\"type\":\"account.Themes\"},{\"id\":-2112423005,\"predicate\":\"updateTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"Theme\"}],\"type\":\"Update\"},{\"id\":-786326563,\"predicate\":\"inputPrivacyKeyAddedByPhone\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1124062251,\"predicate\":\"privacyKeyAddedByPhone\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-2027964103,\"predicate\":\"updateGeoLiveViewed\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1448076945,\"predicate\":\"updateLoginToken\",\"params\":[],\"type\":\"Update\"},{\"id\":1654593920,\"predicate\":\"auth.loginToken\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":110008598,\"predicate\":\"auth.loginTokenMigrateTo\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":957176926,\"predicate\":\"auth.loginTokenSuccess\",\"params\":[{\"name\":\"authorization\",\"type\":\"auth.Authorization\"}],\"type\":\"auth.LoginToken\"},{\"id\":1474462241,\"predicate\":\"account.contentSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"sensitive_enabled\",\"type\":\"flags.0?true\"},{\"name\":\"sensitive_can_change\",\"type\":\"flags.1?true\"}],\"type\":\"account.ContentSettings\"},{\"id\":-1456996667,\"predicate\":\"messages.inactiveChats\",\"params\":[{\"name\":\"dates\",\"type\":\"Vector<int>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.InactiveChats\"},{\"id\":-1012849566,\"predicate\":\"baseThemeClassic\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-69724536,\"predicate\":\"baseThemeDay\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-1212997976,\"predicate\":\"baseThemeNight\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":1834973166,\"predicate\":\"baseThemeTinted\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":1527845466,\"predicate\":\"baseThemeArctic\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-1770371538,\"predicate\":\"inputWallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"id\":-528465642,\"predicate\":\"wallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"dark\",\"type\":\"flags.4?true\"},{\"name\":\"settings\",\"type\":\"flags.2?WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":-1881255857,\"predicate\":\"inputThemeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message_colors_animated\",\"type\":\"flags.2?true\"},{\"name\":\"base_theme\",\"type\":\"BaseTheme\"},{\"name\":\"accent_color\",\"type\":\"int\"},{\"name\":\"outbox_accent_color\",\"type\":\"flags.3?int\"},{\"name\":\"message_colors\",\"type\":\"flags.0?Vector<int>\"},{\"name\":\"wallpaper\",\"type\":\"flags.1?InputWallPaper\"},{\"name\":\"wallpaper_settings\",\"type\":\"flags.1?WallPaperSettings\"}],\"type\":\"InputThemeSettings\"},{\"id\":-94849324,\"predicate\":\"themeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message_colors_animated\",\"type\":\"flags.2?true\"},{\"name\":\"base_theme\",\"type\":\"BaseTheme\"},{\"name\":\"accent_color\",\"type\":\"int\"},{\"name\":\"outbox_accent_color\",\"type\":\"flags.3?int\"},{\"name\":\"message_colors\",\"type\":\"flags.0?Vector<int>\"},{\"name\":\"wallpaper\",\"type\":\"flags.1?WallPaper\"}],\"type\":\"ThemeSettings\"},{\"id\":1421174295,\"predicate\":\"webPageAttributeTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"documents\",\"type\":\"flags.0?Vector<Document>\"},{\"name\":\"settings\",\"type\":\"flags.1?ThemeSettings\"}],\"type\":\"WebPageAttribute\"},{\"id\":274961865,\"predicate\":\"updateMessagePollVote\",\"params\":[{\"name\":\"poll_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"options\",\"type\":\"Vector<bytes>\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":886196148,\"predicate\":\"messageUserVote\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"option\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":1017491692,\"predicate\":\"messageUserVoteInputOption\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":-1973033641,\"predicate\":\"messageUserVoteMultiple\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"options\",\"type\":\"Vector<bytes>\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":136574537,\"predicate\":\"messages.votesList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"votes\",\"type\":\"Vector<MessageUserVote>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"next_offset\",\"type\":\"flags.0?string\"}],\"type\":\"messages.VotesList\"},{\"id\":-1144565411,\"predicate\":\"keyboardButtonRequestPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"quiz\",\"type\":\"flags.0?Bool\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1981704948,\"predicate\":\"messageEntityBankCard\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-177732982,\"predicate\":\"bankCardOpenUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"BankCardOpenUrl\"},{\"id\":1042605427,\"predicate\":\"payments.bankCardData\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"open_urls\",\"type\":\"Vector<BankCardOpenUrl>\"}],\"type\":\"payments.BankCardData\"},{\"id\":-118740917,\"predicate\":\"peerSelfLocated\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"id\":1949890536,\"predicate\":\"dialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"non_contacts\",\"type\":\"flags.1?true\"},{\"name\":\"groups\",\"type\":\"flags.2?true\"},{\"name\":\"broadcasts\",\"type\":\"flags.3?true\"},{\"name\":\"bots\",\"type\":\"flags.4?true\"},{\"name\":\"exclude_muted\",\"type\":\"flags.11?true\"},{\"name\":\"exclude_read\",\"type\":\"flags.12?true\"},{\"name\":\"exclude_archived\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"emoticon\",\"type\":\"flags.25?string\"},{\"name\":\"pinned_peers\",\"type\":\"Vector<InputPeer>\"},{\"name\":\"include_peers\",\"type\":\"Vector<InputPeer>\"},{\"name\":\"exclude_peers\",\"type\":\"Vector<InputPeer>\"}],\"type\":\"DialogFilter\"},{\"id\":2004110666,\"predicate\":\"dialogFilterSuggested\",\"params\":[{\"name\":\"filter\",\"type\":\"DialogFilter\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"DialogFilterSuggested\"},{\"id\":654302845,\"predicate\":\"updateDialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"filter\",\"type\":\"flags.0?DialogFilter\"}],\"type\":\"Update\"},{\"id\":-1512627963,\"predicate\":\"updateDialogFilterOrder\",\"params\":[{\"name\":\"order\",\"type\":\"Vector<int>\"}],\"type\":\"Update\"},{\"id\":889491791,\"predicate\":\"updateDialogFilters\",\"params\":[],\"type\":\"Update\"},{\"id\":-1237848657,\"predicate\":\"statsDateRangeDays\",\"params\":[{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"}],\"type\":\"StatsDateRangeDays\"},{\"id\":-884757282,\"predicate\":\"statsAbsValueAndPrev\",\"params\":[{\"name\":\"current\",\"type\":\"double\"},{\"name\":\"previous\",\"type\":\"double\"}],\"type\":\"StatsAbsValueAndPrev\"},{\"id\":-875679776,\"predicate\":\"statsPercentValue\",\"params\":[{\"name\":\"part\",\"type\":\"double\"},{\"name\":\"total\",\"type\":\"double\"}],\"type\":\"StatsPercentValue\"},{\"id\":1244130093,\"predicate\":\"statsGraphAsync\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"StatsGraph\"},{\"id\":-1092839390,\"predicate\":\"statsGraphError\",\"params\":[{\"name\":\"error\",\"type\":\"string\"}],\"type\":\"StatsGraph\"},{\"id\":-1901828938,\"predicate\":\"statsGraph\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"json\",\"type\":\"DataJSON\"},{\"name\":\"zoom_token\",\"type\":\"flags.0?string\"}],\"type\":\"StatsGraph\"},{\"id\":-1387279939,\"predicate\":\"messageInteractionCounters\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"views\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"MessageInteractionCounters\"},{\"id\":-1107852396,\"predicate\":\"stats.broadcastStats\",\"params\":[{\"name\":\"period\",\"type\":\"StatsDateRangeDays\"},{\"name\":\"followers\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"views_per_post\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"shares_per_post\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"enabled_notifications\",\"type\":\"StatsPercentValue\"},{\"name\":\"growth_graph\",\"type\":\"StatsGraph\"},{\"name\":\"followers_graph\",\"type\":\"StatsGraph\"},{\"name\":\"mute_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_hours_graph\",\"type\":\"StatsGraph\"},{\"name\":\"interactions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"iv_interactions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"views_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"new_followers_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"languages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"recent_message_interactions\",\"type\":\"Vector<MessageInteractionCounters>\"}],\"type\":\"stats.BroadcastStats\"},{\"id\":-428884101,\"predicate\":\"inputMediaDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":1065280907,\"predicate\":\"messageMediaDice\",\"params\":[{\"name\":\"value\",\"type\":\"int\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-427863538,\"predicate\":\"inputStickerSetDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":-1728664459,\"predicate\":\"help.promoDataEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.PromoData\"},{\"id\":-1942390465,\"predicate\":\"help.promoData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"proxy\",\"type\":\"flags.0?true\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"psa_type\",\"type\":\"flags.1?string\"},{\"name\":\"psa_message\",\"type\":\"flags.2?string\"}],\"type\":\"help.PromoData\"},{\"id\":-567037804,\"predicate\":\"videoSize\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"video_start_ts\",\"type\":\"flags.0?double\"}],\"type\":\"VideoSize\"},{\"id\":643940105,\"predicate\":\"updatePhoneCallSignalingData\",\"params\":[{\"name\":\"phone_call_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Update\"},{\"id\":1634294960,\"predicate\":\"chatInvitePeek\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"},{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"ChatInvite\"},{\"id\":-1660637285,\"predicate\":\"statsGroupTopPoster\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"int\"},{\"name\":\"avg_chars\",\"type\":\"int\"}],\"type\":\"StatsGroupTopPoster\"},{\"id\":-682079097,\"predicate\":\"statsGroupTopAdmin\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"deleted\",\"type\":\"int\"},{\"name\":\"kicked\",\"type\":\"int\"},{\"name\":\"banned\",\"type\":\"int\"}],\"type\":\"StatsGroupTopAdmin\"},{\"id\":1398765469,\"predicate\":\"statsGroupTopInviter\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"invitations\",\"type\":\"int\"}],\"type\":\"StatsGroupTopInviter\"},{\"id\":-276825834,\"predicate\":\"stats.megagroupStats\",\"params\":[{\"name\":\"period\",\"type\":\"StatsDateRangeDays\"},{\"name\":\"members\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"messages\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"viewers\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"posters\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"growth_graph\",\"type\":\"StatsGraph\"},{\"name\":\"members_graph\",\"type\":\"StatsGraph\"},{\"name\":\"new_members_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"languages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"messages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"actions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_hours_graph\",\"type\":\"StatsGraph\"},{\"name\":\"weekdays_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_posters\",\"type\":\"Vector<StatsGroupTopPoster>\"},{\"name\":\"top_admins\",\"type\":\"Vector<StatsGroupTopAdmin>\"},{\"name\":\"top_inviters\",\"type\":\"Vector<StatsGroupTopInviter>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"stats.MegagroupStats\"},{\"id\":-1096616924,\"predicate\":\"globalPrivacySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archive_and_mute_new_noncontact_peers\",\"type\":\"flags.0?Bool\"}],\"type\":\"GlobalPrivacySettings\"},{\"id\":1667228533,\"predicate\":\"phoneConnectionWebrtc\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"turn\",\"type\":\"flags.0?true\"},{\"name\":\"stun\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"username\",\"type\":\"string\"},{\"name\":\"password\",\"type\":\"string\"}],\"type\":\"PhoneConnection\"},{\"id\":1107543535,\"predicate\":\"help.countryCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"country_code\",\"type\":\"string\"},{\"name\":\"prefixes\",\"type\":\"flags.0?Vector<string>\"},{\"name\":\"patterns\",\"type\":\"flags.1?Vector<string>\"}],\"type\":\"help.CountryCode\"},{\"id\":-1014526429,\"predicate\":\"help.country\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"hidden\",\"type\":\"flags.0?true\"},{\"name\":\"iso2\",\"type\":\"string\"},{\"name\":\"default_name\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"flags.1?string\"},{\"name\":\"country_codes\",\"type\":\"Vector<help.CountryCode>\"}],\"type\":\"help.Country\"},{\"id\":-1815339214,\"predicate\":\"help.countriesListNotModified\",\"params\":[],\"type\":\"help.CountriesList\"},{\"id\":-2016381538,\"predicate\":\"help.countriesList\",\"params\":[{\"name\":\"countries\",\"type\":\"Vector<help.Country>\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.CountriesList\"},{\"id\":1163625789,\"predicate\":\"messageViews\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"views\",\"type\":\"flags.0?int\"},{\"name\":\"forwards\",\"type\":\"flags.1?int\"},{\"name\":\"replies\",\"type\":\"flags.2?MessageReplies\"}],\"type\":\"MessageViews\"},{\"id\":-761649164,\"predicate\":\"updateChannelMessageForwards\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-96535659,\"predicate\":\"photoSizeProgressive\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector<int>\"}],\"type\":\"PhotoSize\"},{\"id\":-1228606141,\"predicate\":\"messages.messageViews\",\"params\":[{\"name\":\"views\",\"type\":\"Vector<MessageViews>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.MessageViews\"},{\"id\":-693004986,\"predicate\":\"updateReadChannelDiscussionInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"},{\"name\":\"broadcast_id\",\"type\":\"flags.0?long\"},{\"name\":\"broadcast_post\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":1767677564,\"predicate\":\"updateReadChannelDiscussionOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1506535550,\"predicate\":\"messages.discussionMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"max_id\",\"type\":\"flags.0?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"flags.1?int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"flags.2?int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.DiscussionMessage\"},{\"id\":-1495959709,\"predicate\":\"messageReplyHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_to_scheduled\",\"type\":\"flags.2?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"reply_to_peer_id\",\"type\":\"flags.0?Peer\"},{\"name\":\"reply_to_top_id\",\"type\":\"flags.1?int\"}],\"type\":\"MessageReplyHeader\"},{\"id\":-2083123262,\"predicate\":\"messageReplies\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"comments\",\"type\":\"flags.0?true\"},{\"name\":\"replies\",\"type\":\"int\"},{\"name\":\"replies_pts\",\"type\":\"int\"},{\"name\":\"recent_repliers\",\"type\":\"flags.1?Vector<Peer>\"},{\"name\":\"channel_id\",\"type\":\"flags.0?long\"},{\"name\":\"max_id\",\"type\":\"flags.2?int\"},{\"name\":\"read_max_id\",\"type\":\"flags.3?int\"}],\"type\":\"MessageReplies\"},{\"id\":610945826,\"predicate\":\"updatePeerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"blocked\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":-386039788,\"predicate\":\"peerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"PeerBlocked\"},{\"id\":-1937192669,\"predicate\":\"updateChannelUserTyping\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":-1392895362,\"predicate\":\"inputMessageCallbackQuery\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"query_id\",\"type\":\"long\"}],\"type\":\"InputMessage\"},{\"id\":453242886,\"predicate\":\"channelParticipantLeft\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"ChannelParticipant\"},{\"id\":-531931925,\"predicate\":\"channelParticipantsMentions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"q\",\"type\":\"flags.0?string\"},{\"name\":\"top_msg_id\",\"type\":\"flags.1?int\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-309990731,\"predicate\":\"updatePinnedMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"messages\",\"type\":\"Vector<int>\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1538885128,\"predicate\":\"updatePinnedChannelMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector<int>\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":464520273,\"predicate\":\"inputMessagesFilterPinned\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1986399595,\"predicate\":\"stats.messageStats\",\"params\":[{\"name\":\"views_graph\",\"type\":\"StatsGraph\"}],\"type\":\"stats.MessageStats\"},{\"id\":-1730095465,\"predicate\":\"messageActionGeoProximityReached\",\"params\":[{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"to_id\",\"type\":\"Peer\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-668906175,\"predicate\":\"photoPathSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":-651419003,\"predicate\":\"speakingInGroupCallAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":2004925620,\"predicate\":\"groupCallDiscarded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"duration\",\"type\":\"int\"}],\"type\":\"GroupCall\"},{\"id\":-711498484,\"predicate\":\"groupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"join_muted\",\"type\":\"flags.1?true\"},{\"name\":\"can_change_join_muted\",\"type\":\"flags.2?true\"},{\"name\":\"join_date_asc\",\"type\":\"flags.6?true\"},{\"name\":\"schedule_start_subscribed\",\"type\":\"flags.8?true\"},{\"name\":\"can_start_video\",\"type\":\"flags.9?true\"},{\"name\":\"record_video_active\",\"type\":\"flags.11?true\"},{\"name\":\"rtmp_stream\",\"type\":\"flags.12?true\"},{\"name\":\"listeners_hidden\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.3?string\"},{\"name\":\"stream_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"record_start_date\",\"type\":\"flags.5?int\"},{\"name\":\"schedule_date\",\"type\":\"flags.7?int\"},{\"name\":\"unmuted_video_count\",\"type\":\"flags.10?int\"},{\"name\":\"unmuted_video_limit\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"GroupCall\"},{\"id\":-659913713,\"predicate\":\"inputGroupCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputGroupCall\"},{\"id\":2047704898,\"predicate\":\"messageActionGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"duration\",\"type\":\"flags.0?int\"}],\"type\":\"MessageAction\"},{\"id\":1345295095,\"predicate\":\"messageActionInviteToGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"users\",\"type\":\"Vector<long>\"}],\"type\":\"MessageAction\"},{\"id\":-341428482,\"predicate\":\"groupCallParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"muted\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.1?true\"},{\"name\":\"can_self_unmute\",\"type\":\"flags.2?true\"},{\"name\":\"just_joined\",\"type\":\"flags.4?true\"},{\"name\":\"versioned\",\"type\":\"flags.5?true\"},{\"name\":\"min\",\"type\":\"flags.8?true\"},{\"name\":\"muted_by_you\",\"type\":\"flags.9?true\"},{\"name\":\"volume_by_admin\",\"type\":\"flags.10?true\"},{\"name\":\"self\",\"type\":\"flags.12?true\"},{\"name\":\"video_joined\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"active_date\",\"type\":\"flags.3?int\"},{\"name\":\"source\",\"type\":\"int\"},{\"name\":\"volume\",\"type\":\"flags.7?int\"},{\"name\":\"about\",\"type\":\"flags.11?string\"},{\"name\":\"raise_hand_rating\",\"type\":\"flags.13?long\"},{\"name\":\"video\",\"type\":\"flags.6?GroupCallParticipantVideo\"},{\"name\":\"presentation\",\"type\":\"flags.14?GroupCallParticipantVideo\"}],\"type\":\"GroupCallParticipant\"},{\"id\":-124097970,\"predicate\":\"updateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-219423922,\"predicate\":\"updateGroupCallParticipants\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"participants\",\"type\":\"Vector<GroupCallParticipant>\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":347227392,\"predicate\":\"updateGroupCall\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"call\",\"type\":\"GroupCall\"}],\"type\":\"Update\"},{\"id\":-1636664659,\"predicate\":\"phone.groupCall\",\"params\":[{\"name\":\"call\",\"type\":\"GroupCall\"},{\"name\":\"participants\",\"type\":\"Vector<GroupCallParticipant>\"},{\"name\":\"participants_next_offset\",\"type\":\"string\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"phone.GroupCall\"},{\"id\":-193506890,\"predicate\":\"phone.groupParticipants\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector<GroupCallParticipant>\"},{\"name\":\"next_offset\",\"type\":\"string\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"phone.GroupParticipants\"},{\"id\":813821341,\"predicate\":\"inlineQueryPeerTypeSameBotPM\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":-2093215828,\"predicate\":\"inlineQueryPeerTypePM\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":-681130742,\"predicate\":\"inlineQueryPeerTypeChat\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":1589952067,\"predicate\":\"inlineQueryPeerTypeMegagroup\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":1664413338,\"predicate\":\"inlineQueryPeerTypeBroadcast\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":589338437,\"predicate\":\"channelAdminLogEventActionStartGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-610299584,\"predicate\":\"channelAdminLogEventActionDiscardGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-115071790,\"predicate\":\"channelAdminLogEventActionParticipantMute\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-431740480,\"predicate\":\"channelAdminLogEventActionParticipantUnmute\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1456906823,\"predicate\":\"channelAdminLogEventActionToggleGroupCallSetting\",\"params\":[{\"name\":\"join_muted\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1966921727,\"predicate\":\"inputPaymentCredentialsGooglePay\",\"params\":[{\"name\":\"payment_token\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":375566091,\"predicate\":\"messages.historyImport\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"messages.HistoryImport\"},{\"id\":-606432698,\"predicate\":\"sendMessageHistoryImportAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":1578088377,\"predicate\":\"messages.historyImportParsed\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pm\",\"type\":\"flags.0?true\"},{\"name\":\"group\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"flags.2?string\"}],\"type\":\"messages.HistoryImportParsed\"},{\"id\":-170010905,\"predicate\":\"inputReportReasonFake\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-275956116,\"predicate\":\"messages.affectedFoundMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"messages\",\"type\":\"Vector<int>\"}],\"type\":\"messages.AffectedFoundMessages\"},{\"id\":-1441072131,\"predicate\":\"messageActionSetMessagesTTL\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-1147422299,\"predicate\":\"updatePeerHistoryTTL\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"ttl_period\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":-796432838,\"predicate\":\"updateChatParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"actor_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"prev_participant\",\"type\":\"flags.0?ChatParticipant\"},{\"name\":\"new_participant\",\"type\":\"flags.1?ChatParticipant\"},{\"name\":\"invite\",\"type\":\"flags.2?ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1738720581,\"predicate\":\"updateChannelParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"actor_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"prev_participant\",\"type\":\"flags.0?ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"flags.1?ChannelParticipant\"},{\"name\":\"invite\",\"type\":\"flags.2?ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-997782967,\"predicate\":\"updateBotStopped\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"stopped\",\"type\":\"Bool\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1940201511,\"predicate\":\"chatInviteImporter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requested\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"about\",\"type\":\"flags.2?string\"},{\"name\":\"approved_by\",\"type\":\"flags.1?long\"}],\"type\":\"ChatInviteImporter\"},{\"id\":-1111085620,\"predicate\":\"messages.exportedChatInvites\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"invites\",\"type\":\"Vector<ExportedChatInvite>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.ExportedChatInvites\"},{\"id\":410107472,\"predicate\":\"messages.exportedChatInvite\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":572915951,\"predicate\":\"messages.exportedChatInviteReplaced\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"new_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":-2118733814,\"predicate\":\"messages.chatInviteImporters\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"importers\",\"type\":\"Vector<ChatInviteImporter>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.ChatInviteImporters\"},{\"id\":-219353309,\"predicate\":\"chatAdminWithInvites\",\"params\":[{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"invites_count\",\"type\":\"int\"},{\"name\":\"revoked_invites_count\",\"type\":\"int\"}],\"type\":\"ChatAdminWithInvites\"},{\"id\":-1231326505,\"predicate\":\"messages.chatAdminsWithInvites\",\"params\":[{\"name\":\"admins\",\"type\":\"Vector<ChatAdminWithInvites>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.ChatAdminsWithInvites\"},{\"id\":1557846647,\"predicate\":\"channelAdminLogEventActionParticipantJoinByInvite\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1515256996,\"predicate\":\"channelAdminLogEventActionExportedInviteDelete\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1091179342,\"predicate\":\"channelAdminLogEventActionExportedInviteRevoke\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-384910503,\"predicate\":\"channelAdminLogEventActionExportedInviteEdit\",\"params\":[{\"name\":\"prev_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"new_invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1048537159,\"predicate\":\"channelAdminLogEventActionParticipantVolume\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1855199800,\"predicate\":\"channelAdminLogEventActionChangeHistoryTTL\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1571952873,\"predicate\":\"messages.checkedHistoryImportPeer\",\"params\":[{\"name\":\"confirm_text\",\"type\":\"string\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"id\":93890858,\"predicate\":\"inputGroupCallStream\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"time_ms\",\"type\":\"long\"},{\"name\":\"scale\",\"type\":\"int\"},{\"name\":\"video_channel\",\"type\":\"flags.0?int\"},{\"name\":\"video_quality\",\"type\":\"flags.0?int\"}],\"type\":\"InputFileLocation\"},{\"id\":-1343921601,\"predicate\":\"phone.joinAsPeers\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector<Peer>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"phone.JoinAsPeers\"},{\"id\":541839704,\"predicate\":\"phone.exportedGroupCallInvite\",\"params\":[{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"phone.ExportedGroupCallInvite\"},{\"id\":-672693723,\"predicate\":\"inputBotInlineMessageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":894081801,\"predicate\":\"botInlineMessageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1281329567,\"predicate\":\"messageActionGroupCallScheduled\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"schedule_date\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-592373577,\"predicate\":\"groupCallParticipantVideoSourceGroup\",\"params\":[{\"name\":\"semantics\",\"type\":\"string\"},{\"name\":\"sources\",\"type\":\"Vector<int>\"}],\"type\":\"GroupCallParticipantVideoSourceGroup\"},{\"id\":1735736008,\"predicate\":\"groupCallParticipantVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"paused\",\"type\":\"flags.0?true\"},{\"name\":\"endpoint\",\"type\":\"string\"},{\"name\":\"source_groups\",\"type\":\"Vector<GroupCallParticipantVideoSourceGroup>\"},{\"name\":\"audio_source\",\"type\":\"flags.1?int\"}],\"type\":\"GroupCallParticipantVideo\"},{\"id\":192428418,\"predicate\":\"updateGroupCallConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"presentation\",\"type\":\"flags.0?true\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":-2046910401,\"predicate\":\"stickers.suggestedShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"stickers.SuggestedShortName\"},{\"id\":795652779,\"predicate\":\"botCommandScopeDefault\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":1011811544,\"predicate\":\"botCommandScopeUsers\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":1877059713,\"predicate\":\"botCommandScopeChats\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":-1180016534,\"predicate\":\"botCommandScopeChatAdmins\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":-610432643,\"predicate\":\"botCommandScopePeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"BotCommandScope\"},{\"id\":1071145937,\"predicate\":\"botCommandScopePeerAdmins\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"BotCommandScope\"},{\"id\":169026035,\"predicate\":\"botCommandScopePeerUser\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"BotCommandScope\"},{\"id\":-478701471,\"predicate\":\"account.resetPasswordFailedWait\",\"params\":[{\"name\":\"retry_date\",\"type\":\"int\"}],\"type\":\"account.ResetPasswordResult\"},{\"id\":-370148227,\"predicate\":\"account.resetPasswordRequestedWait\",\"params\":[{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"account.ResetPasswordResult\"},{\"id\":-383330754,\"predicate\":\"account.resetPasswordOk\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":1299263278,\"predicate\":\"updateBotCommands\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"commands\",\"type\":\"Vector<BotCommand>\"}],\"type\":\"Update\"},{\"id\":-1434950843,\"predicate\":\"messageActionSetChatTheme\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-1336228175,\"predicate\":\"sendMessageChooseStickerAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":981691896,\"predicate\":\"sponsoredMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"recommended\",\"type\":\"flags.5?true\"},{\"name\":\"random_id\",\"type\":\"bytes\"},{\"name\":\"from_id\",\"type\":\"flags.3?Peer\"},{\"name\":\"chat_invite\",\"type\":\"flags.4?ChatInvite\"},{\"name\":\"chat_invite_hash\",\"type\":\"flags.4?string\"},{\"name\":\"channel_post\",\"type\":\"flags.2?int\"},{\"name\":\"start_param\",\"type\":\"flags.0?string\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector<MessageEntity>\"}],\"type\":\"SponsoredMessage\"},{\"id\":1705297877,\"predicate\":\"messages.sponsoredMessages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector<SponsoredMessage>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.SponsoredMessages\"},{\"id\":215889721,\"predicate\":\"inputStickerSetAnimatedEmojiAnimations\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":630664139,\"predicate\":\"sendMessageEmojiInteraction\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"interaction\",\"type\":\"DataJSON\"}],\"type\":\"SendMessageAction\"},{\"id\":-1234857938,\"predicate\":\"sendMessageEmojiInteractionSeen\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"SendMessageAction\"},{\"id\":-1227287081,\"predicate\":\"inputBotInlineMessageID64\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"owner_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"id\":-911191137,\"predicate\":\"searchResultsCalendarPeriod\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"min_msg_id\",\"type\":\"int\"},{\"name\":\"max_msg_id\",\"type\":\"int\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"SearchResultsCalendarPeriod\"},{\"id\":343859772,\"predicate\":\"messages.searchResultsCalendar\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.0?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"min_msg_id\",\"type\":\"int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.1?int\"},{\"name\":\"periods\",\"type\":\"Vector<SearchResultsCalendarPeriod>\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.SearchResultsCalendar\"},{\"id\":2137295719,\"predicate\":\"searchResultPosition\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"SearchResultsPosition\"},{\"id\":1404185519,\"predicate\":\"messages.searchResultsPositions\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"positions\",\"type\":\"Vector<SearchResultsPosition>\"}],\"type\":\"messages.SearchResultsPositions\"},{\"id\":-339958837,\"predicate\":\"messageActionChatJoinedByRequest\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":1885586395,\"predicate\":\"updatePendingJoinRequests\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"requests_pending\",\"type\":\"int\"},{\"name\":\"recent_requesters\",\"type\":\"Vector<long>\"}],\"type\":\"Update\"},{\"id\":299870598,\"predicate\":\"updateBotChatInviteRequester\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1347021750,\"predicate\":\"channelAdminLogEventActionParticipantJoinByRequest\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"approved_by\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-376962181,\"predicate\":\"inputKeyboardButtonUserProfile\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"KeyboardButton\"},{\"id\":814112961,\"predicate\":\"keyboardButtonUserProfile\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"KeyboardButton\"},{\"id\":-191450938,\"predicate\":\"channels.sendAsPeers\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector<SendAsPeer>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"channels.SendAsPeers\"},{\"id\":-886388890,\"predicate\":\"channelAdminLogEventActionToggleNoForwards\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-738646805,\"predicate\":\"messages.stickerSetNotModified\",\"params\":[],\"type\":\"messages.StickerSet\"},{\"id\":997004590,\"predicate\":\"users.userFull\",\"params\":[{\"name\":\"full_user\",\"type\":\"UserFull\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"users.UserFull\"},{\"id\":1753266509,\"predicate\":\"messages.peerSettings\",\"params\":[{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.PeerSettings\"},{\"id\":663693416,\"predicate\":\"channelAdminLogEventActionSendMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-702884114,\"predicate\":\"auth.codeTypeMissedCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":-2113903484,\"predicate\":\"auth.sentCodeTypeMissedCall\",\"params\":[{\"name\":\"prefix\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1012759713,\"predicate\":\"auth.loggedOut\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"future_auth_token\",\"type\":\"flags.0?bytes\"}],\"type\":\"auth.LoggedOut\"},{\"id\":357013699,\"predicate\":\"updateMessageReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"MessageReactions\"}],\"type\":\"Update\"},{\"id\":-1546531968,\"predicate\":\"reactionCount\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen_order\",\"type\":\"flags.0?int\"},{\"name\":\"reaction\",\"type\":\"Reaction\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"ReactionCount\"},{\"id\":1328256121,\"predicate\":\"messageReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"min\",\"type\":\"flags.0?true\"},{\"name\":\"can_see_list\",\"type\":\"flags.2?true\"},{\"name\":\"results\",\"type\":\"Vector<ReactionCount>\"},{\"name\":\"recent_reactions\",\"type\":\"flags.1?Vector<MessagePeerReaction>\"}],\"type\":\"MessageReactions\"},{\"id\":834488621,\"predicate\":\"messages.messageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"Vector<MessagePeerReaction>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"next_offset\",\"type\":\"flags.0?string\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":-1065882623,\"predicate\":\"availableReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inactive\",\"type\":\"flags.0?true\"},{\"name\":\"premium\",\"type\":\"flags.2?true\"},{\"name\":\"reaction\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"static_icon\",\"type\":\"Document\"},{\"name\":\"appear_animation\",\"type\":\"Document\"},{\"name\":\"select_animation\",\"type\":\"Document\"},{\"name\":\"activate_animation\",\"type\":\"Document\"},{\"name\":\"effect_animation\",\"type\":\"Document\"},{\"name\":\"around_animation\",\"type\":\"flags.1?Document\"},{\"name\":\"center_icon\",\"type\":\"flags.1?Document\"}],\"type\":\"AvailableReaction\"},{\"id\":-1626924713,\"predicate\":\"messages.availableReactionsNotModified\",\"params\":[],\"type\":\"messages.AvailableReactions\"},{\"id\":1989032621,\"predicate\":\"messages.availableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"Vector<AvailableReaction>\"}],\"type\":\"messages.AvailableReactions\"},{\"id\":852137487,\"predicate\":\"messageEntitySpoiler\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1102180616,\"predicate\":\"channelAdminLogEventActionChangeAvailableReactions\",\"params\":[{\"name\":\"prev_value\",\"type\":\"ChatReactions\"},{\"name\":\"new_value\",\"type\":\"ChatReactions\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1741309751,\"predicate\":\"messages.translateNoResult\",\"params\":[],\"type\":\"messages.TranslatedText\"},{\"id\":-1575684144,\"predicate\":\"messages.translateResultText\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"messages.TranslatedText\"},{\"id\":-1319698788,\"predicate\":\"messagePeerReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.0?true\"},{\"name\":\"unread\",\"type\":\"flags.1?true\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"reaction\",\"type\":\"Reaction\"}],\"type\":\"MessagePeerReaction\"},{\"id\":-2132064081,\"predicate\":\"groupCallStreamChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"int\"},{\"name\":\"scale\",\"type\":\"int\"},{\"name\":\"last_timestamp_ms\",\"type\":\"long\"}],\"type\":\"GroupCallStreamChannel\"},{\"id\":-790330702,\"predicate\":\"phone.groupCallStreamChannels\",\"params\":[{\"name\":\"channels\",\"type\":\"Vector<GroupCallStreamChannel>\"}],\"type\":\"phone.GroupCallStreamChannels\"},{\"id\":177124030,\"predicate\":\"inputReportReasonIllegalDrugs\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1631091139,\"predicate\":\"inputReportReasonPersonalDetails\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":767505458,\"predicate\":\"phone.groupCallStreamRtmpUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"key\",\"type\":\"string\"}],\"type\":\"phone.GroupCallStreamRtmpUrl\"},{\"id\":1165423600,\"predicate\":\"attachMenuBotIconColor\",\"params\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"color\",\"type\":\"int\"}],\"type\":\"AttachMenuBotIconColor\"},{\"id\":-1297663893,\"predicate\":\"attachMenuBotIcon\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"icon\",\"type\":\"Document\"},{\"name\":\"colors\",\"type\":\"flags.0?Vector<AttachMenuBotIconColor>\"}],\"type\":\"AttachMenuBotIcon\"},{\"id\":-928371502,\"predicate\":\"attachMenuBot\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inactive\",\"type\":\"flags.0?true\"},{\"name\":\"has_settings\",\"type\":\"flags.1?true\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"peer_types\",\"type\":\"Vector<AttachMenuPeerType>\"},{\"name\":\"icons\",\"type\":\"Vector<AttachMenuBotIcon>\"}],\"type\":\"AttachMenuBot\"},{\"id\":-237467044,\"predicate\":\"attachMenuBotsNotModified\",\"params\":[],\"type\":\"AttachMenuBots\"},{\"id\":1011024320,\"predicate\":\"attachMenuBots\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"bots\",\"type\":\"Vector<AttachMenuBot>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"AttachMenuBots\"},{\"id\":-1816172929,\"predicate\":\"attachMenuBotsBot\",\"params\":[{\"name\":\"bot\",\"type\":\"AttachMenuBot\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"AttachMenuBotsBot\"},{\"id\":397910539,\"predicate\":\"updateAttachMenuBots\",\"params\":[],\"type\":\"Update\"},{\"id\":202659196,\"predicate\":\"webViewResultUrl\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"WebViewResult\"},{\"id\":-2010155333,\"predicate\":\"simpleWebViewResultUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"SimpleWebViewResult\"},{\"id\":211046684,\"predicate\":\"webViewMessageSent\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"msg_id\",\"type\":\"flags.0?InputBotInlineMessageID\"}],\"type\":\"WebViewMessageSent\"},{\"id\":361936797,\"predicate\":\"updateWebViewResultSent\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":326529584,\"predicate\":\"keyboardButtonWebView\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1598009252,\"predicate\":\"keyboardButtonSimpleWebView\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1205698681,\"predicate\":\"messageActionWebViewDataSentMe\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-1262252875,\"predicate\":\"messageActionWebViewDataSent\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":347625491,\"predicate\":\"updateBotMenuButton\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"button\",\"type\":\"BotMenuButton\"}],\"type\":\"Update\"},{\"id\":1966318984,\"predicate\":\"botMenuButtonDefault\",\"params\":[],\"type\":\"BotMenuButton\"},{\"id\":1113113093,\"predicate\":\"botMenuButtonCommands\",\"params\":[],\"type\":\"BotMenuButton\"},{\"id\":-944407322,\"predicate\":\"botMenuButton\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"BotMenuButton\"},{\"id\":-67704655,\"predicate\":\"account.savedRingtonesNotModified\",\"params\":[],\"type\":\"account.SavedRingtones\"},{\"id\":-1041683259,\"predicate\":\"account.savedRingtones\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"ringtones\",\"type\":\"Vector<Document>\"}],\"type\":\"account.SavedRingtones\"},{\"id\":1960361625,\"predicate\":\"updateSavedRingtones\",\"params\":[],\"type\":\"Update\"},{\"id\":-1746354498,\"predicate\":\"notificationSoundDefault\",\"params\":[],\"type\":\"NotificationSound\"},{\"id\":1863070943,\"predicate\":\"notificationSoundNone\",\"params\":[],\"type\":\"NotificationSound\"},{\"id\":-2096391452,\"predicate\":\"notificationSoundLocal\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"NotificationSound\"},{\"id\":-9666487,\"predicate\":\"notificationSoundRingtone\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"NotificationSound\"},{\"id\":-1222230163,\"predicate\":\"account.savedRingtone\",\"params\":[],\"type\":\"account.SavedRingtone\"},{\"id\":523271863,\"predicate\":\"account.savedRingtoneConverted\",\"params\":[{\"name\":\"document\",\"type\":\"Document\"}],\"type\":\"account.SavedRingtone\"},{\"id\":2104224014,\"predicate\":\"attachMenuPeerTypeSameBotPM\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":-1020528102,\"predicate\":\"attachMenuPeerTypeBotPM\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":-247016673,\"predicate\":\"attachMenuPeerTypePM\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":84480319,\"predicate\":\"attachMenuPeerTypeChat\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":2080104188,\"predicate\":\"attachMenuPeerTypeBroadcast\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":-317687113,\"predicate\":\"chatInvitePublicJoinRequests\",\"params\":[],\"type\":\"ExportedChatInvite\"},{\"id\":-977967015,\"predicate\":\"inputInvoiceMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"InputInvoice\"},{\"id\":-1020867857,\"predicate\":\"inputInvoiceSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputInvoice\"},{\"id\":-1362048039,\"predicate\":\"payments.exportedInvoice\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"payments.ExportedInvoice\"},{\"id\":8703322,\"predicate\":\"updateTranscribedAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pending\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"transcription_id\",\"type\":\"long\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":-1821037486,\"predicate\":\"messages.transcribedAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pending\",\"type\":\"flags.0?true\"},{\"name\":\"transcription_id\",\"type\":\"long\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"messages.TranscribedAudio\"},{\"id\":909284270,\"predicate\":\"dialogFilterDefault\",\"params\":[],\"type\":\"DialogFilter\"},{\"id\":1395946908,\"predicate\":\"help.premiumPromo\",\"params\":[{\"name\":\"status_text\",\"type\":\"string\"},{\"name\":\"status_entities\",\"type\":\"Vector<MessageEntity>\"},{\"name\":\"video_sections\",\"type\":\"Vector<string>\"},{\"name\":\"videos\",\"type\":\"Vector<Document>\"},{\"name\":\"period_options\",\"type\":\"Vector<PremiumSubscriptionOption>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"help.PremiumPromo\"},{\"id\":-925956616,\"predicate\":\"messageEntityCustomEmoji\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"MessageEntity\"},{\"id\":-48981863,\"predicate\":\"documentAttributeCustomEmoji\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"free\",\"type\":\"flags.0?true\"},{\"name\":\"alt\",\"type\":\"string\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"DocumentAttribute\"},{\"id\":1087454222,\"predicate\":\"stickerSetFullCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector<StickerPack>\"},{\"name\":\"keywords\",\"type\":\"Vector<StickerKeyword>\"},{\"name\":\"documents\",\"type\":\"Vector<Document>\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1502273946,\"predicate\":\"inputStorePaymentPremiumSubscription\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"restore\",\"type\":\"flags.0?true\"}],\"type\":\"InputStorePaymentPurpose\"},{\"id\":1634697192,\"predicate\":\"inputStorePaymentGiftPremium\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"}],\"type\":\"InputStorePaymentPurpose\"},{\"id\":-1415514682,\"predicate\":\"messageActionGiftPremium\",\"params\":[{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"},{\"name\":\"months\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":1958953753,\"predicate\":\"premiumGiftOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"months\",\"type\":\"int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"},{\"name\":\"bot_url\",\"type\":\"string\"},{\"name\":\"store_product\",\"type\":\"flags.0?string\"}],\"type\":\"PremiumGiftOption\"},{\"id\":-930399486,\"predicate\":\"inputStickerSetPremiumGifts\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-78886548,\"predicate\":\"updateReadFeaturedEmojiStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":-1360618136,\"predicate\":\"inputPrivacyKeyVoiceMessages\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":110621716,\"predicate\":\"privacyKeyVoiceMessages\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-1996951013,\"predicate\":\"paymentFormMethod\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"PaymentFormMethod\"},{\"id\":-193992412,\"predicate\":\"inputWebFileAudioAlbumThumbLocation\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"small\",\"type\":\"flags.2?true\"},{\"name\":\"document\",\"type\":\"flags.0?InputDocument\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"performer\",\"type\":\"flags.1?string\"}],\"type\":\"InputWebFileLocation\"},{\"id\":769727150,\"predicate\":\"emojiStatusEmpty\",\"params\":[],\"type\":\"EmojiStatus\"},{\"id\":-1835310691,\"predicate\":\"emojiStatus\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"EmojiStatus\"},{\"id\":-97474361,\"predicate\":\"emojiStatusUntil\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"until\",\"type\":\"int\"}],\"type\":\"EmojiStatus\"},{\"id\":674706841,\"predicate\":\"updateUserEmojiStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"emoji_status\",\"type\":\"EmojiStatus\"}],\"type\":\"Update\"},{\"id\":821314523,\"predicate\":\"updateRecentEmojiStatuses\",\"params\":[],\"type\":\"Update\"},{\"id\":-796072379,\"predicate\":\"account.emojiStatusesNotModified\",\"params\":[],\"type\":\"account.EmojiStatuses\"},{\"id\":-1866176559,\"predicate\":\"account.emojiStatuses\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"statuses\",\"type\":\"Vector<EmojiStatus>\"}],\"type\":\"account.EmojiStatuses\"},{\"id\":2046153753,\"predicate\":\"reactionEmpty\",\"params\":[],\"type\":\"Reaction\"},{\"id\":455247544,\"predicate\":\"reactionEmoji\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"Reaction\"},{\"id\":-1992950669,\"predicate\":\"reactionCustomEmoji\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"Reaction\"},{\"id\":-352570692,\"predicate\":\"chatReactionsNone\",\"params\":[],\"type\":\"ChatReactions\"},{\"id\":1385335754,\"predicate\":\"chatReactionsAll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"allow_custom\",\"type\":\"flags.0?true\"}],\"type\":\"ChatReactions\"},{\"id\":1713193015,\"predicate\":\"chatReactionsSome\",\"params\":[{\"name\":\"reactions\",\"type\":\"Vector<Reaction>\"}],\"type\":\"ChatReactions\"},{\"id\":-1334846497,\"predicate\":\"messages.reactionsNotModified\",\"params\":[],\"type\":\"messages.Reactions\"},{\"id\":-352454890,\"predicate\":\"messages.reactions\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"reactions\",\"type\":\"Vector<Reaction>\"}],\"type\":\"messages.Reactions\"},{\"id\":1870160884,\"predicate\":\"updateRecentReactions\",\"params\":[],\"type\":\"Update\"},{\"id\":-2030252155,\"predicate\":\"updateMoveStickerSetToTop\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"stickerset\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":1511364673,\"predicate\":\"auth.sentCodeTypeEmailCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"apple_signin_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"google_signin_allowed\",\"type\":\"flags.1?true\"},{\"name\":\"email_pattern\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"next_phone_login_date\",\"type\":\"flags.2?int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1521934870,\"predicate\":\"auth.sentCodeTypeSetUpEmailRequired\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"apple_signin_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"google_signin_allowed\",\"type\":\"flags.1?true\"}],\"type\":\"auth.SentCodeType\"},{\"id\":1128644211,\"predicate\":\"emailVerifyPurposeLoginSetup\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"EmailVerifyPurpose\"},{\"id\":1383932651,\"predicate\":\"emailVerifyPurposeLoginChange\",\"params\":[],\"type\":\"EmailVerifyPurpose\"},{\"id\":-1141565819,\"predicate\":\"emailVerifyPurposePassport\",\"params\":[],\"type\":\"EmailVerifyPurpose\"},{\"id\":-1842457175,\"predicate\":\"emailVerificationCode\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"EmailVerification\"},{\"id\":-611279166,\"predicate\":\"emailVerificationGoogle\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"EmailVerification\"},{\"id\":-1764723459,\"predicate\":\"emailVerificationApple\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"EmailVerification\"},{\"id\":731303195,\"predicate\":\"account.emailVerified\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.EmailVerified\"},{\"id\":-507835039,\"predicate\":\"account.emailVerifiedLogin\",\"params\":[{\"name\":\"email\",\"type\":\"string\"},{\"name\":\"sent_code\",\"type\":\"auth.SentCode\"}],\"type\":\"account.EmailVerified\"},{\"id\":-1225711938,\"predicate\":\"premiumSubscriptionOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"current\",\"type\":\"flags.1?true\"},{\"name\":\"can_purchase_upgrade\",\"type\":\"flags.2?true\"},{\"name\":\"months\",\"type\":\"int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"},{\"name\":\"bot_url\",\"type\":\"string\"},{\"name\":\"store_product\",\"type\":\"flags.0?string\"}],\"type\":\"PremiumSubscriptionOption\"},{\"id\":80008398,\"predicate\":\"inputStickerSetEmojiGenericAnimations\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":701560302,\"predicate\":\"inputStickerSetEmojiDefaultStatuses\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-1206095820,\"predicate\":\"sendAsPeer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"premium_required\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"SendAsPeer\"},{\"id\":-1386050360,\"predicate\":\"messageExtendedMediaPreview\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"w\",\"type\":\"flags.0?int\"},{\"name\":\"h\",\"type\":\"flags.0?int\"},{\"name\":\"thumb\",\"type\":\"flags.1?PhotoSize\"},{\"name\":\"video_duration\",\"type\":\"flags.2?int\"}],\"type\":\"MessageExtendedMedia\"},{\"id\":-297296796,\"predicate\":\"messageExtendedMedia\",\"params\":[{\"name\":\"media\",\"type\":\"MessageMedia\"}],\"type\":\"MessageExtendedMedia\"},{\"id\":1517529484,\"predicate\":\"updateMessageExtendedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"extended_media\",\"type\":\"MessageExtendedMedia\"}],\"type\":\"Update\"},{\"id\":-50416996,\"predicate\":\"stickerKeyword\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"keyword\",\"type\":\"Vector<string>\"}],\"type\":\"StickerKeyword\"}],\"methods\":[{\"id\":-878758099,\"method\":\"invokeAfterMsg\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":1036301552,\"method\":\"invokeAfterMsgs\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector<long>\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1502141361,\"method\":\"auth.sendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":-2131827673,\"method\":\"auth.signUp\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-1923962543,\"method\":\"auth.signIn\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"flags.0?string\"},{\"name\":\"email_verification\",\"type\":\"flags.1?EmailVerification\"}],\"type\":\"auth.Authorization\"},{\"id\":1047706137,\"method\":\"auth.logOut\",\"params\":[],\"type\":\"auth.LoggedOut\"},{\"id\":-1616179942,\"method\":\"auth.resetAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":-440401971,\"method\":\"auth.exportAuthorization\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":-1518699091,\"method\":\"auth.importAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.Authorization\"},{\"id\":-841733627,\"method\":\"auth.bindTempAuthKey\",\"params\":[{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"},{\"name\":\"encrypted_message\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-326762118,\"method\":\"account.registerDevice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_muted\",\"type\":\"flags.0?true\"},{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"app_sandbox\",\"type\":\"Bool\"},{\"name\":\"secret\",\"type\":\"bytes\"},{\"name\":\"other_uids\",\"type\":\"Vector<long>\"}],\"type\":\"Bool\"},{\"id\":1779249670,\"method\":\"account.unregisterDevice\",\"params\":[{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"other_uids\",\"type\":\"Vector<long>\"}],\"type\":\"Bool\"},{\"id\":-2067899501,\"method\":\"account.updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"},{\"name\":\"settings\",\"type\":\"InputPeerNotifySettings\"}],\"type\":\"Bool\"},{\"id\":313765169,\"method\":\"account.getNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"}],\"type\":\"PeerNotifySettings\"},{\"id\":-612493497,\"method\":\"account.resetNotifySettings\",\"params\":[],\"type\":\"Bool\"},{\"id\":2018596725,\"method\":\"account.updateProfile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"first_name\",\"type\":\"flags.0?string\"},{\"name\":\"last_name\",\"type\":\"flags.1?string\"},{\"name\":\"about\",\"type\":\"flags.2?string\"}],\"type\":\"User\"},{\"id\":1713919532,\"method\":\"account.updateStatus\",\"params\":[{\"name\":\"offline\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":127302966,\"method\":\"account.getWallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.WallPapers\"},{\"id\":-977650298,\"method\":\"account.reportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":227648840,\"method\":\"users.getUsers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<InputUser>\"}],\"type\":\"Vector<User>\"},{\"id\":-1240508136,\"method\":\"users.getFullUser\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"users.UserFull\"},{\"id\":2061264541,\"method\":\"contacts.getContactIDs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Vector<int>\"},{\"id\":-995929106,\"method\":\"contacts.getStatuses\",\"params\":[],\"type\":\"Vector<ContactStatus>\"},{\"id\":1574346258,\"method\":\"contacts.getContacts\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"contacts.Contacts\"},{\"id\":746589157,\"method\":\"contacts.importContacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector<InputContact>\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":157945344,\"method\":\"contacts.deleteContacts\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<InputUser>\"}],\"type\":\"Updates\"},{\"id\":269745566,\"method\":\"contacts.deleteByPhones\",\"params\":[{\"name\":\"phones\",\"type\":\"Vector<string>\"}],\"type\":\"Bool\"},{\"id\":1758204945,\"method\":\"contacts.block\",\"params\":[{\"name\":\"id\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-1096393392,\"method\":\"contacts.unblock\",\"params\":[{\"name\":\"id\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-176409329,\"method\":\"contacts.getBlocked\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Blocked\"},{\"id\":1673946374,\"method\":\"messages.getMessages\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<InputMessage>\"}],\"type\":\"messages.Messages\"},{\"id\":-1594569905,\"method\":\"messages.getDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Dialogs\"},{\"id\":1143203525,\"method\":\"messages.getHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1593989278,\"method\":\"messages.search\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"from_id\",\"type\":\"flags.0?InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":238054714,\"method\":\"messages.readHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-1332768214,\"method\":\"messages.deleteHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"just_clear\",\"type\":\"flags.0?true\"},{\"name\":\"revoke\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_date\",\"type\":\"flags.2?int\"},{\"name\":\"max_date\",\"type\":\"flags.3?int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-443640366,\"method\":\"messages.deleteMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":94983360,\"method\":\"messages.receivedMessages\",\"params\":[{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Vector<ReceivedNotifyMessage>\"},{\"id\":1486110434,\"method\":\"messages.setTyping\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Bool\"},{\"id\":228423076,\"method\":\"messages.sendMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"update_stickersets_order\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-497026848,\"method\":\"messages.sendMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"update_stickersets_order\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-869258997,\"method\":\"messages.forwardMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"with_my_score\",\"type\":\"flags.8?true\"},{\"name\":\"drop_author\",\"type\":\"flags.11?true\"},{\"name\":\"drop_media_captions\",\"type\":\"flags.12?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"from_peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"},{\"name\":\"random_id\",\"type\":\"Vector<long>\"},{\"name\":\"to_peer\",\"type\":\"InputPeer\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-820669733,\"method\":\"messages.reportSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-270948702,\"method\":\"messages.getPeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.PeerSettings\"},{\"id\":-1991005362,\"method\":\"messages.report\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1240027791,\"method\":\"messages.getChats\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<long>\"}],\"type\":\"messages.Chats\"},{\"id\":-1364194508,\"method\":\"messages.getFullChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"messages.ChatFull\"},{\"id\":1937260541,\"method\":\"messages.editChatTitle\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":903730804,\"method\":\"messages.editChatPhoto\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":-230206493,\"method\":\"messages.addChatUser\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"fwd_limit\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1575461717,\"method\":\"messages.deleteChatUser\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke_history\",\"type\":\"flags.0?true\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":164303470,\"method\":\"messages.createChat\",\"params\":[{\"name\":\"users\",\"type\":\"Vector<InputUser>\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-304838614,\"method\":\"updates.getState\",\"params\":[],\"type\":\"updates.State\"},{\"id\":630429265,\"method\":\"updates.getDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_total_limit\",\"type\":\"flags.0?int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":1926525996,\"method\":\"photos.updateProfilePhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"photos.Photo\"},{\"id\":-1980559511,\"method\":\"photos.uploadProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"photos.Photo\"},{\"id\":-2016444625,\"method\":\"photos.deletePhotos\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<InputPhoto>\"}],\"type\":\"Vector<long>\"},{\"id\":-1291540959,\"method\":\"upload.saveFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-1101843010,\"method\":\"upload.getFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"precise\",\"type\":\"flags.0?true\"},{\"name\":\"cdn_supported\",\"type\":\"flags.1?true\"},{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.File\"},{\"id\":-990308245,\"method\":\"help.getConfig\",\"params\":[],\"type\":\"Config\"},{\"id\":531836966,\"method\":\"help.getNearestDc\",\"params\":[],\"type\":\"NearestDc\"},{\"id\":1378703997,\"method\":\"help.getAppUpdate\",\"params\":[{\"name\":\"source\",\"type\":\"string\"}],\"type\":\"help.AppUpdate\"},{\"id\":1295590211,\"method\":\"help.getInviteText\",\"params\":[],\"type\":\"help.InviteText\"},{\"id\":-1848823128,\"method\":\"photos.getUserPhotos\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"photos.Photos\"},{\"id\":651135312,\"method\":\"messages.getDhConfig\",\"params\":[{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random_length\",\"type\":\"int\"}],\"type\":\"messages.DhConfig\"},{\"id\":-162681021,\"method\":\"messages.requestEncryption\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":1035731989,\"method\":\"messages.acceptEncryption\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":-208425312,\"method\":\"messages.discardEncryption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"delete_history\",\"type\":\"flags.0?true\"},{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":2031374829,\"method\":\"messages.setEncryptedTyping\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"typing\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":2135648522,\"method\":\"messages.readEncryptedHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"max_date\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1157265941,\"method\":\"messages.sendEncrypted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":1431914525,\"method\":\"messages.sendEncryptedFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":852769188,\"method\":\"messages.sendEncryptedService\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":1436924774,\"method\":\"messages.receivedQueue\",\"params\":[{\"name\":\"max_qts\",\"type\":\"int\"}],\"type\":\"Vector<long>\"},{\"id\":1259113487,\"method\":\"messages.reportEncryptedSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"}],\"type\":\"Bool\"},{\"id\":-562337987,\"method\":\"upload.saveBigFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"file_total_parts\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-1043505495,\"method\":\"initConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"system_lang_code\",\"type\":\"string\"},{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"proxy\",\"type\":\"flags.0?InputClientProxy\"},{\"name\":\"params\",\"type\":\"flags.1?JSONValue\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1663104819,\"method\":\"help.getSupport\",\"params\":[],\"type\":\"help.Support\"},{\"id\":916930423,\"method\":\"messages.readMessageContents\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":655677548,\"method\":\"account.checkUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1040964988,\"method\":\"account.updateUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":301470424,\"method\":\"contacts.search\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Found\"},{\"id\":-623130288,\"method\":\"account.getPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-906486552,\"method\":\"account.setPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector<InputPrivacyRule>\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-1564422284,\"method\":\"account.deleteAccount\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reason\",\"type\":\"string\"},{\"name\":\"password\",\"type\":\"flags.0?InputCheckPasswordSRP\"}],\"type\":\"Bool\"},{\"id\":150761757,\"method\":\"account.getAccountTTL\",\"params\":[],\"type\":\"AccountDaysTTL\"},{\"id\":608323678,\"method\":\"account.setAccountTTL\",\"params\":[{\"name\":\"ttl\",\"type\":\"AccountDaysTTL\"}],\"type\":\"Bool\"},{\"id\":-627372787,\"method\":\"invokeWithLayer\",\"params\":[{\"name\":\"layer\",\"type\":\"int\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-113456221,\"method\":\"contacts.resolveUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":-2108208411,\"method\":\"account.sendChangePhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1891839707,\"method\":\"account.changePhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":-710552671,\"method\":\"messages.getStickers\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Stickers\"},{\"id\":-1197432408,\"method\":\"messages.getAllStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":954152242,\"method\":\"account.updateDeviceLocked\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1738800940,\"method\":\"auth.importBotAuthorization\",\"params\":[{\"name\":\"flags\",\"type\":\"int\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"bot_auth_token\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-1956073268,\"method\":\"messages.getWebPagePreview\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"}],\"type\":\"MessageMedia\"},{\"id\":-484392616,\"method\":\"account.getAuthorizations\",\"params\":[],\"type\":\"account.Authorizations\"},{\"id\":-545786948,\"method\":\"account.resetAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":1418342645,\"method\":\"account.getPassword\",\"params\":[],\"type\":\"account.Password\"},{\"id\":-1663767815,\"method\":\"account.getPasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"account.PasswordSettings\"},{\"id\":-1516564433,\"method\":\"account.updatePasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"new_settings\",\"type\":\"account.PasswordInputSettings\"}],\"type\":\"Bool\"},{\"id\":-779399914,\"method\":\"auth.checkPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"auth.Authorization\"},{\"id\":-661144474,\"method\":\"auth.requestPasswordRecovery\",\"params\":[],\"type\":\"auth.PasswordRecovery\"},{\"id\":923364464,\"method\":\"auth.recoverPassword\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"code\",\"type\":\"string\"},{\"name\":\"new_settings\",\"type\":\"flags.0?account.PasswordInputSettings\"}],\"type\":\"auth.Authorization\"},{\"id\":-1080796745,\"method\":\"invokeWithoutUpdates\",\"params\":[{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1607670315,\"method\":\"messages.exportChatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"legacy_revoke_permanent\",\"type\":\"flags.2?true\"},{\"name\":\"request_needed\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"expire_date\",\"type\":\"flags.0?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.1?int\"},{\"name\":\"title\",\"type\":\"flags.4?string\"}],\"type\":\"ExportedChatInvite\"},{\"id\":1051570619,\"method\":\"messages.checkChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"ChatInvite\"},{\"id\":1817183516,\"method\":\"messages.importChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-928977804,\"method\":\"messages.getStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.StickerSet\"},{\"id\":-946871200,\"method\":\"messages.installStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"archived\",\"type\":\"Bool\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":-110209570,\"method\":\"messages.uninstallStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":-421563528,\"method\":\"messages.startBot\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-1877938321,\"method\":\"help.getAppChangelog\",\"params\":[{\"name\":\"prev_app_version\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1468322785,\"method\":\"messages.getMessagesViews\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"},{\"name\":\"increment\",\"type\":\"Bool\"}],\"type\":\"messages.MessageViews\"},{\"id\":-871347913,\"method\":\"channels.readHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-2067661490,\"method\":\"channels.deleteMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-196443371,\"method\":\"channels.reportSpam\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"Bool\"},{\"id\":-1383294429,\"method\":\"channels.getMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector<InputMessage>\"}],\"type\":\"messages.Messages\"},{\"id\":2010044880,\"method\":\"channels.getParticipants\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelParticipantsFilter\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":-1599378234,\"method\":\"channels.getParticipant\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":176122811,\"method\":\"channels.getChannels\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<InputChannel>\"}],\"type\":\"messages.Chats\"},{\"id\":141781513,\"method\":\"channels.getFullChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"messages.ChatFull\"},{\"id\":1029681423,\"method\":\"channels.createChannel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.0?true\"},{\"name\":\"megagroup\",\"type\":\"flags.1?true\"},{\"name\":\"for_import\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"geo_point\",\"type\":\"flags.2?InputGeoPoint\"},{\"name\":\"address\",\"type\":\"flags.2?string\"}],\"type\":\"Updates\"},{\"id\":-751007486,\"method\":\"channels.editAdmin\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1450044624,\"method\":\"channels.editTitle\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-248621111,\"method\":\"channels.editPhoto\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":283557164,\"method\":\"channels.checkUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":890549214,\"method\":\"channels.updateUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":615851205,\"method\":\"channels.joinChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":-130635115,\"method\":\"channels.leaveChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":429865580,\"method\":\"channels.inviteToChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"users\",\"type\":\"Vector<InputUser>\"}],\"type\":\"Updates\"},{\"id\":-1072619549,\"method\":\"channels.deleteChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":51854712,\"method\":\"updates.getChannelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelMessagesFilter\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1470377534,\"method\":\"messages.editChatAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"is_admin\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1568189671,\"method\":\"messages.migrateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":1271290010,\"method\":\"messages.searchGlobal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":2016638777,\"method\":\"messages.reorderStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"order\",\"type\":\"Vector<long>\"}],\"type\":\"Bool\"},{\"id\":-1309538785,\"method\":\"messages.getDocumentByHash\",\"params\":[{\"name\":\"sha256\",\"type\":\"bytes\"},{\"name\":\"size\",\"type\":\"long\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":1559270965,\"method\":\"messages.getSavedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.SavedGifs\"},{\"id\":846868683,\"method\":\"messages.saveGif\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1364105629,\"method\":\"messages.getInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"geo_point\",\"type\":\"flags.0?InputGeoPoint\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"messages.BotResults\"},{\"id\":-346119674,\"method\":\"messages.setInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"private\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"results\",\"type\":\"Vector<InputBotInlineResult>\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"next_offset\",\"type\":\"flags.2?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.3?InlineBotSwitchPM\"}],\"type\":\"Bool\"},{\"id\":2057376407,\"method\":\"messages.sendInlineBotResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"hide_via\",\"type\":\"flags.11?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-432034325,\"method\":\"channels.exportMessageLink\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"grouped\",\"type\":\"flags.0?true\"},{\"name\":\"thread\",\"type\":\"flags.1?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"ExportedMessageLink\"},{\"id\":527021574,\"method\":\"channels.toggleSignatures\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1056025023,\"method\":\"auth.resendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"auth.SentCode\"},{\"id\":520357240,\"method\":\"auth.cancelCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-39416522,\"method\":\"messages.getMessageEditData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"messages.MessageEditData\"},{\"id\":1224152952,\"method\":\"messages.editMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"},{\"name\":\"schedule_date\",\"type\":\"flags.15?int\"}],\"type\":\"Updates\"},{\"id\":-2091549254,\"method\":\"messages.editInlineBotMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"}],\"type\":\"Bool\"},{\"id\":-1824339449,\"method\":\"messages.getBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"game\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"password\",\"type\":\"flags.2?InputCheckPasswordSRP\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":-712043766,\"method\":\"messages.setBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-1758168906,\"method\":\"contacts.getTopPeers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"correspondents\",\"type\":\"flags.0?true\"},{\"name\":\"bots_pm\",\"type\":\"flags.1?true\"},{\"name\":\"bots_inline\",\"type\":\"flags.2?true\"},{\"name\":\"phone_calls\",\"type\":\"flags.3?true\"},{\"name\":\"forward_users\",\"type\":\"flags.4?true\"},{\"name\":\"forward_chats\",\"type\":\"flags.5?true\"},{\"name\":\"groups\",\"type\":\"flags.10?true\"},{\"name\":\"channels\",\"type\":\"flags.15?true\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"contacts.TopPeers\"},{\"id\":451113900,\"method\":\"contacts.resetTopPeerRating\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-462373635,\"method\":\"messages.getPeerDialogs\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector<InputDialogPeer>\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-1137057461,\"method\":\"messages.saveDraft\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"}],\"type\":\"Bool\"},{\"id\":1782549861,\"method\":\"messages.getAllDrafts\",\"params\":[],\"type\":\"Updates\"},{\"id\":1685588756,\"method\":\"messages.getFeaturedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":1527873830,\"method\":\"messages.readFeaturedStickers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<long>\"}],\"type\":\"Bool\"},{\"id\":-1649852357,\"method\":\"messages.getRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.RecentStickers\"},{\"id\":958863608,\"method\":\"messages.saveRecentSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1986437075,\"method\":\"messages.clearRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":1475442322,\"method\":\"messages.getArchivedStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"offset_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":457157256,\"method\":\"account.sendConfirmPhoneCode\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1596029123,\"method\":\"account.confirmPhone\",\"params\":[{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-122669393,\"method\":\"channels.getAdminedPublicChannels\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"by_location\",\"type\":\"flags.0?true\"},{\"name\":\"check_limit\",\"type\":\"flags.1?true\"}],\"type\":\"messages.Chats\"},{\"id\":1678738104,\"method\":\"messages.getMaskStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":-866424884,\"method\":\"messages.getAttachedStickers\",\"params\":[{\"name\":\"media\",\"type\":\"InputStickeredMedia\"}],\"type\":\"Vector<StickerSetCovered>\"},{\"id\":-1907842680,\"method\":\"auth.dropTempAuthKeys\",\"params\":[{\"name\":\"except_auth_keys\",\"type\":\"Vector<long>\"}],\"type\":\"Bool\"},{\"id\":-1896289088,\"method\":\"messages.setGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":363700068,\"method\":\"messages.setInlineGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-400399203,\"method\":\"messages.getGameHighScores\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":258170395,\"method\":\"messages.getInlineGameHighScores\",\"params\":[{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":-468934396,\"method\":\"messages.getCommonChats\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":-2023787330,\"method\":\"messages.getAllChats\",\"params\":[{\"name\":\"except_ids\",\"type\":\"Vector<long>\"}],\"type\":\"messages.Chats\"},{\"id\":-333262899,\"method\":\"help.setBotUpdatesStatus\",\"params\":[{\"name\":\"pending_updates_count\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":852135825,\"method\":\"messages.getWebPage\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":-1489903017,\"method\":\"messages.toggleDialogPin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":991616823,\"method\":\"messages.reorderPinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"int\"},{\"name\":\"order\",\"type\":\"Vector<InputDialogPeer>\"}],\"type\":\"Bool\"},{\"id\":-692498958,\"method\":\"messages.getPinnedDialogs\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-1440257555,\"method\":\"bots.sendCustomRequest\",\"params\":[{\"name\":\"custom_method\",\"type\":\"string\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"DataJSON\"},{\"id\":-434028723,\"method\":\"bots.answerWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":619086221,\"method\":\"upload.getWebFile\",\"params\":[{\"name\":\"location\",\"type\":\"InputWebFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.WebFile\"},{\"id\":924093883,\"method\":\"payments.getPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"invoice\",\"type\":\"InputInvoice\"},{\"name\":\"theme_params\",\"type\":\"flags.0?DataJSON\"}],\"type\":\"payments.PaymentForm\"},{\"id\":611897804,\"method\":\"payments.getPaymentReceipt\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":-1228345045,\"method\":\"payments.validateRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"invoice\",\"type\":\"InputInvoice\"},{\"name\":\"info\",\"type\":\"PaymentRequestedInfo\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":755192367,\"method\":\"payments.sendPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"invoice\",\"type\":\"InputInvoice\"},{\"name\":\"requested_info_id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"credentials\",\"type\":\"InputPaymentCredentials\"},{\"name\":\"tip_amount\",\"type\":\"flags.2?long\"}],\"type\":\"payments.PaymentResult\"},{\"id\":1151208273,\"method\":\"account.getTmpPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":578650699,\"method\":\"payments.getSavedInfo\",\"params\":[],\"type\":\"payments.SavedInfo\"},{\"id\":-667062079,\"method\":\"payments.clearSavedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"credentials\",\"type\":\"flags.0?true\"},{\"name\":\"info\",\"type\":\"flags.1?true\"}],\"type\":\"Bool\"},{\"id\":-436833542,\"method\":\"messages.setBotShippingResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector<ShippingOption>\"}],\"type\":\"Bool\"},{\"id\":163765653,\"method\":\"messages.setBotPrecheckoutResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"}],\"type\":\"Bool\"},{\"id\":-1876841625,\"method\":\"stickers.createStickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"animated\",\"type\":\"flags.1?true\"},{\"name\":\"videos\",\"type\":\"flags.4?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumb\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"stickers\",\"type\":\"Vector<InputStickerSetItem>\"},{\"name\":\"software\",\"type\":\"flags.3?string\"}],\"type\":\"messages.StickerSet\"},{\"id\":-143257775,\"method\":\"stickers.removeStickerFromSet\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":-4795190,\"method\":\"stickers.changeStickerPosition\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"},{\"name\":\"position\",\"type\":\"int\"}],\"type\":\"messages.StickerSet\"},{\"id\":-2041315650,\"method\":\"stickers.addStickerToSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"sticker\",\"type\":\"InputStickerSetItem\"}],\"type\":\"messages.StickerSet\"},{\"id\":1369162417,\"method\":\"messages.uploadMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"id\":1430593449,\"method\":\"phone.getCallConfig\",\"params\":[],\"type\":\"DataJSON\"},{\"id\":1124046573,\"method\":\"phone.requestCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":1003664544,\"method\":\"phone.acceptCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":788404002,\"method\":\"phone.confirmCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":399855457,\"method\":\"phone.receivedCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"}],\"type\":\"Bool\"},{\"id\":-1295269440,\"method\":\"phone.discardCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"reason\",\"type\":\"PhoneCallDiscardReason\"},{\"name\":\"connection_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":1508562471,\"method\":\"phone.setCallRating\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_initiative\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"rating\",\"type\":\"int\"},{\"name\":\"comment\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":662363518,\"method\":\"phone.saveCallDebug\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"debug\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":962554330,\"method\":\"upload.getCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.CdnFile\"},{\"id\":-1691921240,\"method\":\"upload.reuploadCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"Vector<FileHash>\"},{\"id\":1375900482,\"method\":\"help.getCdnConfig\",\"params\":[],\"type\":\"CdnConfig\"},{\"id\":-219008246,\"method\":\"langpack.getLangPack\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackDifference\"},{\"id\":-269862909,\"method\":\"langpack.getStrings\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"keys\",\"type\":\"Vector<string>\"}],\"type\":\"Vector<LangPackString>\"},{\"id\":-845657435,\"method\":\"langpack.getDifference\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"LangPackDifference\"},{\"id\":1120311183,\"method\":\"langpack.getLanguages\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"}],\"type\":\"Vector<LangPackLanguage>\"},{\"id\":-1763259007,\"method\":\"channels.editBanned\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":870184064,\"method\":\"channels.getAdminLog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"events_filter\",\"type\":\"flags.0?ChannelAdminLogEventsFilter\"},{\"name\":\"admins\",\"type\":\"flags.1?Vector<InputUser>\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"min_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":-1847836879,\"method\":\"upload.getCdnFileHashes\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"long\"}],\"type\":\"Vector<FileHash>\"},{\"id\":-914493408,\"method\":\"messages.sendScreenshotNotification\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":-359881479,\"method\":\"channels.setStickers\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":82946729,\"method\":\"messages.getFavedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FavedStickers\"},{\"id\":-1174420133,\"method\":\"messages.faveSticker\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unfave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-357180360,\"method\":\"channels.readMessageContents\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"Bool\"},{\"id\":-2020263951,\"method\":\"contacts.resetSaved\",\"params\":[],\"type\":\"Bool\"},{\"id\":1180140658,\"method\":\"messages.getUnreadMentions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":-1683319225,\"method\":\"channels.deleteHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"for_everyone\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1036054804,\"method\":\"help.getRecentMeUrls\",\"params\":[{\"name\":\"referer\",\"type\":\"string\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":-356796084,\"method\":\"channels.togglePreHistoryHidden\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":251759059,\"method\":\"messages.readMentions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1881817312,\"method\":\"messages.getRecentLocations\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-134016113,\"method\":\"messages.sendMultiMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"update_stickersets_order\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"multi_media\",\"type\":\"Vector<InputSingleMedia>\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":1347929239,\"method\":\"messages.uploadEncryptedFile\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"EncryptedFile\"},{\"id\":405695855,\"method\":\"account.getWebAuthorizations\",\"params\":[],\"type\":\"account.WebAuthorizations\"},{\"id\":755087855,\"method\":\"account.resetWebAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":1747789204,\"method\":\"account.resetWebAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":896555914,\"method\":\"messages.searchStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_featured\",\"type\":\"flags.0?true\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":-1856595926,\"method\":\"upload.getFileHashes\",\"params\":[{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"long\"}],\"type\":\"Vector<FileHash>\"},{\"id\":749019089,\"method\":\"help.getTermsOfServiceUpdate\",\"params\":[],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":-294455398,\"method\":\"help.acceptTermsOfService\",\"params\":[{\"name\":\"id\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":-1299661699,\"method\":\"account.getAllSecureValues\",\"params\":[],\"type\":\"Vector<SecureValue>\"},{\"id\":1936088002,\"method\":\"account.getSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector<SecureValueType>\"}],\"type\":\"Vector<SecureValue>\"},{\"id\":-1986010339,\"method\":\"account.saveSecureValue\",\"params\":[{\"name\":\"value\",\"type\":\"InputSecureValue\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureValue\"},{\"id\":-1199522741,\"method\":\"account.deleteSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector<SecureValueType>\"}],\"type\":\"Bool\"},{\"id\":-1865902923,\"method\":\"users.setSecureValueErrors\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"errors\",\"type\":\"Vector<SecureValueError>\"}],\"type\":\"Bool\"},{\"id\":-1456907910,\"method\":\"account.getAuthorizationForm\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":-202552205,\"method\":\"account.acceptAuthorization\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"},{\"name\":\"value_hashes\",\"type\":\"Vector<SecureValueHash>\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"Bool\"},{\"id\":-1516022023,\"method\":\"account.sendVerifyPhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1305716726,\"method\":\"account.verifyPhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-1730136133,\"method\":\"account.sendVerifyEmailCode\",\"params\":[{\"name\":\"purpose\",\"type\":\"EmailVerifyPurpose\"},{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.SentEmailCode\"},{\"id\":53322959,\"method\":\"account.verifyEmail\",\"params\":[{\"name\":\"purpose\",\"type\":\"EmailVerifyPurpose\"},{\"name\":\"verification\",\"type\":\"EmailVerification\"}],\"type\":\"account.EmailVerified\"},{\"id\":1072547679,\"method\":\"help.getDeepLinkInfo\",\"params\":[{\"name\":\"path\",\"type\":\"string\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":-2098076769,\"method\":\"contacts.getSaved\",\"params\":[],\"type\":\"Vector<SavedContact>\"},{\"id\":-2092831552,\"method\":\"channels.getLeftChannels\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":-1896617296,\"method\":\"account.initTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"message_users\",\"type\":\"flags.1?true\"},{\"name\":\"message_chats\",\"type\":\"flags.2?true\"},{\"name\":\"message_megagroups\",\"type\":\"flags.3?true\"},{\"name\":\"message_channels\",\"type\":\"flags.4?true\"},{\"name\":\"files\",\"type\":\"flags.5?true\"},{\"name\":\"file_max_size\",\"type\":\"flags.5?long\"}],\"type\":\"account.Takeout\"},{\"id\":489050862,\"method\":\"account.finishTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":486505992,\"method\":\"messages.getSplitRanges\",\"params\":[],\"type\":\"Vector<MessageRange>\"},{\"id\":911373810,\"method\":\"invokeWithMessagesRange\",\"params\":[{\"name\":\"range\",\"type\":\"MessageRange\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1398145746,\"method\":\"invokeWithTakeout\",\"params\":[{\"name\":\"takeout_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1031349873,\"method\":\"messages.markDialogUnread\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":585256482,\"method\":\"messages.getDialogUnreadMarks\",\"params\":[],\"type\":\"Vector<DialogPeer>\"},{\"id\":-2062238246,\"method\":\"contacts.toggleTopPeers\",\"params\":[{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":2119757468,\"method\":\"messages.clearAllDrafts\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1735311088,\"method\":\"help.getAppConfig\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":1862465352,\"method\":\"help.saveAppLog\",\"params\":[{\"name\":\"events\",\"type\":\"Vector<InputAppEvent>\"}],\"type\":\"Bool\"},{\"id\":-966677240,\"method\":\"help.getPassportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.PassportConfig\"},{\"id\":1784243458,\"method\":\"langpack.getLanguage\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":-760547348,\"method\":\"messages.updatePinnedMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"unpin\",\"type\":\"flags.1?true\"},{\"name\":\"pm_oneside\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1881204448,\"method\":\"account.confirmPasswordEmail\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":2055154197,\"method\":\"account.resendPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1043606090,\"method\":\"account.cancelPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":-748624084,\"method\":\"help.getSupportName\",\"params\":[],\"type\":\"help.SupportName\"},{\"id\":59377875,\"method\":\"help.getUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"help.UserInfo\"},{\"id\":1723407216,\"method\":\"help.editUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector<MessageEntity>\"}],\"type\":\"help.UserInfo\"},{\"id\":-1626880216,\"method\":\"account.getContactSignUpNotification\",\"params\":[],\"type\":\"Bool\"},{\"id\":-806076575,\"method\":\"account.setContactSignUpNotification\",\"params\":[{\"name\":\"silent\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1398240377,\"method\":\"account.getNotifyExceptions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"compare_sound\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"flags.0?InputNotifyPeer\"}],\"type\":\"Updates\"},{\"id\":283795844,\"method\":\"messages.sendVote\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"options\",\"type\":\"Vector<bytes>\"}],\"type\":\"Updates\"},{\"id\":1941660731,\"method\":\"messages.getPollResults\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1848369232,\"method\":\"messages.getOnlines\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"ChatOnlines\"},{\"id\":-554301545,\"method\":\"messages.editChatAbout\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"about\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-1517917375,\"method\":\"messages.editChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":-57811990,\"method\":\"account.getWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"}],\"type\":\"WallPaper\"},{\"id\":-578472351,\"method\":\"account.uploadWallPaper\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":1817860919,\"method\":\"account.saveWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"unsave\",\"type\":\"Bool\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":-18000023,\"method\":\"account.installWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":-1153722364,\"method\":\"account.resetWallPapers\",\"params\":[],\"type\":\"Bool\"},{\"id\":1457130303,\"method\":\"account.getAutoDownloadSettings\",\"params\":[],\"type\":\"account.AutoDownloadSettings\"},{\"id\":1995661875,\"method\":\"account.saveAutoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"low\",\"type\":\"flags.0?true\"},{\"name\":\"high\",\"type\":\"flags.1?true\"},{\"name\":\"settings\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"Bool\"},{\"id\":899735650,\"method\":\"messages.getEmojiKeywords\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":352892591,\"method\":\"messages.getEmojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":1318675378,\"method\":\"messages.getEmojiKeywordsLanguages\",\"params\":[{\"name\":\"lang_codes\",\"type\":\"Vector<string>\"}],\"type\":\"Vector<EmojiLanguage>\"},{\"id\":-709817306,\"method\":\"messages.getEmojiURL\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":1749536939,\"method\":\"folders.editPeerFolders\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector<InputFolderPeer>\"}],\"type\":\"Updates\"},{\"id\":472471681,\"method\":\"folders.deleteFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1932455680,\"method\":\"messages.getSearchCounters\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filters\",\"type\":\"Vector<MessagesFilter>\"}],\"type\":\"Vector<messages.SearchCounter>\"},{\"id\":-170208392,\"method\":\"channels.getGroupsForDiscussion\",\"params\":[],\"type\":\"messages.Chats\"},{\"id\":1079520178,\"method\":\"channels.setDiscussionGroup\",\"params\":[{\"name\":\"broadcast\",\"type\":\"InputChannel\"},{\"name\":\"group\",\"type\":\"InputChannel\"}],\"type\":\"Bool\"},{\"id\":428848198,\"method\":\"messages.requestUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"flags.1?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"button_id\",\"type\":\"flags.1?int\"},{\"name\":\"url\",\"type\":\"flags.2?string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1322487515,\"method\":\"messages.acceptUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"write_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"flags.1?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"button_id\",\"type\":\"flags.1?int\"},{\"name\":\"url\",\"type\":\"flags.2?string\"}],\"type\":\"UrlAuthResult\"},{\"id\":1336717624,\"method\":\"messages.hidePeerSettingsBar\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-386636848,\"method\":\"contacts.addContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"add_phone_privacy_exception\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-130964977,\"method\":\"contacts.acceptContact\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":-1892102881,\"method\":\"channels.editCreator\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"Updates\"},{\"id\":-750207932,\"method\":\"contacts.getLocated\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"background\",\"type\":\"flags.1?true\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"self_expires\",\"type\":\"flags.0?int\"}],\"type\":\"Updates\"},{\"id\":1491484525,\"method\":\"channels.editLocation\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-304832784,\"method\":\"channels.toggleSlowMode\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"seconds\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-183077365,\"method\":\"messages.getScheduledHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1111817116,\"method\":\"messages.getScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"messages.Messages\"},{\"id\":-1120369398,\"method\":\"messages.sendScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"Updates\"},{\"id\":1504586518,\"method\":\"messages.deleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"Updates\"},{\"id\":473805619,\"method\":\"account.uploadTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.0?InputFile\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":1697530880,\"method\":\"account.createTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector<InputThemeSettings>\"}],\"type\":\"Theme\"},{\"id\":737414348,\"method\":\"account.updateTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"slug\",\"type\":\"flags.0?string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"document\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector<InputThemeSettings>\"}],\"type\":\"Theme\"},{\"id\":-229175188,\"method\":\"account.saveTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-953697477,\"method\":\"account.installTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"theme\",\"type\":\"flags.1?InputTheme\"},{\"name\":\"format\",\"type\":\"flags.2?string\"},{\"name\":\"base_theme\",\"type\":\"flags.3?BaseTheme\"}],\"type\":\"Bool\"},{\"id\":-1919060949,\"method\":\"account.getTheme\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"Theme\"},{\"id\":1913054296,\"method\":\"account.getThemes\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"id\":-1210022402,\"method\":\"auth.exportLoginToken\",\"params\":[{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"except_ids\",\"type\":\"Vector<long>\"}],\"type\":\"auth.LoginToken\"},{\"id\":-1783866140,\"method\":\"auth.importLoginToken\",\"params\":[{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":-392909491,\"method\":\"auth.acceptLoginToken\",\"params\":[{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"Authorization\"},{\"id\":-1250643605,\"method\":\"account.setContentSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"sensitive_enabled\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":-1952756306,\"method\":\"account.getContentSettings\",\"params\":[],\"type\":\"account.ContentSettings\"},{\"id\":300429806,\"method\":\"channels.getInactiveChannels\",\"params\":[],\"type\":\"messages.InactiveChats\"},{\"id\":1705865692,\"method\":\"account.getMultiWallPapers\",\"params\":[{\"name\":\"wallpapers\",\"type\":\"Vector<InputWallPaper>\"}],\"type\":\"Vector<WallPaper>\"},{\"id\":-1200736242,\"method\":\"messages.getPollVotes\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"option\",\"type\":\"flags.0?bytes\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.VotesList\"},{\"id\":-1257951254,\"method\":\"messages.toggleStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"uninstall\",\"type\":\"flags.0?true\"},{\"name\":\"archive\",\"type\":\"flags.1?true\"},{\"name\":\"unarchive\",\"type\":\"flags.2?true\"},{\"name\":\"stickersets\",\"type\":\"Vector<InputStickerSet>\"}],\"type\":\"Bool\"},{\"id\":779736953,\"method\":\"payments.getBankCardData\",\"params\":[{\"name\":\"number\",\"type\":\"string\"}],\"type\":\"payments.BankCardData\"},{\"id\":-241247891,\"method\":\"messages.getDialogFilters\",\"params\":[],\"type\":\"Vector<DialogFilter>\"},{\"id\":-1566780372,\"method\":\"messages.getSuggestedDialogFilters\",\"params\":[],\"type\":\"Vector<DialogFilterSuggested>\"},{\"id\":450142282,\"method\":\"messages.updateDialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"filter\",\"type\":\"flags.0?DialogFilter\"}],\"type\":\"Bool\"},{\"id\":-983318044,\"method\":\"messages.updateDialogFiltersOrder\",\"params\":[{\"name\":\"order\",\"type\":\"Vector<int>\"}],\"type\":\"Bool\"},{\"id\":-1421720550,\"method\":\"stats.getBroadcastStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.BroadcastStats\"},{\"id\":1646092192,\"method\":\"stats.loadAsyncGraph\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"x\",\"type\":\"flags.0?long\"}],\"type\":\"StatsGraph\"},{\"id\":-1707717072,\"method\":\"stickers.setStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":85399130,\"method\":\"bots.setBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"commands\",\"type\":\"Vector<BotCommand>\"}],\"type\":\"Bool\"},{\"id\":2127598753,\"method\":\"messages.getOldFeaturedStickers\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-1063816159,\"method\":\"help.getPromoData\",\"params\":[],\"type\":\"help.PromoData\"},{\"id\":505748629,\"method\":\"help.hidePromoData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-8744061,\"method\":\"phone.sendSignalingData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-589330937,\"method\":\"stats.getMegagroupStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.MegagroupStats\"},{\"id\":-349483786,\"method\":\"account.getGlobalPrivacySettings\",\"params\":[],\"type\":\"GlobalPrivacySettings\"},{\"id\":517647042,\"method\":\"account.setGlobalPrivacySettings\",\"params\":[{\"name\":\"settings\",\"type\":\"GlobalPrivacySettings\"}],\"type\":\"GlobalPrivacySettings\"},{\"id\":-183649631,\"method\":\"help.dismissSuggestion\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"suggestion\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1935116200,\"method\":\"help.getCountriesList\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.CountriesList\"},{\"id\":584962828,\"method\":\"messages.getReplies\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":1147761405,\"method\":\"messages.getDiscussionMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"messages.DiscussionMessage\"},{\"id\":-147740172,\"method\":\"messages.readDiscussion\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":698914348,\"method\":\"contacts.blockFromReplies\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"delete_message\",\"type\":\"flags.0?true\"},{\"name\":\"delete_history\",\"type\":\"flags.1?true\"},{\"name\":\"report_spam\",\"type\":\"flags.2?true\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1445996571,\"method\":\"stats.getMessagePublicForwards\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":-1226791947,\"method\":\"stats.getMessageStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"stats.MessageStats\"},{\"id\":-265962357,\"method\":\"messages.unpinAllMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1221445336,\"method\":\"phone.createGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"rtmp_stream\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"schedule_date\",\"type\":\"flags.1?int\"}],\"type\":\"Updates\"},{\"id\":-1322057861,\"method\":\"phone.joinGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"muted\",\"type\":\"flags.0?true\"},{\"name\":\"video_stopped\",\"type\":\"flags.2?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"join_as\",\"type\":\"InputPeer\"},{\"name\":\"invite_hash\",\"type\":\"flags.1?string\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Updates\"},{\"id\":1342404601,\"method\":\"phone.leaveGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"source\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":2067345760,\"method\":\"phone.inviteToGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"users\",\"type\":\"Vector<InputUser>\"}],\"type\":\"Updates\"},{\"id\":2054648117,\"method\":\"phone.discardGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":1958458429,\"method\":\"phone.toggleGroupCallSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reset_invite_hash\",\"type\":\"flags.1?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"join_muted\",\"type\":\"flags.0?Bool\"}],\"type\":\"Updates\"},{\"id\":68699611,\"method\":\"phone.getGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"phone.GroupCall\"},{\"id\":-984033109,\"method\":\"phone.getGroupParticipants\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"ids\",\"type\":\"Vector<InputPeer>\"},{\"name\":\"sources\",\"type\":\"Vector<int>\"},{\"name\":\"offset\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"phone.GroupParticipants\"},{\"id\":-1248003721,\"method\":\"phone.checkGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"sources\",\"type\":\"Vector<int>\"}],\"type\":\"Vector<int>\"},{\"id\":1540419152,\"method\":\"messages.deleteChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":-104078327,\"method\":\"messages.deletePhoneCallHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke\",\"type\":\"flags.0?true\"}],\"type\":\"messages.AffectedFoundMessages\"},{\"id\":1140726259,\"method\":\"messages.checkHistoryImport\",\"params\":[{\"name\":\"import_head\",\"type\":\"string\"}],\"type\":\"messages.HistoryImportParsed\"},{\"id\":873008187,\"method\":\"messages.initHistoryImport\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"media_count\",\"type\":\"int\"}],\"type\":\"messages.HistoryImport\"},{\"id\":713433234,\"method\":\"messages.uploadImportedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"import_id\",\"type\":\"long\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"id\":-1271008444,\"method\":\"messages.startHistoryImport\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"import_id\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":-1565154314,\"method\":\"messages.getExportedChatInvites\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"admin_id\",\"type\":\"InputUser\"},{\"name\":\"offset_date\",\"type\":\"flags.2?int\"},{\"name\":\"offset_link\",\"type\":\"flags.2?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ExportedChatInvites\"},{\"id\":1937010524,\"method\":\"messages.getExportedChatInvite\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":-1110823051,\"method\":\"messages.editExportedChatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"expire_date\",\"type\":\"flags.0?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.1?int\"},{\"name\":\"request_needed\",\"type\":\"flags.3?Bool\"},{\"name\":\"title\",\"type\":\"flags.4?string\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":1452833749,\"method\":\"messages.deleteRevokedExportedChatInvites\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"admin_id\",\"type\":\"InputUser\"}],\"type\":\"Bool\"},{\"id\":-731601877,\"method\":\"messages.deleteExportedChatInvite\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":958457583,\"method\":\"messages.getAdminsWithInvites\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.ChatAdminsWithInvites\"},{\"id\":-553329330,\"method\":\"messages.getChatInviteImporters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requested\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"flags.1?string\"},{\"name\":\"q\",\"type\":\"flags.2?string\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_user\",\"type\":\"InputUser\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ChatInviteImporters\"},{\"id\":-1207017500,\"method\":\"messages.setHistoryTTL\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-91437323,\"method\":\"account.reportProfilePhoto\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"photo_id\",\"type\":\"InputPhoto\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":187239529,\"method\":\"channels.convertToGigagroup\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":1573261059,\"method\":\"messages.checkHistoryImportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"id\":-248985848,\"method\":\"phone.toggleGroupCallRecord\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"start\",\"type\":\"flags.0?true\"},{\"name\":\"video\",\"type\":\"flags.2?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"video_portrait\",\"type\":\"flags.2?Bool\"}],\"type\":\"Updates\"},{\"id\":-1524155713,\"method\":\"phone.editGroupCallParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"muted\",\"type\":\"flags.0?Bool\"},{\"name\":\"volume\",\"type\":\"flags.1?int\"},{\"name\":\"raise_hand\",\"type\":\"flags.2?Bool\"},{\"name\":\"video_stopped\",\"type\":\"flags.3?Bool\"},{\"name\":\"video_paused\",\"type\":\"flags.4?Bool\"},{\"name\":\"presentation_paused\",\"type\":\"flags.5?Bool\"}],\"type\":\"Updates\"},{\"id\":480685066,\"method\":\"phone.editGroupCallTitle\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-277077702,\"method\":\"phone.getGroupCallJoinAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"phone.JoinAsPeers\"},{\"id\":-425040769,\"method\":\"phone.exportGroupCallInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_self_unmute\",\"type\":\"flags.0?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"phone.ExportedGroupCallInvite\"},{\"id\":563885286,\"method\":\"phone.toggleGroupCallStartSubscription\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"subscribed\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1451287362,\"method\":\"phone.startScheduledGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":1465786252,\"method\":\"phone.saveDefaultGroupCallJoinAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"join_as\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-873829436,\"method\":\"phone.joinGroupCallPresentation\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Updates\"},{\"id\":475058500,\"method\":\"phone.leaveGroupCallPresentation\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":676017721,\"method\":\"stickers.checkShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1303364867,\"method\":\"stickers.suggestShortName\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"stickers.SuggestedShortName\"},{\"id\":1032708345,\"method\":\"bots.resetBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-481554986,\"method\":\"bots.getBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Vector<BotCommand>\"},{\"id\":-1828139493,\"method\":\"account.resetPassword\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":1284770294,\"method\":\"account.declinePasswordReset\",\"params\":[],\"type\":\"Bool\"},{\"id\":221691769,\"method\":\"auth.checkRecoveryPassword\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-700916087,\"method\":\"account.getChatThemes\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"id\":-432283329,\"method\":\"messages.setChatTheme\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-1095836780,\"method\":\"channels.viewSponsoredMessage\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"random_id\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-333377601,\"method\":\"channels.getSponsoredMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"messages.SponsoredMessages\"},{\"id\":745510839,\"method\":\"messages.getMessageReadParticipants\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Vector<long>\"},{\"id\":1240514025,\"method\":\"messages.getSearchResultsCalendar\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"}],\"type\":\"messages.SearchResultsCalendar\"},{\"id\":1855292323,\"method\":\"messages.getSearchResultsPositions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.SearchResultsPositions\"},{\"id\":2145904661,\"method\":\"messages.hideChatJoinRequest\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"approved\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":-528091926,\"method\":\"messages.hideAllChatJoinRequests\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"approved\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"flags.1?string\"}],\"type\":\"Updates\"},{\"id\":-1323389022,\"method\":\"messages.toggleNoForwards\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-855777386,\"method\":\"messages.saveDefaultSendAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"send_as\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":231174382,\"method\":\"channels.getSendAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"channels.SendAsPeers\"},{\"id\":-1081501024,\"method\":\"account.setAuthorizationTTL\",\"params\":[{\"name\":\"authorization_ttl_days\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1089766498,\"method\":\"account.changeAuthorizationSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"encrypted_requests_disabled\",\"type\":\"flags.0?Bool\"},{\"name\":\"call_requests_disabled\",\"type\":\"flags.1?Bool\"}],\"type\":\"Bool\"},{\"id\":913655003,\"method\":\"channels.deleteParticipantHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-754091820,\"method\":\"messages.sendReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.1?true\"},{\"name\":\"add_to_recent\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?Vector<Reaction>\"}],\"type\":\"Updates\"},{\"id\":-1950707482,\"method\":\"messages.getMessagesReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"Updates\"},{\"id\":1176190792,\"method\":\"messages.getMessageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?Reaction\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":-21928079,\"method\":\"messages.setChatAvailableReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"available_reactions\",\"type\":\"ChatReactions\"}],\"type\":\"Updates\"},{\"id\":417243308,\"method\":\"messages.getAvailableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.AvailableReactions\"},{\"id\":1330094102,\"method\":\"messages.setDefaultReaction\",\"params\":[{\"name\":\"reaction\",\"type\":\"Reaction\"}],\"type\":\"Bool\"},{\"id\":617508334,\"method\":\"messages.translateText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"flags.0?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"text\",\"type\":\"flags.1?string\"},{\"name\":\"from_lang\",\"type\":\"flags.2?string\"},{\"name\":\"to_lang\",\"type\":\"string\"}],\"type\":\"messages.TranslatedText\"},{\"id\":-396644838,\"method\":\"messages.getUnreadReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":-2099097129,\"method\":\"messages.readReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-1963375804,\"method\":\"contacts.resolvePhone\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":447879488,\"method\":\"phone.getGroupCallStreamChannels\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"phone.GroupCallStreamChannels\"},{\"id\":-558650433,\"method\":\"phone.getGroupCallStreamRtmpUrl\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"revoke\",\"type\":\"Bool\"}],\"type\":\"phone.GroupCallStreamRtmpUrl\"},{\"id\":276705696,\"method\":\"messages.searchSentMedia\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":385663691,\"method\":\"messages.getAttachMenuBots\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"AttachMenuBots\"},{\"id\":1998676370,\"method\":\"messages.getAttachMenuBot\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"}],\"type\":\"AttachMenuBotsBot\"},{\"id\":451818415,\"method\":\"messages.toggleBotInAttachMenu\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-58219204,\"method\":\"messages.requestWebView\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"from_bot_menu\",\"type\":\"flags.4?true\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"url\",\"type\":\"flags.1?string\"},{\"name\":\"start_param\",\"type\":\"flags.3?string\"},{\"name\":\"theme_params\",\"type\":\"flags.2?DataJSON\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"WebViewResult\"},{\"id\":-362824498,\"method\":\"messages.prolongWebView\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Bool\"},{\"id\":698084494,\"method\":\"messages.requestSimpleWebView\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"theme_params\",\"type\":\"flags.0?DataJSON\"},{\"name\":\"platform\",\"type\":\"string\"}],\"type\":\"SimpleWebViewResult\"},{\"id\":172168437,\"method\":\"messages.sendWebViewResultMessage\",\"params\":[{\"name\":\"bot_query_id\",\"type\":\"string\"},{\"name\":\"result\",\"type\":\"InputBotInlineResult\"}],\"type\":\"WebViewMessageSent\"},{\"id\":-603831608,\"method\":\"messages.sendWebViewData\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"button_text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1157944655,\"method\":\"bots.setBotMenuButton\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"button\",\"type\":\"BotMenuButton\"}],\"type\":\"Bool\"},{\"id\":-1671369944,\"method\":\"bots.getBotMenuButton\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"BotMenuButton\"},{\"id\":-510647672,\"method\":\"account.getSavedRingtones\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.SavedRingtones\"},{\"id\":1038768899,\"method\":\"account.saveRingtone\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"account.SavedRingtone\"},{\"id\":-2095414366,\"method\":\"account.uploadRingtone\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":2021942497,\"method\":\"bots.setBotBroadcastDefaultAdminRights\",\"params\":[{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"}],\"type\":\"Bool\"},{\"id\":-1839281686,\"method\":\"bots.setBotGroupDefaultAdminRights\",\"params\":[{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"}],\"type\":\"Bool\"},{\"id\":1092913030,\"method\":\"phone.saveCallLog\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"file\",\"type\":\"InputFile\"}],\"type\":\"Bool\"},{\"id\":-456419968,\"method\":\"channels.toggleJoinToSend\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1277789622,\"method\":\"channels.toggleJoinRequest\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":261206117,\"method\":\"payments.exportInvoice\",\"params\":[{\"name\":\"invoice_media\",\"type\":\"InputMedia\"}],\"type\":\"payments.ExportedInvoice\"},{\"id\":647928393,\"method\":\"messages.transcribeAudio\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"messages.TranscribedAudio\"},{\"id\":2132608815,\"method\":\"messages.rateTranscribedAudio\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"transcription_id\",\"type\":\"long\"},{\"name\":\"good\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-2131921795,\"method\":\"payments.assignAppStoreTransaction\",\"params\":[{\"name\":\"receipt\",\"type\":\"bytes\"},{\"name\":\"purpose\",\"type\":\"InputStorePaymentPurpose\"}],\"type\":\"Updates\"},{\"id\":-537046829,\"method\":\"payments.assignPlayMarketTransaction\",\"params\":[{\"name\":\"receipt\",\"type\":\"DataJSON\"},{\"name\":\"purpose\",\"type\":\"InputStorePaymentPurpose\"}],\"type\":\"Updates\"},{\"id\":-1614700874,\"method\":\"payments.canPurchasePremium\",\"params\":[{\"name\":\"purpose\",\"type\":\"InputStorePaymentPurpose\"}],\"type\":\"Bool\"},{\"id\":-1206152236,\"method\":\"help.getPremiumPromo\",\"params\":[],\"type\":\"help.PremiumPromo\"},{\"id\":-643100844,\"method\":\"messages.getCustomEmojiDocuments\",\"params\":[{\"name\":\"document_id\",\"type\":\"Vector<long>\"}],\"type\":\"Vector<Document>\"},{\"id\":-67329649,\"method\":\"messages.getEmojiStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":248473398,\"method\":\"messages.getFeaturedEmojiStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-70001045,\"method\":\"account.updateEmojiStatus\",\"params\":[{\"name\":\"emoji_status\",\"type\":\"EmojiStatus\"}],\"type\":\"Bool\"},{\"id\":-696962170,\"method\":\"account.getDefaultEmojiStatuses\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.EmojiStatuses\"},{\"id\":257392901,\"method\":\"account.getRecentEmojiStatuses\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.EmojiStatuses\"},{\"id\":404757166,\"method\":\"account.clearRecentEmojiStatuses\",\"params\":[],\"type\":\"Bool\"},{\"id\":1063567478,\"method\":\"messages.reportReaction\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"reaction_peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-1149164102,\"method\":\"messages.getTopReactions\",\"params\":[{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Reactions\"},{\"id\":960896434,\"method\":\"messages.getRecentReactions\",\"params\":[{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Reactions\"},{\"id\":-1644236876,\"method\":\"messages.clearRecentReactions\",\"params\":[],\"type\":\"Bool\"},{\"id\":-2064119788,\"method\":\"messages.getExtendedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"Updates\"},{\"id\":767062953,\"method\":\"auth.importWebTokenAuthorization\",\"params\":[{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"web_auth_token\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"}]},\"layer\":147} as {\r\n MTProto: {\r\n constructors: MTProtoConstructor[],\r\n methods: MTProtoMethod[],\r\n constructorsIndex?: {[id: number]: number}\r\n },\r\n API: {\r\n constructors: MTProtoConstructor[],\r\n methods: MTProtoMethod[],\r\n constructorsIndex?: {[id: number]: number}\r\n },\r\n layer: number,\r\n};\r\n","export default function intToUint(val: number) {\r\n // return val < 0 ? val + 4294967296 : val; // 0 <= val <= Infinity\r\n return val >>> 0; // (4294967296 >>> 0) === 0; 0 <= val <= 4294967295\r\n}\r\n","import bigInt from 'big-integer';\r\nimport intToUint from '../number/intToUint';\r\n\r\nexport default function ulongFromInts(high: number, low: number) {\r\n high = intToUint(high), low = intToUint(low);\r\n return bigInt(high).shiftLeft(32).add(bigInt(low));\r\n}\r\n","import bigInt from 'big-integer';\r\n\r\nexport const safeBigInt = bigInt(Number.MAX_SAFE_INTEGER);\r\nexport const ulongBigInt = bigInt(bigInt[2]).pow(64);\r\nexport const longBigInt = ulongBigInt.divide(bigInt[2]);\r\n","import bigInt from 'big-integer';\r\nimport { longBigInt, ulongBigInt } from './bigIntConstants';\r\n\r\nexport function bigIntFromBytes(bytes: Uint8Array | number[], base = 256) {\r\n return bigInt.fromArray(bytes instanceof Uint8Array ? [...bytes] : bytes, base);\r\n}\r\n\r\nexport function bigIntToBytes(bigInt: bigInt.BigInteger) {\r\n return new Uint8Array(bigInt.toArray(256).value);\r\n}\r\n\r\nexport function bigIntToSigned(bigInt: bigInt.BigInteger) {\r\n return bigInt.greater(longBigInt) ? bigInt.minus(ulongBigInt) : bigInt;\r\n}\r\n\r\nexport function bigIntToUnsigned(bigInt: bigInt.BigInteger) {\r\n return bigInt.isNegative() ? ulongBigInt.add(bigInt) : bigInt;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport Schema, {MTProtoConstructor} from './schema';\r\nimport {JSONValue} from '../../layer';\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\r\nimport isObject from '../../helpers/object/isObject';\r\nimport gzipUncompress from '../../helpers/gzipUncompress';\r\nimport bigInt from 'big-integer';\r\nimport ulongFromInts from '../../helpers/long/ulongFromInts';\r\nimport {safeBigInt} from '../../helpers/bigInt/bigIntConstants';\r\nimport {bigIntToSigned, bigIntToUnsigned} from '../../helpers/bigInt/bigIntConversion';\r\n\r\nconst boolFalse = +Schema.API.constructors.find((c) => c.predicate === 'boolFalse').id;\r\nconst boolTrue = +Schema.API.constructors.find((c) => c.predicate === 'boolTrue').id;\r\nconst vector = +Schema.API.constructors.find((c) => c.predicate === 'vector').id;\r\nconst gzipPacked = +Schema.MTProto.constructors.find((c) => c.predicate === 'gzip_packed').id;\r\n\r\n// * using slice to have a new buffer, otherwise the buffer will be copied to main thread\r\nconst sliceMethod: 'slice' | 'subarray' = 'slice'; // subarray\r\n\r\nclass TLSerialization {\r\n private maxLength = 2048; // 2Kb\r\n private offset = 0; // in bytes\r\n private mtproto = false;\r\n private debug = false;// Modes.debug;\r\n\r\n private buffer: ArrayBuffer;\r\n private intView: Int32Array;\r\n private byteView: Uint8Array;\r\n\r\n constructor(options: Partial<{startMaxLength: number, mtproto: true}> = {}) {\r\n this.maxLength = options.startMaxLength || 2048; // 2Kb\r\n this.mtproto = options.mtproto || false;\r\n this.createBuffer();\r\n }\r\n\r\n public createBuffer() {\r\n this.buffer = new ArrayBuffer(this.maxLength);\r\n this.intView = new Int32Array(this.buffer);\r\n this.byteView = new Uint8Array(this.buffer);\r\n }\r\n\r\n public getArray() {\r\n const resultBuffer = new ArrayBuffer(this.offset);\r\n\r\n // let perf = performance.now();\r\n /* const resultUint8: any = new Uint8Array(resultBuffer);\r\n resultUint8.set(this.byteView.subarray(0, this.offset)); */\r\n // console.log('perf uint8', performance.now() - perf);\r\n\r\n // perf = performance.now();\r\n const resultInt32 = new Int32Array(resultBuffer);\r\n resultInt32.set(this.intView.subarray(0, this.offset / 4));\r\n // console.log('perf int32', performance.now() - perf);\r\n\r\n /* if(resultUint8.buffer.byteLength !== resultInt32.buffer.byteLength) {\r\n console.error(resultUint8, resultInt32);\r\n } */\r\n\r\n return resultInt32;\r\n }\r\n\r\n public getBuffer() {\r\n return this.getArray().buffer;\r\n }\r\n\r\n public getBytes(typed: true): Uint8Array;\r\n public getBytes(typed?: false): number[];\r\n public getBytes(typed: boolean = true): number[] | Uint8Array {\r\n if(typed) {\r\n const resultBuffer = new ArrayBuffer(this.offset);\r\n const resultArray = new Uint8Array(resultBuffer);\r\n\r\n resultArray.set(this.byteView.subarray(0, this.offset));\r\n\r\n return resultArray;\r\n }\r\n\r\n const bytes: number[] = new Array(this.offset);\r\n for(let i = 0; i < this.offset; i++) {\r\n bytes[i] = this.byteView[i];\r\n }\r\n return bytes;\r\n }\r\n\r\n public getOffset() {\r\n return this.offset;\r\n }\r\n\r\n public checkLength(needBytes: number) {\r\n if(this.offset + needBytes < this.maxLength) {\r\n return;\r\n }\r\n\r\n // console.log('Increase buffer start', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32));\r\n this.maxLength = Math.ceil(Math.max(this.maxLength * 2, this.offset + needBytes + 16) / 4) * 4;\r\n const previousBuffer = this.buffer;\r\n // const previousByteView = this.byteView;\r\n const previousArray = new Int32Array(previousBuffer);\r\n\r\n this.createBuffer();\r\n\r\n new Int32Array(this.buffer).set(previousArray);\r\n /* console.log('Increase buffer end', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32),\r\n bytesCmp(previousByteView, this.byteView.slice(0, previousByteView.length))); */\r\n }\r\n\r\n public writeInt(i: number, field: string) {\r\n this.debug && console.log('>>>', i.toString(16), i, field);\r\n\r\n const offset = this.offset / 4;\r\n this.checkLength(4);\r\n this.intView[offset] = i;\r\n this.offset += 4;\r\n\r\n return offset;\r\n }\r\n\r\n public storeInt(i: number, field?: string) {\r\n return this.writeInt(i, (field || '') + ':int');\r\n }\r\n\r\n public storeBool(i: boolean, field?: string) {\r\n if(i) {\r\n this.writeInt(boolTrue, (field || '') + ':bool');\r\n } else {\r\n this.writeInt(boolFalse, (field || '') + ':bool');\r\n }\r\n }\r\n\r\n public storeLongP(iHigh: number, iLow: number, field?: string) {\r\n this.writeInt(iLow, (field || '') + ':long[low]');\r\n this.writeInt(iHigh, (field || '') + ':long[high]');\r\n }\r\n\r\n public storeLong(sLong: Array<number> | string | number, field?: string) {\r\n if(Array.isArray(sLong)) {\r\n if(sLong.length === 2) {\r\n return this.storeLongP(sLong[0], sLong[1], field);\r\n } else {\r\n return this.storeIntBytes(sLong, 64, field);\r\n }\r\n }\r\n\r\n const _bigInt = bigIntToUnsigned(bigInt(sLong as string));\r\n const {quotient, remainder} = _bigInt.divmod(0x100000000);\r\n const high = quotient.toJSNumber();\r\n const low = remainder.toJSNumber();\r\n\r\n this.writeInt(low, (field || '') + ':long[low]');\r\n this.writeInt(high, (field || '') + ':long[high]');\r\n }\r\n\r\n public storeDouble(f: any, field?: string) {\r\n const buffer = new ArrayBuffer(8);\r\n const intView = new Int32Array(buffer);\r\n const doubleView = new Float64Array(buffer);\r\n\r\n doubleView[0] = f;\r\n\r\n this.writeInt(intView[0], (field || '') + ':double[low]');\r\n this.writeInt(intView[1], (field || '') + ':double[high]');\r\n }\r\n\r\n public storeString(s: string, field?: string) {\r\n this.debug && console.log('>>>', s, (field || '') + ':string');\r\n\r\n if(s === undefined) {\r\n s = '';\r\n }\r\n const sUTF8 = unescape(encodeURIComponent(s));\r\n\r\n this.checkLength(sUTF8.length + 8);\r\n\r\n const len = sUTF8.length;\r\n if(len <= 253) {\r\n this.byteView[this.offset++] = len;\r\n } else {\r\n this.byteView[this.offset++] = 254;\r\n this.byteView[this.offset++] = len & 0xFF;\r\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\r\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\r\n }\r\n for(let i = 0; i < len; i++) {\r\n this.byteView[this.offset++] = sUTF8.charCodeAt(i);\r\n }\r\n\r\n // Padding\r\n while(this.offset % 4) {\r\n this.byteView[this.offset++] = 0;\r\n }\r\n }\r\n\r\n public storeBytes(bytes: ArrayBuffer | Uint8Array | number[], field?: string) {\r\n if(bytes instanceof ArrayBuffer) {\r\n bytes = new Uint8Array(bytes);\r\n } else if(bytes === undefined) {\r\n bytes = [];\r\n }\r\n\r\n this.debug && console.log('>>>', bytesToHex(bytes as number[]), (field || '') + ':bytes');\r\n\r\n // if uint8array was json.stringified, then will be: {'0': 123, '1': 123}\r\n const len = (bytes as Uint8Array).length;\r\n this.checkLength(len + 8);\r\n if(len <= 253) {\r\n this.byteView[this.offset++] = len;\r\n } else {\r\n this.byteView[this.offset++] = 254;\r\n this.byteView[this.offset++] = len & 0xFF;\r\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\r\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\r\n }\r\n\r\n this.byteView.set(bytes as Uint8Array, this.offset);\r\n this.offset += len;\r\n\r\n // Padding\r\n while(this.offset % 4) {\r\n this.byteView[this.offset++] = 0;\r\n }\r\n }\r\n\r\n public storeIntBytes(bytes: ArrayBuffer | Uint8Array | number[], bits: number, field?: string) {\r\n if(bytes instanceof ArrayBuffer) {\r\n bytes = new Uint8Array(bytes);\r\n }\r\n\r\n const len = (bytes as Uint8Array).length;\r\n if((bits % 32) || (len * 8) !== bits) {\r\n const error = new Error('Invalid bits: ' + bits + ', ' + len);\r\n console.error(error, bytes, field);\r\n throw error;\r\n }\r\n\r\n this.debug && console.log('>>>', bytesToHex(bytes as Uint8Array), (field || '') + ':int' + bits);\r\n this.checkLength(len);\r\n\r\n this.byteView.set(bytes as Uint8Array, this.offset);\r\n this.offset += len;\r\n }\r\n\r\n public storeRawBytes(bytes: ArrayLike<number>, field?: string) {\r\n if(bytes instanceof ArrayBuffer) {\r\n bytes = new Uint8Array(bytes);\r\n }\r\n\r\n const len = bytes.length;\r\n\r\n this.debug && console.log('>>>', bytesToHex(bytes), (field || ''));\r\n this.checkLength(len);\r\n\r\n this.byteView.set(bytes, this.offset);\r\n this.offset += len;\r\n }\r\n\r\n public storeMethod(methodName: string, params: any) {\r\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\r\n const methodData = schema.methods.find((m) => m.method === methodName);\r\n\r\n if(!methodData) {\r\n throw new Error('No method ' + methodName + ' found');\r\n }\r\n\r\n this.storeInt(methodData.id, methodName + '[id]');\r\n\r\n const pFlags = params.pFlags || params; // * support pFlags, though am not expecting it to be there\r\n const flagsOffsets: {[paramName: string]: number} = {};\r\n // console.log('storeMethod', len, methodData);\r\n for(const param of methodData.params) {\r\n let type = param.type;\r\n\r\n if(type.indexOf('?') !== -1) {\r\n const condType = type.split('?');\r\n const fieldBit = condType[0].split('.');\r\n\r\n if(!(params[fieldBit[0]] & (1 << +fieldBit[1]))) {\r\n if(condType[1] === 'true' ? pFlags[param.name] : params[param.name] !== undefined) {\r\n // console.log('storeMethod autocompleting', methodName, param.name, params[param.name], type);\r\n params[fieldBit[0]] |= 1 << +fieldBit[1];\r\n } else {\r\n continue;\r\n }\r\n }\r\n\r\n // console.log('storeMethod', methodName, fieldBit, params[fieldBit[0]], params, param, condType, !!(params[fieldBit[0]] & (1 << +fieldBit[1])));\r\n type = condType[1];\r\n }\r\n\r\n // console.log('storeMethod', methodName, param.name, params[param.name], type);\r\n const result = this.storeObject(params[param.name], type, methodName + '[' + param.name + ']');\r\n\r\n if(type === '#') {\r\n params[param.name] = params[param.name] || 0;\r\n flagsOffsets[param.name] = result as number;\r\n }\r\n }\r\n\r\n for(const paramName in flagsOffsets) {\r\n this.intView[flagsOffsets[paramName]] = params[paramName];\r\n }\r\n\r\n return methodData.type;\r\n }\r\n\r\n public storeObject(obj: any, type: string, field?: string) {\r\n // console.log('storeObject', obj, type, field, this.offset, this.getBytes(true).hex);\r\n switch(type) {\r\n case '#':\r\n obj = obj || 0;\r\n case 'int':\r\n return this.storeInt(obj, field);\r\n case 'long':\r\n return this.storeLong(obj, field);\r\n case 'int128':\r\n return this.storeIntBytes(obj, 128, field);\r\n case 'int256':\r\n return this.storeIntBytes(obj, 256, field);\r\n case 'int512':\r\n return this.storeIntBytes(obj, 512, field);\r\n case 'string':\r\n return this.storeString(obj, field);\r\n case 'bytes':\r\n return this.storeBytes(obj, field);\r\n case 'double':\r\n return this.storeDouble(obj, field);\r\n case 'Bool':\r\n return this.storeBool(obj, field);\r\n case 'true':\r\n return\r\n }\r\n\r\n if(Array.isArray(obj)) {\r\n if(type.substr(0, 6) === 'Vector') {\r\n this.writeInt(vector, field + '[id]');\r\n } else if(type.substr(0, 6) !== 'vector') {\r\n throw new Error('Invalid vector type ' + type);\r\n }\r\n\r\n const itemType = type.substr(7, type.length - 8); // for \"Vector<itemType>\"\r\n this.writeInt(obj.length, field + '[count]');\r\n for(let i = 0; i < obj.length; i++) {\r\n this.storeObject(obj[i], itemType, field + '[' + i + ']');\r\n }\r\n\r\n return true;\r\n } else if(type.substr(0, 6).toLowerCase() === 'vector') {\r\n throw new Error('Invalid vector object');\r\n }\r\n\r\n if(!isObject(obj)) {\r\n throw new Error('Invalid object for type ' + type);\r\n }\r\n\r\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\r\n const predicate = obj['_'];\r\n let isBare = false;\r\n const constructorData: MTProtoConstructor = schema.constructors.find((c) => c.predicate === predicate);\r\n\r\n if(isBare = (type.charAt(0) === '%')) {\r\n type = type.substr(1);\r\n }\r\n\r\n if(!constructorData) {\r\n throw new Error('No predicate ' + predicate + ' found');\r\n }\r\n\r\n if(predicate === type) {\r\n isBare = true;\r\n }\r\n\r\n if(!isBare) {\r\n this.writeInt(constructorData.id, field + '[' + predicate + '][id]');\r\n }\r\n\r\n const pFlags = obj.pFlags;\r\n const flagsOffsets: {[paramName: string]: number} = {};\r\n // console.log('storeObject', len, constructorData);\r\n for(const param of constructorData.params) {\r\n let type = param.type;\r\n\r\n // console.log('storeObject', param, type);\r\n if(type.indexOf('?') !== -1) {\r\n const condType = type.split('?');\r\n const fieldBit = condType[0].split('.');\r\n\r\n // console.log('storeObject fieldBit', fieldBit, obj[fieldBit[0]]);\r\n\r\n if(!(obj[fieldBit[0]] & (1 << +fieldBit[1]))) {\r\n if(condType[1] === 'true' ? pFlags && pFlags[param.name] : obj[param.name] !== undefined) {\r\n // console.log('storeObject autocompleting', param.name, obj[param.name], type);\r\n obj[fieldBit[0]] |= 1 << +fieldBit[1];\r\n } else {\r\n continue;\r\n }\r\n }\r\n\r\n type = condType[1];\r\n }\r\n // console.log('storeObject', param, type);\r\n\r\n const result = this.storeObject(obj[param.name], type, field + '[' + predicate + '][' + param.name + ']');\r\n\r\n if(type === '#') {\r\n obj[param.name] = obj[param.name] || 0;\r\n flagsOffsets[param.name] = result as number;\r\n }\r\n }\r\n\r\n for(const paramName in flagsOffsets) {\r\n this.intView[flagsOffsets[paramName]] = obj[paramName];\r\n }\r\n\r\n return constructorData.type;\r\n }\r\n}\r\n\r\nclass TLDeserialization<FetchLongAs extends Long> {\r\n private offset = 0; // in bytes\r\n private override: {[key: string]: (result: any, field: string) => void};\r\n\r\n private buffer: ArrayBuffer;\r\n private intView: Int32Array;\r\n private byteView: Uint8Array;\r\n\r\n // this.debug =\r\n private mtproto: boolean = false;\r\n private debug: boolean;\r\n\r\n constructor(buffer: ArrayBuffer | Uint8Array, options: Partial<{override: any, mtproto: true, debug: true}> = {}) {\r\n // buffer = addPadding(buffer, 4, true); // fix 21.01.2020 for wss\r\n if(buffer instanceof ArrayBuffer) {\r\n this.buffer = buffer;\r\n this.intView = new Int32Array(buffer);\r\n this.byteView = new Uint8Array(this.buffer);\r\n } else {\r\n this.buffer = buffer.buffer;\r\n this.intView = new Int32Array(buffer.buffer);\r\n this.byteView = buffer;\r\n }\r\n\r\n // console.log(this.intView);\r\n\r\n this.override = options.override || {};\r\n this.mtproto = !!options.mtproto;\r\n this.debug = options.debug !== undefined ? options.debug : /* Modes.debug */false;\r\n }\r\n\r\n /* public setMtproto(mtproto: boolean) {\r\n this.mtproto = mtproto;\r\n } */\r\n\r\n private readInt(field: string) {\r\n // if(this.offset >= this.intView.length * 4) {\r\n if((this.byteView.length - this.offset) < 4) {\r\n console.error(this.byteView, this.offset);\r\n throw new Error('Nothing to fetch: ' + field);\r\n }\r\n\r\n const i = this.intView[this.offset / 4];\r\n // const i = new Uint32Array(this.byteView.buffer.slice(this.offset, this.offset + 4))[0];\r\n\r\n this.debug &&/* || field.includes('[dialog][read_outbox_max_id]') */\r\n console.log('<<<', i.toString(16), i, field,\r\n this.byteView.slice(this.offset - 16, this.offset + 16),\r\n bytesToHex(this.byteView.slice(this.offset - 16, this.offset + 16)));\r\n\r\n this.offset += 4;\r\n\r\n return i;\r\n }\r\n\r\n public fetchInt(field?: string) {\r\n return this.readInt((field || '') + ':int');\r\n }\r\n\r\n public fetchDouble(field?: string) {\r\n const buffer = new ArrayBuffer(8);\r\n const intView = new Int32Array(buffer);\r\n const doubleView = new Float64Array(buffer);\r\n\r\n intView[0] = this.readInt((field || '') + ':double[low]'),\r\n intView[1] = this.readInt((field || '') + ':double[high]');\r\n\r\n return doubleView[0];\r\n }\r\n\r\n // ! it should've been signed\r\n public fetchLong(field?: string): FetchLongAs {\r\n const iLow = this.readInt((field || '') + ':long[low]');\r\n const iHigh = this.readInt((field || '') + ':long[high]');\r\n\r\n let ulong = ulongFromInts(iHigh, iLow);\r\n if(/* !unsigned && */!this.mtproto) { // make it signed\r\n ulong = bigIntToSigned(ulong);\r\n }\r\n\r\n if(!this.mtproto) {\r\n if(safeBigInt.greaterOrEquals(ulong.abs())) {\r\n // @ts-ignore\r\n return ulong.toJSNumber();\r\n }\r\n }\r\n\r\n // @ts-ignore\r\n return ulong.toString(10);\r\n }\r\n\r\n public fetchBool(field?: string): boolean {\r\n const i = this.readInt((field || '') + ':bool');\r\n if(i === boolTrue) {\r\n return true;\r\n } else if(i === boolFalse) {\r\n return false;\r\n }\r\n\r\n this.offset -= 4;\r\n return this.fetchObject('Object', field);\r\n }\r\n\r\n public fetchString(field?: string): string {\r\n let len = this.byteView[this.offset++];\r\n\r\n if(len === 254) {\r\n len = this.byteView[this.offset++] |\r\n (this.byteView[this.offset++] << 8) |\r\n (this.byteView[this.offset++] << 16);\r\n }\r\n\r\n let sUTF8 = '';\r\n for(let i = 0; i < len; i++) {\r\n sUTF8 += String.fromCharCode(this.byteView[this.offset++]);\r\n }\r\n\r\n // Padding\r\n while(this.offset % 4) {\r\n this.offset++;\r\n }\r\n\r\n let s: string;\r\n try {\r\n s = decodeURIComponent(escape(sUTF8));\r\n } catch(e) {\r\n s = sUTF8;\r\n }\r\n\r\n this.debug && console.log('<<<', s, (field || '') + ':string');\r\n\r\n return s;\r\n }\r\n\r\n public fetchBytes(field?: string) {\r\n let len = this.byteView[this.offset++];\r\n\r\n if(len === 254) {\r\n len = this.byteView[this.offset++] |\r\n (this.byteView[this.offset++] << 8) |\r\n (this.byteView[this.offset++] << 16);\r\n }\r\n\r\n const bytes = this.byteView[sliceMethod](this.offset, this.offset + len);\r\n this.offset += len;\r\n\r\n // Padding\r\n while(this.offset % 4) {\r\n this.offset++;\r\n }\r\n\r\n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':bytes');\r\n\r\n return bytes;\r\n }\r\n\r\n public fetchIntBytes(bits: number, typed: true, field?: string): Uint8Array;\r\n public fetchIntBytes(bits: number, typed?: false, field?: string): number[];\r\n public fetchIntBytes(bits: number, typed: boolean = true, field?: string) {\r\n if(bits % 32) {\r\n throw new Error('Invalid bits: ' + bits);\r\n }\r\n\r\n const len = bits / 8;\r\n if(typed) {\r\n const result = this.byteView[sliceMethod](this.offset, this.offset + len);\r\n this.offset += len;\r\n return result;\r\n }\r\n\r\n const bytes: number[] = new Array(len);\r\n for(let i = 0; i < len; i++) {\r\n bytes[i] = this.byteView[this.offset++];\r\n }\r\n\r\n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':int' + bits);\r\n\r\n return bytes;\r\n }\r\n\r\n public fetchRawBytes(len: number | false, typed: true, field: string): Uint8Array;\r\n public fetchRawBytes(len: number | false, typed: false, field: string): number[];\r\n public fetchRawBytes(len: number | false, typed: boolean = true, field: string) {\r\n if(len === false) {\r\n len = this.readInt((field || '') + '_length');\r\n if(len > this.byteView.byteLength) {\r\n throw new Error('Invalid raw bytes length: ' + len + ', buffer len: ' + this.byteView.byteLength);\r\n }\r\n }\r\n\r\n if(typed) {\r\n const bytes = new Uint8Array(len);\r\n bytes.set(this.byteView[sliceMethod](this.offset, this.offset + len));\r\n this.offset += len;\r\n return bytes;\r\n }\r\n\r\n const bytes: number[] = new Array(len);\r\n for(let i = 0; i < len; i++) {\r\n bytes[i] = this.byteView[this.offset++];\r\n }\r\n\r\n this.debug && console.log('<<<', bytesToHex(bytes), (field || ''));\r\n\r\n return bytes;\r\n }\r\n\r\n private fetchVector(type: string, field?: string) {\r\n const len = this.readInt(field + '[count]');\r\n const result: any[] = new Array(len);\r\n if(len > 0) {\r\n const itemType = type.substr(7, type.length - 8); // for \"Vector<itemType>\"\r\n for(let i = 0; i < len; ++i) {\r\n result[i] = this.fetchObject(itemType, field + '[' + i + ']');\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public fetchObject(type: string, field?: string): any {\r\n switch(type) {\r\n case '#':\r\n case 'int':\r\n return this.fetchInt(field);\r\n case 'long':\r\n return this.fetchLong(field);\r\n case 'int128':\r\n return this.fetchIntBytes(128, true, field);\r\n case 'int256':\r\n return this.fetchIntBytes(256, true, field);\r\n case 'int512':\r\n return this.fetchIntBytes(512, true, field);\r\n case 'string':\r\n return this.fetchString(field);\r\n case 'bytes':\r\n return this.fetchBytes(field);\r\n case 'double':\r\n return this.fetchDouble(field);\r\n case 'Bool':\r\n return this.fetchBool(field);\r\n case 'true':\r\n return true;\r\n }\r\n\r\n field = field || type || 'Object';\r\n\r\n if(type.charAt(0) === 'v' && type.substr(1, 5) === 'ector') {\r\n return this.fetchVector(type, field);\r\n }\r\n\r\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\r\n let constructorData: MTProtoConstructor = null;\r\n let fallback = false;\r\n\r\n if(type.charAt(0) === '%') {\r\n const checkType = type.substr(1);\r\n constructorData = schema.constructors.find((c) => c.type === checkType);\r\n if(!constructorData) {\r\n throw new Error('Constructor not found for type: ' + type);\r\n }\r\n }/* else if(type.charAt(0) >= 97 && type.charAt(0) <= 122) {\r\n constructorData = schema.constructors.find((c) => c.predicate === type);\r\n if(!constructorData) {\r\n throw new Error('Constructor not found for predicate: ' + type);\r\n }\r\n } */ else {\r\n const constructorCmp = this.readInt(field + '[id]');\r\n\r\n if(constructorCmp === gzipPacked) { // Gzip packed\r\n const compressed = this.fetchBytes(field + '[packed_string]');\r\n const uncompressed = gzipUncompress(compressed) as Uint8Array;\r\n const newDeserializer = new TLDeserialization(uncompressed); // rpc_result is packed here\r\n\r\n return newDeserializer.fetchObject(type, field);\r\n }\r\n\r\n if(constructorCmp === vector) {\r\n return this.fetchVector(type, field);\r\n }\r\n\r\n let index = schema.constructorsIndex;\r\n if(!index) {\r\n schema.constructorsIndex = index = {};\r\n for(let i = 0, len = schema.constructors.length; i < len; i++) {\r\n index[schema.constructors[i].id] = i;\r\n }\r\n }\r\n\r\n const i = index[constructorCmp];\r\n if(i !== undefined) {\r\n constructorData = schema.constructors[i];\r\n }\r\n\r\n if(!constructorData && this.mtproto) {\r\n const schemaFallback = Schema.API;\r\n for(let i = 0, len = schemaFallback.constructors.length; i < len; i++) {\r\n if(+schemaFallback.constructors[i].id === constructorCmp) {\r\n constructorData = schemaFallback.constructors[i];\r\n\r\n delete this.mtproto;\r\n fallback = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if(!constructorData) {\r\n console.error('Constructor not found:', constructorCmp);\r\n\r\n let int1: number, int2: number;\r\n try {\r\n int1 = this.fetchInt(field);\r\n int2 = this.fetchInt(field);\r\n } catch(err) {\r\n\r\n }\r\n\r\n throw new Error('Constructor not found: ' + constructorCmp + ' ' + int1 + ' ' + int2 + ' ' + field);\r\n }\r\n }\r\n\r\n const predicate = constructorData.predicate;\r\n\r\n const result: any = {'_': predicate};\r\n const overrideKey = (this.mtproto ? 'mt_' : '') + predicate;\r\n if(this.override[overrideKey]) {\r\n this.override[overrideKey](result, field + '[' + predicate + ']');\r\n } else {\r\n for(let i = 0, len = constructorData.params.length; i < len; i++) {\r\n const param = constructorData.params[i];\r\n let type = param.type;\r\n\r\n if(type === '#' && result.pFlags === undefined) {\r\n result.pFlags = {};\r\n }\r\n\r\n const isCond = (type.indexOf('?') !== -1);\r\n if(isCond) {\r\n const condType = type.split('?');\r\n const fieldBit = condType[0].split('.');\r\n\r\n if(!(result[fieldBit[0]] & (1 << +fieldBit[1]))) {\r\n // console.log('fetchObject bad', constructorData, result[fieldBit[0]], fieldBit);\r\n continue;\r\n }\r\n\r\n // console.log('fetchObject good', constructorData, result[fieldBit[0]], fieldBit);\r\n\r\n type = condType[1];\r\n }\r\n\r\n const value = this.fetchObject(type, field + '[' + predicate + '][' + param.name + ']');\r\n\r\n if(isCond && type === 'true') {\r\n result.pFlags[param.name] = value;\r\n } else {\r\n /* if(param.name === 'read_outbox_max_id') {\r\n console.log(result, param.name, value, field + '[' + predicate + '][' + param.name + ']');\r\n } */\r\n\r\n result[param.name] = value;\r\n }\r\n }\r\n }\r\n\r\n if(fallback) {\r\n this.mtproto = true;\r\n }\r\n\r\n if(type === 'JSONValue') {\r\n return this.formatJSONValue(result);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private formatJSONValue(jsonValue: JSONValue): any {\r\n if(!jsonValue._) return jsonValue;\r\n switch(jsonValue._) {\r\n case 'jsonNull':\r\n return null;\r\n case 'jsonObject': {\r\n const out: any = {};\r\n const objectValues = jsonValue.value;\r\n for(let i = 0, length = objectValues.length; i < length; ++i) {\r\n const objectValue = objectValues[i];\r\n out[objectValue.key] = this.formatJSONValue(objectValue.value);\r\n }\r\n return out;\r\n }\r\n default:\r\n return jsonValue.value;\r\n }\r\n }\r\n\r\n public getOffset() {\r\n return this.offset;\r\n }\r\n\r\n public setOffset(offset: number) {\r\n this.offset = offset;\r\n }\r\n\r\n /* public fetchEnd() {\r\n if(this.offset !== this.byteView.length) {\r\n throw new Error('Fetch end with non-empty buffer');\r\n }\r\n\r\n return true;\r\n } */\r\n}\r\n\r\nMOUNT_CLASS_TO.TLDeserialization = TLDeserialization;\r\nMOUNT_CLASS_TO.TLSerialization = TLSerialization;\r\nexport {TLDeserialization, TLSerialization};\r\n","// export function gzipUncompress(bytes: ArrayBuffer, toString: true): string;\r\n\r\n// @ts-ignore\r\nimport pako from 'pako/dist/pako_inflate.min.js';\r\n// import dT from './dT';\r\n\r\n// export function gzipUncompress(bytes: ArrayBuffer, toString?: false): Uint8Array;\r\nexport default function gzipUncompress(bytes: ArrayBuffer, toString?: boolean): string | Uint8Array {\r\n // console.log(dT(), 'Gzip uncompress start');\r\n const result = pako.inflate(bytes, toString ? {to: 'string'} : undefined);\r\n // console.log(dT(), 'Gzip uncompress finish'/* , result */);\r\n return result;\r\n}\r\n","import randomize from '../array/randomize';\r\nimport bufferConcats from './bufferConcats';\r\n\r\nexport default function addPadding<T extends number[] | ArrayBuffer | Uint8Array>(\r\n bytes: T,\r\n blockSize: number = 16,\r\n zeroes?: boolean,\r\n blockSizeAsTotalLength = false,\r\n prepend = false\r\n): T {\r\n const len = (bytes as ArrayBuffer).byteLength || (bytes as Uint8Array).length;\r\n const needPadding = blockSizeAsTotalLength ? blockSize - len : blockSize - (len % blockSize);\r\n if(needPadding > 0 && needPadding < blockSize) {\r\n // //console.log('addPadding()', len, blockSize, needPadding);\r\n const padding = new Uint8Array(needPadding);\r\n if(zeroes) {\r\n for(let i = 0; i < needPadding; ++i) {\r\n padding[i] = 0;\r\n }\r\n } else {\r\n randomize(padding);\r\n }\r\n\r\n if(bytes instanceof ArrayBuffer) {\r\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)).buffer as T;\r\n } else if(bytes instanceof Uint8Array) {\r\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)) as T;\r\n } else {\r\n // @ts-ignore\r\n return (prepend ? [...padding].concat(bytes) : bytes.concat([...padding])) as T;\r\n }\r\n }\r\n\r\n return bytes;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {TLDeserialization, TLSerialization} from './tl_utils';\nimport CryptoWorker from '../crypto/cryptoMessagePort';\nimport sessionStorage from '../sessionStorage';\nimport Schema from './schema';\nimport {NetworkerFactory} from './networkerFactory';\nimport {logger, LogTypes} from '../logger';\nimport {InvokeApiOptions} from '../../types';\nimport longToBytes from '../../helpers/long/longToBytes';\nimport MTTransport from './transports/transport';\nimport {nextRandomUint, randomLong} from '../../helpers/random';\nimport App from '../../config/app';\nimport DEBUG from '../../config/debug';\nimport Modes from '../../config/modes';\nimport noop from '../../helpers/noop';\n\n \nimport HTTP from './transports/http';\n \n\nimport type TcpObfuscated from './transports/tcpObfuscated';\nimport bigInt from 'big-integer';\nimport {ConnectionStatus} from './connectionStatus';\nimport ctx from '../../environment/ctx';\nimport bufferConcats from '../../helpers/bytes/bufferConcats';\nimport bytesCmp from '../../helpers/bytes/bytesCmp';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport convertToUint8Array from '../../helpers/bytes/convertToUint8Array';\nimport isObject from '../../helpers/object/isObject';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport sortLongsArray from '../../helpers/long/sortLongsArray';\nimport randomize from '../../helpers/array/randomize';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport pause from '../../helpers/schedulers/pause';\nimport {getEnvironment} from '../../environment/utils';\nimport {TimeManager} from './timeManager';\n\n// console.error('networker included!', new Error().stack);\n\nexport type MTMessageOptions = InvokeApiOptions & Partial<{\n noResponse: true, // http_wait\n longPoll: true,\n\n notContentRelated: true, // ACK\n noSchedule: true,\n // withResult: true,\n messageId: MTLong,\n}>;\n\nexport type MTMessage = InvokeApiOptions & MTMessageOptions & {\n msg_id: MTLong,\n seq_no: number,\n body?: Uint8Array | number[],\n isAPI?: boolean,\n // only these four are important\n\n acked?: boolean,\n\n deferred?: CancellablePromise<void>,\n\n container?: boolean,\n inner?: MTLong[],\n\n // below - options\n\n notContentRelated?: true,\n noSchedule?: true,\n\n resultType?: string,\n\n longPoll?: true,\n noResponse?: true, // only with http (http_wait for longPoll)\n};\n\nconst DRAIN_TIMEOUT = 10000;\nconst delays: {\n [k in 'client' | 'file']: {\n disconnectDelayMin: number,\n disconnectDelayMax: number,\n pingInterval: number,\n pingMaxTime: number,\n connectionTimeout: number\n }\n} = {\n client: {\n disconnectDelayMin: 7,\n disconnectDelayMax: 20,\n pingInterval: 2000,\n pingMaxTime: 5,\n connectionTimeout: 5000\n },\n file: {\n disconnectDelayMin: 10,\n disconnectDelayMax: 24,\n pingInterval: 3000,\n pingMaxTime: 7,\n connectionTimeout: 7500\n }\n};\nconst RESEND_OPTIONS: MTMessageOptions = {\n noSchedule: true,\n notContentRelated: true\n};\nlet invokeAfterMsgConstructor: number;\nlet networkerTempId = 0;\n\nexport default class MTPNetworker {\n private authKeyUint8: Uint8Array;\n\n public isFileNetworker: boolean;\n private isFileUpload: boolean;\n private isFileDownload: boolean;\n\n private lastServerMessages: Array<MTLong> = [];\n\n private sentMessages: {\n [msgId: MTLong]: MTMessage\n } = {};\n\n private pendingMessages: {[msgId: MTLong]: number} = {};\n private pendingAcks: Array<MTLong> = [];\n private pendingResendReq: MTLong[] = [];\n // private pendingResendAnsReq: MTLong[] = [];\n public connectionInited: boolean;\n\n private nextReqTimeout: number;\n private nextReq: number = 0;\n\n \n private longPollInterval: number;\n private longPollPending: number;\n private checkConnectionRetryAt: number;\n private checkConnectionTimeout: number;\n private checkConnectionPeriod = 0;\n private sleepAfter: number;\n private offline = false;\n private sendingLongPoll: boolean;\n \n\n private seqNo: number;\n private prevSessionId: Uint8Array;\n private sessionId: Uint8Array;\n private serverSalt: Uint8Array;\n\n private lastResendReq: {\n reqMsgId: MTLong,\n msgIds: MTPNetworker['pendingResendReq']\n };\n // private lastResendAnsReq: MTPNetworker['lastResendReq'];\n\n private name: string;\n private log: ReturnType<typeof logger>;\n\n public isOnline = false;\n private status: ConnectionStatus = ConnectionStatus.Closed;\n private lastResponseTime = 0;\n\n private debug = DEBUG /* && false */ || Modes.debug;\n\n public activeRequests = 0;\n\n public onDrain: () => void;\n private onDrainTimeout: number;\n\n public transport: MTTransport;\n\n \n private pingDelayDisconnectDeferred: CancellablePromise<string>;\n private pingPromise: Promise<void>;\n // private pingInterval: number;\n private lastPingTime: number;\n private lastPingStartTime: number;\n private lastPingDelayDisconnectId: string;\n \n // public onConnectionStatusChange: (online: boolean) => void;\n\n // private debugRequests: Array<{before: Uint8Array, after: Uint8Array}> = [];\n\n private delays: typeof delays[keyof typeof delays];\n // private getNewTimeOffset: boolean;\n\n constructor(\n private networkerFactory: NetworkerFactory,\n private timeManager: TimeManager,\n public dcId: number,\n private authKey: Uint8Array,\n private authKeyId: Uint8Array,\n serverSalt: Uint8Array,\n options: InvokeApiOptions = {}\n ) {\n this.authKeyUint8 = convertToUint8Array(this.authKey);\n this.serverSalt = convertToUint8Array(serverSalt);\n\n this.isFileUpload = !!options.fileUpload;\n this.isFileDownload = !!options.fileDownload;\n this.isFileNetworker = this.isFileUpload || this.isFileDownload;\n this.delays = this.isFileNetworker ? delays.file : delays.client;\n\n const suffix = this.isFileUpload ? '-U' : this.isFileDownload ? '-D' : '';\n this.name = 'NET-' + dcId + suffix;\n // this.log = logger(this.name, this.upload && this.dcId === 2 ? LogLevels.debug | LogLevels.warn | LogLevels.log | LogLevels.error : LogLevels.error);\n this.log = logger(this.name + (suffix ? '' : '-C') + '-' + networkerTempId++, LogTypes.Log/* | LogTypes.Debug */ | LogTypes.Error | LogTypes.Warn);\n this.log('constructor'/* , this.authKey, this.authKeyID, this.serverSalt */);\n\n // Test resend after bad_server_salt\n /* if(this.dcId === 2 && this.upload) {\n //timeManager.applyServerTime((Date.now() / 1000 - 86400) | 0);\n this.serverSalt[0] = 0;\n } */\n\n this.updateSession();\n\n // if(!NetworkerFactory.offlineInited) {\n // NetworkerFactory.offlineInited = true;\n // /* rootScope.offline = true\n // rootScope.offlineConnecting = true */\n // }\n }\n\n private updateSession() {\n this.seqNo = 0;\n this.prevSessionId = this.sessionId;\n this.sessionId = randomize(new Uint8Array(8));\n }\n\n /* private clearContainers() {\n for(const messageId in this.sentMessages) {\n const message = this.sentMessages[messageId];\n if(message.container) {\n delete this.sentMessages[messageId];\n }\n }\n } */\n\n private updateSentMessage(sentMessageId: string) {\n const sentMessage = this.sentMessages[sentMessageId];\n if(!sentMessage) {\n return false;\n }\n\n if(sentMessage.container) {\n forEachReverse(sentMessage.inner, (innerSentMessageId, idx) => {\n const innerSentMessage = this.updateSentMessage(innerSentMessageId);\n if(!innerSentMessage) {\n sentMessage.inner.splice(idx, 1);\n } else {\n sentMessage.inner[idx] = innerSentMessage.msg_id;\n }\n });\n }\n\n sentMessage.msg_id = this.timeManager.generateId();\n sentMessage.seq_no = this.generateSeqNo(sentMessage.notContentRelated || sentMessage.container);\n\n if(this.debug) {\n this.log(`updateSentMessage, old=${sentMessageId}, new=${sentMessage.msg_id}`);\n }\n\n this.sentMessages[sentMessage.msg_id] = sentMessage;\n delete this.sentMessages[sentMessageId];\n\n return sentMessage;\n }\n\n private generateSeqNo(notContentRelated?: boolean) {\n let seqNo = this.seqNo * 2;\n\n if(!notContentRelated) {\n seqNo++;\n this.seqNo++;\n }\n\n return seqNo;\n }\n\n public wrapMtpCall(method: string, params: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n\n serializer.storeMethod(method, params);\n\n const messageId = this.timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n\n if(Modes.debug) {\n this.log('MT call', method, params, messageId, seqNo);\n }\n\n return this.pushMessage(message, options);\n }\n\n public wrapMtpMessage(object: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeObject(object, 'Object');\n\n const messageId = this.timeManager.generateId();\n const seqNo = this.generateSeqNo(options.notContentRelated);\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n\n if(Modes.debug) {\n this.log('MT message', object, messageId, seqNo);\n }\n\n return this.pushMessage(message, options);\n }\n\n public wrapApiCall(method: string, params: any = {}, options: InvokeApiOptions = {}) {\n const serializer = new TLSerialization(options);\n\n if(!this.connectionInited) { // this will call once for each new session\n // /////this.log('Wrap api call !this.connectionInited');\n\n const invokeWithLayer = Schema.API.methods.find((m) => m.method === 'invokeWithLayer');\n if(!invokeWithLayer) throw new Error('no invokeWithLayer!');\n serializer.storeInt(+invokeWithLayer.id, 'invokeWithLayer');\n\n // @ts-ignore\n serializer.storeInt(Schema.layer, 'layer');\n\n const initConnection = Schema.API.methods.find((m) => m.method === 'initConnection');\n if(!initConnection) throw new Error('no initConnection!');\n\n serializer.storeInt(+initConnection.id, 'initConnection');\n serializer.storeInt(0x0, 'flags');\n serializer.storeInt(App.id, 'api_id');\n serializer.storeString(getEnvironment().USER_AGENT || 'Unknown UserAgent', 'device_model');\n serializer.storeString(navigator.platform || 'Unknown Platform', 'system_version');\n serializer.storeString(App.version + (App.isMainDomain ? ' ' + App.suffix : ''), 'app_version');\n serializer.storeString(navigator.language || 'en', 'system_lang_code');\n serializer.storeString(App.langPack, 'lang_pack');\n serializer.storeString(this.networkerFactory.language, 'lang_code');\n // serializer.storeInt(0x0, 'proxy');\n /* serializer.storeMethod('initConnection', {\n 'flags': 0,\n 'api_id': App.id,\n 'device_model': navigator.userAgent || 'Unknown UserAgent',\n 'system_version': navigator.platform || 'Unknown Platform',\n 'app_version': App.version,\n 'system_lang_code': navigator.language || 'en',\n 'lang_pack': '',\n 'lang_code': navigator.language || 'en'\n }); */\n }\n\n if(options.afterMessageId) {\n if(invokeAfterMsgConstructor === undefined) {\n const m = Schema.API.methods.find((m) => m.method === 'invokeAfterMsg');\n invokeAfterMsgConstructor = m ? +m.id : 0;\n }\n\n if(invokeAfterMsgConstructor) {\n // if(this.debug) {\n // this.log('invokeApi: store invokeAfterMsg');\n // }\n\n serializer.storeInt(invokeAfterMsgConstructor, 'invokeAfterMsg');\n serializer.storeLong(options.afterMessageId, 'msg_id');\n } else {\n this.log.error('no invokeAfterMsg!');\n }\n }\n\n options.resultType = serializer.storeMethod(method, params);\n\n /* if(method === 'account.updateNotifySettings') {\n this.log('api call body:', serializer.getBytes(true));\n } */\n\n const messageId = this.timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true),\n isAPI: true\n };\n\n if(Modes.debug/* || true */) {\n this.log('Api call', method, message, params, options);\n } else if(this.debug) {\n this.log('Api call', method, params, options);\n }\n\n return this.pushMessage(message, options);\n }\n\n public changeTransport(transport?: MTTransport) {\n const oldTransport = this.transport;\n if(oldTransport) {\n oldTransport.destroy();\n\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n }\n\n this.connectionInited = false;\n\n \n if(this.longPollInterval !== undefined) {\n clearInterval(this.longPollInterval);\n this.longPollInterval = undefined;\n }\n\n this.clearCheckConnectionTimeout();\n \n }\n\n this.log('change transport', transport, oldTransport);\n\n \n this.clearPingDelayDisconnect();\n\n // if(this.pingInterval !== undefined) {\n // clearInterval(this.pingInterval);\n // this.pingInterval = undefined;\n // }\n\n // this.clearPing();\n \n\n this.transport = transport;\n if(!transport) {\n return;\n }\n\n transport.networker = this;\n\n \n \n if(transport instanceof HTTP) {\n \n this.longPollInterval = ctx.setInterval(this.checkLongPoll, 10000);\n this.checkLongPoll();\n this.checkConnection('changed transport');\n \n }\n \n \n\n \n // * handle outcoming dead socket, server will close the connection\n if((transport as TcpObfuscated).connection) {\n // this.sendPingDelayDisconnect();\n\n if(transport.connected) {\n this.setConnectionStatus(ConnectionStatus.Connected);\n }\n\n // this.pingInterval = ctx.setInterval(this.sendPing, PING_INTERVAL);\n // this.sendPing();\n }\n \n\n this.resend();\n }\n\n public destroy() {\n this.log('destroy');\n }\n\n public forceReconnectTimeout() {\n if((this.transport as TcpObfuscated).reconnect) {\n (this.transport as TcpObfuscated).reconnect();\n } else {\n this.resend();\n }\n }\n\n public forceReconnect() {\n if((this.transport as TcpObfuscated).forceReconnect) {\n (this.transport as TcpObfuscated).forceReconnect();\n } else {\n this.checkConnection('force reconnect');\n }\n }\n\n /* private clearPing() {\n if(this.pingPromise) {\n this.pingPromise = undefined;\n }\n\n this.lastPingTime = undefined;\n }\n\n private sendPing = () => {\n // return;\n\n // if(!(this.transport as TcpObfuscated).connected) {\n // this.clearPing();\n // return;\n // }\n\n if(this.pingPromise) {\n return;\n }\n\n const startTime = Date.now();\n this.log('sendPing: ping', startTime);\n const promise = this.pingPromise = this.wrapMtpCall('ping', {\n ping_id: randomLong()\n }, {\n notContentRelated: true\n }).then(() => {\n const elapsedTime = Date.now() - startTime;\n this.lastPingTime = elapsedTime / 1000;\n this.log('sendPing: pong', elapsedTime);\n\n setTimeout(() => {\n if(this.pingPromise !== promise) {\n return;\n }\n\n this.pingPromise = undefined;\n this.sendPing();\n }, Math.max(0, PING_INTERVAL - elapsedTime));\n });\n }; */\n\n private clearPingDelayDisconnect() {\n const deferred = this.pingDelayDisconnectDeferred;\n this.pingDelayDisconnectDeferred = undefined;\n this.lastPingDelayDisconnectId = undefined;\n\n if(deferred) {\n deferred.reject();\n }\n }\n\n private sendPingDelayDisconnect = () => {\n // return;\n\n if(this.pingDelayDisconnectDeferred || !this.transport || !this.transport.connected) return;\n\n /* if(!this.isOnline) {\n if((this.transport as TcpObfuscated).connected) {\n (this.transport as TcpObfuscated).connection.close();\n }\n\n return;\n } */\n\n const deferred = this.pingDelayDisconnectDeferred = deferredPromise();\n const delays = this.delays;\n const pingMaxTime = this.delays.pingMaxTime;\n const lastPingTime = Math.min(this.lastPingTime ?? 0, pingMaxTime);\n const disconnectDelay = Math.round(delays.disconnectDelayMin + lastPingTime / pingMaxTime * (delays.disconnectDelayMax - delays.disconnectDelayMin));\n const timeoutTime = disconnectDelay * 1000;\n const startTime = this.lastPingStartTime = Date.now();\n const pingId = this.lastPingDelayDisconnectId = randomLong();\n const options: MTMessageOptions = {notContentRelated: true};\n this.wrapMtpCall('ping_delay_disconnect', {\n ping_id: pingId,\n disconnect_delay: disconnectDelay\n }, options);\n\n const log = this.log.bindPrefix('sendPingDelayDisconnect');\n this.debug && log.debug(`ping, timeout=${timeoutTime}, lastPingTime=${this.lastPingTime}, msgId=${options.messageId}, pingId=${pingId}`);\n const rejectTimeout = ctx.setTimeout(deferred.reject, timeoutTime);\n\n const onResolved = (reason: string) => {\n clearTimeout(rejectTimeout);\n const elapsedTime = Date.now() - startTime;\n this.lastPingTime = elapsedTime / 1000;\n this.debug && log.debug(`pong, reason='${reason}', time=${lastPingTime}, msgId=${options.messageId}`);\n if(elapsedTime > timeoutTime) {\n throw undefined;\n } else {\n return pause(Math.max(0, this.delays.pingInterval - elapsedTime/* timeoutTime - elapsedTime - PING_INTERVAL */));\n }\n };\n\n const onTimeout = () => {\n clearTimeout(rejectTimeout);\n const transport = this.transport as TcpObfuscated;\n if(this.pingDelayDisconnectDeferred !== deferred || !transport?.connection) {\n return;\n }\n\n log.error('catch, closing connection', this.lastPingTime, options.messageId);\n transport.connection.close();\n };\n\n const onFinally = () => {\n if(this.pingDelayDisconnectDeferred !== deferred) {\n return;\n }\n\n this.pingDelayDisconnectDeferred = undefined;\n this.sendPingDelayDisconnect();\n };\n\n deferred\n .then(onResolved)\n .catch(onTimeout)\n .finally(onFinally);\n };\n\n \n private checkLongPoll = () => {\n const isClean = this.cleanupSent();\n // this.log.error('Check lp', this.longPollPending, this.dcId, isClean, this);\n if((this.longPollPending && Date.now() < this.longPollPending) ||\n this.offline ||\n this.isStopped() ||\n this.isFileNetworker) {\n // this.log('No lp this time');\n return false;\n }\n\n sessionStorage.get('dc').then((baseDcId) => {\n if(isClean && (\n baseDcId !== this.dcId ||\n (this.sleepAfter && Date.now() > this.sleepAfter)\n )) {\n // console.warn(dT(), 'Send long-poll for DC is delayed', this.dcId, this.sleepAfter);\n return;\n }\n\n this.sendLongPoll();\n });\n };\n\n private sendLongPoll() {\n if(this.sendingLongPoll) return;\n this.sendingLongPoll = true;\n const maxWait = 25000;\n\n this.longPollPending = Date.now() + maxWait;\n this.debug && this.log.debug('sendLongPoll', this.longPollPending);\n\n this.wrapMtpCall('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: maxWait\n }, {\n noResponse: true,\n // notContentRelated: true,\n longPoll: true\n }).then(() => {\n this.longPollPending = undefined;\n setTimeout(this.checkLongPoll, 0);\n }, (error: ErrorEvent) => {\n this.log('Long-poll failed', error);\n }).finally(() => {\n this.sendingLongPoll = undefined;\n });\n }\n\n private checkConnection = (event: Event | string) => {\n this.debug && this.log('Check connection', event);\n this.clearCheckConnectionTimeout();\n\n if(!this.transport) {\n this.log.warn('No transport for checkConnection');\n return;\n }\n\n const serializer = new TLSerialization({mtproto: true});\n const pingId = randomLong();\n\n serializer.storeMethod('ping', {\n ping_id: pingId\n });\n\n const pingMessage = {\n msg_id: this.timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n body: serializer.getBytes(true)\n };\n\n if(this.offline) {\n this.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.sendEncryptedRequest(pingMessage).then(() => {\n this.toggleOffline(false);\n }, () => {\n this.debug && this.log('Delay', this.checkConnectionPeriod * 1000);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from failed checkConnection request'), this.checkConnectionPeriod * 1000 | 0);\n this.checkConnectionPeriod = Math.min(60, this.checkConnectionPeriod * 1.5);\n });\n };\n\n private clearCheckConnectionTimeout() {\n if(this.checkConnectionTimeout !== undefined) {\n clearTimeout(this.checkConnectionTimeout);\n this.checkConnectionTimeout = undefined;\n }\n }\n\n private toggleOffline(offline: boolean) {\n if(this.offline !== offline) {\n this.offline = offline;\n\n this.clearCheckConnectionTimeout();\n if(offline) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n\n if(this.checkConnectionPeriod < 1.5) {\n this.checkConnectionPeriod = 0;\n }\n\n const delay = this.checkConnectionPeriod * 1000 | 0;\n this.checkConnectionRetryAt = Date.now() + delay;\n this.setConnectionStatus(ConnectionStatus.Closed, this.checkConnectionRetryAt);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from toggleOfline'), delay);\n this.checkConnectionPeriod = Math.min(30, (1 + this.checkConnectionPeriod) * 1.5);\n\n \n \n \n \n } else {\n this.setConnectionStatus(ConnectionStatus.Connected);\n this.checkLongPoll();\n\n this.scheduleRequest();\n\n \n \n \n \n }\n }\n\n this.setConnectionStatus(offline ? ConnectionStatus.Closed : ConnectionStatus.Connected, offline ? this.checkConnectionRetryAt : undefined);\n }\n\n private handleSentEncryptedRequestHTTP(promise: ReturnType<MTPNetworker['sendEncryptedRequest']>, message: MTMessage, noResponseMsgs: string[]) {\n // let timeout = setTimeout(() => {\n // this.log.error('handleSentEncryptedRequestHTTP timeout', promise, message, noResponseMsgs);\n // }, 5e3);\n\n promise.then((result) => {\n this.toggleOffline(false);\n // this.log('parse for', message);\n return this.parseResponse(result).then((response) => {\n this.debug && this.log.debug('Server response', response);\n\n this.processMessage(response.response, response.messageId, response.sessionId);\n\n this.checkLongPoll();\n this.checkConnectionPeriod = Math.max(1.1, Math.sqrt(this.checkConnectionPeriod));\n\n return true;\n });\n }, (error) => {\n this.log.error('Encrypted request failed', error, message);\n\n this.pushResend(message.msg_id);\n this.toggleOffline(true);\n\n return false;\n }).then((shouldResolve) => {\n // clearTimeout(timeout);\n const sentMessages = this.sentMessages;\n noResponseMsgs.forEach((msgId) => {\n const sentMessage = sentMessages[msgId];\n if(sentMessage) {\n const deferred = sentMessage.deferred;\n delete sentMessages[msgId];\n delete this.pendingMessages[msgId];\n shouldResolve ? deferred.resolve() : deferred.reject();\n }\n });\n });\n }\n \n\n // тут можно сделать таймаут и выводить дисконнект\n private pushMessage(message: {\n msg_id: string,\n seq_no: number,\n body: Uint8Array | number[],\n isAPI?: boolean\n }, options: MTMessageOptions) {\n let promise: CancellablePromise<void>;\n if(!options.notContentRelated || options.noResponse) {\n promise = deferredPromise();\n }\n\n this.sentMessages[message.msg_id] = Object.assign(\n message,\n options,\n promise ? {deferred: promise} : undefined\n );\n\n // this.log.error('Networker pushMessage:', this.sentMessages[message.msg_id]);\n\n this.pendingMessages[message.msg_id] = 0;\n\n if(!options.noSchedule) {\n this.scheduleRequest();\n }\n\n if(isObject(options)) {\n options.messageId = message.msg_id;\n }\n\n return promise;\n }\n\n public attachPromise(promise: Promise<any>, message: MTMessage) {\n const canIncrement = true;\n const timeout = setTimeout(() => {\n if(this.lastResponseTime && (Date.now() - this.lastResponseTime) < this.delays.connectionTimeout) {\n return;\n }\n\n this.log.error('timeout', message);\n if(this.isOnline) {\n this.setConnectionStatus(ConnectionStatus.TimedOut);\n }\n\n /* this.getEncryptedOutput(message).then((bytes) => {\n this.log.error('timeout encrypted', bytes);\n }); */\n }, this.delays.connectionTimeout);\n\n promise.catch(noop).finally(() => {\n clearTimeout(timeout);\n this.setConnectionStatus(ConnectionStatus.Connected);\n\n if(canIncrement) {\n --this.activeRequests;\n this.setDrainTimeout();\n }\n });\n\n if(canIncrement) {\n ++this.activeRequests;\n if(this.onDrainTimeout !== undefined) {\n clearTimeout(this.onDrainTimeout);\n this.onDrainTimeout = undefined;\n }\n }\n }\n\n public setDrainTimeout() {\n if(!this.activeRequests && this.onDrain && this.onDrainTimeout === undefined) {\n this.onDrainTimeout = ctx.setTimeout(() => {\n this.onDrainTimeout = undefined;\n this.log('drain');\n this.onDrain();\n }, DRAIN_TIMEOUT);\n }\n }\n\n public setConnectionStatus(status: ConnectionStatus, retryAt?: number) {\n const isOnline = status === ConnectionStatus.Connected;\n const willChange = this.status !== status;\n this.isOnline = isOnline;\n this.status = status;\n\n if(willChange) {\n if(this.networkerFactory.onConnectionStatusChange) {\n this.networkerFactory.onConnectionStatusChange({\n _: 'networkerStatus',\n status,\n dcId: this.dcId,\n name: this.name,\n isFileNetworker: this.isFileNetworker,\n isFileDownload: this.isFileDownload,\n isFileUpload: this.isFileUpload,\n retryAt\n });\n }\n\n if(this.isOnline) {\n this.scheduleRequest();\n }\n\n if((this.transport as TcpObfuscated)?.connection) {\n this.clearPingDelayDisconnect();\n this.sendPingDelayDisconnect();\n }\n\n // this.getNewTimeOffset = true;\n }\n /* if(this.onConnectionStatusChange) {\n this.onConnectionStatusChange(this.isOnline);\n } */\n }\n\n private pushResend(messageId: string, delay = 100) {\n const value = delay ? Date.now() + delay : 0;\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage.container) {\n for(const innerMsgId of sentMessage.inner) {\n this.pendingMessages[innerMsgId] = value;\n }\n } else {\n this.pendingMessages[messageId] = value;\n }\n\n if(sentMessage.acked) {\n this.log.error('pushResend: acked message?', sentMessage);\n }\n\n if(this.debug) {\n this.log.debug('pushResend:', messageId, sentMessage, this.pendingMessages, delay);\n }\n\n this.scheduleRequest(delay);\n }\n\n // * correct, fully checked\n private async getMsgKey(dataWithPadding: Uint8Array, isOut: boolean) {\n const x = isOut ? 0 : 8;\n const msgKeyLargePlain = bufferConcats(this.authKeyUint8.subarray(88 + x, 88 + x + 32), dataWithPadding);\n\n const msgKeyLarge = await CryptoWorker.invokeCrypto('sha256', msgKeyLargePlain);\n const msgKey = new Uint8Array(msgKeyLarge).subarray(8, 24);\n return msgKey;\n };\n\n // * correct, fully checked\n private getAesKeyIv(msgKey: Uint8Array, isOut: boolean): Promise<[Uint8Array, Uint8Array]> {\n const x = isOut ? 0 : 8;\n const sha2aText = new Uint8Array(52);\n const sha2bText = new Uint8Array(52);\n const promises: Array<Promise<Uint8Array>> = [];\n\n sha2aText.set(msgKey, 0);\n sha2aText.set(this.authKeyUint8.subarray(x, x + 36), 16);\n promises.push(CryptoWorker.invokeCrypto('sha256', sha2aText));\n\n sha2bText.set(this.authKeyUint8.subarray(40 + x, 40 + x + 36), 0);\n sha2bText.set(msgKey, 36);\n promises.push(CryptoWorker.invokeCrypto('sha256', sha2bText));\n\n return Promise.all(promises).then((results) => {\n const aesKey = new Uint8Array(32);\n const aesIv = new Uint8Array(32);\n const sha2a = new Uint8Array(results[0]);\n const sha2b = new Uint8Array(results[1]);\n\n aesKey.set(sha2a.subarray(0, 8));\n aesKey.set(sha2b.subarray(8, 24), 8);\n aesKey.set(sha2a.subarray(24, 32), 24);\n\n aesIv.set(sha2b.subarray(0, 8));\n aesIv.set(sha2a.subarray(8, 24), 8);\n aesIv.set(sha2b.subarray(24, 32), 24);\n\n return [aesKey, aesIv];\n });\n }\n\n public isStopped() {\n return this.networkerFactory.akStopped && !this.isFileNetworker;\n }\n\n private performScheduledRequest() {\n if(this.isStopped()) {\n return false;\n }\n\n if(this.pendingAcks.length) {\n const ackMsgIds = this.pendingAcks.slice();\n\n // this.log('acking messages', ackMsgIDs)\n this.wrapMtpMessage({\n _: 'msgs_ack',\n msg_ids: ackMsgIds\n }, {\n notContentRelated: true,\n noSchedule: true\n });\n }\n\n const pendingResendReqLength = this.pendingResendReq.length;\n if(pendingResendReqLength) {\n const options: MTMessageOptions = {...RESEND_OPTIONS};\n const msgIds = this.pendingResendReq.splice(0, pendingResendReqLength);\n this.wrapMtpMessage({\n _: 'msg_resend_req',\n msg_ids: msgIds\n }, options);\n\n this.log('resend: resending requests', options.messageId, msgIds);\n /* this.lastResendReq = {\n reqMsgId: options.messageId,\n msgIds: msgIds\n }; */\n\n // this.pendingResendReq.length = 0;\n }\n\n // if(this.pendingResendAnsReq.length) {\n // const options: MTMessageOptions = {...RESEND_OPTIONS};\n // const msgIds = this.pendingResendAnsReq.slice();\n // this.wrapMtpMessage({\n // _: 'msg_resend_ans_req',\n // msg_ids: msgIds\n // }, options);\n\n // this.log('resend: requesting answers', options.messageId, msgIds);\n // this.lastResendAnsReq = {\n // reqMsgId: options.messageId,\n // msgIds: msgIds\n // };\n\n // // this.pendingResendAnsReq.length = 0;\n // }\n\n let outMessage: MTMessage;\n const messages: typeof outMessage[] = [];\n\n // const currentTime = Date.now();\n let messagesByteLen = 0;\n\n \n let hasApiCall = false;\n let hasHttpWait = false;\n \n\n let lengthOverflow = false;\n\n // * Сюда никогда не попадут контейнеры, так как их не будет в pendingMessages\n const keys = sortLongsArray(Object.keys(this.pendingMessages));\n for(const messageId of keys) {\n // const value = this.pendingMessages[messageId];\n\n // if(!value || value <= currentTime) {\n const message = this.sentMessages[messageId];\n if(message && message.body) {\n /* if(message.fileUpload) {\n this.log('performScheduledRequest message:', message, message.body.length, (message.body as Uint8Array).byteLength, (message.body as Uint8Array).buffer.byteLength);\n } */\n\n const messageByteLength = message.body.length + 32;\n\n if((messagesByteLen + messageByteLength) > 655360) { // 640 Kb\n this.log.warn('lengthOverflow', message, messages);\n lengthOverflow = true;\n\n if(outMessage) { // if it's not a first message\n break;\n }\n }\n\n messages.push(message);\n messagesByteLen += messageByteLength;\n\n \n if(message.isAPI) {\n hasApiCall = true;\n } else if(message.longPoll) {\n hasHttpWait = true;\n }\n \n\n outMessage = message;\n } else {\n // this.log(message, messageId)\n }\n\n delete this.pendingMessages[messageId];\n // }\n }\n\n \n \n if(this.transport instanceof HTTP)\n \n if(hasApiCall && !hasHttpWait) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeMethod('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: 3000\n });\n\n messages.push({\n msg_id: this.timeManager.generateId(),\n seq_no: this.generateSeqNo(),\n body: serializer.getBytes(true)\n });\n }\n \n\n if(!messages.length) {\n // this.log('no scheduled messages')\n return;\n }\n\n \n const noResponseMsgs: Array<string> = messages.filter((message) => message.noResponse).map((message) => message.msg_id);\n \n\n if(messages.length > 1) {\n const container = this.generateContainerMessage(messagesByteLen, messages);\n outMessage = container.messageWithBody;\n\n this.sentMessages[outMessage.msg_id] = container.message;\n } else {\n this.sentMessages[outMessage.msg_id] = outMessage;\n }\n\n this.pendingAcks = [];\n\n const promise = this.sendEncryptedRequest(outMessage);\n\n \n \n if(this.transport instanceof HTTP)\n \n this.handleSentEncryptedRequestHTTP(promise, outMessage, noResponseMsgs);\n \n\n \n \n if(!(this.transport instanceof HTTP))\n \n this.cleanupSent(); // ! WARNING\n \n\n if(lengthOverflow) {\n this.scheduleRequest();\n }\n }\n\n private generateContainerMessage(messagesByteLen: number, messages: MTMessage[]) {\n const container = new TLSerialization({\n mtproto: true,\n startMaxLength: messagesByteLen + 64\n });\n\n container.storeInt(0x73f1f8dc, 'CONTAINER[id]');\n container.storeInt(messages.length, 'CONTAINER[count]');\n\n const innerMessages: string[] = [];\n messages.forEach((message, i) => {\n innerMessages.push(message.msg_id);\n // this.log('Pushing to container:', message.msg_id);\n container.storeLong(message.msg_id, 'CONTAINER[' + i + '][msg_id]');\n container.storeInt(message.seq_no, 'CONTAINER[' + i + '][seq_no]');\n container.storeInt(message.body.length, 'CONTAINER[' + i + '][bytes]');\n container.storeRawBytes(message.body, 'CONTAINER[' + i + '][body]');\n });\n\n const message: MTMessage = {\n msg_id: this.timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n container: true,\n inner: innerMessages\n };\n\n if(Modes.debug/* || true */) {\n this.log.warn('Container', innerMessages, message.msg_id, message.seq_no);\n }\n\n return {\n message,\n messageWithBody: Object.assign({body: container.getBytes(true)}, message)\n };\n }\n\n private async getEncryptedMessage(dataWithPadding: Uint8Array) {\n const msgKey = await this.getMsgKey(dataWithPadding, true);\n const keyIv = await this.getAesKeyIv(msgKey, true);\n // this.log('after msg key iv')\n\n const encryptedBytes = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithPadding, keyIv[0], keyIv[1]);\n // this.log('Finish encrypt')\n\n return {\n bytes: encryptedBytes,\n msgKey\n };\n }\n\n private getDecryptedMessage(msgKey: Uint8Array, encryptedData: Uint8Array) {\n // this.log('get decrypted start')\n return this.getAesKeyIv(msgKey, false).then((keyIv) => {\n // this.log('after msg key iv')\n return CryptoWorker.invokeCrypto('aes-decrypt', encryptedData, keyIv[0], keyIv[1]);\n });\n }\n\n private getEncryptedOutput(message: MTMessage) {\n /* if(DEBUG) {\n this.log.debug('Send encrypted', message, this.authKeyId);\n } */\n /* if(!this.isOnline) {\n this.log('trying to send message when offline:', Object.assign({}, message));\n //debugger;\n } */\n\n const data = new TLSerialization({\n startMaxLength: message.body.length + 2048\n });\n\n data.storeIntBytes(this.serverSalt, 64, 'salt');\n data.storeIntBytes(this.sessionId, 64, 'session_id');\n\n data.storeLong(message.msg_id, 'message_id');\n data.storeInt(message.seq_no, 'seq_no');\n\n data.storeInt(message.body.length, 'message_data_length');\n data.storeRawBytes(message.body, 'message_data');\n\n /* const des = new TLDeserialization(data.getBuffer().slice(16));\n const desSalt = des.fetchLong();\n const desSessionId = des.fetchLong();\n\n if(!this.isOnline) {\n this.log.error('trying to send message when offline', message, new Uint8Array(des.buffer), desSalt, desSessionId);\n } */\n\n /* const messageDataLength = message.body.length;\n let canBeLength = 0; // bytes\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 4;\n canBeLength += 4;\n canBeLength += message.body.length; */\n\n const dataBuffer = data.getBuffer();\n\n /* if(dataBuffer.byteLength !== canBeLength || !bytesCmp(new Uint8Array(dataBuffer.slice(dataBuffer.byteLength - message.body.length)), new Uint8Array(message.body))) {\n this.log.error('wrong length', dataBuffer, canBeLength, message.msg_id);\n } */\n\n const paddingLength = (16 - (data.getOffset() % 16)) + 16 * (1 + nextRandomUint(8) % 5);\n const padding = /* (message as any).padding || */randomize(new Uint8Array(paddingLength))/* .fill(0) */;\n /* const padding = [167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157,\n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150,\n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28, 167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157,\n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150,\n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28].slice(0, paddingLength); */\n\n // (message as any).padding = padding;\n\n const dataWithPadding = bufferConcats(dataBuffer, padding);\n // this.log('Adding padding', dataBuffer, padding, dataWithPadding)\n // this.log('auth_key_id', bytesToHex(self.authKeyID))\n\n /* if(dataWithPadding.byteLength % 16) {\n this.log.error('aaa', dataWithPadding, paddingLength);\n }\n\n if(message.fileUpload) {\n this.log('Send encrypted: body length:', (message.body as ArrayBuffer).byteLength, paddingLength, dataWithPadding);\n } */\n\n // * full next block is correct\n return this.getEncryptedMessage(dataWithPadding).then((encryptedResult) => {\n /* if(DEBUG) {\n this.log('Got encrypted out message', encryptedResult);\n } */\n\n const request = new TLSerialization({\n startMaxLength: encryptedResult.bytes.length + 256\n });\n request.storeIntBytes(this.authKeyId, 64, 'auth_key_id');\n request.storeIntBytes(encryptedResult.msgKey, 128, 'msg_key');\n request.storeRawBytes(encryptedResult.bytes, 'encrypted_data');\n\n const requestData = request.getBytes(true);\n\n // if(this.isFileNetworker) {\n // //this.log('Send encrypted: requestData length:', requestData.length, requestData.length % 16, paddingLength % 16, paddingLength, data.offset, encryptedResult.msgKey.length % 16, encryptedResult.bytes.length % 16);\n // //this.log('Send encrypted: messageId:', message.msg_id, requestData.length);\n // //this.log('Send encrypted:', message, new Uint8Array(bufferConcat(des.buffer, padding)), requestData, this.serverSalt.hex, this.sessionId.hex/* new Uint8Array(des.buffer) */);\n // this.debugRequests.push({before: new Uint8Array(bufferConcat(des.buffer, padding)), after: requestData});\n // }\n\n return requestData;\n });\n }\n\n private async sendEncryptedRequest(message: MTMessage) {\n const requestData = await this.getEncryptedOutput(message);\n\n if(!this.transport) {\n this.log.error('trying to send something when offline', this.transport, this);\n }\n\n this.debug && this.log.debug('sending:', message, [message.msg_id].concat(message.inner || []), requestData.length);\n const promise: Promise<Uint8Array> = this.transport ? this.transport.send(requestData) as any : Promise.reject({});\n // this.debug && this.log.debug('sendEncryptedRequest: launched message into space:', message, promise);\n\n \n \n \n\n \n if(!(this.transport instanceof HTTP)) return promise;\n \n\n const baseError: ApiError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE',\n // @ts-ignore\n transport: this.transport\n };\n\n return promise.then((result) => {\n if(!result?.byteLength) {\n throw baseError;\n }\n\n // this.debug && this.log.debug('sendEncryptedRequest: got response for:', message, [message.msg_id].concat(message.inner || []));\n return result;\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n type: 'NETWORK_BAD_REQUEST',\n originalError: error\n });\n }\n\n throw error;\n });\n \n }\n\n public parseResponse(responseBuffer: Uint8Array) {\n // const perf = performance.now();\n /* if(this.debug) {\n this.log.debug('Start parsing response', responseBuffer);\n } */\n\n this.lastResponseTime = Date.now();\n\n const deserializer = new TLDeserialization(responseBuffer);\n\n const authKeyId = deserializer.fetchIntBytes(64, true, 'auth_key_id');\n if(!bytesCmp(authKeyId, this.authKeyId)) {\n throw new Error('[MT] Invalid server auth_key_id: ' + bytesToHex(authKeyId));\n }\n\n const msgKey = deserializer.fetchIntBytes(128, true, 'msg_key');\n const encryptedData = deserializer.fetchRawBytes(responseBuffer.byteLength - deserializer.getOffset(), true, 'encrypted_data');\n\n return this.getDecryptedMessage(msgKey, encryptedData).then((dataWithPadding) => {\n // this.log('after decrypt')\n return this.getMsgKey(dataWithPadding, false).then((calcMsgKey) => {\n if(!bytesCmp(msgKey, calcMsgKey)) {\n this.log.warn('[MT] msg_keys', msgKey, calcMsgKey);\n this.updateSession(); // fix 28.01.2020\n throw new Error('[MT] server msgKey mismatch, updating session');\n }\n // this.log('after msgKey check')\n\n let deserializer = new TLDeserialization<MTLong>(dataWithPadding, {mtproto: true});\n\n /* const salt = */deserializer.fetchIntBytes(64, true, 'salt'); // need\n const sessionId = deserializer.fetchIntBytes(64, true, 'session_id');\n const messageId = deserializer.fetchLong('message_id');\n\n if(!bytesCmp(sessionId, this.sessionId) &&\n (!this.prevSessionId || !bytesCmp(sessionId, this.prevSessionId))) {\n this.log.warn('Sessions', sessionId, this.sessionId, this.prevSessionId, dataWithPadding);\n // this.updateSession();\n // this.sessionID = sessionID;\n throw new Error('[MT] Invalid server session_id: ' + bytesToHex(sessionId));\n }\n\n const seqNo = deserializer.fetchInt('seq_no');\n\n const totalLength = dataWithPadding.byteLength;\n\n const messageBodyLength = deserializer.fetchInt('message_data[length]');\n let offset = deserializer.getOffset();\n\n if((messageBodyLength % 4) ||\n messageBodyLength > totalLength - offset) {\n throw new Error('[MT] Invalid body length: ' + messageBodyLength);\n }\n const messageBody = deserializer.fetchRawBytes(messageBodyLength, true, 'message_data');\n\n offset = deserializer.getOffset();\n const paddingLength = totalLength - offset;\n if(paddingLength < 12 || paddingLength > 1024) {\n throw new Error('[MT] Invalid padding length: ' + paddingLength);\n }\n\n // let buffer = bytesToArrayBuffer(messageBody);\n deserializer = new TLDeserialization<MTLong>(/* buffer */messageBody, {\n mtproto: true,\n override: {\n mt_message: (result: any, field: string) => {\n result.msg_id = deserializer.fetchLong(field + '[msg_id]');\n result.seqno = deserializer.fetchInt(field + '[seqno]');\n result.bytes = deserializer.fetchInt(field + '[bytes]');\n\n const offset = deserializer.getOffset();\n\n // self.log('mt_message!!!!!', result, field);\n\n try {\n result.body = deserializer.fetchObject('Object', field + '[body]');\n } catch(e) {\n this.log.error('parse error', (e as Error).message, (e as Error).stack);\n result.body = {\n _: 'parse_error',\n error: e\n };\n }\n\n if(deserializer.getOffset() !== offset + result.bytes) {\n // console.warn(dT(), 'set offset', this.offset, offset, result.bytes)\n // this.log(result)\n deserializer.setOffset(offset + result.bytes);\n }\n // this.log('override message', result)\n },\n mt_rpc_result: (result: any, field: any) => {\n result.req_msg_id = deserializer.fetchLong(field + '[req_msg_id]');\n\n const sentMessage = this.sentMessages[result.req_msg_id];\n const type = sentMessage && sentMessage.resultType || 'Object';\n\n if(result.req_msg_id && !sentMessage) {\n // console.warn(dT(), 'Result for unknown message', result);\n return;\n }\n\n // deserializer.setMtproto(false);\n result.result = deserializer.fetchObject(type, field + '[result]');\n // deserializer.setMtproto(true);\n // self.log(dT(), 'override rpc_result', sentMessage, type, result);\n }\n }\n });\n\n const response = deserializer.fetchObject('', 'INPUT');\n // this.log.error('Parse response time:', performance.now() - perf);\n return {\n response,\n messageId,\n sessionId,\n seqNo\n };\n });\n });\n }\n\n private applyServerSalt(newServerSalt: string) {\n const serverSalt = longToBytes(newServerSalt);\n\n sessionStorage.set({\n ['dc' + this.dcId + '_server_salt']: bytesToHex(serverSalt)\n });\n\n this.serverSalt = new Uint8Array(serverSalt);\n }\n\n // ! таймаут очень сильно тормозит скорость работы сокета (даже нулевой)\n public scheduleRequest(delay?: number) {\n /* if(!this.isOnline) {\n return;\n } */\n\n \n \n if(this.transport instanceof HTTP) {\n \n if(this.offline) {\n this.checkConnection('forced schedule');\n }\n\n delay ||= 0; // set zero timeout to pack other messages too\n \n }\n \n \n\n const nextReq = Date.now() + (delay || 0);\n if(this.nextReq && (delay === undefined || this.nextReq <= nextReq)) {\n // this.debug && this.log('scheduleRequest: nextReq', this.nextReq, nextReq);\n return;\n }\n\n // this.debug && this.log('scheduleRequest: delay', delay);\n\n /* if(this.nextReqTimeout) {\n return;\n } */\n\n // const perf = performance.now();\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n }\n\n const cb = () => {\n // this.debug && this.log('scheduleRequest: timeout delay was:', performance.now() - perf);\n\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n\n \n \n if(this.transport instanceof HTTP)\n \n if(this.offline) {\n // this.log('Cancel scheduled');\n return;\n }\n \n\n this.performScheduledRequest();\n };\n\n this.nextReq = nextReq;\n\n if(delay !== undefined) {\n this.nextReqTimeout = ctx.setTimeout(cb, delay);\n } else {\n cb();\n }\n }\n\n private ackMessage(msgId: MTLong) {\n // this.log('ack message', msgID)\n this.pendingAcks.push(msgId);\n\n let delay: number;\n\n \n \n if(this.transport instanceof HTTP)\n \n delay = 30000;\n \n\n this.scheduleRequest(delay);\n }\n\n private reqResend(msgId: MTLong/* , isAnswer?: boolean */) {\n if(this.debug) {\n this.log.debug('Req resend', msgId/* , isAnswer */);\n }\n\n // (isAnswer ? this.pendingResendAnsReq : this.pendingResendReq).push(msgId);\n this.pendingResendReq.push(msgId);\n this.scheduleRequest(100);\n }\n\n public cleanupSent() {\n let notEmpty = false;\n const sentMessages = this.sentMessages;\n // this.log('clean start', this.dcId/*, sentMessages*/)\n Object.keys(sentMessages).forEach((msgId) => {\n const message = sentMessages[msgId];\n\n // this.log('clean iter', msgID, message)\n if(message.notContentRelated && this.pendingMessages[msgId] === undefined) {\n // this.log('clean notContentRelated', msgID)\n delete sentMessages[msgId];\n } else if(message.container) {\n for(const innerMsgId of message.inner) {\n if(sentMessages[innerMsgId] !== undefined) {\n // this.log('clean failed, found', msgID, message.inner[i], sentMessages[message.inner[i]].seq_no)\n notEmpty = true;\n return;\n }\n }\n // this.log('clean container', msgID)\n delete sentMessages[msgId];\n } else {\n notEmpty = true;\n }\n });\n\n return !notEmpty;\n }\n\n private processMessageAck(messageId: Long) {\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage && !sentMessage.acked) {\n // delete sentMessage.body;\n sentMessage.acked = true;\n }\n }\n\n private processError(rawError: {error_message: string, error_code: number}): ApiError {\n const matches = (rawError.error_message || '').match(/^([A-Z_0-9]+\\b)(: (.+))?/) || [];\n rawError.error_code = rawError.error_code;\n\n return {\n code: !rawError.error_code || rawError.error_code <= 0 ? 500 : rawError.error_code,\n type: matches[1] as any || 'UNKNOWN',\n description: matches[3] || ('CODE#' + rawError.error_code + ' ' + rawError.error_message),\n originalError: rawError\n };\n }\n\n /**\n * * только для сокета\n * TODO: consider about containers resend\n */\n public resend() {\n const sentMessages = this.sentMessages;\n for(const id in sentMessages) {\n const msg = sentMessages[id];\n if(msg.body || msg.container) {\n this.pushResend(id);\n }\n }\n\n if((this.transport as TcpObfuscated).connection) {\n this.clearPingDelayDisconnect();\n this.sendPingDelayDisconnect();\n }\n }\n\n /* public requestMessageStatus() {\n const ids: string[] = [];\n for(const id in this.sentMessages) {\n const message = this.sentMessages[id];\n if(message.isAPI && message.fileUpload) {\n ids.push(message.msg_id);\n }\n }\n\n this.wrapMtpMessage({\n _: 'msgs_state_req',\n msg_ids: ids\n }, {\n notContentRelated: true\n }).then((res) => {\n this.log('status', res);\n });\n } */\n\n private applyServerTime(messageId: string) {\n const serverTime = bigInt(messageId).shiftRight(32).toJSNumber();\n this.log('applying server time', serverTime);\n return this.timeManager.applyServerTime(serverTime);\n }\n\n // * https://core.telegram.org/mtproto/service_messages_about_messages#notice-of-ignored-error-message\n public processMessage(message: any, messageId: MTLong, sessionId: Uint8Array | number[]) {\n if(message._ === 'messageEmpty') {\n this.log.warn('processMessage: messageEmpty', message, messageId);\n return;\n }\n\n // messageId = messageId.toString();\n\n const msgidInt = parseInt(messageId.substr(0, -10), 10);\n if(msgidInt % 2) {\n this.log.warn('Server even message id: ', messageId, message);\n return;\n }\n\n if(this.debug) {\n this.log.debug('process message', message, messageId);\n }\n\n if(this.pingDelayDisconnectDeferred) {\n this.pingDelayDisconnectDeferred.resolve('any message');\n }\n\n // let changedTimeOffset: boolean;\n // if(this.getNewTimeOffset) {\n // changedTimeOffset = this.applyServerTime(messageId);\n // this.getNewTimeOffset = undefined;\n // }\n\n switch(message._) {\n case 'msg_container': {\n for(const innerMessage of message.messages) {\n this.processMessage(innerMessage, innerMessage.msg_id, sessionId);\n }\n\n break;\n }\n\n case 'bad_server_salt': {\n this.log('Bad server salt', message);\n\n this.applyServerSalt(message.new_server_salt);\n\n if(this.sentMessages[message.bad_msg_id]) {\n this.pushResend(message.bad_msg_id);\n }\n\n this.ackMessage(messageId);\n\n // simulate disconnect\n /* try {\n this.log('networker state:', this);\n // @ts-ignore\n this.transport.ws.close(1000);\n } catch(err) {\n this.log.error('transport', this.transport, err);\n } */\n\n break;\n }\n\n case 'bad_msg_notification': {\n this.log.error('Bad msg notification', message);\n\n switch(message.error_code) {\n case 16: // * msg_id too low\n case 17: // * msg_id too high\n case 32: // * msg_seqno too low\n case 33: // * msg_seqno too high\n case 64: { // * invalid container\n // if(changedTimeOffset === undefined) {\n // changedTimeOffset = this.applyServerTime(messageId);\n // }\n\n const changedTimeOffset = this.applyServerTime(messageId);\n if(message.error_code === 17 || changedTimeOffset) {\n this.log('Update session');\n this.updateSession();\n }\n\n const badMessage = this.updateSentMessage(message.bad_msg_id);\n if(badMessage) this.pushResend(badMessage.msg_id); // fix 23.01.2020\n // this.ackMessage(messageId);\n }\n\n // * invalid container\n /* case 64: {\n const badMessage = this.sentMessages[message.bad_msg_id];\n if(badMessage) {\n for(const msgId of badMessage.inner) {\n if(this.sentMessages[msgId] !== undefined) {\n this.updateSentMessage\n }\n }\n const inner = badMessage.inner;\n }\n } */\n }\n\n break;\n }\n\n case 'message': {\n if(this.lastServerMessages.indexOf(messageId) !== -1) {\n // console.warn('[MT] Server same messageId: ', messageId)\n this.ackMessage(messageId);\n return;\n }\n\n this.lastServerMessages.push(messageId);\n if(this.lastServerMessages.length > 100) {\n this.lastServerMessages.shift();\n }\n\n this.processMessage(message.body, message.msg_id, sessionId);\n break;\n }\n\n case 'new_session_created': {\n this.ackMessage(messageId);\n\n if(this.debug) {\n this.log.debug('new_session_created', message);\n }\n // this.updateSession();\n\n this.processMessageAck(message.first_msg_id);\n this.applyServerSalt(message.server_salt);\n\n sessionStorage.get('dc').then((baseDcId) => {\n if(baseDcId === this.dcId && !this.isFileNetworker && this.networkerFactory.updatesProcessor) {\n this.networkerFactory.updatesProcessor(message);\n }\n });\n break;\n }\n\n case 'msgs_ack': {\n this.debug && this.log('got acks', message.msg_ids);\n for(const msgId of message.msg_ids) {\n this.processMessageAck(msgId);\n }\n\n break;\n }\n\n case 'msg_detailed_info': {\n const sentMessage = this.sentMessages[message.msg_id];\n if(!sentMessage) {\n this.ackMessage(message.answer_msg_id);\n break;\n }/* else if(sentMessage.acked) {\n this.reqResend(message.answer_msg_id, true);\n }\n\n break; */\n }\n\n case 'msg_new_detailed_info': {\n if(this.pendingAcks.indexOf(message.answer_msg_id) !== -1) {\n break;\n }\n\n this.reqResend(message.answer_msg_id);\n break;\n }\n\n case 'msgs_state_info': {\n this.ackMessage(message.answer_msg_id);\n const arr = [\n [this.lastResendReq, this.pendingResendReq] as const\n // [this.lastResendAnsReq, this.pendingResendAnsReq] as const\n ];\n\n for(const [lastResend, pendingResend] of arr) {\n if(lastResend?.reqMsgId === message.req_msg_id && pendingResend.length) {\n for(const badMsgId of lastResend.msgIds) {\n const pos = pendingResend.indexOf(badMsgId);\n if(pos !== -1) {\n pendingResend.splice(pos, 1);\n }\n }\n }\n }\n\n break;\n }\n\n case 'rpc_result': {\n this.ackMessage(messageId);\n\n const sentMessageId = message.req_msg_id;\n const sentMessage = this.sentMessages[sentMessageId];\n\n if(this.debug) {\n this.log('Rpc response', message.result, sentMessage);\n }\n\n this.processMessageAck(sentMessageId);\n if(sentMessage) {\n const deferred = sentMessage.deferred;\n if(message.result._ === 'rpc_error') {\n const error = this.processError(message.result);\n this.log('Rpc error', error);\n if(deferred) {\n deferred.reject(error);\n }\n } else {\n if(deferred) {\n deferred.resolve(message.result);\n }\n\n if(sentMessage.isAPI && !this.connectionInited) {\n this.connectionInited = true;\n }\n }\n\n delete this.sentMessages[sentMessageId];\n } else {\n if(this.debug) {\n this.log('Rpc result for unknown message:', sentMessageId, message);\n }\n }\n\n break;\n }\n\n case 'pong': { // * https://core.telegram.org/mtproto/service_messages#ping-messages-pingpong - These messages don't require acknowledgments\n /* const sentMessageId = message.msg_id;\n const sentMessage = this.sentMessages[sentMessageId];\n\n if(sentMessage) {\n sentMessage.deferred.resolve(message);\n delete this.sentMessages[sentMessageId];\n } */\n const pingId = message.ping_id;\n if(this.lastPingDelayDisconnectId === pingId) {\n const deferred = this.pingDelayDisconnectDeferred;\n if(deferred) {\n deferred.resolve('pong');\n } else {\n this.log('ping deferred deleted', pingId);\n }\n }\n\n break;\n }\n\n default:\n this.ackMessage(messageId);\n\n /* if(this.debug) {\n this.log.debug('Update', message);\n } */\n\n if(this.networkerFactory.updatesProcessor !== null) {\n this.networkerFactory.updatesProcessor(message);\n }\n break;\n }\n }\n}\n","import bigInt from 'big-integer';\r\n\r\nexport default function sortLongsArray(arr: string[]) {\r\n return arr.map((long) => {\r\n return bigInt(long);\r\n }).sort((a, b) => {\r\n return a.compare(b);\r\n }).map((bigInt) => {\r\n return bigInt.toString(10);\r\n });\r\n}\r\n","import addPadding from '../bytes/addPadding';\r\nimport bigInt from 'big-integer';\r\nimport {bigIntToBytes} from '../bigInt/bigIntConversion';\r\n\r\nexport default function longToBytes(sLong: string) {\r\n const bigIntBytes = bigIntToBytes(bigInt(sLong)).reverse();\r\n const bytes = addPadding(bigIntBytes, 8, true, false, false);\r\n // console.log('longToBytes', bytes, bigIntBytes);\r\n\r\n return bytes;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type {ConnectionStatusChange} from './connectionStatus';\r\nimport MTPNetworker from './networker';\r\nimport {InvokeApiOptions} from '../../types';\r\nimport App from '../../config/app';\r\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\r\nimport {AppManager} from '../appManagers/manager';\r\n\r\nexport class NetworkerFactory extends AppManager {\r\n private networkers: MTPNetworker[] = [];\r\n public language = navigator.language || App.langPackCode;\r\n public updatesProcessor: (obj: any) => void = null;\r\n // public onConnectionStatusChange: (status: ConnectionStatusChange) => void = null;\r\n public akStopped = false;\r\n\r\n public onConnectionStatusChange(status: ConnectionStatusChange) {\r\n this.rootScope.dispatchEvent('connection_status_change', status);\r\n // ({type: 'connectionStatusChange', payload: status});\r\n }\r\n\r\n public removeNetworker(networker: MTPNetworker) {\r\n indexOfAndSplice(this.networkers, networker);\r\n }\r\n\r\n public setUpdatesProcessor(callback: (obj: any) => void) {\r\n this.updatesProcessor = callback;\r\n }\r\n\r\n public getNetworker(dcId: number, authKey: Uint8Array, authKeyId: Uint8Array, serverSalt: Uint8Array, options: InvokeApiOptions) {\r\n // console.log('NetworkerFactory: creating new instance of MTPNetworker:', dcId, options);\r\n const networker = new MTPNetworker(this, this.timeManager, dcId, authKey, authKeyId, serverSalt, options);\r\n this.networkers.push(networker);\r\n return networker;\r\n }\r\n\r\n public startAll() {\r\n if(this.akStopped) {\r\n const stoppedNetworkers = this.networkers.filter((networker) => networker.isStopped());\r\n\r\n this.akStopped = false;\r\n this.updatesProcessor && this.updatesProcessor({_: 'new_session_created'});\r\n\r\n for(const networker of stoppedNetworkers) {\r\n networker.scheduleRequest();\r\n }\r\n }\r\n }\r\n\r\n public stopAll() {\r\n this.akStopped = true;\r\n }\r\n\r\n public setLanguage(langCode: string) {\r\n this.language = langCode;\r\n for(const networker of this.networkers) {\r\n if(!networker.isFileNetworker) {\r\n networker.connectionInited = false;\r\n }\r\n }\r\n }\r\n\r\n public unsetConnectionInited() {\r\n for(const networker of this.networkers) {\r\n networker.connectionInited = false;\r\n }\r\n }\r\n\r\n public forceReconnectTimeout() {\r\n for(const networker of this.networkers) {\r\n networker.forceReconnectTimeout();\r\n }\r\n }\r\n\r\n public forceReconnect() {\r\n for(const networker of this.networkers) {\r\n if(!networker.isFileNetworker) {\r\n networker.forceReconnect();\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport {TLSerialization} from './tl_utils';\r\nimport cryptoWorker from '../crypto/cryptoMessagePort';\r\nimport Modes from '../../config/modes';\r\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\r\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\r\nimport bigInt from 'big-integer';\r\n\r\nexport type RSAPublicKeyHex = {\r\n modulus: string,\r\n exponent: string\r\n};\r\n\r\nexport class RSAKeysManager {\n /**\r\n * Server public key, obtained from here: https://core.telegram.org/api/obtaining_api_id\r\n *\r\n *\r\n * -----BEGIN RSA PUBLIC KEY-----\r\n * MIIBCgKCAQEA6LszBcC1LGzyr992NzE0ieY+BSaOW622Aa9Bd4ZHLl+TuFQ4lo4g\r\n * 5nKaMBwK/BIb9xUfg0Q29/2mgIR6Zr9krM7HjuIcCzFvDtr+L0GQjae9H0pRB2OO\r\n * 62cECs5HKhT5DZ98K33vmWiLowc621dQuwKWSQKjWf50XYFw42h21P2KXUGyp2y/\r\n * +aEyZ+uVgLLQbRA1dEjSDZ2iGRy12Mk5gpYc397aYp438fsJoHIgJ2lgMv5h7WY9\r\n * t6N/byY9Nw9p21Og3AoXSL2q/2IJ1WRUhebgAdGVMlV1fkuOQoEzR7EdpqtQD9Cs\r\n * 5+bfo3Nhmcyvk5ftB0WkJ9z6bNZ7yxrP8wIDAQAB\r\n * -----END RSA PUBLIC KEY-----\r\n *\r\n * -----BEGIN RSA PUBLIC KEY-----\r\n * MIIBCgKCAQEBadMIUYSKhyznMh+Pg+OxTLyDZrWEjQIPZC3oJCtuZX7qUxgcWqFX\r\n * Q1952TSY8S8NYuz12sK9Fvp+lil1hIG0U/cuPsK08VB1hB4VA+p0S46fGwVsRovq\r\n * 4qUiUIzQSjSHDASuXTOinlYEHwmg/GaLc5G7qhePWa0p9YmqYR5Ha3xHJywcXZrn\r\n * yE3nC9igL96Aanqv+Prbu1N+r9vAgZeHh9cfbtbV8WWwruOANOTEv2ctQLR0dfr9\r\n * MwQXNePTPQlYsO9HNIGS1LWe7hZFtGBAVJH92F7Kig68WqHM3PIZ6Sq7N0VSzfzL\r\n * b11Z/YHz2UXYtXADwL/m5pTpKBUtJBXkOQIDAQAB\r\n * -----END RSA PUBLIC KEY-----\r\n *\r\n * Bytes can be got via\r\n * $ openssl rsa -in rsa.pem -RSAPublicKey_in -pubout > pub.pem\r\n * $ openssl rsa -pubin -in pub.pem -text -noout\r\n */\r\n\r\n /* private publisKeysHex = [{\r\n modulus: 'c150023e2f70db7985ded064759cfecf0af328e69a41daf4d6f01b538135a6f91f8f8b2a0ec9ba9720ce352efcf6c5680ffc424bd634864902de0b4bd6d49f4e580230e3ae97d95c8b19442b3c0a10d8f5633fecedd6926a7f6dab0ddb7d457f9ea81b8465fcd6fffeed114011df91c059caedaf97625f6c96ecc74725556934ef781d866b34f011fce4d835a090196e9a5f0e4449af7eb697ddb9076494ca5f81104a305b6dd27665722c46b60e5df680fb16b210607ef217652e60236c255f6a28315f4083a96791d7214bf64c1df4fd0db1944fb26a2a57031b32eee64ad15a8ba68885cde74a5bfc920f6abf59ba5c75506373e7130f9042da922179251f',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'aeec36c8ffc109cb099624685b97815415657bd76d8c9c3e398103d7ad16c9bba6f525ed0412d7ae2c2de2b44e77d72cbf4b7438709a4e646a05c43427c7f184debf72947519680e651500890c6832796dd11f772c25ff8f576755afe055b0a3752c696eb7d8da0d8be1faf38c9bdd97ce0a77d3916230c4032167100edd0f9e7a3a9b602d04367b689536af0d64b613ccba7962939d3b57682beb6dae5b608130b2e52aca78ba023cf6ce806b1dc49c72cf928a7199d22e3d7ac84e47bc9427d0236945d10dbd15177bab413fbf0edfda09f014c7a7da088dde9759702ca760af2b8e4e97cc055c617bd74c3d97008635b98dc4d621b4891da9fb0473047927',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'bdf2c77d81f6afd47bd30f29ac76e55adfe70e487e5e48297e5a9055c9c07d2b93b4ed3994d3eca5098bf18d978d54f8b7c713eb10247607e69af9ef44f38e28f8b439f257a11572945cc0406fe3f37bb92b79112db69eedf2dc71584a661638ea5becb9e23585074b80d57d9f5710dd30d2da940e0ada2f1b878397dc1a72b5ce2531b6f7dd158e09c828d03450ca0ff8a174deacebcaa22dde84ef66ad370f259d18af806638012da0ca4a70baa83d9c158f3552bc9158e69bf332a45809e1c36905a5caa12348dd57941a482131be7b2355a5f4635374f3bd3ddf5ff925bf4809ee27c1e67d9120c5fe08a9de458b1b4a3c5d0a428437f2beca81f4e2d5ff',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'b3f762b739be98f343eb1921cf0148cfa27ff7af02b6471213fed9daa0098976e667750324f1abcea4c31e43b7d11f1579133f2b3d9fe27474e462058884e5e1b123be9cbbc6a443b2925c08520e7325e6f1a6d50e117eb61ea49d2534c8bb4d2ae4153fabe832b9edf4c5755fdd8b19940b81d1d96cf433d19e6a22968a85dc80f0312f596bd2530c1cfb28b5fe019ac9bc25cd9c2a5d8a0f3a1c0c79bcca524d315b5e21b5c26b46babe3d75d06d1cd33329ec782a0f22891ed1db42a1d6c0dea431428bc4d7aabdcf3e0eb6fda4e23eb7733e7727e9a1915580796c55188d2596d2665ad1182ba7abf15aaa5a8b779ea996317a20ae044b820bff35b6e8a1',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'be6a71558ee577ff03023cfa17aab4e6c86383cff8a7ad38edb9fafe6f323f2d5106cbc8cafb83b869cffd1ccf121cd743d509e589e68765c96601e813dc5b9dfc4be415c7a6526132d0035ca33d6d6075d4f535122a1cdfe017041f1088d1419f65c8e5490ee613e16dbf662698c0f54870f0475fa893fc41eb55b08ff1ac211bc045ded31be27d12c96d8d3cfc6a7ae8aa50bf2ee0f30ed507cc2581e3dec56de94f5dc0a7abee0be990b893f2887bd2c6310a1e0a9e3e38bd34fded2541508dc102a9c9b4c95effd9dd2dfe96c29be647d6c69d66ca500843cfaed6e440196f1dbe0e2e22163c61ca48c79116fa77216726749a976a1c4b0944b5121e8c01',\r\n exponent: '010001'\r\n }]; */\r\n\r\n private testPublicKeysHex: RSAPublicKeyHex[] = [{\r\n modulus: 'c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5',\r\n exponent: '010001'\r\n }];\r\n\r\n private publisKeysHex: RSAPublicKeyHex[] = [{\r\n // modulus: '00e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\r\n modulus: 'e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\r\n exponent: '010001'\r\n }];\r\n\r\n private publicKeysParsed: {\r\n [hex: string]: RSAPublicKeyHex\r\n } = {};\r\n private prepared = false;\r\n private preparePromise: Promise<void> = null;\r\n\r\n constructor() {\r\n if(Modes.test) {\r\n this.publisKeysHex = this.testPublicKeysHex;\r\n }\r\n }\r\n\r\n public prepare(): Promise<void> {\r\n if(this.preparePromise) return this.preparePromise;\r\n else if(this.prepared) {\r\n return Promise.resolve();\r\n }\r\n\r\n return this.preparePromise = Promise.all(this.publisKeysHex.map((keyParsed) => {\r\n const RSAPublicKey = new TLSerialization();\r\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.modulus), 'n');\r\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.exponent), 'e');\r\n\r\n const buffer = RSAPublicKey.getBuffer();\r\n\r\n return cryptoWorker.invokeCrypto('sha1', buffer).then((bytes) => {\r\n const fingerprintBytes = bytes.slice(-8);\r\n fingerprintBytes.reverse();\r\n\r\n this.publicKeysParsed[bytesToHex(fingerprintBytes).toLowerCase()] = {\r\n modulus: keyParsed.modulus,\r\n exponent: keyParsed.exponent\r\n };\r\n });\r\n })).then(() => {\r\n this.prepared = true;\r\n\r\n // console.log('[MT] Prepared keys');\r\n this.preparePromise = null;\r\n });\r\n }\r\n\r\n public async select(fingerprints: Array<string>) {\r\n await this.prepare();\r\n\r\n for(let i = 0; i < fingerprints.length; ++i) {\r\n let fingerprintHex = bigInt(fingerprints[i]).toString(16).toLowerCase();\r\n\r\n if(fingerprintHex.length < 16) {\r\n fingerprintHex = new Array(16 - fingerprintHex.length).fill('0').join('') + fingerprintHex;\r\n }\r\n\r\n // console.log(fingerprintHex, this.publicKeysParsed);\r\n const foundKey = this.publicKeysParsed[fingerprintHex];\r\n if(foundKey) {\r\n return Object.assign({\r\n fingerprint: fingerprints[i]\r\n }, foundKey);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default new RSAKeysManager();\r\n","export default function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\r\n const len = bytes1.length;\r\n const bytes = new Uint8Array(len);\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = bytes1[i] ^ bytes2[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n \nimport transportController from './transports/controller';\n \n\nimport {TLSerialization, TLDeserialization} from './tl_utils';\nimport {TransportType} from './dcConfigurator';\nimport rsaKeysManager from './rsaKeysManager';\n\nimport CryptoWorker from '../crypto/cryptoMessagePort';\n\nimport {logger, LogTypes} from '../logger';\nimport DEBUG from '../../config/debug';\nimport {Awaited, DcId} from '../../types';\nimport addPadding from '../../helpers/bytes/addPadding';\nimport bytesCmp from '../../helpers/bytes/bytesCmp';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport bytesXor from '../../helpers/bytes/bytesXor';\nimport {bigIntFromBytes} from '../../helpers/bigInt/bigIntConversion';\nimport bigInt from 'big-integer';\nimport randomize from '../../helpers/array/randomize';\nimport {AppManager} from '../appManagers/manager';\n\n/* let fNewNonce: any = bytesFromHex('8761970c24cb2329b5b2459752c502f3057cb7e8dbab200e526e8767fdc73b3c').reverse();\nlet fNonce: any = bytesFromHex('b597720d11faa5914ef485c529cde414').reverse();\nlet fResult: any = new Uint8Array(bytesFromHex('000000000000000001b473a0661b285e480000006324160514e4cd29c585f44e91a5fa110d7297b5c0c4134c84893db5715ecd56af5ed618082182053cc5de91cd00000015c4b51c02000000a5b7f709355fc30b216be86c022bb4c3'));\n\nfNewNonce = false;\nfNonce = false;\nfResult = false; */\n\ntype AuthOptions = {\n dcId: number,\n nonce: Uint8Array,\n\n serverNonce?: Uint8Array,\n pq?: Uint8Array,\n fingerprints?: string[],\n publicKey?: {\n modulus: string,\n exponent: string,\n fingerprint: string\n },\n\n // good\n p?: Uint8Array,\n q?: Uint8Array,\n\n newNonce?: Uint8Array,\n\n retry?: number,\n\n b?: Uint8Array,\n g?: number,\n gA?: Uint8Array,\n dhPrime?: Uint8Array,\n\n tmpAesKey?: Uint8Array,\n tmpAesIv?: Uint8Array,\n\n authKeyId?: Uint8Array,\n authKey?: Uint8Array,\n serverSalt?: Uint8Array,\n\n localTime?: number,\n serverTime?: any,\n};\n\ntype ResPQ = {\n _: 'resPQ';\n nonce: Uint8Array;\n pq: Uint8Array;\n server_nonce: Uint8Array;\n server_public_key_fingerprints: string[];\n};\n\ntype P_Q_inner_data = {\n _: 'p_q_inner_data_dc';\n pq: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n new_nonce: Uint8Array;\n dc: number;\n};\n\ntype req_DH_params = {\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n public_key_fingerprint: string;\n encrypted_data: Uint8Array;\n};\n\nexport class Authorizer extends AppManager {\n private cached: {\n [dcId: DcId]: Promise<AuthOptions>\n };\n\n private log: ReturnType<typeof logger>;\n\n private transportType: TransportType;\n\n \n private getTransportTypePromise: Promise<void>;\n \n\n protected after() {\n this.cached = {};\n this.log = logger(`AUTHORIZER`, LogTypes.Error | LogTypes.Log);\n }\n\n private sendPlainRequest(dcId: DcId, requestArray: Uint8Array) {\n const requestLength = requestArray.byteLength;\n\n const header = new TLSerialization();\n header.storeLongP(0, 0, 'auth_key_id');\n header.storeLong(this.timeManager.generateId(), 'msg_id');\n header.storeInt(requestLength, 'request_length');\n\n const headerArray = header.getBytes(true) as Uint8Array;\n const resultArray = new Uint8Array(headerArray.byteLength + requestLength);\n resultArray.set(headerArray);\n resultArray.set(requestArray, headerArray.length);\n\n const transport = this.dcConfigurator.chooseServer(dcId, 'client', this.transportType);\n const baseError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE'\n };\n\n if(DEBUG) {\n this.log('mtpSendPlainRequest: creating requestPromise');\n }\n\n const promise = transport.send(resultArray) as any as Promise<Uint8Array>;\n return promise.then((result) => {\n if(DEBUG) {\n this.log('mtpSendPlainRequest: in good sector', result);\n }\n\n if(!result || !result.byteLength) {\n throw baseError;\n }\n\n try {\n /* result = fResult ? fResult : result;\n fResult = new Uint8Array(0); */\n\n const deserializer = new TLDeserialization<MTLong>(result, {mtproto: true});\n\n if(result.length === 4) {\n const errorCode = deserializer.fetchInt();\n this.log.error('mtpSendPlainRequest: wrong response, error code:', errorCode);\n throw errorCode;\n }\n\n const auth_key_id = deserializer.fetchLong('auth_key_id');\n if(auth_key_id !== '0') this.log.error('auth_key_id !== 0', auth_key_id);\n\n const msg_id = deserializer.fetchLong('msg_id');\n if(msg_id === '0') this.log.error('msg_id === 0', msg_id);\n\n const msg_len = deserializer.fetchInt('msg_len');\n if(!msg_len) this.log.error('no msg_len', msg_len);\n\n return deserializer;\n } catch(e) {\n this.log.error('mtpSendPlainRequest: deserialization went bad', e);\n const error = Object.assign(baseError, {originalError: e});\n throw error;\n }\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n originalError: error\n });\n }\n\n throw error;\n });\n }\n\n private async sendReqPQ(auth: AuthOptions) {\n const request = new TLSerialization({mtproto: true});\n\n request.storeMethod('req_pq_multi', {nonce: auth.nonce});\n\n if(DEBUG) {\n this.log('Send req_pq', bytesToHex(auth.nonce));\n }\n\n let deserializer: Awaited<ReturnType<Authorizer['sendPlainRequest']>>;\n try {\n const promise = this.sendPlainRequest(auth.dcId, request.getBytes(true));\n rsaKeysManager.prepare();\n deserializer = await promise;\n } catch(error) {\n this.log.error('req_pq error', (error as Error).message);\n throw error;\n }\n\n const response: ResPQ = deserializer.fetchObject('ResPQ');\n\n if(response._ !== 'resPQ') {\n throw new Error('[MT] resPQ response invalid: ' + response._);\n }\n\n if(!bytesCmp(auth.nonce, response.nonce)) {\n this.log.error(auth.nonce, response.nonce);\n throw new Error('[MT] resPQ nonce mismatch');\n }\n\n auth.serverNonce = response.server_nonce; // need\n auth.pq = response.pq;\n auth.fingerprints = response.server_public_key_fingerprints;\n\n if(DEBUG) {\n this.log('Got ResPQ', bytesToHex(auth.serverNonce), bytesToHex(auth.pq), auth.fingerprints);\n }\n\n const publicKey = await rsaKeysManager.select(auth.fingerprints);\n if(!publicKey) {\n throw new Error('[MT] No public key found');\n }\n\n auth.publicKey = publicKey;\n\n if(DEBUG) {\n this.log('PQ factorization start', auth.pq);\n }\n\n // let pAndQ: Awaited<ReturnType<typeof CryptoWorker['factorize']>>;\n try {\n var pAndQ = await CryptoWorker.invokeCrypto('factorize', auth.pq);\n } catch(error) {\n this.log.error('worker error factorize', error);\n throw error;\n }\n\n auth.p = pAndQ[0];\n auth.q = pAndQ[1];\n\n if(DEBUG) {\n this.log('PQ factorization done', pAndQ);\n }\n\n return this.sendReqDhParams(auth);\n }\n\n private async sendReqDhParams(auth: AuthOptions): Promise<AuthOptions> {\n auth.newNonce = randomize(new Uint8Array(32));\n\n const p_q_inner_data_dc: P_Q_inner_data = {\n _: 'p_q_inner_data_dc',\n pq: auth.pq,\n p: auth.p,\n q: auth.q,\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n new_nonce: auth.newNonce,\n dc: 0\n };\n\n const pQInnerDataSerialization = new TLSerialization({mtproto: true});\n pQInnerDataSerialization.storeObject(p_q_inner_data_dc, 'P_Q_inner_data', 'DECRYPTED_DATA');\n\n const data = pQInnerDataSerialization.getBytes(true);\n if(data.length > 144) {\n throw 'DH_params: data is more than 144 bytes!';\n }\n\n const dataWithPadding = addPadding(data, 192, false, true, false);\n const dataPadReversed = dataWithPadding.slice().reverse();\n\n const getKeyAesEncrypted = async() => {\n for(;;) {\n const tempKey = randomize(new Uint8Array(32));\n const dataWithHash = dataPadReversed.concat(await CryptoWorker.invokeCrypto('sha256', tempKey.concat(dataWithPadding)));\n if(dataWithHash.length !== 224) {\n throw 'DH_params: dataWithHash !== 224 bytes!';\n }\n\n const aesEncrypted = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, tempKey, new Uint8Array([0]));\n const tempKeyXor = bytesXor(tempKey, await CryptoWorker.invokeCrypto('sha256', aesEncrypted));\n const keyAesEncrypted = tempKeyXor.concat(aesEncrypted);\n\n const keyAesEncryptedBigInt = bigIntFromBytes(keyAesEncrypted);\n const publicKeyModulusBigInt = bigInt(auth.publicKey.modulus, 16);\n\n if(keyAesEncryptedBigInt.compare(publicKeyModulusBigInt) === -1) {\n return keyAesEncrypted;\n }\n }\n };\n\n const keyAesEncrypted = await getKeyAesEncrypted();\n const encryptedData = addPadding(await CryptoWorker.invokeCrypto('rsa-encrypt', keyAesEncrypted, auth.publicKey), 256, true, true, true);\n\n const req_DH_params: req_DH_params = {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n p: auth.p,\n q: auth.q,\n public_key_fingerprint: auth.publicKey.fingerprint,\n encrypted_data: encryptedData\n };\n\n const request = new TLSerialization({mtproto: true});\n request.storeMethod('req_DH_params', req_DH_params);\n\n const requestBytes = request.getBytes(true);\n\n if(DEBUG) {\n this.log('Send req_DH_params', req_DH_params/* , requestBytes.hex */);\n }\n\n let deserializer: Awaited<ReturnType<Authorizer['sendPlainRequest']>>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, requestBytes);\n } catch(error) {\n this.log.error('Send req_DH_params FAIL!', error);\n throw error;\n }\n\n const response = deserializer.fetchObject('Server_DH_Params', 'RESPONSE');\n\n if(DEBUG) {\n this.log('Sent req_DH_params, response:', response);\n }\n\n if(response._ !== 'server_DH_params_fail' && response._ !== 'server_DH_params_ok') {\n throw new Error('[MT] Server_DH_Params response invalid: ' + response._);\n }\n\n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Server_DH_Params nonce mismatch');\n }\n\n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Server_DH_Params server_nonce mismatch');\n }\n\n if(response._ === 'server_DH_params_fail') {\n const newNonceHash = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce)).slice(-16);\n if(!bytesCmp(newNonceHash, response.new_nonce_hash)) {\n throw new Error('[MT] server_DH_params_fail new_nonce_hash mismatch');\n }\n\n throw new Error('[MT] server_DH_params_fail');\n }\n\n // fill auth object\n try {\n await this.decryptServerDhDataAnswer(auth, response.encrypted_answer);\n } catch(e) {\n this.log.error('mtpDecryptServerDhDataAnswer FAILED!', e);\n throw e;\n }\n\n // console.log(dT(), 'mtpSendReqDhParams: executing mtpSendSetClientDhParams...');\n\n return this.sendSetClientDhParams(auth);\n }\n\n private async decryptServerDhDataAnswer(auth: AuthOptions, encryptedAnswer: any) {\n auth.localTime = Date.now();\n\n // ! can't concat Array with Uint8Array!\n auth.tmpAesKey = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat(auth.serverNonce)))\n .concat((await CryptoWorker.invokeCrypto('sha1', auth.serverNonce.concat(auth.newNonce))).slice(0, 12));\n\n auth.tmpAesIv = (await CryptoWorker.invokeCrypto('sha1', auth.serverNonce.concat(auth.newNonce))).slice(12)\n .concat(await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat(auth.newNonce)), auth.newNonce.slice(0, 4));\n\n const answerWithHash = new Uint8Array(await CryptoWorker.invokeCrypto('aes-decrypt', encryptedAnswer, auth.tmpAesKey, auth.tmpAesIv));\n\n const hash = answerWithHash.slice(0, 20);\n const answerWithPadding = answerWithHash.slice(20);\n\n const deserializer = new TLDeserialization<MTLong>(answerWithPadding, {mtproto: true});\n const response = deserializer.fetchObject('Server_DH_inner_data');\n\n if(response._ !== 'server_DH_inner_data') {\n throw new Error('[MT] server_DH_inner_data response invalid: ' + response);\n }\n\n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] server_DH_inner_data nonce mismatch');\n }\n\n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] server_DH_inner_data serverNonce mismatch');\n }\n\n if(DEBUG) {\n this.log('Done decrypting answer');\n }\n auth.g = response.g;\n auth.dhPrime = response.dh_prime;\n auth.gA = response.g_a;\n auth.serverTime = response.server_time;\n auth.retry = 0;\n\n this.verifyDhParams(auth.g, auth.dhPrime, auth.gA);\n\n const offset = deserializer.getOffset();\n\n if(!bytesCmp(hash, await CryptoWorker.invokeCrypto('sha1', answerWithPadding.slice(0, offset)))) {\n throw new Error('[MT] server_DH_inner_data SHA1 mismatch');\n }\n\n this.timeManager.applyServerTime(auth.serverTime, auth.localTime);\n }\n\n private verifyDhParams(g: number, dhPrime: Uint8Array, gA: Uint8Array) {\n if(DEBUG) {\n this.log('Verifying DH params', g, dhPrime, gA);\n }\n\n const dhPrimeHex = bytesToHex(dhPrime);\n if(g !== 3 || dhPrimeHex !== 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b') {\n // The verified value is from https://core.telegram.org/mtproto/security_guidelines\n throw new Error('[MT] DH params are not verified: unknown dhPrime');\n }\n\n if(DEBUG) {\n this.log('dhPrime cmp OK');\n }\n\n const gABigInt = bigIntFromBytes(gA);\n const dhPrimeBigInt = bigInt(dhPrimeHex, 16);\n\n if(gABigInt.compare(bigInt.one) <= 0) {\n throw new Error('[MT] DH params are not verified: gA <= 1');\n }\n\n if(gABigInt.compare(dhPrimeBigInt.subtract(bigInt.one)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA >= dhPrime - 1');\n }\n\n if(DEBUG) {\n this.log('1 < gA < dhPrime-1 OK');\n }\n\n const twoPow = bigInt(2).pow(2048 - 64);\n\n if(gABigInt.compare(twoPow) < 0) {\n throw new Error('[MT] DH params are not verified: gA < 2^{2048-64}');\n }\n if(gABigInt.compare(dhPrimeBigInt.subtract(twoPow)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}');\n }\n\n if(DEBUG) {\n this.log('2^{2048-64} < gA < dhPrime-2^{2048-64} OK');\n }\n\n return true;\n }\n\n private async sendSetClientDhParams(auth: AuthOptions): Promise<AuthOptions> {\n const gBytes = bytesFromHex(auth.g.toString(16));\n\n auth.b = randomize(new Uint8Array(256));\n // MTProto.secureRandom.nextBytes(auth.b);\n\n // let gB: Awaited<ReturnType<typeof CryptoWorker['modPow']>>;\n try {\n var gB = await CryptoWorker.invokeCrypto('mod-pow', gBytes, auth.b, auth.dhPrime);\n } catch(error) {\n throw error;\n }\n\n const data = new TLSerialization({mtproto: true});\n data.storeObject({\n _: 'client_DH_inner_data',\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n retry_id: [0, auth.retry++],\n g_b: gB\n }, 'Client_DH_Inner_Data');\n\n const dataWithHash = (await CryptoWorker.invokeCrypto('sha1', data.getBuffer())).concat(data.getBytes(true));\n const encryptedData = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, auth.tmpAesKey, auth.tmpAesIv);\n\n const request = new TLSerialization({mtproto: true});\n request.storeMethod('set_client_DH_params', {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n encrypted_data: encryptedData\n });\n\n if(DEBUG) {\n this.log('Send set_client_DH_params');\n }\n\n let deserializer: Awaited<ReturnType<Authorizer['sendPlainRequest']>>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, request.getBytes(true));\n } catch(err) {\n throw err;\n }\n\n const response = deserializer.fetchObject('Set_client_DH_params_answer');\n\n if(response._ !== 'dh_gen_ok' && response._ !== 'dh_gen_retry' && response._ !== 'dh_gen_fail') {\n throw new Error('[MT] Set_client_DH_params_answer response invalid: ' + response._);\n }\n\n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer nonce mismatch');\n }\n\n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer server_nonce mismatch');\n }\n\n // let authKey: Uint8Array;\n try {\n var authKey = await CryptoWorker.invokeCrypto('mod-pow', auth.gA, auth.b, auth.dhPrime);\n } catch(err) {\n throw authKey;\n }\n\n const authKeyHash = await CryptoWorker.invokeCrypto('sha1', authKey),\n authKeyAux = authKeyHash.slice(0, 8),\n authKeyId = authKeyHash.slice(-8);\n\n if(DEBUG) {\n this.log('Got Set_client_DH_params_answer', response._, authKey);\n }\n switch(response._) {\n case 'dh_gen_ok': {\n const newNonceHash1 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([1], authKeyAux))).slice(-16);\n\n if(!bytesCmp(newNonceHash1, response.new_nonce_hash1)) {\n this.log.error('Set_client_DH_params_answer new_nonce_hash1 mismatch', newNonceHash1, response);\n throw new Error('new_nonce_hash1 mismatch');\n }\n\n const serverSalt = bytesXor(auth.newNonce.slice(0, 8), auth.serverNonce.slice(0, 8));\n if(DEBUG) {\n this.log('Auth successfull!', authKeyId, authKey, serverSalt);\n }\n\n auth.authKeyId = authKeyId;\n auth.authKey = authKey;\n auth.serverSalt = serverSalt;\n\n return auth;\n }\n\n case 'dh_gen_retry': {\n const newNonceHash2 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([2], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash2, response.new_nonce_hash2)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch');\n }\n\n return this.sendSetClientDhParams(auth);\n }\n\n case 'dh_gen_fail': {\n const newNonceHash3 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([3], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash3, response.new_nonce_hash3)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch');\n }\n\n throw new Error('[MT] Set_client_DH_params_answer fail');\n }\n }\n }\n\n \n private getTransportType() {\n if(this.getTransportTypePromise) return this.getTransportTypePromise;\n return this.getTransportTypePromise = transportController.pingTransports().then(({websocket}) => {\n this.transportType = websocket ? 'websocket' : 'https';\n this.log('will use transport:', this.transportType);\n });\n }\n \n\n public auth(dcId: DcId) {\n let promise = this.cached[dcId];\n if(promise) {\n return promise;\n }\n\n promise = new Promise(async(resolve, reject) => {\n \n await this.getTransportType();\n \n\n let error: ApiError;\n let _try = 1;\n while(_try++ <= 3) {\n try {\n const auth: AuthOptions = {\n dcId,\n nonce: randomize(new Uint8Array(16))\n };\n\n const promise = this.sendReqPQ(auth);\n resolve(await promise);\n return;\n } catch(err) {\n error = err;\n }\n }\n\n reject(error);\n });\n\n return this.cached[dcId] = promise;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport sessionStorage from '../sessionStorage';\r\nimport {nextRandomUint} from '../../helpers/random';\r\nimport {WorkerTaskVoidTemplate} from '../../types';\r\nimport ulongFromInts from '../../helpers/long/ulongFromInts';\r\nimport {AppManager} from '../appManagers/manager';\r\n\r\n/*\r\nlet lol: any = {};\r\nfor(var i = 0; i < 100; i++) {\r\n timeManager.generateId();\r\n}\r\n*/\r\n\r\nexport interface ApplyServerTimeOffsetTask extends WorkerTaskVoidTemplate {\r\n type: 'applyServerTimeOffset',\r\n payload: TimeManager['timeOffset']\r\n};\r\n\r\nexport class TimeManager extends AppManager {\r\n private lastMessageId: [number, number];\r\n private timeOffset: number;\r\n\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n protected after() {\r\n this.lastMessageId = [0, 0];\r\n this.timeOffset = 0;\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.timeOffset = to;\r\n }\r\n });\r\n\r\n\r\n // * migrated from ServerTimeManager\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n\r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n }\r\n\r\n public getServerTimeOffset() {\r\n return this.timeOffset;\r\n }\r\n\r\n public generateId(): string {\r\n const timeTicks = Date.now(),\r\n timeSec = Math.floor(timeTicks / 1000) + this.timeOffset,\r\n timeMSec = timeTicks % 1000,\r\n random = nextRandomUint(16);\r\n\r\n let messageId: TimeManager['lastMessageId'] = [timeSec, (timeMSec << 21) | (random << 3) | 4];\r\n if(this.lastMessageId[0] > messageId[0] ||\r\n this.lastMessageId[0] === messageId[0] && this.lastMessageId[1] >= messageId[1]) {\r\n messageId = [this.lastMessageId[0], this.lastMessageId[1] + 4];\r\n }\r\n\r\n this.lastMessageId = messageId;\r\n\r\n const ret = ulongFromInts(messageId[0], messageId[1]).toString(10);\r\n\r\n // if(lol[ret]) {\r\n // console.error('[TimeManager]: Generated SAME msg id', messageId, this.timeOffset, ret);\r\n // }\r\n // lol[ret] = true;\r\n\r\n // console.log('[TimeManager]: Generated msg id', messageId, this.timeOffset, ret);\r\n\r\n return ret\r\n }\r\n\r\n public applyServerTime(serverTime: number, localTime?: number) {\r\n localTime = (localTime || Date.now()) / 1000 | 0;\r\n const newTimeOffset = serverTime - localTime;\r\n const changed = Math.abs(this.timeOffset - newTimeOffset) > 10;\r\n this.lastMessageId = [0, 0];\r\n\r\n if(this.timeOffset !== newTimeOffset) {\r\n sessionStorage.set({\r\n server_time_offset: newTimeOffset\r\n });\r\n\r\n this.timeOffset = newTimeOffset;\r\n }\r\n\r\n // console.log('[TimeManager]: Apply server time', serverTime, localTime, newTimeOffset, changed);\r\n\r\n return changed;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {DocumentAttribute, WebDocument} from '../../layer';\r\n\r\nexport default class AppWebDocsManager {\r\n public saveWebDocument(webDocument: WebDocument) {\r\n if(!webDocument) {\r\n return;\r\n }\r\n\r\n const attribute: DocumentAttribute.documentAttributeImageSize = webDocument.attributes.find((attribute) => attribute._ === 'documentAttributeImageSize') as any;\r\n if(attribute) {\r\n webDocument.w = attribute.w;\r\n webDocument.h = attribute.h;\r\n }\r\n\r\n return webDocument;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {InputInvoice, InputPaymentCredentials, PaymentRequestedInfo, PaymentsPaymentForm} from '../../layer';\r\nimport {AppManager} from './manager';\r\nimport getServerMessageId from './utils/messageId/getServerMessageId';\r\n\r\nexport default class AppPaymentsManager extends AppManager {\r\n public getInputInvoiceBySlug(slug: string): InputInvoice.inputInvoiceSlug {\r\n return {\r\n _: 'inputInvoiceSlug',\r\n slug\r\n };\r\n }\r\n\r\n public getInputInvoiceByPeerId(peerId: PeerId, mid: number): InputInvoice.inputInvoiceMessage {\r\n return {\r\n _: 'inputInvoiceMessage',\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n msg_id: getServerMessageId(mid)\r\n };\r\n }\r\n\r\n public getPaymentForm(invoice: InputInvoice) {\r\n return this.apiManager.invokeApi('payments.getPaymentForm', {\r\n invoice\r\n }).then((paymentForm) => {\r\n this.appUsersManager.saveApiUsers(paymentForm.users);\r\n\r\n return paymentForm;\r\n });\r\n }\r\n\r\n public getPaymentReceipt(peerId: PeerId, mid: number) {\r\n return this.apiManager.invokeApi('payments.getPaymentReceipt', {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n msg_id: getServerMessageId(mid)\r\n }).then((paymentForm) => {\r\n this.appUsersManager.saveApiUsers(paymentForm.users);\r\n\r\n return paymentForm;\r\n });\r\n }\r\n\r\n public validateRequestedInfo(invoice: InputInvoice, info: PaymentRequestedInfo, save?: boolean) {\r\n return this.apiManager.invokeApi('payments.validateRequestedInfo', {\r\n save,\r\n invoice,\r\n info\r\n });\r\n }\r\n\r\n public sendPaymentForm(\r\n invoice: InputInvoice,\r\n formId: PaymentsPaymentForm['form_id'],\r\n requestedInfoId: string,\r\n shippingOptionId: string,\r\n credentials: InputPaymentCredentials,\r\n tipAmount?: number\r\n ) {\r\n return this.apiManager.invokeApi('payments.sendPaymentForm', {\r\n form_id: formId,\r\n invoice,\r\n requested_info_id: requestedInfoId,\r\n shipping_option_id: shippingOptionId,\r\n credentials,\r\n tip_amount: tipAmount || undefined\r\n }).then((result) => {\r\n if(result._ === 'payments.paymentResult') {\r\n this.apiUpdatesManager.processUpdateMessage(result.updates);\r\n }\r\n\r\n return result;\r\n });\r\n }\r\n\r\n public clearSavedInfo(info?: boolean, credentials?: boolean) {\r\n return this.apiManager.invokeApi('payments.clearSavedInfo', {\r\n info,\r\n credentials\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport App from '../../config/app';\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport callbackify from '../../helpers/callbackify';\r\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\r\nimport cryptoMessagePort from '../crypto/cryptoMessagePort';\r\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\r\nimport appStateManager from './appStateManager';\r\nimport {AppStoragesManager} from './appStoragesManager';\r\nimport createManagers from './createManagers';\r\n\r\ntype Managers = Awaited<ReturnType<typeof createManagers>>;\r\n\r\nexport class AppManagersManager {\r\n private managers: Managers | Promise<Managers>;\r\n private cryptoWorkersURLs: string[];\r\n private cryptoPortsAttached: number;\r\n private cryptoPortPromise: CancellablePromise<void>;\r\n\r\n constructor() {\r\n this.cryptoWorkersURLs = [];\r\n this.cryptoPortsAttached = 0;\r\n this.cryptoPortPromise = deferredPromise();\r\n this.cryptoPortPromise.then(() => {\r\n this.cryptoPortPromise = undefined;\r\n });\r\n }\r\n\r\n public start() {\r\n const port = MTProtoMessagePort.getInstance<false>();\r\n\r\n port.addEventListener('manager', ({name, method, args}) => {\r\n return callbackify(this.getManagers(), (managers) => {\r\n // @ts-ignore\r\n const manager = managers[name];\r\n return manager[method].apply(manager, args);\r\n });\r\n });\r\n\r\n port.addEventListener('cryptoPort', (payload, source, event) => {\r\n const port = event.ports[0];\r\n if(this.cryptoPortsAttached >= this.cryptoWorkersURLs.length) {\r\n port.close();\r\n return;\r\n }\r\n\r\n ++this.cryptoPortsAttached;\r\n cryptoMessagePort.attachPort(port);\r\n this.cryptoPortPromise?.resolve();\r\n });\r\n\r\n port.addEventListener('createProxyWorkerURLs', ({originalUrl, blob}) => {\r\n let length = this.cryptoWorkersURLs.length;\r\n if(!length) {\r\n this.cryptoWorkersURLs.push(originalUrl);\r\n ++length;\r\n }\r\n\r\n const maxLength = App.cryptoWorkers;\r\n if(length === maxLength) {\r\n return this.cryptoWorkersURLs;\r\n }\r\n\r\n const newURLs = new Array(maxLength - length).fill(undefined).map(() => URL.createObjectURL(blob));\r\n this.cryptoWorkersURLs.push(...newURLs);\r\n return this.cryptoWorkersURLs;\r\n });\r\n }\r\n\r\n public async createManagers() {\r\n const appStoragesManager = new AppStoragesManager();\r\n\r\n await Promise.all([\r\n // new Promise(() => {}),\r\n appStoragesManager.loadStorages(),\r\n this.cryptoPortPromise\r\n ]);\r\n\r\n const managers = await createManagers(appStoragesManager, appStateManager.userId);\r\n return this.managers = managers;\r\n }\r\n\r\n public getManagers() {\r\n return this.managers ??= this.createManagers();\r\n }\r\n}\r\n\r\nconst appManagersManager = new AppManagersManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appManagersManager = appManagersManager);\r\nexport default appManagersManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {PasswordManager} from '../mtproto/passwordManager';\r\nimport {ReferenceDatabase} from '../mtproto/referenceDatabase';\r\nimport DialogsStorage from '../storages/dialogs';\r\nimport FiltersStorage from '../storages/filters';\r\nimport {ApiUpdatesManager} from './apiUpdatesManager';\r\nimport {AppAvatarsManager} from './appAvatarsManager';\r\nimport {AppCallsManager} from './appCallsManager';\r\nimport {AppChatsManager} from './appChatsManager';\r\nimport {AppDocsManager} from './appDocsManager';\r\nimport {AppDraftsManager} from './appDraftsManager';\r\nimport {AppEmojiManager} from './appEmojiManager';\r\nimport {AppGroupCallsManager} from './appGroupCallsManager';\r\nimport {AppInlineBotsManager} from './appInlineBotsManager';\r\nimport {AppMessagesIdsManager} from './appMessagesIdsManager';\r\nimport {AppMessagesManager} from './appMessagesManager';\r\nimport {AppNotificationsManager} from './appNotificationsManager';\r\nimport {AppPeersManager} from './appPeersManager';\r\nimport {AppPhotosManager} from './appPhotosManager';\r\nimport {AppPollsManager} from './appPollsManager';\r\nimport {AppPrivacyManager} from './appPrivacyManager';\r\nimport {AppProfileManager} from './appProfileManager';\r\nimport {AppReactionsManager} from './appReactionsManager';\r\nimport {AppStickersManager} from './appStickersManager';\r\nimport {AppUsersManager} from './appUsersManager';\r\nimport {AppWebPagesManager} from './appWebPagesManager';\r\nimport {ApiFileManager} from '../mtproto/apiFileManager';\r\nimport {ApiManager} from '../mtproto/apiManager';\r\nimport ctx from '../../environment/ctx';\r\nimport PeersStorage from '../storages/peers';\r\nimport ThumbsStorage from '../storages/thumbs';\r\nimport {NetworkerFactory} from '../mtproto/networkerFactory';\r\nimport {RootScope} from '../rootScope';\r\nimport {Authorizer} from '../mtproto/authorizer';\r\nimport {DcConfigurator} from '../mtproto/dcConfigurator';\r\nimport {TimeManager} from '../mtproto/timeManager';\r\nimport {AppStoragesManager} from './appStoragesManager';\r\nimport cryptoMessagePort from '../crypto/cryptoMessagePort';\r\nimport appStateManager from './appStateManager';\r\nimport filterUnique from '../../helpers/array/filterUnique';\r\nimport AppWebDocsManager from './appWebDocsManager';\r\nimport AppPaymentsManager from './appPaymentsManager';\r\n\r\nexport default function createManagers(appStoragesManager: AppStoragesManager, userId: UserId) {\r\n const managers = {\r\n appPeersManager: new AppPeersManager,\r\n appChatsManager: new AppChatsManager,\r\n appDocsManager: new AppDocsManager,\r\n appPhotosManager: new AppPhotosManager,\r\n appPollsManager: new AppPollsManager,\r\n appUsersManager: new AppUsersManager,\r\n appWebPagesManager: new AppWebPagesManager,\r\n appDraftsManager: new AppDraftsManager,\r\n appProfileManager: new AppProfileManager,\r\n appNotificationsManager: new AppNotificationsManager,\r\n apiUpdatesManager: new ApiUpdatesManager,\r\n appAvatarsManager: new AppAvatarsManager,\r\n appGroupCallsManager: new AppGroupCallsManager,\r\n appCallsManager: new AppCallsManager,\r\n appReactionsManager: new AppReactionsManager,\r\n appMessagesManager: new AppMessagesManager,\r\n appMessagesIdsManager: new AppMessagesIdsManager,\r\n appPrivacyManager: new AppPrivacyManager,\r\n appInlineBotsManager: new AppInlineBotsManager,\r\n appStickersManager: new AppStickersManager,\r\n referenceDatabase: new ReferenceDatabase,\r\n appEmojiManager: new AppEmojiManager,\r\n filtersStorage: new FiltersStorage,\r\n dialogsStorage: new DialogsStorage,\r\n apiManager: new ApiManager,\r\n cryptoWorker: cryptoMessagePort,\r\n passwordManager: new PasswordManager,\r\n apiFileManager: new ApiFileManager,\r\n peersStorage: new PeersStorage,\r\n thumbsStorage: new ThumbsStorage,\r\n networkerFactory: new NetworkerFactory,\r\n rootScope: new RootScope,\r\n authorizer: new Authorizer,\r\n dcConfigurator: new DcConfigurator,\r\n timeManager: new TimeManager,\r\n appStoragesManager: appStoragesManager,\r\n appStateManager: appStateManager,\r\n appWebDocsManager: new AppWebDocsManager,\r\n appPaymentsManager: new AppPaymentsManager\r\n };\r\n\r\n type T = typeof managers;\r\n\r\n for(const name in managers) {\r\n const manager = managers[name as keyof T];\r\n if(!manager) {\r\n continue;\r\n }\r\n\r\n if((manager as AppMessagesManager).setManagers) {\r\n (manager as AppMessagesManager).setManagers(managers as any);\r\n delete (manager as AppMessagesManager).setManagers;\r\n }\r\n\r\n // @ts-ignore\r\n ctx[name] = manager;\r\n }\r\n\r\n const promises: Array<Promise<(() => void) | void> | void>[] = [];\r\n let names = Object.keys(managers) as (keyof T)[];\r\n names.unshift('appUsersManager', 'appChatsManager', 'appNotificationsManager', 'appMessagesManager', 'dialogsStorage');\r\n names = filterUnique(names);\r\n for(const name of names) {\r\n const manager = managers[name];\r\n if((manager as any)?.after) {\r\n // console.log('injecting after', name);\r\n const result = (manager as any).after();\r\n promises.push(result);\r\n\r\n // if(result instanceof Promise) {\r\n // result.then(() => {\r\n // console.log('injected after', name);\r\n // });\r\n // }\r\n }\r\n }\r\n\r\n if(userId) {\r\n managers.apiManager.setUserAuth(userId);\r\n }\r\n\r\n return Promise.all(promises).then(() => managers);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// just to include\r\nimport '../polyfill';\r\nimport '../../helpers/peerIdPolyfill';\r\n\r\nimport cryptoWorker from '../crypto/cryptoMessagePort';\r\nimport {setEnvironment} from '../../environment/utils';\r\nimport appStateManager from '../appManagers/appStateManager';\r\nimport transportController from './transports/controller';\r\nimport MTProtoMessagePort from './mtprotoMessagePort';\r\nimport RESET_STORAGES_PROMISE from '../appManagers/utils/storages/resetStoragesPromise';\r\nimport appManagersManager from '../appManagers/appManagersManager';\r\nimport listenMessagePort from '../../helpers/listenMessagePort';\r\nimport {logger} from '../logger';\r\nimport {State} from '../../config/state';\r\nimport toggleStorages from '../../helpers/toggleStorages';\r\nimport appTabsManager from '../appManagers/appTabsManager';\r\nimport ServiceMessagePort from '../serviceWorker/serviceMessagePort';\r\nimport callbackify from '../../helpers/callbackify';\r\n\r\nlet _isServiceWorkerOnline = true;\r\nexport function isServiceWorkerOnline() {\r\n return _isServiceWorkerOnline;\r\n}\r\n\r\nlet serviceMessagePort: ServiceMessagePort<true>, _serviceMessagePort: MessagePort;\r\nexport function getServiceMessagePort() {\r\n return _isServiceWorkerOnline ? serviceMessagePort : undefined;\r\n}\r\n\r\nconst log = logger('MTPROTO');\r\n// let haveState = false;\r\n\r\nconst port = new MTProtoMessagePort<false>();\r\nport.addMultipleEventsListeners({\r\n environment: (environment) => {\r\n setEnvironment(environment);\r\n\r\n transportController.waitForWebSocket();\r\n },\r\n\r\n crypto: ({method, args}) => {\r\n return cryptoWorker.invokeCrypto(method as any, ...args as any);\r\n },\r\n\r\n state: ({state, resetStorages, pushedKeys, newVersion, oldVersion, userId}) => {\r\n // if(haveState) {\r\n // return;\r\n // }\r\n\r\n log('got state', state, pushedKeys);\r\n\r\n appStateManager.userId = userId;\r\n appStateManager.newVersion = newVersion;\r\n appStateManager.oldVersion = oldVersion;\r\n\r\n (Object.keys(state) as any as (keyof State)[]).forEach((key) => {\r\n appStateManager.pushToState(key, state[key], true, !pushedKeys.includes(key));\r\n });\r\n\r\n RESET_STORAGES_PROMISE.resolve(resetStorages);\r\n // haveState = true;\r\n },\r\n\r\n toggleStorages: ({enabled, clearWrite}) => {\r\n return toggleStorages(enabled, clearWrite);\r\n },\r\n\r\n event: (payload, source) => {\r\n log('will redirect event', payload, source);\r\n port.invokeExceptSource('event', payload, source);\r\n },\r\n\r\n serviceWorkerOnline: (online) => {\r\n _isServiceWorkerOnline = online;\r\n },\r\n\r\n serviceWorkerPort: (payload, source, event) => {\r\n if(serviceMessagePort) {\r\n serviceMessagePort.detachPort(_serviceMessagePort);\r\n _serviceMessagePort = undefined;\r\n } else {\r\n serviceMessagePort = new ServiceMessagePort();\r\n serviceMessagePort.addMultipleEventsListeners({\r\n requestFilePart: (payload) => {\r\n return callbackify(appManagersManager.getManagers(), (managers) => {\r\n const {docId, dcId, offset, limit} = payload;\r\n return managers.appDocsManager.requestDocPart(docId, dcId, offset, limit);\r\n });\r\n }\r\n });\r\n }\r\n\r\n // * port can be undefined in the future\r\n if(_serviceMessagePort = event.ports[0]) {\r\n serviceMessagePort.attachPort(_serviceMessagePort);\r\n }\r\n },\r\n\r\n createObjectURL: (blob) => {\r\n return URL.createObjectURL(blob);\r\n }\r\n\r\n // socketProxy: (task) => {\r\n // const socketTask = task.payload;\r\n // const id = socketTask.id;\r\n\r\n // const socketProxied = socketsProxied.get(id);\r\n // if(socketTask.type === 'message') {\r\n // socketProxied.dispatchEvent('message', socketTask.payload);\r\n // } else if(socketTask.type === 'open') {\r\n // socketProxied.dispatchEvent('open');\r\n // } else if(socketTask.type === 'close') {\r\n // socketProxied.dispatchEvent('close');\r\n // socketsProxied.delete(id);\r\n // }\r\n // },\r\n});\r\n\r\nlog('MTProto start');\r\n\r\nappManagersManager.start();\r\nappManagersManager.getManagers();\r\nappTabsManager.start();\r\n\r\n// let sentHello = false;\r\nlistenMessagePort(port, (source) => {\r\n appTabsManager.addTab(source);\r\n\r\n // port.invokeVoid('hello', undefined, source);\r\n // if(!sentHello) {\r\n // port.invokeVoid('hello', undefined, source);\r\n // sentHello = true;\r\n // }\r\n}, (source) => {\r\n appTabsManager.deleteTab(source);\r\n});\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type SuperMessagePort from '../lib/mtproto/superMessagePort';\r\nimport ctx from '../environment/ctx';\r\n\r\nexport default function listenMessagePort(\r\n messagePort: SuperMessagePort<any, any, any>,\r\n onConnect?: (source: MessageEventSource) => void,\r\n onDisconnect?: (source: MessageEventSource) => void\r\n) {\r\n const attachPort = (listenPort: any, sendPort: any) => {\r\n messagePort.attachListenPort(listenPort);\r\n sendPort && messagePort.attachSendPort(sendPort);\r\n onConnect?.(listenPort);\r\n };\r\n\r\n messagePort.setOnPortDisconnect(onDisconnect);\r\n\r\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\r\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source, e.source));\r\n } else if(typeof(ServiceWorkerGlobalScope) !== 'undefined') {\r\n attachPort(ctx, null);\r\n } else {\r\n attachPort(ctx, ctx);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {MyDialogFilter} from '../storages/filters';\r\n\r\n/**\r\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\r\n */\r\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\r\nexport type REAL_FOLDER_ID = 0 | 1;\r\n\r\nexport const NULL_PEER_ID: PeerId = 0;\r\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\r\nexport const REPLIES_HIDDEN_CHANNEL_ID: ChatId = 777;\r\nexport const SERVICE_PEER_ID: PeerId = 777000;\r\nexport const MUTE_UNTIL = 0x7FFFFFFF;\r\nexport const BOT_START_PARAM = '';\r\nexport const MAX_FILE_SAVE_SIZE = 20 * 1024 * 1024;\r\nexport const THUMB_TYPE_FULL = '';\r\n\r\nexport const FOLDER_ID_ALL: REAL_FOLDER_ID = 0;\r\nexport const FOLDER_ID_ARCHIVE: REAL_FOLDER_ID = 1;\r\nexport const REAL_FOLDERS: Set<number> = new Set([FOLDER_ID_ALL, FOLDER_ID_ARCHIVE]);\r\nexport const START_LOCAL_ID = Math.max(...Array.from(REAL_FOLDERS)) + 1 as MyDialogFilter['localId'];\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport emojiRegExp from '../../vendor/emoji/regex';\r\nimport {MessageEntity} from '../../layer';\r\n\r\nconst EmojiHelper = {\r\n emojiMap: (code: string) => { return code; },\r\n shortcuts: [] as any,\r\n emojis: [] as any\r\n};\r\n\r\nexport const ALPHA_CHARS_REG_EXP = 'a-z' +\r\n '\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00f6\\\\u00f8-\\\\u00ff' + // Latin-1\r\n '\\\\u0100-\\\\u024f' + // Latin Extended A and B\r\n '\\\\u0253\\\\u0254\\\\u0256\\\\u0257\\\\u0259\\\\u025b\\\\u0263\\\\u0268\\\\u026f\\\\u0272\\\\u0289\\\\u028b' + // IPA Extensions\r\n '\\\\u02bb' + // Hawaiian\r\n '\\\\u0300-\\\\u036f' + // Combining diacritics\r\n '\\\\u1e00-\\\\u1eff' + // Latin Extended Additional (mostly for Vietnamese)\r\n '\\\\u0400-\\\\u04ff\\\\u0500-\\\\u0527' + // Cyrillic\r\n '\\\\u2de0-\\\\u2dff\\\\ua640-\\\\ua69f' + // Cyrillic Extended A/B\r\n '\\\\u0591-\\\\u05bf\\\\u05c1-\\\\u05c2\\\\u05c4-\\\\u05c5\\\\u05c7' +\r\n '\\\\u05d0-\\\\u05ea\\\\u05f0-\\\\u05f4' + // Hebrew\r\n '\\\\ufb1d-\\\\ufb28\\\\ufb2a-\\\\ufb36\\\\ufb38-\\\\ufb3c\\\\ufb3e\\\\ufb40-\\\\ufb41' +\r\n '\\\\ufb43-\\\\ufb44\\\\ufb46-\\\\ufb4f' + // Hebrew Pres. Forms\r\n '\\\\u0610-\\\\u061a\\\\u0620-\\\\u065f\\\\u066e-\\\\u06d3\\\\u06d5-\\\\u06dc' +\r\n '\\\\u06de-\\\\u06e8\\\\u06ea-\\\\u06ef\\\\u06fa-\\\\u06fc\\\\u06ff' + // Arabic\r\n '\\\\u0750-\\\\u077f\\\\u08a0\\\\u08a2-\\\\u08ac\\\\u08e4-\\\\u08fe' + // Arabic Supplement and Extended A\r\n '\\\\ufb50-\\\\ufbb1\\\\ufbd3-\\\\ufd3d\\\\ufd50-\\\\ufd8f\\\\ufd92-\\\\ufdc7\\\\ufdf0-\\\\ufdfb' + // Pres. Forms A\r\n '\\\\ufe70-\\\\ufe74\\\\ufe76-\\\\ufefc' + // Pres. Forms B\r\n '\\\\u200c' + // Zero-Width Non-Joiner\r\n '\\\\u0e01-\\\\u0e3a\\\\u0e40-\\\\u0e4e' + // Thai\r\n '\\\\u1100-\\\\u11ff\\\\u3130-\\\\u3185\\\\uA960-\\\\uA97F\\\\uAC00-\\\\uD7AF\\\\uD7B0-\\\\uD7FF' + // Hangul (Korean)\r\n '\\\\u3003\\\\u3005\\\\u303b' + // Kanji/Han iteration marks\r\n '\\\\uff21-\\\\uff3a\\\\uff41-\\\\uff5a' + // full width Alphabet\r\n '\\\\uff66-\\\\uff9f' + // half width Katakana\r\n '\\\\uffa1-\\\\uffdc'; // half width Hangul (Korean)\r\nexport const ALPHA_NUMERIC_REG_EXP = '0-9\\_' + ALPHA_CHARS_REG_EXP;\r\nexport const DOMAIN_ADD_CHARS = '\\u00b7';\r\n// Based on Regular Expression for URL validation by Diego Perini\r\nexport const URL_ALPHANUMERIC_REG_EXP_PART = '[' + ALPHA_CHARS_REG_EXP + '0-9]';\r\nexport const URL_PROTOCOL_REG_EXP_PART = '((?:https?|ftp)://|mailto:)?';\r\nexport const URL_REG_EXP = URL_PROTOCOL_REG_EXP_PART +\r\n // user:pass authentication\r\n '(?:' + URL_ALPHANUMERIC_REG_EXP_PART + '{1,64}(?::' + URL_ALPHANUMERIC_REG_EXP_PART + '{0,64})?@)?' +\r\n '(?:' +\r\n // sindresorhus/ip-regexp\r\n '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}' +\r\n '|' +\r\n // host name\r\n URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}' +\r\n // domain name\r\n '(?:\\\\.' + URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}){0,10}' +\r\n // TLD identifier\r\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + ALPHA_CHARS_REG_EXP + ']{2,24}))' +\r\n ')' +\r\n // port number\r\n '(?::\\\\d{2,5})?' +\r\n // resource path\r\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?';\r\nexport const URL_PROTOCOL_REG_EXP = new RegExp('^' + URL_PROTOCOL_REG_EXP_PART.slice(0, -1), 'i');\r\nexport const URL_ANY_PROTOCOL_REG_EXP = /^((?:[^\\/]+?):\\/\\/|mailto:)/;\r\nexport const USERNAME_REG_EXP = '[a-zA-Z\\\\d_]{5,32}';\r\nexport const BOT_COMMAND_REG_EXP = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + USERNAME_REG_EXP + '))?(\\\\b|$)';\r\nexport const FULL_REG_EXP = new RegExp('(^| )(@)(' + USERNAME_REG_EXP + ')|(' + URL_REG_EXP + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + ALPHA_NUMERIC_REG_EXP + ']{2,64})|(^|\\\\s)' + BOT_COMMAND_REG_EXP, 'i');\r\nexport const EMAIL_REG_EXP = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\r\n// const markdownTestRegExp = /[`_*@~]/;\r\nexport const MARKDOWN_REG_EXP = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s|\\x01)(`|~~|\\*\\*|__|_-_|\\|\\|)([^\\n]+?)\\7([\\x01\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)|(\\[(.+?)\\]\\((.+?)\\))/m;\r\nexport const SITE_HASHTAGS: {[siteName: string]: string} = {\r\n 'Telegram': 'tg://search_hashtag?hashtag={1}',\r\n 'Twitter': 'https://twitter.com/hashtag/{1}',\r\n 'Instagram': 'https://instagram.com/explore/tags/{1}/',\r\n 'Google Plus': 'https://plus.google.com/explore/{1}'\r\n};\r\n\r\n// export const SITE_MENTIONS: {[siteName in 'Telegram' | 'Twitter' | 'Instagram' | 'GitHub']: string} = {\r\n// Telegram: '#{1}',\r\n// Twitter: 'https://twitter.com/{1}',\r\n// Instagram: 'https://instagram.com/{1}/',\r\n// GitHub: 'https://github.com/{1}'\r\n// };\r\n\r\nexport const MARKDOWN_ENTITIES: {[markdown: string]: MessageEntity['_']} = {\r\n '`': 'messageEntityCode',\r\n '``': 'messageEntityPre',\r\n '**': 'messageEntityBold',\r\n '__': 'messageEntityItalic',\r\n '~~': 'messageEntityStrike',\r\n '_-_': 'messageEntityUnderline',\r\n '||': 'messageEntitySpoiler'\r\n};\r\n\r\nexport const PASS_CONFLICTING_ENTITIES: Set<MessageEntity['_']> = new Set([\r\n 'messageEntityEmoji',\r\n 'messageEntityLinebreak',\r\n 'messageEntityCaret'\r\n]);\r\nfor(const i in MARKDOWN_ENTITIES) {\r\n PASS_CONFLICTING_ENTITIES.add(MARKDOWN_ENTITIES[i]);\r\n}\r\n\r\nexport const PHONE_NUMBER_REG_EXP = /^\\+\\d+$/;\r\n\r\n/* export function parseEmojis(text: string) {\r\n return text.replace(/:([a-z0-9\\-\\+\\*_]+?):/gi, function (all, shortcut) {\r\n var emojiCode = EmojiHelper.shortcuts[shortcut]\r\n if (emojiCode !== undefined) {\r\n return EmojiHelper.emojis[emojiCode][0]\r\n }\r\n return all\r\n })\r\n} */\r\n\r\n\r\n/* export function replaceUrlEncodings(urlWithEncoded: string) {\r\n return urlWithEncoded.replace(/(%[A-Z\\d]{2})+/g, (str) => {\r\n try {\r\n return decodeURIComponent(str);\r\n } catch (e) {\r\n return str;\r\n }\r\n });\r\n} */\r\n","// https://github.com/twitter/twemoji-parser/blob/master/src/lib/regex.js\r\n\r\nexport function encodeEmoji(emojiText: string) {\r\n const codepoints = toCodePoints(removeVS16s(emojiText)).join('-');\r\n return codepoints;\r\n}\r\n\r\nconst vs16RegExp = /\\uFE0F/g;\r\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\r\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\r\n\r\nconst removeVS16s = (rawEmoji: string) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji);\r\n\r\nexport function toCodePoints(unicodeSurrogates: string): Array<string> {\r\n const points = [];\r\n let char = 0;\r\n let previous = 0;\r\n let i = 0;\r\n while(i < unicodeSurrogates.length) {\r\n char = unicodeSurrogates.charCodeAt(i++);\r\n if(previous) {\r\n points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16));\r\n previous = 0;\r\n } else if(char > 0xd800 && char <= 0xdbff) {\r\n previous = char;\r\n } else {\r\n points.push(char.toString(16));\r\n }\r\n }\r\n\r\n if(points.length && points[0].length === 2) {\r\n points[0] = '00' + points[0];\r\n }\r\n\r\n return points;\r\n}\r\n\r\nexport function getEmojiToneIndex(input: string) {\r\n const match = input.match(/[\\uDFFB-\\uDFFF]/);\r\n return match ? 5 - (57343 - match[0].charCodeAt(0)) : 0;\r\n}\r\n\r\nexport function getCountryEmoji(iso2: string) {\r\n return String.fromCharCode(55356, 56741 + iso2.charCodeAt(0), 55356, 56741 + iso2.charCodeAt(1));\r\n}\r\n\r\nexport function emojiFromCodePoints(codePoints: string) {\r\n return codePoints.split('-').reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\r\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [699,211,51,437,570], () => (__webpack_require__(4098)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames not based on template\n\tif (chunkId === 437) return \"437.2f6e4ba7b76c49b10044.bundle.js\";\n\tif (chunkId === 570) return \"570.254518769bc35dd5eb83.bundle.js\";\n\t// return url for filenames based on template\n\treturn \"\" + ({\"211\":\"npm.big-integer\",\"699\":\"npm.pako\"}[chunkId] || chunkId) + \".\" + {\"8\":\"ecbe3e5cdfb6e654ee52\",\"51\":\"8b4ab19d8c6587b76634\",\"104\":\"ba6f2eaff4f47e31c2f7\",\"211\":\"a7ea0f3283af2967a6ae\",\"301\":\"64e4d58535811468fea7\",\"642\":\"cc8956bde224050c852a\",\"699\":\"f16d6f756c34f3914132\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t678: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","oldGetScript","oldLoadScript","queryMap","countMap","next","EmojiVersions","Emoji","version","Object","assign","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","badCharsRe","trimRe","C2L","cleanSearchText","text","latinize","processSearchText","clearBadChars","ignoreCase","options","hasTag","includeTag","charAt","originalText","replace","clearBadCharsAndTrim","ch","latinizeCh","latinizeString","fixCyrillic","FILENAME_JOINER","getFileNameByLocation","location","ext","length","str","_","id","thumb_size","filter","Boolean","join","photo_id","pFlags","big","stickerset","short_name","emoticon","thumb_version","volume_id","local_id","url","console","error","downloadId","getFileURL","type","encodeURIComponent","JSON","stringify","IDB","constructor","db","this","name","storageIsAvailable","log","openDatabase","INSTANCES","push","isAvailable","createNew","openDbPromise","createIndexes","os","store","indexNames","Array","from","indexName","deleteIndex","indexes","index","contains","createIndex","keyPath","objectParameters","request","indexedDB","open","Promise","reject","message","finished","setTimeout","onerror","resolve","onsuccess","event","result","calledNew","onclose","e","onabort","transaction","target","close","onversionchange","onupgradeneeded","warn","oldVersion","newVersion","stores","forEach","objectStoreNames","objectStore","createObjectStore","static","find","instance","preserve","storage","IDBStorage","storeName","idb","create","delete","entryName","isArray","concat","getObjectStore","map","clear","save","value","idx","put","get","mode","callback","perf","performance","now","then","onError","clearTimeout","timeout","onComplete","results","requests","r","waitForTransactionComplete","oncomplete","callbackResult","left","onRequestFinished","i","getAll","environment","getEnvironment","setEnvironment","env","RootScope","super","myId","connectionStatus","premium","addEventListener","toPeerId","isPremium","status","dispatchEvent","args","invokeVoid","settings","getConnectionStatus","getPremium","dispatchEventSingle","state","stateStorage","getState","setByKey","key","object","splitted","split","getDeepProperty","slice","pop","setDeepProperty","first","pushToState","direct","onlyLocal","setKeyValueToStorage","set","HTTP","dcId","logSuffix","pending","debug","logTypes","Log","logger","connected","_send","body","fetch","method","response","arrayBuffer","buffer","TextDecoder","decode","Uint8Array","setConnected","err","destroyed","destroy","send","networker","promise","releasePending","releasing","splice","pause","Socket","handleOpen","handleError","handleClose","removeListeners","handleMessage","data","byteLength","ws","connect","removeEventListener","undefined","WebSocket","binaryType","randomize","arr","crypto","Error","getRandomValues","Obfuscation","_process","operation","cryptoMessagePort","transfer","init","codec","idPromise","release","initPayload","val","val2","reversedPayload","reverse","encKey","encIv","decKey","decIv","process","obfuscateTag","encrypted","encode","payload","tag","encodePacket","len","header","readPacket","bytesToHex","bytes","toString","TcpObfuscated","Connection","retryTimeout","abridged","obfuscation","autoReconnect","onOpen","connection","setConnectionStatus","cleanupSent","resend","onMessage","parseResponse","processMessage","messageId","sessionId","catch","shift","onClose","needTimeout","retryAt","time","Date","diff","lastCloseTime","isNaN","reconnectTimeout","ctx","reconnect","bodySent","forceReconnect","setAutoReconnect","once","enable","changeUrl","encodeBody","toEncode","encoded","releasingPending","sent","TEST_SUFFIX","getTelegramConnectionSuffix","connectionType","constructTelegramWebSocketUrl","suffix","path","DcConfigurator","sslSubdomains","dcOptions","host","port","chosenServers","transportSocket","chosenServer","oooohLetMeLive","transportHTTP","dcOption","chooseServer","transportType","reuse","hasOwnProperty","client","download","upload","servers","transports","transport","obj","indexOfAndSplice","MTTransportController","opened","Map","waitForWebSocket","pingTransports","dcConfigurator","https","websocket","httpPromise","websocketPromise","socket","isFulfilled","isRejected","isHttpAvailable","isWebSocketAvailable","all","pinging","setTransportValue","setTransportOpened","setTransportClosed","AppManager","setManagers","managers","loadStorages","storages","recordPromise","storagesKeys","keys","storagesPromises","storagesResults","resetStorages","size","loadStoragesInner","AppStoragesManager","names","createStorages","loadStorage","PasswordManager","apiManager","invokeApi","updateSettings","currentHashPromise","newHashPromise","params","password","new_settings","hint","email","currentPassword","cryptoWorker","invokeCrypto","newAlgo","new_algo","salt1","newPassword","hashes","new_password_hash","getInputCheckPassword","check","inputCheckPassword","auth","setUser","user","confirmPasswordEmail","code","resendPasswordEmail","cancelPasswordEmail","ReferenceDatabase","contexts","links","saveContext","reference","context","getContexts","Set","_context","deepEqual","add","getReferenceByLink","getContext","values","deleteContext","refreshReference","c","appMessagesManager","reloadMessages","peerId","refreshEmojiesSoundsPromise","appStickersManager","getAnimatedEmojiSounds","appProfileManager","getProfile","userId","appEmojiManager","getCustomEmojiDocuments","docId","hex","newHex","newContext","makeError","safeReplaceObject","wasObject","newObject","getPeerIdsFromMessage","peerIds","fromId","viaBotId","fwdFromId","media","contactUserId","user_id","recentVoters","recent_voters","recentReactions","recent_reactions","reaction","getPeerId","peer_id","action","userIds","users","inviter_id","chatIds","channel_id","chat_id","chatId","recentRepliers","recent_repliers","reply","defineNotNumerableProperties","props","writable","configurable","out","defineProperties","setDialogIndex","dialog","indexKey","GLOBAL_FOLDER_ID","DialogsStorage","folders","allDialogsLoaded","pinnedOrders","folderId","setDialogsLoaded","resetPinnedOrder","savePinnedOrders","dialogsOffsetDate","dialogsNum","dialogsIndex","cachedResults","query","count","dialogs","onUpdateFolderPeers","update","folder_peers","folderPeer","folder_id","peer","appPeersManager","dropDialog","pinned","handleDialogUnpinning","generateIndexForDialog","pushDialog","scheduleHandleNewDialogs","onUpdateDialogPinned","getDialogOnly","onUpdatePinnedDialogs","handleOrder","order","newPinned","getFolderDialogs","dialogsResult","applyDialogs","d","after","rootScope","appUsersManager","getSelf","peerText","getPeerSearchText","indexObject","onFilterUpdate","getCachedDialogs","processDialogForFilter","filterId","processDialogForFilters","getDialogIndexKeyByFilterId","prepareDialogUnreadCountModifying","chat","appChatsManager","getChat","dropDialogOnDeletion","apiUpdatesManager","addMultipleEventsListeners","updateFolderPeers","updateDialogPinned","updatePinnedDialogs","appStateManager","appStoragesManager","getCache","_order","setDialogsFromState","bind","appDraftsManager","addMissedDialogs","top_message","getServerMessageId","topMessage","saveMessages","saveDialog","getMessageByPeer","reloadConversation","isDialogsLoaded","loaded","every","getPinnedOrders","getOffsetDate","offsetDate","Math","min","sort","a","b","generateFolder","folder","unreadMessagesCount","unreadPeerIds","unreadUnmutedPeerIds","getFolder","skipMigrated","migratedTo","getNextDialog","currentPeerId","findIndex","getDialogIndexKey","filtersStorage","getFilter","localId","isPeerUnmuted","appNotificationsManager","isPeerLocalMuted","getFolderUnreadCount","unreadUnmutedCount","unreadCount","arrays","setDialogIndexInFilter","isRealFolder","testDialogForFilter","pinnedIndex","pinnedPeerIds","generateDialogIndex","generateDialogPinnedDateByIndex","getDialogIndex","getDialog","skipped","isObject","date","isPinned","tsNow","timeManager","getServerTimeOffset","filters","getFilters","wasIndex","wasDialog","wasDialogIndex","newDialogIndex","prepareFolderUnreadCountModifyingByDialog","insertInDescendSortedArray","callbacks","toggle","wasUnreadCount","getDialogUnreadCount","wasUnmuted","newUnreadCount","newUnmuted","addMessagesCount","modifyFolderUnreadCount","toggleDialog","toggleUnmuted","max","dispatchUnreadTimeout","_folder","justReturn","noPinnedOrderUpdate","topDate","generateDialogPinnedDate","channelId","isChannel","toChatId","channel","draft","unshift","setDialogToState","pts","historyStorage","getHistoryStorage","messagesStorage","getHistoryMessagesStorage","history","incomingMessage","mid","getMessageFromStorage","is_outgoing","peersStorage","requestPeersForKey","isAnyChat","newPts","getChannelState","requestPeer","ignoreOffsetDate","saveGlobalOffset","getDialogOffsetDate","savedGlobalOffsetDate","savedOffsetDate","dropDialogFromFolders","foundDialog","wasPinned","keepLocal","clearDialogFromState","releasePeer","dropDialogWithEvent","dropped","forEachReverse","saveApiUsers","saveApiChats","chats","messages","updatedDialogs","topMid","topPendingMid","pendingTopMsgs","topPendingMessage","maxId","updates","newUpdatesAfterReloadToHandle","saveUpdate","canSaveDialogByPeerId","wasDialogBefore","generateMessageId","wasTopMessage","generateTempMessageId","from_id","getOutputPeer","deleted","isOutgoing","migrated_to","deactivated","migratedToPeer","migratedFromTo","migratedToFrom","read_inbox_max_id","read_outbox_max_id","saveDraft","isOut","unread","unread_count","isEnd","insertSlice","setEnd","mergeReplyKeyboard","readMaxId","readOutboxMaxId","savePeerSettings","notify_settings","addChannelState","releaseUnreadCount","dialogsStorage","getDialogs","offsetIndex","limit","promises","fillContactsResult","fillContacts","cached","reloadMissingDialogsPromise","reloadMissingPeerIds","realFolderId","curDialogStorage","has","d1","d2","offset","loadedAll","isEnoughDialogs","isTopEnd","getTopMessages","convertment","PREPENDED_FILTERS","LOCAL_FILTER","flags","title","exclude_peers","include_peers","pinned_peers","excludePeerIds","includePeerIds","FiltersStorage","filtersArr","reloadedPeerIds","localFilters","generateLocalFilter","clearFilters","onUpdateDialogFilter","saveDialogFilter","findAndSplice","onUpdateDialogFilters","oldFilters","copy","getDialogFilters","_filterId","onUpdateDialogFilterOrder","includes","setLocalId","updateDialogFilter","updateDialogFilters","updateDialogFilterOrder","prependFilters","allChatsFilter","archiveFilter","allChatsFilterIndex","exclude_archived","exclude_unarchived","exclude_read","isDialogUnread","exclude_muted","unread_mentions_count","broadcasts","isBroadcast","groups","isAnyGroup","toUserId","isBot","bots","non_contacts","isContact","contacts","testDialogForFilterId","toggleDialogPin","getConfig","pinned_infolder_count_max","getInputPeerById","createDialogFilter","prepend","remove","getOutputDialogFilter","bool","f","filterIncludedPinnedPeers","peers","reloadDialogs","inputPeer","isAlreadyReloaded","reloadPromises","missingPeerIds","overwrite","invokeApiSingle","getSuggestedDialogsFilters","silent","assumeType","to","oldFilter","_filter","isFilterIdAvailable","getLimit","some","applyMixins","derivedCtor","constructors","baseCtor","getOwnPropertyNames","prototype","getOwnPropertyDescriptor","defineProperty","ApiUpdatesManager","updatesState","pendingPtsUpdates","pendingSeqUpdates","syncPending","syncLoading","channelStates","attached","processUpdateMessage","updateMessage","processOpts","seq","seqStart","seq_start","forceGetDifference","processUpdate","toId","fwd_from","reply_to","entities","pts_count","override","_constructor","setProxy","self","Proxy","saveUpdatesState","us","popPendingSeqUpdate","nextSeq","pendingUpdatesData","seqAwaiting","ptsAwaiting","popPendingPtsUpdate","curState","curPts","goodPts","goodIndex","getDifference","processLocalUpdate","wasSyncing","pts_total_limit","qts","differenceResult","other_updates","new_messages","apiMessage","nextState","intermediate_state","onDifferenceTooLong","justAName","getChannelDifference","channelState","bindPrefix","getChannelInput","final","lastPtsUpdateTime","fwdHeader","reason","hasUser","post","hasChat","isUser","popPts","popSeq","attach","langCode","noErrorBox","stateResult","setUpdatesProcessor","strs","en","ru","getChangelog","lang","res","ok","langStr","parseMarkdown","inbox_date","languages","filterUnique","language","AppAvatarsManager","savedAvatarURLs","removeFromAvatarsCache","isAvatarCached","saved","loadAvatar","photo","peerPhotoFileLocation","downloadOptions","dc_id","limitPart","apiFileManager","blob","URL","createObjectURL","AppCallsManager","calls","IS_CALL_SUPPORTED","updatePhoneCall","saveCall","phone_call","updatePhoneCallSignalingData","callId","phone_call_id","computeKey","g_b","p","call","isDiscarded","oldCall","getCall","getCallInput","access_hash","savePhonePhoneCall","phonePhoneCall","generateDh","random_length","dhConfig","requestCall","protocol","g_a_hash","video","getUserInput","random_id","discardCall","duration","connection_id","platforms","ignore","getRestrictionReason","reasons","isRestricted","AppChatsManager","isPeerNeeded","onChatUpdated","updateChannelParticipant","clearCache","updateChatDefaultBannedRights","default_banned_rights","getFromCache","apiChats","saveApiChat","oldChat","participants_count","changedPhoto","changedTitle","changedAnyBadge","verified","scam","fake","getChatTyped","hasRights","rights","isThread","editChatDefaultBannedRights","banned_rights","until_date","isMegagroup","megagroup","isInChat","good","getInputPeer","getChannelInputPeer","getChatInputPeer","allowMin","getChatPhoto","getChatString","createChannel","inviteToChannel","input","usersInputs","u","createChat","leaveChannel","joinChannel","addChatUser","fwdLimit","fwd_limit","deleteChatUser","leaveChat","leave","deleteChannel","deleteChat","migrateChat","updateUsername","username","editPhoto","inputFile","inputChatPhoto","file","editTitle","editAbout","about","editBanned","participant","getParticipantPeerId","timestamp","actor_id","prev_participant","new_participant","kicked_by","clearChannelParticipantBannedRights","kickFromChannel","view_messages","kickFromChat","resolveChannel","messagesChats","togglePreHistoryHidden","enabled","toggleSignatures","toggleNoForwards","setChatAvailableReactions","reactions","chatFull","getCachedFullChat","available_reactions","restrictionReasons","restriction_reason","restricted","getSendAs","invokeApiSingleProcess","processResult","sendAsPeers","importChatInvite","hash","checkUsername","getSponsoredMessage","invokeApiCacheable","cacheSeconds","sponsoredMessages","sponsoredMessage","viewSponsoredMessage","randomId","checkChatInvite","chatInvite","I18n","pluralRules","cacheLangPackPromise","setLangCode","lastRequestedLangCode","lastRequestedNormalizedLangCode","updateAmPm","timeFormat","dateTimeFormat","getDateTimeFormat","hour","minute","hour12","setHours","amText","format","amPmCache","am","pmText","pm","loadLocalLangPack","defaultCode","langSign","countries","strings","formatLocalStrings","default","saveLangPack","from_version","lang_code","local","loadLangPack","web","requestedServerLanguage","lang_pack","polyfillPromise","pushTo","v","langPack","appVersion","applyLangPack","currentLangCode","Intl","PluralRules","string","countriesList","country","langPackKey","default_name","lastAppliedLangCode","cachedDateTimeFormats","document","querySelectorAll","element","weakMap","superFormatter","indexHolder","lastIndex","p1","p2","p3","p4","createElement","append","lastIndexOf","matchUrlProtocol","wrappedUrl","wrapUrl","href","onclick","setAttribute","DocumentFragment","firstChild","textContent","arg","pushNextArgument","plain","select","item","Node","getCacheLangPack","finally","setTimeFormat","haveToUpdate","IntlDateElement","getStrings","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","l","_Intl","window","WeakMap","IntlElementBase","classList","property","IntlElement","safeAssign","formatted","dataset","compareAndUpdate","json","DateTimeFormat","hours","getHours","getMinutes","capitalizeFirstLetter","i18n","i18n_","_i18n","months","days","getWeekNumber","UTC","getFullYear","getMonth","getDate","dayNum","getUTCDay","setUTCDate","getUTCDate","yearStart","getUTCFullYear","ceil","getTime","today","year","day","month","weekday","minYear","yearPattern","RegExp","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","createForMonthYear","dates","selectedYear","currentYear","setFullYear","minDate","setMonth","maxDate","formatterMonthYear","createForDayMonth","validDateForMonth","formatterDayMonth","formatterYearMax","formatWeekLong","getDay","q","safeReplaceArrayInObject","trim","dayOfWeek","setDate","getDayOfWeek","distance","setTime","matches","exec","g1","g2","k","g3","parseInt","k1","EXTENSION_MIME_TYPE_MAP","pdf","tgv","tgs","wav","mp3","ogg","jpeg","jpg","png","gif","webp","mp4","webm","mov","svg","MIME_TYPE_EXTENSION_MAP","uploadWallPaperTempId","AppDocsManager","onServiceWorkerFail","docs","doc","supportsStreaming","thumbsStorage","deleteCacheContext","stickerCachedThumbs","uploadingWallPapers","online","saveDoc","oldDoc","file_reference","referenceDatabase","attributes","attribute","file_name","wrapPlainText","voice","mime_type","w","h","round_message","alt","stickerEmojiRaw","stickerSetInput","thumbs","IS_WEBP_SUPPORTED","sticker","IS_WEBM_SUPPORTED","animated","mappedMimeType","joiner","monthAsNumber","noSeconds","getSeconds","leadingZero","noTime","getFullDate","isServiceWorkerOnline","getCacheContext","setCacheContextURL","thumb","getDocumentDownloadOptions","getDocumentURL","getDoc","downloadDoc","queueId","onlyCache","downloadMedia","getLottieCachedThumb","toneIndex","saveLottiePreview","width","height","saveWebPConvertedStrippedThumb","stickerThumbConverted","getWallPapers","invokeApiHashable","accountWallpapers","wallPapers","wallpapers","wallPaper","prepareWallPaperUpload","cacheContext","wallpaper","slug","uploadWallPaper","fileName","downloaded","getGifs","gifs","requestDocPart","requestFilePart","getDocumentInputFileLocation","AppDraftsManager","drafts","updateDraftMessage","threadId","notify","getKey","getDraft","getAllDrafts","getAllDraftPromise","apiDraft","processApiDraft","force","isEmptyDraft","reply_to_msg_id","syncDraft","localDraft","saveOnServer","serverDraft","draftsAreEqual","draftObj","getInputEntities","no_webpage","saveLocalDraft","clearAllDrafts","combined","clearDraft","emptyDraft","setDraft","EMOJI_LANG_PACK","keywords","AppEmojiManager","keywordLangPacks","indexedLangPacks","getKeywordsPromises","recent","getRecentEmojisPromises","getCustomEmojiDocumentPromises","getEmojiKeywords","storageKey","pack","validateInitObject","keywordsDifference","packKeywords","keyword","emoticons","getBothEmojiKeywords","networkerFactory","native","getRecentEmojis","indexEmojis","searchEmojis","emojis","reduce","acc","POPULAR_EMOJI","recentEmoji","recentCustomEmoji","pushRecentEmoji","emoji","fixEmoji","docIds","document_id","documents","appDocsManager","getCachedCustomEmojiDocuments","setDebouncedGetCustomEmojiDocuments","getCustomEmojiDocumentsPromise","allIds","ids","getCustomEmojiDocument","getCustomEmojis","getEmojiStickers","AppGroupCallsManager","groupCalls","participants","nextOffsets","updateGroupCall","saveGroupCall","updateGroupCallParticipants","groupCallId","saveApiParticipants","groupCall","getCachedParticipants","prepareToSavingNextOffset","nextOffsetsMap","nextOffset","setNextOffset","newNextOffset","saveApiParticipant","skipCounterUpdating","oldParticipant","hasLeft","muted","can_self_unmute","getGroupCall","modified","just_joined","apiParticipants","editParticipant","getGroupCallInput","getInputPeerSelf","volume","raise_hand","raiseHand","video_paused","videoPaused","video_stopped","videoStopped","presentation_paused","presentationPaused","getGroupCallFull","participants_next_offset","shouldUpdate","createGroupCall","scheduleDate","schedule_date","getGroupCallParticipants","sources","groupCallParticipants","next_offset","hangUp","discard","groupCallInput","source","join_as","joinGroupCall","isMuted","joinVideo","leaveGroupCallPresentation","getPhotoInput","getPhotoMediaInput","ttl_seconds","getMediaInput","AppInlineBotsManager","inlineResults","setHash","getGeoInput","geo","lat","long","accuracy_radius","getInlineResults","botId","bot","geo_point","stopTime","botResults","queryId","query_id","appPhotosManager","savePhoto","generateQId","pushPopularBot","getTopPeers","topPeers","botPeerId","topPeer","rating","switchToPM","fromPeerId","startParam","startBot","checkSwitchReturn","getUser","bot_inline_placeholder","peerData","switchInlineQuery","callbackButtonClick","button","msg_id","sendInlineResult","queryAndResultIds","inlineResult","queryID","resultID","resultId","send_message","reply_markup","replyMarkup","sendText","inputMedia","messageMedia","caption","sendMessage","geoPoint","address","provider","venue_id","venue_type","phone_number","first_name","last_name","vcard","description","currency","total_amount","shipping_address_requested","start_param","sendOther","AppMessagesIdsManager","tempNum","num","MIDDLEWARE_ERROR","MiddlewareHelper","details","cleaned","inner","onCleanCallbacks","onDestroyCallbacks","onDestroy","clean","helper","parent","additionalCallback","middleware","onClean","splitStringByLength","maxLength","lastSliceStartIndex","arrayIndex","cut","end","part","_arrayIndex","partLength","appTabsManager","tabs","start","getTabs","tab","addTab","deleteTab","getDocumentInput","processAfter","cb","UPDATE_STICKERSET_ORDER","AppMessagesManager","pendingByRandomId","pendingByMessageId","pendingAfterMsgs","tempFinalizeCallbacks","sendSmthLazyLoadQueue","needSingleMessages","fetchSingleMessagesPromise","extendedMedia","maxSeenId","newDialogsToHandle","notificationsHandlePromise","notificationsToHandle","reloadConversationsPeers","groupedTempId","typings","unreadMentions","goToNextMentionPromises","batchUpdates","uploadFilePromises","messagesStorageByPeerId","groupedMessagesStorage","scheduledMessagesStorage","historiesStorage","threadsStorage","searchesStorage","pinnedMessages","threadsServiceMessagesIdsStorage","threadsToReplies","handleNewDialogs","newMaxSeenId","incrementMaxSeenId","handleNotifications","_peerId","notifyPeerToHandle","getNotifyPeerSettings","peerTypeNotifySettings","mentioned","notifyAboutMessage","fwdCount","onUpdateMessageId","pendingData","tempId","finalizePendingMessageCallbacks","onUpdateNewMessage","getMessagePeer","isLocalThreadUpdate","createMessageStorage","threadKey","getThreadKey","reply_to_peer_id","reply_to_mid","receiptMessage","ignoreExisting","checkPendingMessage","updateMessageRepliesIfNeeded","findSlice","firstSlice","forceUserOnline","top_msg_id","handleNewMessage","inboxUnread","modifyCachedMentions","setDialogTopMessage","notifyPeer","onUpdateMessageReactions","recentReaction","previousReactions","previousRecentReactions","show_previews","peerReaction","pushBatchUpdate","batchUpdateReactions","setDialogToStateIfMessageIsTop","onUpdateDialogUnreadMark","unread_mark","onUpdateEditMessage","oldMessage","newMessage","handleEditedMessage","isTopMessage","clear_history","dispatchEditEvent","newReactions","grouped_id","onUpdateReadHistory","max_id","read_max_id","getObjectKeysAndSort","stillUnreadCount","still_unread_count","newUnreadMentionsCount","foundAffected","repliesKey","replyTo","reply_to_top_id","setCount","getReadMaxIdIfUnread","threadKeyPart","onUpdateReadMessagesContents","mids","findPeerIdByMids","media_unread","fixDialogUnreadMentionsIfNoMessage","onUpdateChannelAvailableMessages","availableMinId","available_min_id","onUpdateDeleteMessages","threadKeys","historyUpdated","handleDeletedMessages","threadsStorages","msgs","affected","onUpdateChannel","needDialog","onUpdateChannelReload","flushStoragesByPeerId","onUpdateChannelMessageViews","views","batchUpdateViews","onUpdateServiceNotification","popup","phone","onUpdatePinnedMessages","missingMessages","werePinned","hiddenPinnedMessages","onUpdateNotifySettings","onUpdateNewScheduledMessage","isScheduled","onUpdateDeleteScheduledMessages","onUpdateMessageExtendedMedia","extended_media","batch","toDispatch","getMessagesFromMap","previousResults","changedResults","reactionCount","previousReactionCount","_reactionCount","reactionsEqual","chosen_order","updateMessageID","updateNewDiscussionMessage","updateNewMessage","updateNewChannelMessage","updateDialogUnreadMark","updateEditMessage","updateEditChannelMessage","updateMessageReactions","updateReadChannelDiscussionInbox","updateReadChannelDiscussionOutbox","updateReadHistoryInbox","updateReadHistoryOutbox","updateReadChannelInbox","updateReadChannelOutbox","updateChannelReadMessagesContents","updateReadMessagesContents","updateChannelAvailableMessages","updateDeleteMessages","updateDeleteChannelMessages","updateChannel","updateChannelReload","updateChannelMessageViews","updateServiceNotification","updatePinnedMessages","updatePinnedChannelMessages","updateNotifySettings","updateNewScheduledMessage","updateDeleteScheduledMessages","updateMessageExtendedMedia","filterFunc","getScheduledMessagesStorage","webpage","appWebPagesManager","getCachedWebPage","drop","poll","appPollsManager","pollToMessages","batchUpdatesDebounced","debounce","maxSeenMsgId","sendEntites","entity","invokeAfterMessageIsSent","callbackName","finalize","editMessage","is_scheduled","newMedia","noWebPage","handled","replyToMsgId","MAX_LENGTH","message_length_max","webPage","getPeerMigratedTo","generateOutgoingMessage","toggleError","onMessagesSendError","sentRequestOptions","afterMessageId","sendAs","sendAsPeerId","apiPromise","invokeApiAfter","clear_draft","send_as","update_stickersets_order","wrapMessageEntities","beforeMessageSending","sequential","noop","sendFile","attachType","apiFileName","fileType","File","isDocument","Blob","isPhoto","IMAGE_MIME_TYPES_SUPPORTED","actionName","isVoiceMessage","waveform","isMedia","photoSize","sizes","objectURL","VIDEO_MIME_TYPES_SUPPORTED","videoAttribute","isRoundMessage","supports_streaming","noSound","thumbCacheContext","sentDeferred","uploadingFileName","getFileNameForUpload","uploaded","uploadPromise","load","thumbUploadPromise","cancelPendingMessage","setTyping","addNotifyListener","progress","percents","floor","done","total","notifyAll","force_file","isGroupedItem","background","ret","sendAlbum","files","sendFileDetails","groupId","o","invoke","multiMedia","multi_media","inputSingleMedia","inputs","sendContact","contactPeerId","getContactMediaInput","pollId","savePoll","total_voters","getPoll","getPhoto","postAuthor","getPeer","signatures","generateFromId","post_author","generateFlags","generateReplyHeader","via_bot_id","replies","generateReplies","replyToTopId","channelFull","linked_chat_id","comments","replies_pts","isAnonymousSending","generateForwardHeader","originalMessage","isUserHidden","from_name","userFull","getCachedFullUser","private_forward_name","channel_post","saved_from_msg_id","saved_from_peer","generateFakeAvatarMessage","Number","MAX_SAFE_INTEGER","getUploadPromise","uploadFileName","admin_rights","anonymous","fillConversations","getConversations","chatHistoryStorage","offset_date","offset_id","offset_peer","offsetPeerId","maxSeenIdIncremented","hasPrepend","noIdsDialogs","setFolderId","folderDialogs","dialogsLength","slicedDialogs","forwardMessages","config","overflowMids","forwarded_count_max","dropCaptions","dropAuthor","newMids","newMessages","replyToMid","replyToMessageIdx","newReplyToMid","getStickerEffectThumb","nopremium","group","from_peer","to_peer","with_my_score","withMyScore","drop_author","drop_media_captions","generateEmptyMessage","getMessagesStorageByKey","s","getMessagesStorage","getMessageById","getDialogByPeerId","cantForwardDeleteMids","cantForward","cantDelete","canForward","canDeleteMessage","inputDialogPeer","getInputDialogPeerById","reloadConversationsPromise","inputDialogPeers","fullfillLeft","doFlushHistory","just_clear","revoke","affectedHistory","flushHistory","justClear","getHistory","historyResult","ss","hidePinnedMessages","getPinnedMessage","getSearch","inputFilter","getPinnedMessagesCount","getPinnedMessagesMaxId","updatePinnedMessage","unpin","pm_oneside","unpinAllMessages","unpinAll","getAlbumText","getGroupsFirstMessage","minMid","getMidsByAlbum","groupedId","getMessagesByAlbum","getMidsByMessage","filterMessages","verify","appMessagesIdsManager","saveMessage","isMessage","overwriting","msgId","savedFromPeerId","savedFromMid","savedFrom","mediaContext","unsupported","originalDoc","messageKey","getMessageKeyForPendingWebPage","saveWebPage","appWebDocsManager","saveWebDocument","extendedMediaMedia","totalEntities","migrateFrom","migrateTo","video_sizes","appGroupCallsManager","migrateChecks","getFirstMessageToEdit","goodMessage","myPeerId","canEditMessage","apiEntities","myEntities","parseEntities","mergeEntities","reportMessages","editPeerFolders","getDialogPeer","markDialogUnread","read","fromChat","canMessageBeEdited","kind","goodMedias","edit_time_limit","getReplyKeyboard","messageReplyMarkup","lastReplyMarkup","selective","maxOutId","single_use","hidden","getSearchStorage","getSearchCounters","canCache","func","filterMessagesByInputFilterFromStorage","_storage","filterMessagesByInputFilter","nextRate","backLimit","offset_id_offset","next_rate","foundMsgs","min_date","max_date","add_offset","min_id","offsetId","offsetMessage","offset_rate","searchResult","foundCount","subscribeRepliesThread","getDiscussionMessage","generateThreadServiceStartMessage","maxMessageId","serviceStartMessage","is_single","getThreadServiceMessageId","getMessageWithReplies","newDialogsHandlePromise","deleteMessages","localMessageIds","creator","delete_messages","affectedMessages","readHistory","triedToReadMaxId","readPromise","getPeerString","readAllHistory","slicedArray","fixUnreadMentionsCountIfNeeded","goToNextMention","loadNextPromise","loadNextMentions","last","getUnreadMentions","mergeHistoryResult","minId","messagesMessages","readMessages","msgIds","getHistoryStorageTransferable","historySerialized","toJSON","getNotifyPeerTypeSettings","getNotifySettings","getInputNotifyPeerById","isMessageIsTopMessage","threadMessage","broadcastEventName","pendingMessage","finalizePendingMessage","mutePeer","muteUntil","mute_until","togglePeerMute","mute","canSendToPeer","canSendToUser","finalMessage","tempMessage","newPhoto","newDoc","newPhotoSize","oldCacheContext","getPhotoDownloadOptions","thumbSize","polls","handleReleasingMessage","getMessageReactionsListAndReadParticipants","skipReadParticipants","skipReactionsList","emptyMessageReactionsList","canViewMessageReadParticipants","getMessageReadParticipants","appReactionsManager","getMessageReactionsList","messageReactionsList","readParticipantsPeerIds","filteredReadParticipants","readPeerId","reactionsCount","readParticipants","appConfig","getAppConfig","chat_read_mark_size_threshold","chat_read_mark_expire_period","incrementMessageViews","increment","chatPeerIds","idleStartTime","getScheduledMessageByPeer","getScheduledMessages","sendScheduledMessages","deleteScheduledMessages","getMessageWithCommentReplies","isFetchIntervalNeeded","getNewHistory","unsetEnd","isBottomEnd","getEnds","offsetIdOffset","haveSlice","sliceMe","fulfilled","fillHistoryStorage","constructSlice","isHistoryResultEnd","topWasMeantToLoad","wasMaxId","requestHistory","newMaxId","deleteSlice","oldestMessage","foundSlice","_historyResult","fetchSingleMessages","requestPromises","getMessagesResult","getExtendedMedia","toRequest","fetchMessageReplyTo","replyToPeerId","typing","smth","deleteWebPageFromPending","updatePollToMessage","groupedStorage","albums","dispatchAlbumEdit","deletedMids","noforwards","noForwards","getElementCallback","newMap","peerIdStr","saveDefaultSendAs","default_send_as","convertInputKeyToKey","inputKey","AppNotificationsManager","peerSettings","notifyUsers","notifyChats","notifyBroadcasts","checkMuteUntil","checkMuteUntilTimeout","closestMuteUntil","peerNotifySettings","checkMuteUntilThrottled","throttle","notifySettings","getNotifyPeerTypePromise","getContactSignUpNotification","notifyContactsSignUp","setContactSignUpNotification","getPeerMuted","getPeerLocalSettings","respectType","n","typeNotifySettings","AppPeersManager","canPinMessage","getPeerPhoto","getUserPhoto","getUserString","getPeerUsername","getRestrictionReasonText","ignorePeerId","getUserInputPeer","getUserSearchText","getDialogType","getDeleteButtonText","AppPhotosManager","photos","oldPhoto","Infinity","getUserPhotos","inputUser","photosResult","photoIds","photoId","AppPollsManager","updateMessagePoll","poll_id","saveResults","chosenIndexes","answer","chosen","getInputMediaPoll","correctAnswers","solution","solutionEntities","correct_answers","solution_entities","sendVote","optionIds","answers","option","getResults","getVotes","votesList","stopPoll","closed","newPoll","AppPrivacyManager","privacy","updatePrivacy","rules","setPrivacy","privacyRules","inputRule","rule","getPrivacy","privacyKey","getGlobalPrivacySettings","setGlobalPrivacySettings","PEER_FULL_TTL","AppProfileManager","usersFull","chatsFull","fullExpiration","onUpdateUserTyping","typingsInPeer","t","cancelAction","getChatFull","onUpdatePeerBlocked","blocked","updateChatParticipants","updateChatParticipantAdd","_participants","updateChatParticipantDelete","updateUserTyping","updateChatUserTyping","updateChannelUserTyping","updatePeerBlocked","fullChat","updated","call_active","hasChatPhoto","chat_photo","refreshFullPeer","invalidateChannelParticipants","usersUserFull","full_user","profile_photo","botInfo","bot_info","referenceContext","description_document","description_photo","getProfileByPeerId","getCachedProfileByPeerId","getFullPhoto","profile","getChannelFull","full_chat","getChatInviteLink","exported_invite","link","exportedInvite","getChannelParticipants","broadcast","getChannelParticipant","channelParticipant","fullChannel","processError","getMentions","processUserIds","ratingMap","cP","updateProfile","saveApiUser","uploadProfilePhoto","updateResult","strippedThumb","stripped_thumb","previous","deletePhotos","deletedList","verifyParticipantForOnlineCount","reduceParticipantsForOnlineCount","getOnlines","chatInfo","channelParticipants","onlines","getPeerTypings","callbackifyAll","SAVE_DOC_KEYS","REFERENCE_CONTEXT","AppReactionsManager","availableReactions","getAvailableReactions","sendReactionPromises","lastSendingTimes","availableReaction","around_animation","static_icon","appear_animation","center_icon","messagesAvailableReactions","getActiveAvailableReactions","callbackify","inactive","getAvailableReactionsForPeer","activeAvailableReactions","unshiftQuickReaction","getQuickReaction","quickReaction","chatAvailableReactions","filteredChatAvailableReactions","unshiftQuickReactionInner","getAvailableReactionsByMessage","isReactionActive","reactions_default","getReactionCached","getReaction","getMessagesReactions","setDefaultReaction","sendReaction","lastSendingTimeKey","unsetReactionCount","canSeeList","can_see_list","chosenReactions","unsetReactions","chosenReactionIdx","chosenReactionCount","chosenReactionsLength","reactionCountIdx","id1","id2","promiseKey","editMessageUpdateIdx","editMessageUpdate","EMOJI_SET_LOCAL_ID","EMOJI_ANIMATIONS_SET_LOCAL_ID","LOCAL_IDS_SET","AppStickersManager","processAllStickersResult","allStickers","sets","stickerSet","videos","getStickerSetPromises","getStickersByEmoticonsPromises","sounds","getAnimatedEmojiStickerSet","getGreetingStickersPromise","getGreetingStickersTimeout","getGreetingSticker","onStickersUpdated","updateNewStickerSet","saveStickerSet","updateRecentStickers","updateFavedStickers","updateMoveStickerSetToTop","stickers","getFavedStickersStickers","getRecentStickersStickers","justPreload","getStickersByEmoticon","greetingStickers","random","saveStickers","canUseStickerSetCache","useCache","refreshTime","getStickerSet","cachedSet","getStickerSetInput","saveById","animations","getAnimatedEmojiSoundsPromise","emojies_sounds","sound","bytesStr","atob","file_reference_base64","charCodeAt","this_dc","getRecentStickers","recentStickers","saveRecentSticker","unsave","_doc","docEmoticon","faved","cleanEmoji","getAnimatedEmojiSticker","isAnimation","packs","getAnimatedEmojiSoundDocument","preloadAnimatedEmojiSticker","preloadEmojiPromise","preloadAnimatedEmojiStickerAnimation","animation","preloadSticker","isPremiumEffect","video_thumbs","newSet","setToCache","needSave","installed_date","getStickerSetThumbDownloadOptions","thumb_dc_id","isAnimated","mimeType","getFeaturedStickers","covered","getPromoPremiumStickers","getPremiumStickers","getFavedStickers","favedStickers","getFavedStickersLimit","faveSticker","unfave","toggleStickerSet","archived","toggleStickerSets","searchStickerSets","excludeFeatured","exclude_featured","foundSaved","cache","cover","getAllStickers","preloadStickerSets","includeOurStickers","messagesStickers","installedSets","foundStickers","cachedStickersAnimated","cachedStickersStatic","iteratePacks","clearRecentStickers","cleanUsername","AppUsersManager","usernames","getTopPeersPromises","contactsIndex","createSearchIndex","contactsFillPromise","contactsList","updatedContactsList","updateUsersStatuses","timestampNow","updateUserStatus","setInterval","expires","was_online","setUserToStateIfNeeded","updateUserPhoto","updateUserName","setUserNameToCache","checkPremium","contactsListCachedTime","contact","mutual_contact","pushContact","recentSearch","onContactsModified","fromServer","pushRecentSearch","clearRecentSearch","resolveUsername","resolvedPeer","processResolvedPeer","resolvePhone","popContact","getContacts","includeSaved","sortBy","_contactsList","userId1","userId2","sortName1","sortName","sortName2","localeCompare","status1","getUserStatusForSort","myUserId","testSelfSearch","getContactsPeerIds","toggleBlock","block","apiUsers","oldUser","oldSearchUsername","searchUsername","fullName","wasContact","newContact","onContactUpdated","isUserOnlineVisible","isRegularUser","support","isNonContactUser","eventTimestamp","importContact","importContacts","phones","inputContacts","j","client_id","importedContactsResult","imported","importedContact","topPeersCache","cachedTime","categories","getBlocked","contactsBlocked","getLocated","self_expires","searchContacts","pathname","my_results","curIsContact","setUserStatus","offline","updateMyOnlineStatus","addContact","showPhone","add_phone_privacy_exception","deleteContacts","photoTypeSet","AppWebPagesManager","webpages","pendingWebPages","updateWebPage","apiWebPage","oldWebPage","isUpdated","siteName","site_name","shortTitle","author","pendingSet","getWebPage","readBlobAsArrayBuffer","readBlobAs","fileNameRFC","escape","DownloadWriter","serviceMessagePort","getServiceMessagePort","write","chunk","saveToStorage","DownloadStorage","getFile","prepareWriting","headers","cancel","getWriter","MIN_PART_SIZE","IGNORE_ERRORS","ApiFileManager","cacheStorage","downloadStorage","downloadPromises","uploadPromises","downloadPulls","downloadActives","refreshReferencePromises","maxUploadParts","maxDownloadParts","uncompressTGS","uncompressTGV","svgIndex","__","fixFirefoxSvg","TextEncoder","convertWebp","convertOpus","webFileDcId","webfile_dc_id","upload_max_fileparts_premium","upload_max_fileparts_default","downloadRequest","activeDelta","downloadPull","downloadCheck","downloadLimit","setQueueId","getFileStorage","cancelDownload","canceled","requestWebFilePart","checkCancel","fileDownload","getDelta","checkedReference","getLimitPart","isUpload","maxParts","maxPartSize","inputFileLocation","isDownloading","getDownload","getUpload","getConvertMethod","IS_OPUS_SUPPORTED","allocateDeferredPromises","startOffset","delayed","writeDeferred","writePromise","originalMimeType","convertMethod","getDownloadFileNameFromOptions","cacheFileName","errorHandler","prepared","cachePrepared","downloadPrepared","possibleSize","_errorHandler","writer","truncate","downloadFileName","readBlobAsUint8Array","isWebFile","requestPart","dispatchProgress","throttledDispatchProgress","superpuper","isFinal","getParts","replaceParts","processedResult","getDownloadMediaDetails","downloadMediaURL","downloadMediaVoid","fileSize","isBigFile","partSize","totalParts","fileId","resultInputFile","parts","md5_checksum","resolved","it","_part","doneParts","file_id","file_part","file_total_parts","fileUpload","generator","ApiManagerMethods","apiPromisesSingleProcess","apiPromisesSingle","apiPromisesCacheable","afterMessageIdTemp","setUserAuth","prepareTempMessageId","queryJSON","cacheKey","oldPromise","getNewPromise","newPromise","ignore_restriction_reasons","pin","folderPin","bio","ApiManager","cachedNetworkers","cachedExportPromise","gettingNetworkers","baseDcId","afterMessageTempIds","changeTransportType","updateConfig","iterateNetworkers","getTransportType","connections","dcs","array","oldTransportType","oldObject","oldGetKey","newGetKey","info","changeNetworkerTransport","getBaseDcId","sessionStorage","setBaseDcId","userAuth","dcID","user_auth","wasDcId","getNetworker","setOnDrainIfNeeded","dc","logOut","loggingOut","storageKeys","storageResult","logoutPromises","ignoreErrors","toggleStorages","generateNetworkerGetKey","networkers","maxNetworkers","found","isOnline","ak","authKeyHex","serverSaltHex","authKey","bytesFromHex","authKeyId","serverSalt","authorizer","_error","newTransportType","removeTransport","stack","getNetworkerVoid","oldTransport","changeTransport","onNetworkerDrain","onDrain","removeNetworker","isFileNetworker","canRelease","setDrainTimeout","updatesProcessor","cachedNetworker","startTime","interval","isStopped","clearInterval","performRequest","wrapApiCall","exportResolve","exportReject","exportedAuth","newDcId","unsetConnectionInited","rawError","waitTime","floodMaxTimeout","attachPromise","originalError","PeersStorage","neededPeers","singlePeerMap","thumbFullSize","ThumbsStorage","thumbsCache","intToUint","ulongFromInts","high","low","shiftLeft","safeBigInt","ulongBigInt","pow","longBigInt","divide","bigIntFromBytes","base","boolFalse","predicate","boolTrue","vector","gzipPacked","TLSerialization","mtproto","startMaxLength","createBuffer","ArrayBuffer","intView","Int32Array","byteView","getArray","resultBuffer","resultInt32","subarray","getBuffer","getBytes","typed","resultArray","getOffset","checkLength","needBytes","previousBuffer","previousArray","writeInt","field","storeInt","storeBool","storeLongP","iHigh","iLow","storeLong","sLong","storeIntBytes","_bigInt","bigInt","isNegative","quotient","remainder","divmod","toJSNumber","storeDouble","Float64Array","storeString","sUTF8","unescape","storeBytes","bits","storeRawBytes","storeMethod","methodName","methodData","methods","m","flagsOffsets","param","condType","fieldBit","storeObject","paramName","substr","itemType","schema","isBare","constructorData","TLDeserialization","readInt","fetchInt","fetchDouble","doubleView","fetchLong","ulong","greater","minus","greaterOrEquals","abs","fetchBool","fetchObject","fetchString","String","fromCharCode","decodeURIComponent","fetchBytes","fetchIntBytes","fetchRawBytes","fetchVector","fallback","checkType","constructorCmp","uncompressed","constructorsIndex","schemaFallback","int1","int2","overrideKey","isCond","formatJSONValue","jsonValue","objectValues","objectValue","setOffset","addPadding","blockSize","zeroes","blockSizeAsTotalLength","needPadding","padding","bufferConcats","delays","disconnectDelayMin","disconnectDelayMax","pingInterval","pingMaxTime","connectionTimeout","RESEND_OPTIONS","noSchedule","notContentRelated","invokeAfterMsgConstructor","networkerTempId","MTPNetworker","lastServerMessages","sentMessages","pendingMessages","pendingAcks","pendingResendReq","nextReq","checkConnectionPeriod","lastResponseTime","activeRequests","sendPingDelayDisconnect","pingDelayDisconnectDeferred","lastPingTime","disconnectDelay","round","timeoutTime","lastPingStartTime","pingId","lastPingDelayDisconnectId","wrapMtpCall","ping_id","disconnect_delay","rejectTimeout","elapsedTime","checkLongPoll","isClean","longPollPending","sleepAfter","sendLongPoll","checkConnection","clearCheckConnectionTimeout","serializer","pingMessage","generateId","seq_no","generateSeqNo","sendEncryptedRequest","toggleOffline","checkConnectionTimeout","authKeyUint8","convertToUint8Array","isFileUpload","isFileDownload","updateSession","seqNo","prevSessionId","updateSentMessage","sentMessageId","sentMessage","container","innerSentMessageId","innerSentMessage","pushMessage","wrapMtpMessage","connectionInited","invokeWithLayer","initConnection","resultType","isAPI","nextReqTimeout","longPollInterval","clearPingDelayDisconnect","forceReconnectTimeout","sendingLongPoll","max_delay","wait_after","max_wait","noResponse","longPoll","delay","checkConnectionRetryAt","scheduleRequest","handleSentEncryptedRequestHTTP","noResponseMsgs","sqrt","pushResend","shouldResolve","onDrainTimeout","willChange","onConnectionStatusChange","innerMsgId","acked","getMsgKey","dataWithPadding","x","msgKeyLargePlain","msgKeyLarge","getAesKeyIv","msgKey","sha2aText","sha2bText","aesKey","aesIv","sha2a","sha2b","akStopped","performScheduledRequest","ackMsgIds","msg_ids","pendingResendReqLength","outMessage","messagesByteLen","hasApiCall","hasHttpWait","lengthOverflow","compare","messageByteLength","generateContainerMessage","messageWithBody","innerMessages","getEncryptedMessage","keyIv","getDecryptedMessage","encryptedData","getEncryptedOutput","dataBuffer","paddingLength","encryptedResult","requestData","baseError","responseBuffer","deserializer","bytesCmp","calcMsgKey","totalLength","messageBodyLength","messageBody","mt_message","seqno","mt_rpc_result","req_msg_id","applyServerSalt","newServerSalt","toArray","ackMessage","reqResend","notEmpty","processMessageAck","error_message","error_code","msg","applyServerTime","serverTime","shiftRight","innerMessage","new_server_salt","bad_msg_id","changedTimeOffset","badMessage","first_msg_id","server_salt","answer_msg_id","lastResendReq","lastResend","pendingResend","reqMsgId","badMsgId","pos","NetworkerFactory","startAll","stoppedNetworkers","stopAll","setLanguage","testPublicKeysHex","modulus","exponent","publisKeysHex","publicKeysParsed","preparePromise","prepare","keyParsed","RSAPublicKey","fingerprintBytes","fingerprints","fingerprintHex","fill","foundKey","fingerprint","bytesXor","bytes1","bytes2","Authorizer","sendPlainRequest","requestArray","requestLength","headerArray","errorCode","auth_key_id","msg_len","sendReqPQ","nonce","rsaKeysManager","serverNonce","server_nonce","pq","server_public_key_fingerprints","publicKey","pAndQ","sendReqDhParams","newNonce","p_q_inner_data_dc","new_nonce","pQInnerDataSerialization","dataPadReversed","keyAesEncrypted","tempKey","dataWithHash","aesEncrypted","keyAesEncryptedBigInt","publicKeyModulusBigInt","getKeyAesEncrypted","req_DH_params","public_key_fingerprint","encrypted_data","requestBytes","newNonceHash","new_nonce_hash","decryptServerDhDataAnswer","encrypted_answer","sendSetClientDhParams","encryptedAnswer","localTime","tmpAesKey","tmpAesIv","answerWithHash","answerWithPadding","g","dhPrime","dh_prime","gA","g_a","server_time","retry","verifyDhParams","dhPrimeHex","gABigInt","dhPrimeBigInt","subtract","twoPow","gBytes","gB","retry_id","authKeyHash","authKeyAux","newNonceHash1","new_nonce_hash1","newNonceHash2","new_nonce_hash2","newNonceHash3","new_nonce_hash3","getTransportTypePromise","_try","TimeManager","lastMessageId","timeOffset","timeTicks","newTimeOffset","changed","server_time_offset","AppWebDocsManager","webDocument","AppPaymentsManager","getInputInvoiceBySlug","getInputInvoiceByPeerId","getPaymentForm","invoice","paymentForm","getPaymentReceipt","validateRequestedInfo","sendPaymentForm","formId","requestedInfoId","shippingOptionId","credentials","tipAmount","form_id","requested_info_id","shipping_option_id","tip_amount","clearSavedInfo","appManagersManager","cryptoWorkersURLs","cryptoPortsAttached","cryptoPortPromise","getManagers","manager","apply","ports","originalUrl","newURLs","createManagers","appAvatarsManager","appCallsManager","appPrivacyManager","appInlineBotsManager","passwordManager","appPaymentsManager","_serviceMessagePort","_isServiceWorkerOnline","pushedKeys","clearWrite","invokeExceptSource","serviceWorkerOnline","serviceWorkerPort","detachPort","attachPort","messagePort","onConnect","onDisconnect","listenPort","sendPort","attachListenPort","attachSendPort","setOnPortDisconnect","listenMessagePort","NULL_PEER_ID","REPLIES_PEER_ID","REPLIES_HIDDEN_CHANNEL_ID","SERVICE_PEER_ID","MUTE_UNTIL","MAX_FILE_SAVE_SIZE","THUMB_TYPE_FULL","FOLDER_ID_ALL","FOLDER_ID_ARCHIVE","REAL_FOLDERS","START_LOCAL_ID","ALPHA_CHARS_REG_EXP","URL_ALPHANUMERIC_REG_EXP_PART","URL_PROTOCOL_REG_EXP_PART","URL_REG_EXP","URL_ANY_PROTOCOL_REG_EXP","FULL_REG_EXP","EMAIL_REG_EXP","MARKDOWN_REG_EXP","MARKDOWN_ENTITIES","PASS_CONFLICTING_ENTITIES","PHONE_NUMBER_REG_EXP","encodeEmoji","emojiText","unicodeSurrogates","points","char","toCodePoints","removeVS16s","vs16RegExp","zeroWidthJoiner","rawEmoji","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","__webpack_exports__","O","chunkIds","fn","priority","notFulfilled","getter","__esModule","definition","enumerable","chunkId","miniCssF","globalThis","Function","prop","Symbol","toStringTag","nmd","paths","children","scriptUrl","importScripts","currentScript","src","scripts","getElementsByTagName","retries","realSrc","cacheBust","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime"],"sourceRoot":""}