1 line
592 KiB
Plaintext
1 line
592 KiB
Plaintext
{"version":3,"mappings":"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,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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ACN,MACF,EACA,eAAgB,CACd,SACA,SACF,EACA,KAAQ,CACN,OACA,KACA,OACF,EACA,KAAQ,CACN,OACA,KACF,EACA,SAAY,CACV,WACA,IACF,EACA,OAAU,CACR,SACA,KACF,EACA,SAAY,CACV,WACA,MACF,EACA,KAAM,CACJ,SACA,KACA,QACF,EACA,eAAgB,CACd,QACF,EACA,gBAAiB,CACf,SACF,EACA,qBAAsB,CACpB,UACF,EACA,WAAc,CACZ,YACF,EACA,OAAU,CACR,QACF,EACA,SAAY,CACV,WACA,KACF,EACA,WAAY,CACV,WACA,MACF,EACA,IAAO,CACL,MACA,MACF,EACA,MAAS,CACP,OACF,EACA,MAAS,CACP,OACF,EACA,OAAU,CACR,SACA,WACF,EACA,IAAO,CACL,KACF,EACA,MAAS,CACP,OACF,EACA,KAAQ,CACN,MACF,EACA,MAAS,CACP,OACF,EACA,IAAO,CACL,MACA,MACF,EACA,IAAO,CACL,KACF,EACA,UAAa,CACX,WACF,EACA,aAAgB,CACd,cACF,EACA,IAAO,CACL,KACF,EACA,SAAY,CACV,WACA,KACF,EACA,WAAc,CACZ,YACF,EACA,IAAO,CACL,KACF,EACA,SAAU,CACR,QACA,QACF,EACA,WAAY,CACV,UACA,WACA,MACF,EACA,QAAW,CACT,SACF,EACA,MAAS,CACP,OACF,EACA,MAAS,CACP,OACF,EACA,aAAgB,CACd,eACA,QACF,EACA,UAAa,CACX,YACA,MACF,EACA,0BAA2B,CACzB,KACF,EACA,SAAY,CACV,UACF,EACA,KAAQ,CACN,OACA,IACF,EACA,QAAW,CACT,SACF,EACA,IAAO,CACL,KACF,EACA,IAAO,CACL,KACF,EACA,OAAU,CACR,QACF,EACA,EAAK,CACH,GACF,EACA,KAAQ,CACN,MACF,EACA,UAAa,CACX,WACF,EACA,IAAO,CACL,KACF,EACA,MAAS,CACP,OACF,EACA,KAAQ,CACN,MACF,EACA,oBAAqB,CACnB,mBACF,EACA,gBAAiB,CACf,SACA,QACF,EACA,gBAAiB,CACf,gBACA,UACF,EACA,OAAU,CACR,SACA,YACF,EACA,iBAAkB,CAChB,MACA,IACF,EACA,KAAQ,CACN,MACF,EACA,aAAgB,CACd,cACF,EACA,OAAU,CACR,QACF,EACA,IAAO,CACL,MACA,KACF,EACA,OAAU,CACR,QACF,EACA,IAAO,CACL,KACF,EACA,IAAO,CACL,KACF,EACA,0BAA2B,CACzB,OACF,EACA,IAAO,CACL,KACF,EACA,OAAU,CACR,QACF,EACA,gBAAiB,CACf,gBACA,OACA,KACF,EACA,KAAM,CACJ,QACF,EACA,OAAU,CACR,QACF,EACA,MAAS,CACP,OACF,EACA,2BAA4B,CAC1B,0BACF,EACA,KAAQ,CACN,MACF,EACA,QAAW,CACT,SACF,EACA,+BAAgC,CAC9B,KACF,EACA,qBAAsB,CACpB,MACA,mBACF,EACA,YAAa,CACX,KACF,EACA,SAAU,CACR,OACF,EACA,SAAY,CACV,UACF,EACA,OAAU,CACR,QACF,EACA,QAAW,CACT,UACA,IACF,EACA,IAAO,CACL,KACF,EACA,KAAQ,CACN,MACF,EACA,GAAM,CACJ,KACA,KACF,EACA,oBAAqB,CACnB,gBACA,IACF,EACA,GAAM,CACJ,IACF,EACA,YAAa,CACX,YACA,QACF,EACA,OAAU,CACR,QACF,EACA,QAAW,CACT,SACF,EACA,OAAU,CACR,QACF,EACA,KAAQ,CACN,MACF,EACA,cAAe,CACb,MACF,EACA,QAAW,CACT,SACF,EACA,KAAQ,CACN,MACF,EACA,WAAc,CACZ,aACA,MACA,UACF,EACA,QAAW,CACT,UACA,IACF,EACA,KAAQ,CACN,MACF,EACA,IAAO,CACL,KACF,EACA,KAAQ,CACN,MACF,EACA,KAAQ,CACN,MACF,EACA,uBAAwB,CACtB,MACF,EACA,iCAAkC,CAChC,MACF,EACA,KAAQ,CACN,OACA,aACF,EACA,IAAO,CACL,MACA,KACF,EACA,KAAQ,CACN,MACF,EACA,UAAa,CACX,WACF,EACA,KAAQ,CACN,MACF,EACA,qBAAsB,CACpB,oBACF,EACA,MAAS,CACP,QACA,KACF,EACA,UAAW,CACT,SACA,YACA,WACA,WACF,EACA,WAAY,CACV,SACF,EACA,IAAO,CACL,KACF,EACA,GAAM,CACJ,IACF,EACA,EAAK,CACH,GACF,EACA,KAAQ,CACN,MACF,EACA,MAAS,CACP,OACF,EACA,IAAO,CACL,KACF,EACA,eAAgB,CACd,aACF,EACA,QAAW,CACT,SACF,EACA,mBAAoB,CAClB,gBACF,EACA,MAAS,CACP,OACF,EACA,GAAM,CACJ,IACF,EACA,WAAc,CACZ,aACA,IACF,EACA,MAAS,CACP,OACF,EACA,KAAQ,CACN,OACA,OACF,EACA,MAAS,CACP,OACF,EACA,MAAS,CACP,OACF,EACA,iBAAkB,CAChB,cACF,EACA,MAAS,CACP,OACF,EACA,uBAAwB,CACtB,YACF,EACA,OAAU,CACR,QACF,EACA,OAAU,CACR,SACA,KACA,KACF,EACA,MAAS,CACP,OACF,EACA,MAAS,CACP,QACA,MACA,SACF,EACA,MAAS,CACP,OACF,EACA,OAAU,CACR,QACF,EACA,SAAY,CACV,WACA,IACF,EACA,OAAU,CACR,QACF,EACA,KAAQ,CACN,OACA,QACA,QACA,YACF,EACA,WAAc,CACZ,YACF,EACA,UAAW,CACT,MACF,EACA,WAAY,CACV,KACF,EACA,QAAW,CACT,SACF,EACA,cAAe,CACb,OACF,EACA,SAAY,CACV,UACF,EACA,KAAQ,CACN,MACF,EACA,OAAU,CACR,QACF,EACA,UAAa,CACX,WACF,EACA,IAAO,CACL,KACF,EACA,QAAW,CACT,SACF,EACA,SAAY,CACV,UACF,EACA,MAAS,CACP,OACF,EACA,QAAW,CACT,SACF,EACA,OAAU,CACR,QACF,EACA,WAAc,CACZ,aACA,MACF,EACA,KAAQ,CACN,MACF,EACA,qBAAsB,CACpB,iBACF,EACA,mBAAoB,CAClB,aACA,MACF,EACA,KAAQ,CACN,MACF,EACA,KAAQ,CACN,MACF,EACA,MAAS,CACP,OACF,EACA,MAAS,CACP,OACF,EACA,IAAO,CACL,KACF,EACA,IAAO,CACL,KACF,EACA,KAAQ,CACN,MACF,EACA,cAAe,CACb,aACA,MACF,EACA,MAAS,CACP,OACF,EACA,KAAQ,CACN,MACF,EACA,OAAU,CACR,QACF,EACA,SAAY,CACV,WACA,MACF,EACA,GAAM,CACJ,IACF,EACA,UAAW,CACT,QACF,EACA,OAAU,CACR,QACF,EACA,OAAU,CACR,SACA,cACF,EACA,UAAa,CACX,WACF,EACA,4BAA6B,CAC3B,KACF,EACA,UAAW,CACT,SACA,IACF,EACA,WAAc,CACZ,aACA,OACF,EACA,KAAQ,CACN,MACF,EACA,OAAU,CACR,QACF,EACA,SAAY,CACV,YACA,UACF,EACA,SAAU,CACR,OACF,EACA,WAAc,CACZ,aACA,KACA,SACF,EACA,WAAc,CACZ,YACF,EACA,WAAc,CACZ,YACF,EACA,OAAU,CACR,QACF,EACA,OAAU,CACR,QACF,EACA,cAAe,CACb,YACF,EACA,mBAAoB,CAClB,UACF,EACA,OAAU,CACR,QACF,EACA,KAAQ,CACN,MACF,EACA,IAAO,CACL,KACF,EACA,OAAU,CACR,QACF,EACA,UAAa,CACX,YACA,QACF,EACA,OAAU,CACR,SACA,IACF,EACA,KAAM,CACJ,SACA,IACF,EACA,oBAAqB,CACnB,GACF,EACA,IAAO,CACL,KACF,EACA,KAAQ,CACN,MACF,EACA,EAAK,CACH,GACF,EACA,OAAU,CACR,SACA,KACF,EACA,WAAY,CACV,SACA,OACF,EACA,YAAa,CACX,KACF,EACA,YAAa,CACX,KACF,EACA,OAAU,CACR,QACF,EACA,KAAQ,CACN,MACF,EACA,SAAW,CACT,QACA,KACF,EACA,SAAY,CACV,WACA,KACF,EACA,0BAA2B,CACzB,MACF,EACA,IAAO,CACL,KACF,EACA,SAAY,CACV,UACF,EACA,kBAAmB,CACjB,iBACA,OACF,EACA,KAAQ,CACN,MACF,EACA,IAAO,CACL,KACF,EACA,cAAe,CACb,MACF,EACA,gBAAiB,CACf,gBACA,aACA,cACF,EACA,MAAS,CACP,OACF,EACA,UAAa,CACX,WACF,EACA,OAAU,CACR,QACF,EACA,IAAO,CACL,MACA,OACF,EACA,sBAAuB,CACrB,WACA,KACF,EACA,gBAAiB,CACf,gBACA,KACF,EACA,yBAA0B,CACxB,KACF,EACA,aAAc,CACZ,YACF,EACA,oCAAqC,CACnC,KACF,EACA,SAAY,CACV,UACF,EACA,KAAQ,CACN,MACF,EACA,YAAa,CACX,OACF,EACA,gCAAiC,CAC/B,OACF,EACA,cAAiB,CACf,gBACA,QACF,EACA,MAAS,CACP,OACF,EACA,6BAA8B,CAC5B,SACF,EACA,gBAAiB,CACf,eACF,EACA,yBAA0B,CACxB,QACA,IACF,EACA,SAAU,CACR,OACF,EACA,yBAA0B,CACxB,OACF,EACA,IAAO,CACL,KACF,EACA,IAAO,CACL,KACF,EACA,qBAAsB,CACpB,KACF,EACA,KAAQ,CACN,MACF,EACA,OAAU,CACR,SACA,UACA,MACF,EACA,WAAc,CACZ,aACA,UACF,EACA,aAAgB,CACd,eACA,UACA,IACF,EACA,kBAAmB,CACjB,SACF,EACA,EAAK,CACH,GACF,EACA,KAAQ,CACN,MACF,EACA,SAAY,CACV,UACF,EACA,QAAW,CACT,SACF,EACA,KAAQ,CACN,MACF,EACA,IAAO,CACL,KACF,EACA,eAAgB,CACd,eACA,KACA,KACF,EACA,WAAc,CACZ,YACF,EACA,YAAe,CACb,MACF,EACA,UAAW,CACT,UACA,QACF,EACA,KAAQ,CACN,MACF,EACA,cAAe,CACb,MACF,EACA,mBAAoB,CAClB,UACA,cACA,KACA,IACF,EACA,KAAQ,CACN,MACF,EACA,MAAS,CACP,QACA,WACF,EACA,mBAAoB,CAClB,MACF,EACA,OAAU,CACR,QACF,EACA,KAAQ,CACN,MACF,EACA,IAAO,CACL,KACF,CACF,EAEaC,GAA+C,GAE5D,UAAUC,KAAYF,GAAiB,CAC/B,MAAAG,EAAUH,GAAgBE,CAAQ,EAChCC,EAAA,QAAQD,EAAS,YAAa,GAC9B,QAAAttB,EAAI,EAAGylB,EAAI8H,EAAQ,OAAQvtB,EAAIylB,EAAG,EAAEzlB,EACtBqtB,GAAAE,EAAQvtB,C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","names":["forEachReverse","array","callback","length","i","safePlay","media","promise","noop","e","AnimationIntersector","entries","entry","target","group","animation","p","_animation","idleController","idle","paused","override","element","found","player","el","indexOfAndSplice","item","options","observeElement","controlled","liteModeKey","type","locked","rootScope","_a","blurred","destroy","imitateIntersection","groups","animations","isInDOM","fastRaf","lock","play","changed","animationItem","loop","animationIntersector","MOUNT_CLASS_TO","IS_IMAGE_BITMAP_SUPPORTED","FramesCache","cache","value","name","width","height","color","toneIndex","framesCache","getLottiePixelRatio","needUpscale","pixelRatio","clamp","IS_APPLE","mediaSizes","IS_ANDROID","applyColorOnContext","context","x","y","_RLottiePlayer","EventListenerBase","worker","skipRatio","IS_APPLE_MOBILE","IS_SAFARI","IS_APPLE_MX","canvas","CAN_USE_TRANSFERABLES","args","transfer","data","clearPendingRAF","renderFirstFrame","curFrame","speed","direction","customProperties","frame","frameNo","idx","cachedSource","c","err","now","delta","timeout","frameNew","skipDelta","maxFrame","minFrame","method","from","to","bounds","renderIfPaused","frameCount","fps","diff","container","time","RLottiePlayer","QueryableWorker","error","event","message","IS_WEB_ASSEMBLY_SUPPORTED","LottieLoader","makeError","App","logger","LogTypes","reqId","resolve","reject","remain","queryableWorker","params","url","res","apiManagerProxy","arr","blobConstruct","blob","newParams","pause","middleware","cacheName","players","containers","toArray","playersByCacheName","lottieLoader","replaceContent","elem","node","firstChild","toggleDisability","elements","disable","placeCaretAtEnd","ignoreTouchCheck","focus","IS_TOUCH_SUPPORTED","range","sel","VisibilityIntersector","onVisibilityChange","index","change","items","key","visible","targets","findAndSpliceAll","verify","out","findAndSplice","PARALLEL_LIMIT","IGNORE_ERRORS","LazyLoadQueueBase","parallelLimit","throttle","LazyLoadQueueIntersector","LazyLoadQueue","ignoreHeavyAnimation","useHeavyAnimationCheck","getPathFromBytes","bytes","lookup","path","num","outCanvas","outContext","computeLockColor","size","skipx","skipy","imageData","sr","sg","sb","sa","rgba","updateStreamInUse","inUse","createVideo","pip","video","getHeavyAnimationPromise","originalSrc","newValue","CRBUG_1250841_ERROR","isCrbug1250841Error","shouldIgnoreVideoError","isChromeBug","srcPromise","callbackify","src","onMediaLoad","readyState","useCanplayOnIos","loadEventName","errorEventName","onLoad","onError","loadedURLs","set","renderImageFromUrl","useCache","processImageOnLoad","isVideo","isImage","loader","renderImageFromUrlPromise","bytesFromHex","hexString","len","start","bytesToDataURL","mimeType","convertToUint8Array","JPEG_HEADER_HEX","JPEG_HEADER","JPEG_TAIL","getPreviewBytesFromURL","needle","sliced","jpegBytes","char","getPreviewURLFromBytes","isSticker","getPreviewURLFromThumb","photo","thumb","heavyQueue","processingQueue","addHeavyTask","queue","deferredPromise","processHeavyQueue","timedChunk","todo","results","f","possiblePromise","realResult","RADIUS","ITERATIONS","requireBlurPromise","fastBlurFunc","IS_CANVAS_FILTER_SUPPORTED","__vitePreload","m","processBlurNext","img","radius","iterations","ctx","CACHE_SIZE","blur","dataUri","cached","getImageFromStrippedThumb","useBlur","loadPromise","result","savingLottiePreview","isSavingLottiePreview","doc","getStickerThumbKey","saving","sharedCanvas","sharedContext","createCanvas","saveLottiePreview","uploadId","getFileNameForUpload","file","fileName","ext","tabId","getDocumentInputFileLocation","thumbSize","getDocumentDownloadOptions","queueId","onlyCache","inputFileLocation","getPhotoDownloadOptions","photoSize","isDocument","isPhoto","location","getWebFileDownloadOptions","getWebDocumentDownloadOptions","webDocument","downloadOptions","isWebDocument","getDownloadFileNameFromOptions","getFileNameByLocation","getDownloadMediaDetails","isWebFileLocation","createDownloadAnchor","onRemove","a","clickEvent","AppDownloadManager","managers","details","download","deferred","main","downloads","getPromise","promiseBefore","cb","d","justAttach","USE_SW","IS_MOBILE_SAFARI","getOutFileName","pingPromise","iframe","id","_iframe","onSuccess","onFinish","good","onDownloadRequestReceived","downloadId","hadProgress","onProgress","appDownloadManager","choosePhotoSize","boxWidth","boxHeight","useBytes","pushDocumentSize","sizes","bestPhotoSize","THUMB_TYPE_FULL","calcImageInBox","getStickerEffectThumb","encodeEmoji","emojiText","toCodePoints","removeVS16s","vs16RegExp","zeroWidthJoiner","rawEmoji","unicodeSurrogates","points","previous","getEmojiToneIndex","input","match","VIRTUAL_COUNTRIES_EMOJIS","getCountryEmoji","iso2","emojiFromCodePoints","codePoints","prev","curr","createDetails","MIDDLEWARE_ERROR","MiddlewareHelper","helper","additionalCallback","getMiddleware","throttleWith","schedulerFn","fn","waiting","_args","throttleWithRaf","emojiAnimationContainer","wrapStickerAnimation","stickerSize","side","fullThumb","withRandomOffset","relativeEffect","loopEffect","onUnmount","scrollable","textColor","_addOffsetX","_addOffsetY","animationDiv","unmountAnimation","middlewareHelper","onScroll","stickerPromise","wrapSticker","render","IS_VIBRATE_SUPPORTED","setPosition","generateRandomSigned","max","r","randomOffsetX","randomOffsetY","rect","factor","stableOffsetX","stableOffsetY","rectX","rectY","addOffsetX","addOffsetY","windowSize","setCurrentTime","currentTime","USE_FIX","IS_CHROMIUM","SHOULD_HANDLE_VIDEO_LEAK","onVideoLeak","firstElementChild","handleVideoLeak","testVideoLeak","isLeak","bindPromise","onTimeUpdate","eventsOrder","eventsOrderLength","sawEvents","leakVideoFallbacks","onVideoLeakListener","events","normalized","deepEqual","fallbackCallback","attachVideoLeakListener","attachVideoLeakListeners","callbacks","STICKER_EFFECT_MULTIPLIER","locksUrls","videosCache","onAnimationEnd","onEnd","_timeout","isEmptyContainer","childElementCount","getThumbFromContainer","div","loadStickerMiddleware","lazyLoadQueue","exportLoad","onlyThumb","emoji","withThumb","loadPromises","needFadeIn","asStatic","isOut","noPremium","withLock","isCustomEmoji","syncedVideo","isEffect","showPremiumInfo","stickerType","IS_WEBM_SUPPORTED","boxSize","makeMediaSize","liteMode","cacheContext","getCacheContext","isAnimated","effectThumb","willHaveLock","lockUrl","Icon","customEmojiAttribute","attribute","lottieCachedThumbToneIndex","downloaded","isThumbNeededForType","lottieCachedThumb","ret","loadThumbPromise","haveThumbCached","afterRender","thumbImage","sequentialDom","t","ns","svg","IS_WEBP_SUPPORTED","webpWorkerController","load","middlewareError","setLockColor","onFirstFrame","isSingleVideo","cachePromise","onTimeupdate","previousTime","playedTimes","mediaLength","loaded","videoWidth","videoHeight","ratio","w","h","reset","detach","lastPromise","_media","attachStickerEffectHandler","fireStickerEffect","isAvailable","cancelEvent","attachClickEvent","getVisibleRect","overflowElement","lookForSticky","overflowRect","overflowTop","overflowRight","overflowBottom","overflowLeft","sticky","overflow","windowWidth","windowHeight","getViewportSlice","selector","extraSize","extraMinLength","invisibleTop","invisibleBottom","foundVisible","visibleRect","isVisible","resizeObserverMap","resizeObserver","observeResize","unobserveResize","globalLazyLoadQueue","_CustomEmojiRendererElement","syncedPlayer","syncedPlayersFrames","syncedPlayers","clearRenderInterval","emojiRenderers","offsetsMap","findUpClassName","elementsArr","placeholders","offsets","elementRect","top","left","isDimensionsSet","dpr","isImageData","frameWidth","frameHeight","elementWidth","maxLeft","forceRenderAfter","newWidth","newHeight","renderEmojis","addCustomEmojis","usingOwnQueue","renderer","docId","newElements","customEmojis","newElementsArray","isLottie","isStatic","willHaveSyncedPlayer","_loadPromises","CUSTOM_EMOJI_INSTANT_PLAY","addition","readyPromise","placeholder","_p","setRenderInterval","addElements","docIds","docs","wrapOptions","missing","cachedPromises","uncachedPromisesPromise","loadFromPromises","_promises","promises","onRender","l","uncached","CustomEmojiRendererElement","emojiRenderInterval","renderers","o","acc","v","CUSTOM_EMOJI_FPS","CUSTOM_EMOJI_FRAME_INTERVAL","encodeEntities","hi","low","documentFragmentToHTML","fragment","findUpAttribute","findUpTag","tag","getCaretPosNew","anchor","selection","offset","findUpAsChild","getCaretPosF","childNodes","childNodesLength","CAN_COMBINE_ENTITIES","combineSameEntities","entities","entity","nextEntityIdx","_i","nextEntity","sortEntities","b","BOM","markdownTags","tabulationMatch","BLOCK_TAGS","BOM_REG_EXP","SELECTION_SEPARATOR","checkNodeForEntity","parentElement","closest","codeElement","isLineEmpty","line","getRichElementValue","lines","selNode","selOffset","nodeValue","pushLine","isSelected","isQuote","isBlock","alt","stickerEmoji","isTableCell","wasEntitiesLength","wasNodeEmpty","curChild","lastValue","getCaretPos","field","startOffset","possibleChildrenFocusOffset","getRichValueWithCaret","withEntities","withCaret","caretPos","isInputEmpty","allowStartingSpace","EmojiVersions","Emoji","version","buildURLHash","str","spoiler","text","chars","charsLength","encodeSpoiler","before","spoilerBefore","spoilerAfter","after","TLD","checkBrackets","urlLength","urlOpenBrackets","urlCloseBrackets","getEmojiUnified","emojiCode","unified","parseEntities","raw","matchIndex","rawOffset","FULL_REG_EXP","EMAIL_REG_EXP","protocol","tld","balanced","timestamp","splitted","splittedLength","hours","minutes","seconds","EMOJI_VERSIONS_SUPPORTED","isEmojiSupported","inlineEl","newEmojiWidth","legacyEmojiWidth","IS_EMOJI_SUPPORTED","wrapTelegramUrlToAnchor","url1","onclick","wrapUrl","CustomEmojiElement","replaceChildren","createCustomFiller","CodeLanguageMap","CodeLanguageAliases","language","aliases","importPrismLanguage","lowerCase","alias","prism","importPrism","hadBefore","module","Prism","env","className","highlightCode","code","_language","imported","findIndexFrom","predicate","createMarkupFormatting","formatting","onQuoteResize","scrollHeight","padding","isExpanded","makeQuoteCollapsable","collapseIcon","wrapRichText","nasty","wrapSomething","wrapElement","noFiller","lastElement","customWraps","passEntities","contextSite","contextExternal","textLength","copy","endOffset","endPartOffset","fullEntityText","partText","property","usedText","processingBlockElement","entityLanguage","content","languageName","header","headerName","i18n","headerWrapButton","html","lastInnerEntityIndex","n","command","bot","atPos","customEmojiElement","isSupported","IS_FIREFOX","masked","wrapped","hostname","currentContext","href","setBlankToAnchor","contextUrl","SITE_HASHTAGS","hashtag","username","encoded","CLICK_EVENT_NAME","dispose","setDirection","foundNextLinebreakIndex","lastInnerLinebreakIndex","insertCustomFillers","notFiller","isCustomFillerNeededBySiblingNode","check","needed","previousSibling","nextSibling","ListenerSetter","listener","_listener","compareNodes","node1","node1Offset","node2","node2Offset","whichChild","parents","commonAncestorContainer","NOT_ONLY_BOMS_REG_EXP","RichInputHandler","caret","move","toLeft","log","addInputCallback","moveFirst","isBOM","something","fromSelectionChange","smthIndex","moved","idxidx","rangeString","onlyBOMs","br","capture","newCallback","sibling","treeWalker","textNode","cleanSiblings","bomNode","focusNodeBefore","focusOffsetBefore","focusNodeAfter","focusOffsetAfter","fillers","smths","selectElementContents","SINGLE_ENTITIES","findConflictingEntity","currentEntities","newEntity","singleStart","singleEnd","currentEntity","PASS_SINGLE_CONFLICTING_ENTITIES","PASS_CONFLICTING_ENTITIES","mergeEntities","newEntities","filtered","wrapDraftText","insertRichTextAsHTML","wrappingForPeerId","createCustomEmojiRendererForInput","customEmojiElements","pre","simulateEvent","init","noLinebreaks","plainText","usePlainText","filterEntity","regExp","peerId","NULL_PEER_ID","span","richValue","lineIndex","nextLine","correctedText","richTextLength","plainTextLength","entities2","InputState","animationGroup","processCustomEmojisInInput","hasSet","InputField","empty","maxLength","showLengthOn","canBeEdited","autocomplete","withBorder","canHaveFormatting","label","onInputCallbacks","isEmpty","centerX","focusOnNext","_i18n","border","labelEl","showingLength","onInput","wasError","inputLength","isError","setInnerHTML","fromSet","silent","_value","state","wrapEmojiText","isDraft"],"ignoreList":[],"sources":["../src/helpers/array/forEachReverse.ts","../src/helpers/dom/safePlay.ts","../src/components/animationIntersector.ts","../src/environment/imageBitmapSupport.ts","../src/helpers/framesCache.ts","../src/lib/rlottie/rlottiePlayer.ts","../src/lib/rlottie/queryableWorker.ts","../src/environment/webAssemblySupport.ts","../src/lib/rlottie/lottieLoader.ts","../src/helpers/dom/replaceContent.ts","../src/helpers/dom/toggleDisability.ts","../src/helpers/dom/placeCaretAtEnd.ts","../src/components/visibilityIntersector.ts","../src/helpers/array/findAndSpliceAll.ts","../src/helpers/array/findAndSplice.ts","../src/components/lazyLoadQueueBase.ts","../src/components/lazyLoadQueueIntersector.ts","../src/components/lazyLoadQueue.ts","../src/helpers/bytes/getPathFromBytes.ts","../src/helpers/computeLockColor.ts","../src/helpers/dom/createVideo.ts","../src/helpers/fixChromiumMp4.constants.ts","../src/helpers/onMediaLoad.ts","../src/helpers/dom/renderImageFromUrl.ts","../src/helpers/bytes/bytesFromHex.ts","../src/helpers/bytes/bytesToDataURL.ts","../src/helpers/bytes/convertToUint8Array.ts","../src/helpers/bytes/getPreviewURLFromBytes.ts","../src/helpers/getPreviewURLFromThumb.ts","../src/helpers/heavyQueue.ts","../src/helpers/blur.ts","../src/helpers/getImageFromStrippedThumb.ts","../src/helpers/saveLottiePreview.ts","../src/helpers/getFileNameForUpload.ts","../src/lib/appManagers/utils/docs/getDocumentInputFileLocation.ts","../src/lib/appManagers/utils/docs/getDocumentDownloadOptions.ts","../src/lib/appManagers/utils/photos/getPhotoDownloadOptions.ts","../src/lib/appManagers/utils/webFiles/getWebFileDownloadOptions.ts","../src/lib/appManagers/utils/webDocs/getWebDocumentDownloadOptions.ts","../src/lib/appManagers/utils/webDocs/isWebDocument.ts","../src/lib/appManagers/utils/download/getDownloadFileNameFromOptions.ts","../src/lib/appManagers/utils/download/getDownloadMediaDetails.ts","../src/helpers/dom/createDownloadAnchor.ts","../src/lib/appManagers/appDownloadManager.ts","../src/lib/appManagers/utils/photos/choosePhotoSize.ts","../src/lib/appManagers/utils/stickers/getStickerEffectThumb.ts","../src/vendor/emoji/index.ts","../src/helpers/middleware.ts","../src/helpers/schedulers/throttleWith.ts","../src/helpers/schedulers/throttleWithRaf.ts","../src/components/wrappers/stickerAnimation.ts","../src/helpers/dom/setCurrentTime.ts","../src/helpers/dom/handleVideoLeak.ts","../src/components/wrappers/sticker.ts","../src/helpers/dom/getVisibleRect.ts","../src/helpers/dom/getViewportSlice.ts","../src/components/resizeObserver.ts","../src/lib/customEmoji/renderer.ts","../src/helpers/string/encodeEntities.ts","../src/helpers/dom/documentFragmentToHTML.ts","../src/helpers/dom/findUpAttribute.ts","../src/helpers/dom/findUpTag.ts","../src/helpers/dom/getCaretPosNew.ts","../src/lib/richTextProcessor/combineSameEntities.ts","../src/lib/richTextProcessor/sortEntities.ts","../src/helpers/string/bom.ts","../src/helpers/dom/getRichElementValue.ts","../src/helpers/dom/getRichValueWithCaret.ts","../src/helpers/dom/isInputEmpty.ts","../src/config/emoji.ts","../src/helpers/buildURLHash.ts","../src/lib/richTextProcessor/spoiler.ts","../src/lib/richTextProcessor/encodeSpoiler.ts","../src/config/tld.ts","../src/lib/richTextProcessor/checkBrackets.ts","../src/lib/richTextProcessor/getEmojiUnified.ts","../src/lib/richTextProcessor/parseEntities.ts","../src/environment/emojiVersionsSupport.ts","../src/lib/richTextProcessor/wrapTelegramUrlToAnchor.ts","../src/lib/customEmoji/element.ts","../src/codeLanguages.ts","../src/helpers/array/findIndexFrom.ts","../src/lib/richTextProcessor/wrapRichText.ts","../src/helpers/listenerSetter.ts","../src/helpers/dom/compareNodes.ts","../src/helpers/dom/richInputHandler.ts","../src/helpers/dom/selectElementContents.ts","../src/lib/richTextProcessor/findConflictingEntity.ts","../src/lib/richTextProcessor/mergeEntities.ts","../src/lib/richTextProcessor/wrapDraftText.ts","../src/components/inputField.ts","../src/lib/richTextProcessor/wrapEmojiText.ts"],"sourcesContent":["export default function forEachReverse<T>(array: Array<T>, callback: (value: T, index?: number, array?: Array<T>) => void) {\n for(let length = array.length, i = length - 1; i >= 0; --i) {\n callback(array[i], i, array);\n }\n};\n","import noop from '../noop';\n\nexport default function safePlay(media: {play: () => any}) {\n try {\n const promise = media.play();\n if(promise instanceof Promise) {\n promise.catch(noop);\n }\n } catch(e) {\n console.error(e);\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\nimport type {LiteModeKey} from '../helpers/liteMode';\nimport type RLottiePlayer from '../lib/rlottie/rlottiePlayer';\nimport rootScope from '../lib/rootScope';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport isInDOM from '../helpers/dom/isInDOM';\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport forEachReverse from '../helpers/array/forEachReverse';\nimport idleController from '../helpers/idleController';\nimport {fastRaf} from '../helpers/schedulers';\nimport {Middleware} from '../helpers/middleware';\nimport safePlay from '../helpers/dom/safePlay';\n\nexport type AnimationItemGroup = '' | 'none' | 'chat' | 'lock' |\n 'STICKERS-POPUP' | 'emoticons-dropdown' | 'STICKERS-SEARCH' | 'GIFS-SEARCH' |\n `CHAT-MENU-REACTIONS-${number}` | 'INLINE-HELPER' | 'GENERAL-SETTINGS' | 'STICKER-VIEWER' | 'EMOJI' |\n 'EMOJI-STATUS' | `chat-${number}` | 'PREMIUM-PROMO' | 'NEW-MEDIA';\nexport interface AnimationItem {\n el: HTMLElement,\n group: AnimationItemGroup,\n animation: AnimationItemWrapper,\n liteModeKey?: LiteModeKey,\n controlled?: boolean | Middleware,\n type: AnimationItemType,\n locked?: boolean\n};\n\nexport type AnimationItemType = 'lottie' | 'dots' | 'video' | 'emoji';\n\nexport interface AnimationItemWrapper {\n remove: () => void;\n paused: boolean;\n pause: () => any;\n play: () => any;\n autoplay: boolean;\n _autoplay?: boolean;\n loop: boolean | number;\n _loop?: boolean | number;\n // onVisibilityChange?: (visible: boolean) => boolean;\n};\n\nexport class AnimationIntersector {\n private observer: IntersectionObserver;\n private visible: Set<AnimationItem>;\n\n private overrideIdleGroups: Set<string>;\n private byGroups: {[group in AnimationItemGroup]?: AnimationItem[]};\n private byPlayer: Map<AnimationItem['animation'], AnimationItem>;\n private lockedGroups: {[group in AnimationItemGroup]?: true};\n private onlyOnePlayableGroup: AnimationItemGroup;\n\n private intersectionLockedGroups: {[group in AnimationItemGroup]?: true};\n private videosLocked: boolean;\n\n constructor() {\n this.observer = new IntersectionObserver((entries) => {\n // if(rootScope.idle.isIDLE) return;\n\n for(const entry of entries) {\n const target = entry.target;\n\n for(const group in this.byGroups) {\n if(this.intersectionLockedGroups[group as AnimationItemGroup]) {\n continue;\n }\n\n const animation = this.byGroups[group as AnimationItemGroup].find((p) => p.el === target);\n if(!animation) {\n continue;\n }\n\n if(entry.isIntersecting) {\n this.visible.add(animation);\n this.checkAnimation(animation, false);\n\n /* if(animation instanceof HTMLVideoElement && animation.dataset.src) {\n animation.src = animation.dataset.src;\n animation.load();\n } */\n } else {\n this.visible.delete(animation);\n this.checkAnimation(animation, true);\n\n const _animation = animation.animation;\n if(animation.type === 'lottie'/* && animation.cachingDelta === 2 */) {\n // console.warn('will clear cache', player);\n (_animation as RLottiePlayer).clearCache();\n }/* else if(animation instanceof HTMLVideoElement && animation.src) {\n animation.dataset.src = animation.src;\n animation.src = '';\n animation.load();\n } */\n }\n\n break;\n }\n }\n });\n\n this.visible = new Set();\n\n this.overrideIdleGroups = new Set();\n this.byGroups = {};\n this.byPlayer = new Map();\n this.lockedGroups = {};\n this.onlyOnePlayableGroup = '';\n\n this.intersectionLockedGroups = {};\n this.videosLocked = false;\n\n idleController.addEventListener('change', (idle) => {\n this.checkAnimations2(idle);\n });\n }\n\n public toggleMediaPause(paused: boolean) {\n if(paused) {\n if(this.videosLocked) {\n this.videosLocked = false;\n this.checkAnimations2();\n }\n } else {\n this.videosLocked = true;\n this.checkAnimations2();\n }\n }\n\n public setOverrideIdleGroup(group: string, override: boolean) {\n if(override) this.overrideIdleGroups.add(group);\n else this.overrideIdleGroups.delete(group);\n }\n\n public getAnimations(element: HTMLElement) {\n const found: AnimationItem[] = [];\n for(const group in this.byGroups) {\n for(const player of this.byGroups[group as AnimationItemGroup]) {\n if(player.el === element) {\n found.push(player);\n }\n }\n }\n\n return found;\n }\n\n public removeAnimation(player: AnimationItem) {\n const {el, animation} = player;\n if(player.controlled !== true && player.type !== 'video') {\n animation.remove();\n }\n\n const group = this.byGroups[player.group];\n if(group) {\n indexOfAndSplice(group, player);\n if(!group.length) {\n delete this.byGroups[player.group];\n }\n }\n\n this.observer.unobserve(el);\n this.visible.delete(player);\n this.byPlayer.delete(animation);\n }\n\n public removeAnimationByPlayer(player: AnimationItemWrapper) {\n const item = this.byPlayer.get(player);\n if(item) {\n this.removeAnimation(item);\n }\n }\n\n public addAnimation(options: {\n animation: AnimationItem['animation'],\n group?: AnimationItemGroup,\n observeElement: HTMLElement,\n controlled?: AnimationItem['controlled'],\n liteModeKey?: LiteModeKey\n type: AnimationItemType,\n locked?: boolean\n }) {\n const {animation, group = '', observeElement, controlled, liteModeKey, type, locked} = options;\n if(group === 'none' || this.byPlayer.has(animation)) {\n return;\n }\n\n const item: AnimationItem = {\n el: observeElement,\n animation: animation,\n group,\n controlled,\n liteModeKey,\n type,\n locked\n };\n\n if(controlled && typeof(controlled) !== 'boolean') {\n controlled.onClean(() => {\n this.removeAnimationByPlayer(animation);\n });\n }\n\n if(item.type === 'lottie') {\n if(!rootScope.settings.stickers.loop && animation.loop) {\n animation.loop = rootScope.settings.stickers.loop;\n }\n }\n\n (this.byGroups[group as AnimationItemGroup] ??= []).push(item);\n this.observer.observe(item.el);\n this.byPlayer.set(animation, item);\n }\n\n public checkAnimations(\n blurred?: boolean,\n group?: AnimationItemGroup,\n destroy?: boolean,\n imitateIntersection?: boolean\n ) {\n // if(rootScope.idle.isIDLE) return;\n\n if(group !== undefined && !this.byGroups[group]) {\n // console.warn('no animation group:', group);\n return;\n }\n\n const groups = group !== undefined /* && false */ ? [group] : Object.keys(this.byGroups) as AnimationItemGroup[];\n\n for(const group of groups) {\n if(imitateIntersection && this.intersectionLockedGroups[group]) {\n continue;\n }\n\n const animations = this.byGroups[group];\n\n forEachReverse(animations, (animation) => {\n this.checkAnimation(animation, blurred, destroy);\n });\n }\n }\n\n public checkAnimations2(blurred?: boolean) {\n this.checkAnimations(blurred, undefined, undefined, true);\n }\n\n public checkAnimation(player: AnimationItem, blurred?: boolean, destroy?: boolean) {\n const {el, animation, group, locked} = player;\n if(locked) {\n return;\n }\n\n // return;\n if(destroy || (!this.lockedGroups[group] && !isInDOM(el))) {\n if(!player.controlled || destroy) {\n this.removeAnimation(player);\n }\n\n return;\n }\n\n if(\n blurred ||\n (this.onlyOnePlayableGroup && this.onlyOnePlayableGroup !== group) ||\n (player.type === 'video' && this.videosLocked)\n ) {\n if(!animation.paused) {\n // console.warn('pause animation:', animation);\n animation.pause();\n }\n } else if(\n animation.paused &&\n this.visible.has(player) &&\n animation.autoplay &&\n (!this.onlyOnePlayableGroup || this.onlyOnePlayableGroup === group) &&\n (!idleController.isIdle || this.overrideIdleGroups.has(player.group))\n ) {\n // console.warn('play animation:', animation);\n safePlay(animation);\n }\n }\n\n public getOnlyOnePlayableGroup() {\n return this.onlyOnePlayableGroup;\n }\n\n public setOnlyOnePlayableGroup(group: AnimationItemGroup = '') {\n this.onlyOnePlayableGroup = group;\n }\n\n public lockGroup(group: AnimationItemGroup) {\n this.lockedGroups[group] = true;\n }\n\n public unlockGroup(group: AnimationItemGroup) {\n delete this.lockedGroups[group];\n this.checkAnimations(undefined, group);\n }\n\n public refreshGroup(group: AnimationItemGroup) {\n const animations = this.byGroups[group];\n if(!animations?.length) {\n return;\n }\n\n animations.forEach((animation) => {\n this.observer.unobserve(animation.el);\n });\n\n fastRaf(() => {\n animations.forEach((animation) => {\n this.observer.observe(animation.el);\n });\n });\n }\n\n public lockIntersectionGroup(group: AnimationItemGroup) {\n this.intersectionLockedGroups[group] = true;\n }\n\n public unlockIntersectionGroup(group: AnimationItemGroup) {\n delete this.intersectionLockedGroups[group];\n this.refreshGroup(group);\n }\n\n public toggleIntersectionGroup(group: AnimationItemGroup, lock: boolean) {\n if(lock) this.lockIntersectionGroup(group);\n else this.unlockIntersectionGroup(group);\n }\n\n public setAutoplay(play: boolean, liteModeKey: LiteModeKey) {\n let changed = false;\n this.byPlayer.forEach((animationItem, animation) => {\n if(animationItem.liteModeKey === liteModeKey) {\n changed = true;\n animation.autoplay = play ? animation._autoplay : false;\n animation.loop = play ? rootScope.settings.stickers.loop && animation._loop : false;\n }\n });\n\n return changed;\n }\n\n public setLoop(loop: boolean) {\n let changed = false;\n this.byPlayer.forEach((animationItem, animation) => {\n if(\n animation._loop &&\n animation.loop !== loop &&\n (animationItem.type === 'lottie' || animationItem.type === 'video')\n ) {\n changed = true;\n animation.loop = loop;\n\n // if(animation._autoplay && animation.autoplay !== animation._autoplay) {\n animation.autoplay = animation._autoplay;\n // }\n }\n });\n\n return changed;\n }\n\n public toggleItemLock(animationItem: AnimationItem, lock: boolean) {\n // const wasLocked = animationItem.locked;\n animationItem.locked = lock;\n\n // if(!!wasLocked !== lock) {\n // this.checkAnimation(animationItem);\n // }\n }\n}\n\nconst animationIntersector = new AnimationIntersector();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.animationIntersector = animationIntersector);\nexport default animationIntersector;\n","const IS_IMAGE_BITMAP_SUPPORTED = typeof(ImageBitmap) !== 'undefined';\n\nexport default IS_IMAGE_BITMAP_SUPPORTED;\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 type {RLottieColor} from '../lib/rlottie/rlottiePlayer';\n\nexport type FramesCacheMap = Map<number, Uint8ClampedArray>;\nexport type FramesCacheMapNew = Map<number, HTMLCanvasElement | ImageBitmap>;\nexport type FramesCacheMapURLs = Map<number, string>;\nexport type FramesCacheItem = {\n frames: FramesCacheMap,\n framesNew: FramesCacheMapNew,\n framesURLs: FramesCacheMapURLs,\n clearCache: () => void,\n counter: number\n};\n\nexport class FramesCache {\n private cache: Map<string, FramesCacheItem>;\n\n constructor() {\n this.cache = new Map();\n }\n\n public static createCache(): FramesCacheItem {\n const cache: FramesCacheItem = {\n frames: new Map(),\n framesNew: new Map(),\n framesURLs: new Map(),\n clearCache: () => {\n cache.framesNew.forEach((value) => {\n (value as ImageBitmap).close?.();\n });\n\n cache.frames.clear();\n cache.framesNew.clear();\n cache.framesURLs.clear();\n },\n counter: 0\n };\n\n return cache;\n }\n\n public getCache(name: string) {\n let cache = this.cache.get(name);\n if(!cache) {\n this.cache.set(name, cache = FramesCache.createCache());\n } else {\n // console.warn('[RLottieCache] cache will be reused', cache);\n }\n\n ++cache.counter;\n return cache;\n }\n\n public releaseCache(name: string) {\n const cache = this.cache.get(name);\n if(cache && !--cache.counter) {\n this.cache.delete(name);\n // console.warn('[RLottieCache] released cache', cache);\n }\n }\n\n public getCacheCounter(name: string) {\n const cache = this.cache.get(name);\n return cache?.counter;\n }\n\n public generateName(name: string, width: number, height: number, color: RLottieColor, toneIndex: number) {\n return [\n name,\n width,\n height,\n // color ? rgbaToHexa(color) : ''\n // color ? 'colored' : '',\n toneIndex || ''\n ].filter(Boolean).join('-');\n }\n}\n\nconst framesCache = new FramesCache();\n\nexport default framesCache;\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 type {AnimationItemGroup, AnimationItemWrapper} from '../../components/animationIntersector';\nimport type {Middleware} from '../../helpers/middleware';\nimport type {LiteModeKey} from '../../helpers/liteMode';\nimport CAN_USE_TRANSFERABLES from '../../environment/canUseTransferables';\nimport IS_APPLE_MX from '../../environment/appleMx';\nimport {IS_ANDROID, IS_APPLE_MOBILE, IS_APPLE, IS_SAFARI} from '../../environment/userAgent';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport clamp from '../../helpers/number/clamp';\nimport QueryableWorker from './queryableWorker';\nimport IS_IMAGE_BITMAP_SUPPORTED from '../../environment/imageBitmapSupport';\nimport framesCache, {FramesCache, FramesCacheItem} from '../../helpers/framesCache';\nimport customProperties from '../../helpers/dom/customProperties';\n\nexport type RLottieOptions = {\n container: HTMLElement | HTMLElement[],\n middleware?: Middleware,\n canvas?: HTMLCanvasElement,\n autoplay?: boolean,\n animationData: Blob,\n loop?: RLottiePlayer['loop'],\n width?: number,\n height?: number,\n group?: AnimationItemGroup,\n noCache?: boolean,\n needUpscale?: boolean,\n skipRatio?: number,\n initFrame?: number, // index\n color?: RLottieColor,\n textColor?: WrapSomethingOptions['textColor'],\n name?: string,\n skipFirstFrameRendering?: boolean,\n toneIndex?: number,\n sync?: boolean,\n liteModeKey?: LiteModeKey\n};\n\nexport type RLottieColor = [number, number, number];\n\nexport function getLottiePixelRatio(width: number, height: number, needUpscale?: boolean) {\n let pixelRatio = clamp(window.devicePixelRatio, 1, 2);\n if(pixelRatio > 1 && !needUpscale) {\n if(width > 90 && height > 90) {\n if(!IS_APPLE && mediaSizes.isMobile) {\n pixelRatio = 1;\n }\n } else if((width > 60 && height > 60) || IS_ANDROID) {\n pixelRatio = Math.max(1.5, pixelRatio - 1.5);\n }\n }\n\n return pixelRatio;\n}\n\nexport function applyColorOnContext(\n context: CanvasRenderingContext2D,\n color: RLottieColor | string,\n x: number,\n y: number,\n width: number,\n height: number\n) {\n context.globalCompositeOperation = 'source-atop';\n context.fillStyle = typeof(color) === 'string' ? color : `rgb(${color[0]}, ${color[1]}, ${color[2]})`;\n context.fillRect(x, y, width, height);\n context.globalCompositeOperation = 'source-over';\n}\n\nexport default class RLottiePlayer extends EventListenerBase<{\n enterFrame: (frameNo: number) => void,\n ready: () => void,\n firstFrame: () => void,\n cached: () => void,\n destroy: () => void\n}> implements AnimationItemWrapper {\n public static CACHE = framesCache;\n private static reqId = 0;\n\n public reqId = 0;\n public curFrame: number;\n private frameCount: number;\n private fps: number;\n private skipDelta: number;\n public name: string;\n public cacheName: string;\n private toneIndex: number;\n\n private worker: QueryableWorker;\n\n private width = 0;\n private height = 0;\n\n public el: HTMLElement[];\n public canvas: HTMLCanvasElement[];\n public contexts: CanvasRenderingContext2D[];\n\n public paused = true;\n // public paused = false;\n public direction = 1;\n private speed = 1;\n public autoplay = true;\n public _autoplay: boolean; // ! will be used to store original value for settings.stickers.loop\n public loop: number | boolean = true;\n public _loop: RLottiePlayer['loop']; // ! will be used to store original value for settings.stickers.loop\n public group: AnimationItemGroup = '';\n public liteModeKey: LiteModeKey;\n\n private frInterval: number;\n private frThen: number;\n private rafId: number;\n\n // private caching = false;\n // private removed = false;\n\n private cache: FramesCacheItem;\n private imageData: ImageData;\n public clamped: Uint8ClampedArray;\n private cachingDelta = 0;\n\n private initFrame: number;\n private color: RLottieOptions['color'];\n private textColor: RLottieOptions['textColor'];\n\n public minFrame: number;\n public maxFrame: number;\n\n private playedTimes = 0;\n\n private currentMethod: RLottiePlayer['mainLoopForwards'] | RLottiePlayer['mainLoopBackwards'];\n private frameListener: (currentFrame: number) => void;\n private skipFirstFrameRendering: boolean;\n private playToFrameOnFrameCallback: (frameNo: number) => void;\n\n public overrideRender: (frame: ImageData | HTMLCanvasElement | ImageBitmap) => void;\n private renderedFirstFrame: boolean;\n\n private raw: boolean;\n\n constructor({el, worker, options}: {\n el: RLottiePlayer['el'],\n worker: QueryableWorker,\n options: RLottieOptions\n }) {\n super(true);\n\n this.reqId = ++RLottiePlayer['reqId'];\n this.el = el;\n this.worker = worker;\n\n for(const i in options) {\n if(this.hasOwnProperty(i)) {\n // @ts-ignore\n this[i] = options[i];\n }\n }\n\n this._loop = this.loop;\n this._autoplay = this.autoplay;\n\n // ! :(\n this.initFrame = options.initFrame;\n this.color = options.color;\n this.textColor = options.textColor;\n this.name = options.name;\n this.skipFirstFrameRendering = options.skipFirstFrameRendering;\n this.toneIndex = options.toneIndex;\n this.raw = false;\n this.liteModeKey = options.liteModeKey;\n\n if(this.name) {\n this.cacheName = RLottiePlayer.CACHE.generateName(\n this.name,\n this.width,\n this.height,\n this.color,\n this.toneIndex\n );\n }\n\n // * Skip ratio (30fps)\n let skipRatio: number;\n if(options.skipRatio !== undefined) skipRatio = options.skipRatio;\n else if((IS_ANDROID || IS_APPLE_MOBILE || (IS_APPLE && !IS_SAFARI && !IS_APPLE_MX)) && this.width < 100 && this.height < 100 && !options.needUpscale) {\n skipRatio = 0.5;\n }\n\n this.skipDelta = skipRatio !== undefined ? 1 / skipRatio | 0 : 1;\n\n // options.needUpscale = true;\n\n // * Pixel ratio\n const pixelRatio = getLottiePixelRatio(this.width, this.height, options.needUpscale);\n\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n\n // options.noCache = true;\n\n // * Cache frames params\n if(!options.noCache/* && false */) {\n // проверка на размер уже после скейлинга, сделано для попапа и сайдбара, где стикеры 80х80 и 68х68, туда нужно 75%\n if(IS_APPLE && this.width > 100 && this.height > 100) {\n this.cachingDelta = 2; // 2 // 50%\n } else if(this.width < 100 && this.height < 100) {\n this.cachingDelta = Infinity; // 100%\n } else {\n this.cachingDelta = 4; // 75%\n }\n }\n\n // this.cachingDelta = Infinity;\n // this.cachingDelta = 0;\n // if(isApple) {\n // this.cachingDelta = 0; //2 // 50%\n // }\n\n if(!this.canvas) {\n this.canvas = this.el.map(() => {\n const canvas = document.createElement('canvas');\n canvas.classList.add('rlottie');\n canvas.width = this.width;\n canvas.height = this.height;\n canvas.dpr = pixelRatio;\n return canvas;\n });\n }\n\n this.contexts = this.canvas.map((canvas) => canvas.getContext('2d'));\n\n if(!IS_IMAGE_BITMAP_SUPPORTED || this.raw) {\n this.imageData = new ImageData(this.width, this.height);\n\n if(CAN_USE_TRANSFERABLES) {\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n }\n\n if(this.name) {\n this.cache = RLottiePlayer.CACHE.getCache(this.cacheName);\n } else {\n this.cache = FramesCache.createCache();\n }\n }\n\n public setSize(width: number, height: number) {\n this.width = width;\n this.height = height;\n this.canvas.forEach((canvas) => {\n canvas.width = width;\n canvas.height = height;\n });\n }\n\n public clearCache() {\n if(this.cachingDelta === Infinity) {\n return;\n }\n\n if(this.cacheName && this.cache.counter > 1) { // skip clearing because same sticker can be still visible\n return;\n }\n\n this.cache.clearCache();\n }\n\n public sendQuery(args: any[], transfer?: Transferable[]) {\n this.worker.sendQuery([args.shift(), this.reqId, ...args], transfer);\n }\n\n public loadFromData(data: RLottieOptions['animationData']) {\n this.sendQuery([\n 'loadFromData',\n data,\n this.width,\n this.height,\n this.toneIndex,\n this.raw\n /* , this.canvas.transferControlToOffscreen() */\n ]);\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n this.paused = false;\n this.setMainLoop();\n }\n\n public pause(clearPendingRAF = true) {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n if(clearPendingRAF) {\n clearTimeout(this.rafId);\n this.rafId = undefined;\n }\n // window.cancelAnimationFrame(this.rafId);\n }\n\n private resetCurrentFrame() {\n return this.curFrame = this.initFrame ?? (this.direction === 1 ? this.minFrame : this.maxFrame);\n }\n\n public stop(renderFirstFrame = true) {\n this.pause();\n\n const curFrame = this.resetCurrentFrame();\n if(renderFirstFrame) {\n this.requestFrame(curFrame);\n // this.sendQuery('renderFrame', this.curFrame);\n }\n }\n\n public restart() {\n this.stop(false);\n this.play();\n }\n\n public playOrRestart() {\n if(!this.paused) {\n return;\n }\n\n if(this.curFrame === this.maxFrame) {\n this.restart();\n } else {\n this.play();\n }\n }\n\n public setSpeed(speed: number) {\n if(this.speed === speed) {\n return;\n }\n\n this.speed = speed;\n\n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public setDirection(direction: number) {\n if(this.direction === direction) {\n return;\n }\n\n this.direction = direction;\n\n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public remove() {\n this.pause();\n this.sendQuery(['destroy']);\n if(this.cacheName) RLottiePlayer.CACHE.releaseCache(this.cacheName);\n this.dispatchEvent('destroy');\n this.cleanup();\n }\n\n public applyColor(context: CanvasRenderingContext2D) {\n applyColorOnContext(\n context,\n // this.color || customProperties.getPropertyAsColor(typeof(this.textColor) === 'function' ? this.textColor() : this.textColor),\n this.color || customProperties.getPropertyAsColor(this.textColor),\n 0,\n 0,\n this.width,\n this.height\n );\n }\n\n public applyColorForAllContexts() {\n if(!this.color && !this.textColor) {\n return;\n }\n\n this.contexts.forEach((context) => {\n this.applyColor(context);\n });\n }\n\n public renderFrame2(frame: Uint8ClampedArray | HTMLCanvasElement | ImageBitmap, frameNo: number) {\n /* this.setListenerResult('enterFrame', frameNo);\n return; */\n\n try {\n if(frame instanceof Uint8ClampedArray) {\n this.imageData.data.set(frame);\n }\n\n // this.context.putImageData(new ImageData(frame, this.width, this.height), 0, 0);\n this.contexts.forEach((context, idx) => {\n let cachedSource: HTMLCanvasElement | ImageBitmap = this.cache.framesNew.get(frameNo);\n if(!(frame instanceof Uint8ClampedArray)) {\n cachedSource = frame;\n } else if(idx > 0) {\n cachedSource = this.canvas[0];\n }\n\n if(!cachedSource) {\n const c = document.createElement('canvas');\n c.width = context.canvas.width;\n c.height = context.canvas.height;\n c.getContext('2d').putImageData(this.imageData, 0, 0);\n this.cache.framesNew.set(frameNo, c);\n cachedSource = c;\n }\n\n if(this.overrideRender && this.renderedFirstFrame) {\n this.overrideRender(cachedSource || this.imageData);\n } else if(cachedSource) {\n context.clearRect(0, 0, cachedSource.width, cachedSource.height);\n context.drawImage(cachedSource, 0, 0);\n } else {\n context.putImageData(this.imageData, 0, 0);\n }\n\n if(this.color || this.textColor) {\n this.applyColor(context);\n }\n\n if(!this.renderedFirstFrame) {\n this.renderedFirstFrame = true;\n }\n });\n\n this.dispatchEvent('enterFrame', frameNo);\n } catch(err) {\n console.error('RLottiePlayer renderFrame error:', err/* , frame */, this.width, this.height);\n this.autoplay = false;\n this.pause();\n }\n }\n\n public renderFrame(frame: Parameters<RLottiePlayer['renderFrame2']>[0], frameNo: number) {\n const canCacheFrame = this.cachingDelta && (frameNo % this.cachingDelta || !frameNo);\n if(canCacheFrame) {\n if(frame instanceof Uint8ClampedArray && !this.cache.frames.has(frameNo)) {\n this.cache.frames.set(frameNo, new Uint8ClampedArray(frame));// frame;\n } else if(IS_IMAGE_BITMAP_SUPPORTED && frame instanceof ImageBitmap && !this.cache.framesNew.has(frameNo)) {\n this.cache.framesNew.set(frameNo, frame);\n }\n }\n\n /* if(!this.listenerResults.hasOwnProperty('cached')) {\n this.setListenerResult('enterFrame', frameNo);\n if(frameNo === (this.frameCount - 1)) {\n this.setListenerResult('cached');\n }\n\n return;\n } */\n\n if(this.frInterval) {\n const now = Date.now(), delta = now - this.frThen;\n\n if(delta < 0) {\n const timeout = this.frInterval > -delta ? -delta % this.frInterval : this.frInterval;\n if(this.rafId) clearTimeout(this.rafId);\n this.rafId = window.setTimeout(() => {\n this.renderFrame2(frame, frameNo);\n }, timeout);\n // await new Promise((resolve) => setTimeout(resolve, -delta % this.frInterval));\n return;\n }\n }\n\n this.renderFrame2(frame, frameNo);\n }\n\n public requestFrame(frameNo: number) {\n const frame = this.cache.frames.get(frameNo);\n const frameNew = this.cache.framesNew.get(frameNo);\n if(frameNew) {\n this.renderFrame(frameNew, frameNo);\n } else if(frame) {\n this.renderFrame(frame, frameNo);\n } else {\n if(this.clamped && !this.clamped.length) { // fix detached\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n\n this.sendQuery(['renderFrame', frameNo], this.clamped ? [this.clamped.buffer] : undefined);\n }\n }\n\n private onLap() {\n ++this.playedTimes;\n if(typeof(this.loop) === 'number' && this.playedTimes >= this.loop) {\n this.loop =\n this.autoplay =\n this._loop =\n this._autoplay =\n false;\n }\n\n if(!this.loop) {\n this.clearCache();\n this.pause(false);\n return false;\n }\n\n return true;\n }\n\n private mainLoopForwards() {\n const {skipDelta, maxFrame} = this;\n const frame = (this.curFrame + skipDelta) > maxFrame ? this.curFrame = (this.loop ? this.minFrame : this.maxFrame) : this.curFrame += skipDelta;\n // console.log('mainLoopForwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame + skipDelta) > maxFrame) {\n return this.onLap();\n }\n\n return true;\n }\n\n private mainLoopBackwards() {\n const {skipDelta, minFrame} = this;\n const frame = (this.curFrame - skipDelta) < minFrame ? this.curFrame = (this.loop ? this.maxFrame : this.minFrame) : this.curFrame -= skipDelta;\n // console.log('mainLoopBackwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame - skipDelta) < minFrame) {\n return this.onLap();\n }\n\n return true;\n }\n\n public setMainLoop() {\n // window.cancelAnimationFrame(this.rafId);\n clearTimeout(this.rafId);\n this.rafId = undefined;\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n\n // console.trace('setMainLoop', this.frInterval, this.direction, this, JSON.stringify(this.listenerResults), this.listenerResults);\n\n const method = (this.direction === 1 ? this.mainLoopForwards : this.mainLoopBackwards).bind(this);\n this.currentMethod = method;\n // this.frameListener && this.removeListener('enterFrame', this.frameListener);\n\n // setTimeout(() => {\n // this.addListener('enterFrame', this.frameListener);\n // }, 0);\n\n if(this.frameListener) {\n const lastResult = this.listenerResults.enterFrame;\n if(lastResult !== undefined) {\n this.frameListener(this.curFrame);\n }\n }\n\n // this.mainLoop(method);\n // this.r(method);\n // method();\n }\n\n public playPart(options: {\n from: number,\n to: number,\n callback?: () => void\n }) {\n this.pause();\n\n const {from, to, callback} = options;\n this.curFrame = from - 1;\n\n return this.playToFrame({\n frame: to,\n direction: to > from ? 1 : -1,\n callback\n });\n }\n\n public playToFrame(options: {\n frame: number,\n speed?: number,\n direction?: number,\n callback?: () => void\n }) {\n this.pause();\n\n const {frame, speed, callback, direction} = options;\n this.setDirection(direction === undefined ? this.curFrame > frame ? -1 : 1 : direction);\n speed !== undefined && this.setSpeed(speed);\n\n const bounds = [this.curFrame, frame];\n if(this.direction === -1) bounds.reverse();\n\n this.loop = false;\n this.setMinMax(bounds[0], bounds[1]);\n\n if(this.playToFrameOnFrameCallback) {\n this.removeEventListener('enterFrame', this.playToFrameOnFrameCallback);\n }\n\n if(callback) {\n this.playToFrameOnFrameCallback = (frameNo: number) => {\n if(frameNo === frame) {\n this.removeEventListener('enterFrame', this.playToFrameOnFrameCallback);\n callback();\n }\n };\n\n this.addEventListener('enterFrame', this.playToFrameOnFrameCallback);\n }\n\n this.play();\n }\n\n public setColor(color: RLottieColor | string, renderIfPaused: boolean) {\n if(typeof(color) === 'string') {\n this.textColor = color;\n } else {\n this.color = color;\n }\n\n if(renderIfPaused && this.paused) {\n this.applyColorForAllContexts();\n // this.renderFrame2(this.imageData?.data, this.curFrame);\n }\n }\n\n private setMinMax(minFrame = 0, maxFrame = this.frameCount - 1) {\n this.minFrame = minFrame;\n this.maxFrame = maxFrame;\n }\n\n public async onLoad(frameCount: number, fps: number) {\n this.frameCount = frameCount;\n this.fps = fps;\n this.setMinMax();\n if(this.initFrame !== undefined) {\n this.initFrame = clamp(this.initFrame, this.minFrame, this.maxFrame);\n }\n\n const curFrame = this.resetCurrentFrame();\n\n // * Handle 30fps stickers if 30fps set\n if(this.fps < 60 && this.skipDelta !== 1) {\n const diff = 60 / fps;\n this.skipDelta = this.skipDelta / diff | 0;\n }\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n // this.sendQuery('renderFrame', 0);\n\n // Кешировать сразу не получится, рендер стикера (тайгер) занимает 519мс,\n // если рендерить 75% с получением каждого кадра из воркера, будет 475мс, т.е. при 100% было бы 593мс, потеря на передаче 84мс.\n\n /* console.time('cache' + this.reqId);\n for(let i = 0; i < frameCount; ++i) {\n //if(this.removed) return;\n\n if(i % 4) {\n await new Promise((resolve) => {\n delete this.listenerResults.enterFrame;\n this.addListener('enterFrame', resolve, true);\n this.requestFrame(i);\n });\n }\n }\n\n console.timeEnd('cache' + this.reqId); */\n // console.log('cached');\n /* this.el.innerHTML = '';\n this.el.append(this.canvas);\n return; */\n\n !this.skipFirstFrameRendering && this.requestFrame(curFrame);\n this.dispatchEvent('ready');\n this.addEventListener('enterFrame', () => {\n this.dispatchEvent('firstFrame');\n\n if(!this.canvas[0].parentNode && this.el?.[0] && !this.overrideRender) {\n this.el.forEach((container, idx) => container.append(this.canvas[idx]));\n }\n\n // console.log('enterFrame firstFrame');\n\n // let lastTime = this.frThen;\n this.frameListener = () => {\n if(this.paused || !this.currentMethod) {\n return;\n }\n\n const time = Date.now();\n // console.log(`enterFrame handle${this.reqId}`, time, (time - lastTime), this.frInterval);\n /* if(Math.round(time - lastTime + this.frInterval * 0.25) < Math.round(this.frInterval)) {\n return;\n } */\n\n // lastTime = time;\n\n this.frThen = time + this.frInterval;\n const canContinue = this.currentMethod();\n if(!canContinue && !this.loop && this.autoplay) {\n this.autoplay = false;\n }\n };\n\n this.addEventListener('enterFrame', this.frameListener);\n // setInterval(this.frameListener, this.frInterval);\n\n // ! fix autoplaying since there will be no animationIntersector for it\n if(this.group === 'none' && this.autoplay) {\n this.play();\n }\n }, {once: true});\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\nimport CAN_USE_TRANSFERABLES from '../../environment/canUseTransferables';\nimport EventListenerBase from '../../helpers/eventListenerBase';\n\nexport default class QueryableWorker extends EventListenerBase<{\n ready: () => void,\n frame: (reqId: number, frameNo: number, frame: Uint8ClampedArray | ImageBitmap) => void,\n loaded: (reqId: number, frameCount: number, fps: number) => void,\n error: (reqId: number, error: Error) => void,\n workerError: (error: ErrorEvent) => void\n}> {\n constructor(private worker: Worker) {\n super();\n\n this.worker.onerror = (error) => {\n try {\n this.dispatchEvent('workerError', error);\n this.cleanup();\n this.terminate();\n } catch(err) {\n\n }\n };\n\n this.worker.onmessage = (event) => {\n this.dispatchEvent(event.data.queryMethodListener, ...event.data.queryMethodArguments);\n };\n }\n\n public postMessage(message: any) {\n this.worker.postMessage(message);\n }\n\n public terminate() {\n this.worker.terminate();\n }\n\n public sendQuery(args: any[], transfer?: Transferable[]) {\n this.worker.postMessage({\n queryMethod: args.shift(),\n queryMethodArguments: args\n }, CAN_USE_TRANSFERABLES ? transfer: undefined);\n }\n}\n","const IS_WEB_ASSEMBLY_SUPPORTED = typeof(WebAssembly) !== 'undefined';\n\nexport default IS_WEB_ASSEMBLY_SUPPORTED;\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 animationIntersector from '../../components/animationIntersector';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport pause from '../../helpers/schedulers/pause';\nimport {logger, LogTypes} from '../logger';\nimport RLottiePlayer, {RLottieOptions} from './rlottiePlayer';\nimport QueryableWorker from './queryableWorker';\nimport blobConstruct from '../../helpers/blob/blobConstruct';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport IS_WEB_ASSEMBLY_SUPPORTED from '../../environment/webAssemblySupport';\nimport makeError from '../../helpers/makeError';\nimport App from '../../config/app';\nimport rootScope from '../rootScope';\nimport toArray from '../../helpers/array/toArray';\n\nexport type LottieAssetName = 'EmptyFolder' | 'Folders_1' | 'Folders_2' |\n 'TwoFactorSetupMonkeyClose' | 'TwoFactorSetupMonkeyCloseAndPeek' |\n 'TwoFactorSetupMonkeyCloseAndPeekToIdle' | 'TwoFactorSetupMonkeyIdle' |\n 'TwoFactorSetupMonkeyPeek' | 'TwoFactorSetupMonkeyTracking' |\n 'voice_outlined2' | 'voip_filled' | 'voice_mini' | 'jolly_roger' |\n 'Gift3' | 'Gift6' | 'Gift12' | 'Folders_Shared' | 'UtyanSearch' |\n 'UtyanDiscussion' | 'UtyanLinks' | 'UtyanStories' | 'ReactionGeneric' |\n 'StatsEmoji' | 'Congratulations' | 'large_lastseen' | 'large_readtime';\n\nexport class LottieLoader {\n private loadPromise: Promise<void> = !IS_WEB_ASSEMBLY_SUPPORTED ? Promise.reject(makeError('NO_WASM')) : undefined;\n private loaded = false;\n\n private workersLimit = App.threads;\n private players: {[reqId: number]: RLottiePlayer} = {};\n private playersByCacheName: {[cacheName: string]: Set<RLottiePlayer>} = {};\n\n private workers: QueryableWorker[] = [];\n private curWorkerNum = 0;\n\n private log = logger('LOTTIE', LogTypes.Error);\n\n constructor() {\n rootScope.addEventListener('theme_changed', () => {\n for(const reqId in this.players) {\n this.players[reqId].applyColorForAllContexts();\n }\n });\n }\n\n public getAnimation(element: HTMLElement) {\n for(const i in this.players) {\n if(this.players[i].el.includes(element)) {\n return this.players[i];\n }\n }\n\n return null;\n }\n\n public loadLottieWorkers() {\n if(this.loadPromise) {\n return this.loadPromise;\n }\n\n return this.loadPromise = new Promise((resolve, reject) => {\n let remain = this.workersLimit;\n for(let i = 0; i < this.workersLimit; ++i) {\n const worker = new Worker(new URL('./rlottie.worker.ts', import.meta.url), {type: 'module'});\n const queryableWorker = this.workers[i] = new QueryableWorker(worker);\n\n queryableWorker.addEventListener('ready', () => {\n this.log('worker #' + i + ' ready');\n\n queryableWorker.addEventListener('frame', this.onFrame);\n queryableWorker.addEventListener('loaded', this.onPlayerLoaded);\n queryableWorker.addEventListener('error', this.onPlayerError);\n\n --remain;\n if(!remain) {\n this.log('workers ready');\n resolve();\n this.loaded = true;\n }\n }, {once: true});\n\n queryableWorker.addEventListener('workerError', (error) => {\n reject('rlottie load error: ' + error.message);\n this.loaded = false;\n }, {once: true});\n }\n });\n }\n\n public makeAssetUrl(name: LottieAssetName) {\n return 'assets/tgs/' + name + '.json';\n }\n\n public loadAnimationAsAsset(params: Omit<RLottieOptions, 'animationData' | 'name'>, name: LottieAssetName) {\n // (params as RLottieOptions).name = name;\n return this.loadAnimationFromURL(params, this.makeAssetUrl(name));\n }\n\n public loadAnimationDataFromURL(url: string, method: 'json'): Promise<any>;\n public loadAnimationDataFromURL(url: string, method?: 'blob'): Promise<Blob>;\n public loadAnimationDataFromURL(url: string, method: 'json' | 'blob' = 'blob'): Promise<Blob | any> {\n if(!IS_WEB_ASSEMBLY_SUPPORTED) {\n return this.loadPromise as any;\n }\n\n this.loadLottieWorkers();\n\n return fetch(url)\n .then((res) => {\n if(!res.headers || res.headers.get('content-type') === 'application/octet-stream') {\n return res.arrayBuffer()\n .then((data) => apiManagerProxy.invokeCrypto('gzipUncompress', data))\n .then((arr) => blobConstruct(arr as Uint8Array, ''));\n } else {\n return res[method]();\n }\n });\n /* .then((str) => {\n return new Promise<string>((resolve) => setTimeout(() => resolve(str), 2e3));\n }) */\n }\n\n public loadAnimationFromURLManually(name: LottieAssetName) {\n const url = this.makeAssetUrl(name);\n return this.loadAnimationDataFromURL(url).then((blob) => {\n return (params: Omit<RLottieOptions, 'animationData'>) => this.loadAnimationFromURLNext(blob, params, url);\n });\n }\n\n public loadAnimationFromURL(params: Omit<RLottieOptions, 'animationData'>, url: string) {\n return this.loadAnimationDataFromURL(url).then((blob) => {\n return this.loadAnimationFromURLNext(blob, params, url);\n });\n }\n\n public loadAnimationFromURLNext(blob: Blob, params: Omit<RLottieOptions, 'animationData'>, url: string) {\n const newParams = Object.assign(params, {animationData: blob, needUpscale: true});\n newParams.name ||= url;\n return this.loadAnimationWorker(newParams);\n }\n\n public waitForFirstFrame(player: RLottiePlayer) {\n return Promise.race([\n /* new Promise<void>((resolve) => {\n player.addEventListener('firstFrame', () => {\n setTimeout(() => resolve(), 1500);\n }, true);\n }) */\n new Promise<void>((resolve) => {\n player.addEventListener('firstFrame', resolve, {once: true});\n }),\n pause(2500)\n ]).then(() => player);\n }\n\n public async loadAnimationWorker(params: RLottieOptions): Promise<RLottiePlayer> {\n if(!IS_WEB_ASSEMBLY_SUPPORTED) {\n return this.loadPromise as any;\n }\n\n if(!this.loaded) {\n await this.loadLottieWorkers();\n }\n\n const {middleware, group = ''} = params;\n if(middleware && !middleware()) {\n throw makeError('MIDDLEWARE');\n }\n\n if(params.sync) {\n const cacheName = RLottiePlayer.CACHE.generateName(params.name, params.width, params.height, params.color, params.toneIndex);\n const players = this.playersByCacheName[cacheName];\n if(players?.size) {\n return Promise.resolve(players.entries().next().value[0]);\n }\n }\n\n const containers = toArray(params.container);\n if(!params.width || !params.height) {\n params.width = parseInt(containers[0].style.width);\n params.height = parseInt(containers[0].style.height);\n }\n\n if(!params.width || !params.height) {\n throw new Error('No size for sticker!');\n }\n\n params.group = group;\n\n const player = this.initPlayer(containers, params);\n\n animationIntersector.addAnimation({\n animation: player,\n group,\n observeElement: player.el[0],\n controlled: middleware,\n liteModeKey: params.liteModeKey,\n type: 'lottie'\n });\n\n if(!params.sync) {\n // * have to use onClean here, SuperStickerRenderer relies on it\n middleware?.onClean(() => {\n player.remove();\n });\n }\n\n return player;\n }\n\n private onPlayerLoaded = (reqId: number, frameCount: number, fps: number) => {\n const player = this.players[reqId];\n if(!player) {\n this.log.warn('onPlayerLoaded on destroyed player:', reqId, frameCount);\n return;\n }\n\n this.log.debug('onPlayerLoaded');\n player.onLoad(frameCount, fps);\n };\n\n private onFrame = (reqId: number, frameNo: number, frame: Uint8ClampedArray | ImageBitmap) => {\n const player = this.players[reqId];\n if(!player) {\n this.log.warn('onFrame on destroyed player:', reqId, frameNo);\n return;\n }\n\n if(player.clamped !== undefined && frame instanceof Uint8ClampedArray) {\n player.clamped = frame;\n }\n\n player.renderFrame(frame, frameNo);\n };\n\n private onPlayerError = (reqId: number, error: Error) => {\n const player = this.players[reqId];\n if(!player) {\n return;\n }\n\n // ! will need refactoring later, this is not the best way to remove the animation\n const animations = animationIntersector.getAnimations(player.el[0]);\n animations.forEach((animation) => {\n animationIntersector.removeAnimation(animation);\n });\n };\n\n public onDestroy(reqId: number) {\n delete this.players[reqId];\n }\n\n public destroyWorkers() {\n if(!IS_WEB_ASSEMBLY_SUPPORTED) {\n return;\n }\n\n this.workers.forEach((worker, idx) => {\n worker.terminate();\n this.log('worker #' + idx + ' terminated');\n });\n\n this.log('workers destroyed');\n this.workers.length = 0;\n this.curWorkerNum = 0;\n this.loaded = false;\n this.loadPromise = undefined;\n }\n\n private initPlayer(el: RLottiePlayer['el'], options: RLottieOptions) {\n const player = new RLottiePlayer({\n el,\n worker: this.workers[this.curWorkerNum++],\n options\n });\n\n const {reqId, cacheName} = player;\n this.players[reqId] = player;\n\n const playersByCacheName = cacheName ? this.playersByCacheName[cacheName] ??= new Set() : undefined;\n if(cacheName) {\n playersByCacheName.add(player);\n }\n\n if(this.curWorkerNum >= this.workers.length) {\n this.curWorkerNum = 0;\n }\n\n player.addEventListener('destroy', () => {\n this.onDestroy(reqId);\n if(playersByCacheName.delete(player) && !playersByCacheName.size) {\n delete this.playersByCacheName[cacheName];\n }\n });\n\n player.loadFromData(options.animationData);\n\n return player;\n }\n}\n\nconst lottieLoader = new LottieLoader();\nMOUNT_CLASS_TO.lottieLoader = lottieLoader;\nexport default lottieLoader;\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\nexport default function replaceContent(elem: HTMLElement, node: string | Node) {\n if(typeof(node) === 'string') {\n elem.textContent = node;\n return;\n }\n\n // * children.length doesn't count text nodes\n const firstChild = elem.firstChild;\n if(firstChild) {\n if(elem.lastChild === firstChild) {\n firstChild.replaceWith(node);\n } else {\n elem.textContent = '';\n elem.append(node);\n }\n } else {\n elem.append(node);\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\nimport toArray from '../array/toArray';\n\nexport default function toggleDisability(elements: HTMLElement | HTMLElement[], disable: boolean): () => void {\n elements = toArray(elements);\n\n if(disable) {\n elements.forEach((el) => el.setAttribute('disabled', 'true'));\n } else {\n elements.forEach((el) => el.removeAttribute('disabled'));\n }\n\n return () => toggleDisability(elements, !disable);\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 IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\n\nexport default function placeCaretAtEnd(el: HTMLElement, ignoreTouchCheck = false, focus = true) {\n if(IS_TOUCH_SUPPORTED && (!ignoreTouchCheck || (document.activeElement.tagName !== 'INPUT' && !(document.activeElement as HTMLElement).isContentEditable))) {\n return;\n }\n\n focus && el.focus();\n if(el instanceof HTMLInputElement) {\n const length = el.value.length;\n el.selectionStart = length;\n el.selectionEnd = length;\n } else {\n const range = document.createRange();\n range.selectNodeContents(el);\n range.collapse(false);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n }\n}\n\n(window as any).placeCaretAtEnd = placeCaretAtEnd;\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\ntype TargetType = HTMLElement;\nexport type OnVisibilityChangeItem = {target: TargetType, visible: boolean, entry: IntersectionObserverEntry, index: number};\nexport type OnVisibilityChange = (item: OnVisibilityChangeItem) => void;\n\nexport default class VisibilityIntersector {\n private observer: IntersectionObserver;\n private items: Map<TargetType, boolean> = new Map();\n private locked = false;\n\n constructor(onVisibilityChange: OnVisibilityChange, options?: IntersectionObserverInit) {\n this.observer = new IntersectionObserver((entries) => {\n if(this.locked) {\n return;\n }\n\n const changed: OnVisibilityChangeItem[] = [];\n\n entries.forEach((entry, index) => {\n const target = entry.target as TargetType;\n\n if(this.items.get(target) === entry.isIntersecting) {\n return;\n } else {\n this.items.set(target, entry.isIntersecting);\n }\n\n /* if(entry.isIntersecting) {\n console.log('ooo', entry);\n } */\n\n /* if(this.locked) {\n return;\n } */\n\n const change: typeof changed[0] = {target, visible: entry.isIntersecting, entry, index};\n\n // ! order will be incorrect so can't use it\n // changed[entry.isIntersecting ? 'unshift' : 'push'](change);\n changed.push(change);\n\n // onVisibilityChange(target, entry.isIntersecting);\n });\n\n changed.forEach((item) => {\n onVisibilityChange(item);\n });\n }, options);\n }\n\n public getVisible() {\n const items: TargetType[] = [];\n this.items.forEach((value, key) => {\n if(value) {\n items.push(key);\n }\n });\n\n return items;\n }\n\n public clearVisible() {\n const visible = this.getVisible();\n for(const target of visible) {\n this.items.set(target, false);\n }\n }\n\n public isVisible(target: TargetType) {\n return !!this.items.get(target);\n }\n\n public disconnect() {\n this.observer.disconnect();\n this.items.clear();\n }\n\n public refresh() {\n this.observer.disconnect();\n\n // window.requestAnimationFrame(() => {\n const targets = [...this.items.keys()];\n for(const target of targets) {\n // this.items.set(target, false);\n this.observer.observe(target);\n }\n // });\n }\n\n public refreshVisible() {\n const visible = this.getVisible();\n for(const target of visible) {\n this.observer.unobserve(target);\n }\n\n for(const target of visible) {\n this.observer.observe(target);\n }\n }\n\n public observe(target: TargetType) {\n this.items.set(target, false);\n this.observer.observe(target);\n }\n\n public unobserve(target: TargetType) {\n this.observer.unobserve(target);\n this.items.delete(target);\n }\n\n public unlock() {\n this.locked = false;\n }\n\n public unlockAndRefresh() {\n this.unlock();\n this.refresh();\n }\n\n public lock() {\n this.locked = true;\n }\n}\n","export default function findAndSpliceAll<T>(array: Array<T>, verify: (value: T, index: number, arr: typeof array) => boolean) {\n const out: typeof array = [];\n let idx = -1;\n while((idx = array.findIndex(verify)) !== -1) {\n out.push(array.splice(idx, 1)[0]);\n }\n\n return out;\n}\n","export default function findAndSplice<T>(array: Array<T>, verify: (value: T, index?: number, array?: Array<T>) => boolean) {\n const index = array.findIndex(verify);\n return index !== -1 ? array.splice(index, 1)[0] : undefined;\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\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport {Middleware} from '../helpers/middleware';\nimport throttle from '../helpers/schedulers/throttle';\nimport {logger, LogTypes} from '../lib/logger';\n\nconst PARALLEL_LIMIT = 8;\nconst IGNORE_ERRORS: Set<ErrorType> = new Set(['NO_ENTRY_FOUND', 'STORAGE_OFFLINE', 'MIDDLEWARE', 'NO_AUTO_DOWNLOAD']);\n\nexport type LazyLoadElementBase = {\n load: () => Promise<any>,\n middleware?: Middleware\n};\n\nexport default class LazyLoadQueueBase {\n public queueId = 0;\n protected queue: Array<LazyLoadElementBase> = [];\n protected inProcess: Set<LazyLoadElementBase> = new Set();\n\n protected lockPromise: Promise<void> = null;\n protected unlockResolve: () => void = null;\n\n protected log = logger('LL', LogTypes.Error);\n protected processQueue: () => void;\n\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\n this.processQueue = throttle(() => this._processQueue(), 8, false);\n }\n\n public clear() {\n this.inProcess.clear(); // ацтеки забьются, будет плохо\n\n this.queue.length = 0;\n // unreachable code\n /* for(let item of this.inProcess) {\n this.lazyLoadMedia.push(item);\n } */\n }\n\n public lock() {\n if(this.lockPromise) return;\n\n // const perf = performance.now();\n this.lockPromise = new Promise((resolve, reject) => {\n this.unlockResolve = resolve;\n });\n\n /* if(DEBUG) {\n this.lockPromise.then(() => {\n this.log('was locked for:', performance.now() - perf);\n });\n } */\n }\n\n public unlock() {\n if(!this.unlockResolve) return;\n\n this.unlockResolve();\n this.unlockResolve = this.lockPromise = null;\n\n this.processQueue();\n }\n\n protected async processItem(item: LazyLoadElementBase) {\n if(this.lockPromise) {\n return;\n }\n\n this.inProcess.add(item);\n\n /* if(DEBUG) {\n this.log('will load media', this.lockPromise, item);\n } */\n\n try {\n // await new Promise((resolve) => setTimeout(resolve, 2e3));\n // await new Promise((resolve, reject) => window.requestAnimationFrame(() => window.requestAnimationFrame(resolve)));\n // await item.load(item.div);\n await this.loadItem(item);\n } catch(err) {\n if(!IGNORE_ERRORS.has((err as ApiError)?.type)) {\n this.log.error('loadMediaQueue error:', err/* , item */);\n }\n }\n\n this.inProcess.delete(item);\n\n /* if(DEBUG) {\n this.log('loaded media', item);\n } */\n\n this.processQueue();\n }\n\n protected loadItem(item: LazyLoadElementBase) {\n return item.load();\n }\n\n protected getItem() {\n return this.queue.shift();\n }\n\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElementBase) {\n this.queue[method](el);\n this.processQueue();\n }\n\n protected _processQueue(item?: LazyLoadElementBase) {\n if(!this.queue.length || this.lockPromise || (this.parallelLimit > 0 && this.inProcess.size >= this.parallelLimit)) return;\n\n // console.log('_processQueue start');\n // let added = 0;\n do {\n if(item) {\n indexOfAndSplice(this.queue, item);\n } else {\n item = this.getItem();\n }\n\n if(item) {\n this.processItem(item);\n } else {\n break;\n }\n\n item = null;\n // ++added;\n } while(this.inProcess.size < this.parallelLimit && this.queue.length);\n // console.log('_processQueue end, added', added, this.queue.length);\n }\n\n public push(el: LazyLoadElementBase) {\n this.addElement('push', el);\n }\n\n public unshift(el: LazyLoadElementBase) {\n this.addElement('unshift', el);\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\nimport findAndSpliceAll from '../helpers/array/findAndSpliceAll';\nimport LazyLoadQueueBase, {LazyLoadElementBase} from './lazyLoadQueueBase';\nimport VisibilityIntersector from './visibilityIntersector';\n\nexport type LazyLoadElement = Omit<LazyLoadElementBase, 'load'> & {\n load: (target?: HTMLElement) => Promise<any>,\n div: HTMLElement\n wasSeen?: boolean,\n visible?: boolean\n};\n\nexport default class LazyLoadQueueIntersector extends LazyLoadQueueBase {\n protected queue: Array<LazyLoadElement> = [];\n protected inProcess: Set<LazyLoadElement> = new Set();\n\n public intersector: VisibilityIntersector;\n protected intersectorTimeout: number;\n\n constructor(parallelLimit?: number) {\n super(parallelLimit);\n }\n\n public lock() {\n super.lock();\n this.intersector.lock();\n }\n\n public unlock() {\n super.unlock();\n this.intersector.unlock();\n }\n\n public unlockAndRefresh() {\n super.unlock();\n this.intersector.unlockAndRefresh();\n }\n\n public clear() {\n super.clear();\n this.intersector.disconnect();\n }\n\n public refresh() {\n this.intersector.refresh();\n }\n\n protected loadItem(item: LazyLoadElement) {\n return item.load(item.div);\n }\n\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\n const item = this.queue.find((i) => i.div === el.div && i.load === el.load);\n if(item) {\n return false;\n } else {\n for(const item of this.inProcess) {\n if(item.div === el.div && item.load === el.load) {\n return false;\n }\n }\n }\n\n this.queue[method](el);\n return true;\n }\n\n protected setProcessQueueTimeout() {\n this.intersectorTimeout ??= window.setTimeout(() => {\n this.intersectorTimeout = undefined;\n this.processQueue();\n }, 0);\n }\n\n public push(el: LazyLoadElement) {\n super.push(el);\n }\n\n public unshift(el: LazyLoadElement) {\n super.unshift(el);\n }\n\n public delete(el: Omit<LazyLoadElement, 'load'>) {\n findAndSpliceAll(this.queue, (i) => i.div === el.div);\n this.unobserve(el);\n }\n\n public observe(el: LazyLoadElement) {\n this.intersector.observe(el.div);\n }\n\n public unobserve(el: Omit<LazyLoadElement, 'load'>) {\n this.intersector.unobserve(el.div);\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\nimport VisibilityIntersector, {OnVisibilityChangeItem} from './visibilityIntersector';\nimport findAndSpliceAll from '../helpers/array/findAndSpliceAll';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport LazyLoadQueueIntersector, {LazyLoadElement} from './lazyLoadQueueIntersector';\nimport useHeavyAnimationCheck from '../hooks/useHeavyAnimationCheck';\n\nexport default class LazyLoadQueue extends LazyLoadQueueIntersector {\n constructor(parallelLimit?: number, ignoreHeavyAnimation?: boolean) {\n super(parallelLimit);\n\n this.intersector = new VisibilityIntersector(this.onVisibilityChange);\n\n !ignoreHeavyAnimation && useHeavyAnimationCheck(() => {\n this.lock();\n }, () => {\n this.unlockAndRefresh();\n });\n }\n\n private onVisibilityChange = ({target, visible}: OnVisibilityChangeItem) => {\n // if(DEBUG) {\n // this.log('isIntersecting', target, visible);\n // }\n\n // if visible - will move to the end of visible arary\n findAndSpliceAll(this.queue, (i) => i.div === target).forEach((item) => {\n if(visible) {\n item.wasSeen = true;\n }\n\n item.visible = visible;\n const index = this.queue.findIndex((item) => !item.visible);\n this.queue.splice(Math.max(0, index), 0, item);\n });\n\n this.setProcessQueueTimeout();\n };\n\n protected getItem() {\n return findAndSplice(this.queue, (item) => item.wasSeen);\n }\n\n public async processItem(item: LazyLoadElement) {\n await super.processItem(item);\n this.intersector.unobserve(item.div);\n }\n\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\n const inserted = super.addElement(method, el);\n\n if(!inserted) return false;\n\n this.observe(el);\n /* if(el.wasSeen) {\n this.processQueue(el);\n } else */\n el.wasSeen ??= false;\n\n return true;\n }\n\n public setAllSeen() {\n this.queue.forEach((item) => {\n item.wasSeen = true;\n });\n\n this.setProcessQueueTimeout();\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\n/**\n * https://core.telegram.org/api/files#vector-thumbnails\n */\nexport default function getPathFromBytes(bytes: Uint8Array) {\n const lookup = 'AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,';\n\n let path = 'M';\n for(let i = 0, length = bytes.length; i < length; ++i) {\n const num = bytes[i];\n\n if(num >= (128 + 64)) {\n path += lookup[num - 128 - 64];\n } else {\n if(num >= 128) {\n path += ',';\n } else if(num >= 64) {\n path += '-';\n }\n path += '' + (num & 63);\n }\n }\n path += 'z';\n\n return path;\n}\n","let outCanvas: HTMLCanvasElement,\n outContext: CanvasRenderingContext2D;\n\n// https://github.com/telegramdesktop/tdesktop/blob/543bfab24a76402992421063f1e6444f347d31fe/Telegram/SourceFiles/boxes/sticker_set_box.cpp#L75\nexport default function computeLockColor(canvas: HTMLCanvasElement) {\n if(!outCanvas) {\n outCanvas = document.createElement('canvas');\n outContext = outCanvas.getContext('2d');\n }\n\n const context = canvas.getContext('2d');\n const size = 20 * (canvas.dpr ?? 1);\n const width = size;\n const height = size;\n const skipx = (canvas.width - width) / 2;\n const margin = 0/* * (canvas.dpr ?? 1) */;\n const skipy = canvas.height - height - margin;\n const imageData = context.getImageData(skipx, skipy, width, height).data;\n let sr = 0, sg = 0, sb = 0, sa = 0;\n for(let i = 0; i < imageData.length; i += 4) {\n sr += imageData[i];\n sg += imageData[i + 1];\n sb += imageData[i + 2];\n sa += imageData[i + 3];\n }\n\n outCanvas.width = outCanvas.height = size;\n const color = new Uint8ClampedArray([sr * 255 / sa, sg * 255 / sa, sb * 255 / sa, 255]);\n const rgba = `rgba(${color[0]}, ${color[1]}, ${color[2]}, ${color[3]})`;\n outContext.fillStyle = rgba;\n outContext.fillRect(0, 0, size, size);\n outContext.fillStyle = `rgba(112, 117, 121, 0.3)`;\n outContext.fillRect(0, 0, size, size);\n // document.querySelector('.popup-title').append(c);\n return outCanvas.toDataURL('image/jpeg');\n}\n","import {getHeavyAnimationPromise} from '../../hooks/useHeavyAnimationCheck';\nimport apiManagerProxy from '../../lib/mtproto/mtprotoworker';\nimport {Middleware} from '../middleware';\n\nfunction updateStreamInUse(url: string, inUse: boolean) {\n if(url.includes('stream/')) {\n apiManagerProxy.serviceMessagePort.invokeVoid('toggleStreamInUse', {url, inUse});\n }\n}\n\n// const createdVideos: Set<HTMLVideoElement> = new Set();\nexport default function createVideo({\n pip,\n middleware\n}: {\n pip?: boolean,\n middleware: Middleware\n}) {\n const video = document.createElement('video');\n if(!pip) video.disablePictureInPicture = true;\n video.setAttribute('playsinline', 'true');\n // createdVideos.add(video);\n\n middleware?.onDestroy(async() => {\n // createdVideos.delete(video);\n await getHeavyAnimationPromise();\n video.src = '';\n video.load();\n });\n\n let originalSrc = video.src;\n Object.defineProperty(video, 'src', {\n get: () => {\n return originalSrc;\n },\n set: (newValue) => {\n updateStreamInUse(originalSrc, false);\n updateStreamInUse(newValue, true);\n\n originalSrc = newValue;\n\n video.setAttribute('src', newValue);\n }\n });\n\n return video;\n}\n\n// (window as any).createdVideos = createdVideos;\n","export const CRBUG_1250841_ERROR = 'DECODER_ERROR_NOT_SUPPORTED: Audio configuration specified 2 channels, but FFmpeg thinks the file contains 1 channels';\n\nexport default function isCrbug1250841Error(err: MediaError) {\n return err.code === 4 && err.message === CRBUG_1250841_ERROR;\n}\n","import {IS_APPLE_MOBILE} from '../environment/userAgent';\nimport rootScope from '../lib/rootScope';\nimport callbackify from './callbackify';\nimport isCrbug1250841Error from './fixChromiumMp4.constants';\n\nexport function shouldIgnoreVideoError(e: ErrorEvent) {\n try {\n const target = e.target as HTMLVideoElement;\n const error = target.error;\n\n if(!error || error.message.includes('URL safety check')) {\n console.warn('will ignore video error', e);\n return true;\n }\n\n const isChromeBug = isCrbug1250841Error(error);\n if(isChromeBug && !(target as any).triedFixingChromeBug) {\n let srcPromise: MaybePromise<string>;\n const originalSrc = target.src;\n if(originalSrc.includes('stream/')) {\n srcPromise = originalSrc + '?_crbug1250841';\n } else {\n srcPromise = rootScope.managers.appDocsManager.fixChromiumMp4(originalSrc);\n }\n\n callbackify(srcPromise, (src) => {\n (target as any).triedFixingChromeBug = true;\n if(target.src === src) {\n return;\n }\n\n target.src = src;\n target.load();\n });\n return true;\n } else if(isChromeBug) {\n console.error('chrome video error', e);\n }\n } catch(err) {}\n\n return false;\n}\n\nexport default function onMediaLoad(media: HTMLMediaElement, readyState = media.HAVE_METADATA, useCanplayOnIos?: boolean) {\n return new Promise<void>((resolve, reject) => {\n if(media.readyState >= readyState) {\n resolve();\n return;\n }\n\n const loadEventName = IS_APPLE_MOBILE && !useCanplayOnIos ? 'loadeddata' : 'canplay';\n const errorEventName = 'error';\n const onLoad = () => {\n media.removeEventListener(errorEventName, onError);\n resolve();\n };\n const onError = (e: ErrorEvent) => {\n if(shouldIgnoreVideoError(e)) {\n return;\n }\n\n media.removeEventListener(loadEventName, onLoad);\n media.removeEventListener(errorEventName, onError);\n reject(media.error);\n };\n media.addEventListener(loadEventName, onLoad, {once: true});\n media.addEventListener(errorEventName, onError);\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\nimport onMediaLoad from '../onMediaLoad';\n\n// import { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\n\nexport const loadedURLs: {[url: string]: boolean} = {};\nconst set = (elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement, url: string) => {\n if(elem instanceof HTMLImageElement || elem instanceof HTMLVideoElement) elem.src = url;\n else if(elem instanceof SVGImageElement) elem.setAttributeNS(null, 'href', url);\n else elem.style.backgroundImage = 'url(' + url + ')';\n};\n\n// проблема функции в том, что она не подходит для ссылок, пригодна только для blob'ов, потому что обычным ссылкам нужен 'load' каждый раз.\nexport default function renderImageFromUrl(\n elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement,\n url: string,\n callback?: () => void,\n useCache?: boolean,\n processImageOnLoad?: (image: HTMLImageElement) => void\n): MaybePromise<void> {\n if(processImageOnLoad) useCache = false;\n useCache ??= processImageOnLoad === undefined;\n\n if(!url) {\n console.error('renderImageFromUrl: no url?', elem, url);\n callback?.();\n return;\n }\n\n const isVideo = elem instanceof HTMLVideoElement;\n if(((loadedURLs[url]/* && false */) && useCache) || isVideo) {\n /* if(isVideo) {\n const source = document.createElement('source');\n source.src = url;\n source.type = 'video/webm';\n elem.append(source);\n } else */if(elem) {\n set(elem, url);\n }\n\n if(callback) {\n if(isVideo) {\n return onMediaLoad(elem).then(callback);\n } else {\n callback?.();\n }\n // callback && getHeavyAnimationPromise().then(() => callback());\n }\n } else {\n const isImage = elem instanceof HTMLImageElement;\n const loader = isImage ? elem : new Image();\n // const loader = new Image();\n // let perf = performance.now();\n\n const onLoad = () => {\n if(!isImage && elem) {\n set(elem, url);\n }\n\n loadedURLs[url] = true;\n // console.log('onload:', url, performance.now(), loader.naturalWidth, loader.naturalHeight);\n processImageOnLoad?.(loader);\n // TODO: переделать прогрузки аватаров до начала анимации, иначе с этим ожиданием они неприятно появляются\n // callback && getHeavyAnimationPromise().then(() => callback());\n callback?.();\n\n // if(loader.naturalWidth) {\n // const interval = setInterval(() => {\n // if(!loader.naturalWidth) {\n // const parents = getParents(loader);\n // console.warn('image no dimensions', loader.isConnected, parents, (parents[parents.length - 1] as HTMLElement).outerHTML, loader.src === url);\n // }\n // }, 1);\n\n // setTimeout(() => clearInterval(interval), 1e3);\n // }\n };\n\n const onError = (err: DOMException) => {\n if(!err.message.includes('cannot be decoded')) {\n console.error('Render image from url failed:', err, url, loader, err.message, loader.naturalWidth);\n }\n\n callback?.();\n };\n\n loader.decoding = 'async';\n loader.src = url;\n return loader.decode().then(onLoad, onError);\n // const timeout = setTimeout(() => {\n // console.error('not yet decoded', loader, url);\n // debugger;\n // }, 1e3);\n // decodePromise.finally(() => {\n // clearTimeout(timeout);\n // });\n }\n}\n\nexport function renderImageFromUrlPromise(\n elem: Parameters<typeof renderImageFromUrl>[0],\n url: string,\n useCache?: boolean,\n processImageOnLoad?: (image: HTMLImageElement) => void\n) {\n return new Promise<void>((resolve) => {\n renderImageFromUrl(elem, url, resolve, useCache, processImageOnLoad);\n });\n}\n","export default function bytesFromHex(hexString: string) {\n const len = hexString.length;\n const bytes = new Uint8Array(Math.ceil(len / 2));\n let start = 0;\n\n if(len % 2) { // read 0x581 as 0x0581\n bytes[start++] = parseInt(hexString.charAt(0), 16);\n }\n\n for(let i = start; i < len; i += 2) {\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\n }\n\n return bytes;\n}\n","export default function bytesToDataURL(bytes: Uint8Array, mimeType: string = 'image/jpeg') {\n return `data:${mimeType};base64,${btoa(String.fromCharCode(...bytes))}`;\n}\n","export default function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\n if(bytes instanceof Uint8Array) {\n return bytes;\n } else if(typeof(bytes) === 'string') {\n return new TextEncoder().encode(bytes);\n }\n\n return new Uint8Array(bytes);\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\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport bytesFromHex from './bytesFromHex';\nimport bytesToDataURL from './bytesToDataURL';\nimport convertToUint8Array from './convertToUint8Array';\n\nconst JPEG_HEADER_HEX = 'ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00';\n\nconst JPEG_HEADER = bytesFromHex(JPEG_HEADER_HEX);\nconst JPEG_TAIL = bytesFromHex('ffd9');\n\nexport function getPreviewBytesFromURL(url: string) {\n const needle = 'base64,';\n const sliced = url.slice(url.indexOf(needle) + needle.length);\n const jpegBytes = [...atob(sliced)].map((char) => char.charCodeAt(0));\n\n return new Uint8Array(jpegBytes);\n // console.log('getPreviewBytesFromURL', bytesToHex(jpegBytes));\n\n // const n = JPEG_HEADER_HEX.slice(-10);\n // const one = jpegBytes[164];\n // const two = jpegBytes[166];\n\n // const body = jpegBytes.slice(bytesToHex(jpegBytes).indexOf(n) / 2 + n.length / 2/* JPEG_HEADER.length */, jpegBytes.length - JPEG_TAIL.length);\n // const original = new Uint8Array([\n // 0xFF,\n // one,\n // two,\n // ...body\n // ]);\n\n // console.log(bytesToHex(body));\n\n // return original;\n}\n\nexport default function getPreviewURLFromBytes(bytes: Uint8Array | number[], isSticker = false) {\n let arr: Uint8Array;\n if(!isSticker && bytes[0] === 0x1) {\n arr = new Uint8Array(JPEG_HEADER.concat(Array.from(bytes.slice(3)), JPEG_TAIL));\n arr[164] = bytes[1];\n arr[166] = bytes[2];\n } else {\n arr = convertToUint8Array(bytes);\n }\n\n let mimeType: string;\n if(isSticker) {\n mimeType = IS_SAFARI ? 'image/png' : 'image/webp';\n } else {\n mimeType = 'image/jpeg';\n }\n\n const dataURL = bytesToDataURL(arr, mimeType);\n return dataURL;\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\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport type {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {PhotoSize} from '../layer';\n// import appDownloadManager from \"../lib/appManagers/appDownloadManager\";\nimport getPreviewURLFromBytes from './bytes/getPreviewURLFromBytes';\n\nexport default function getPreviewURLFromThumb(photo: MyPhoto | MyDocument, thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize, isSticker = false) {\n // const cacheContext = appDownloadManager.getCacheContext(photo, thumb.type);\n // return cacheContext.url || (cacheContext.url = getPreviewURLFromBytes(thumb.bytes, isSticker));\n return getPreviewURLFromBytes(thumb.bytes, isSticker);\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\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\nimport {getHeavyAnimationPromise} from '../hooks/useHeavyAnimationCheck';\nimport {fastRaf} from './schedulers';\nimport {ArgumentTypes} from '../types';\n\ntype HeavyQueue<T extends HeavyQueue<any>> = {\n items: ArgumentTypes<T['process']>[],\n process: (...args: any[]) => ReturnType<T['process']>,\n context: any,\n promise?: CancellablePromise<ReturnType<T['process']>[]>\n};\nconst heavyQueue: HeavyQueue<any>[] = [];\nlet processingQueue = false;\n\nexport default function addHeavyTask<T extends HeavyQueue<T>>(queue: T, method: 'push' | 'unshift' = 'push') {\n if(!queue.items.length) {\n return Promise.resolve([]) as typeof promise;\n }\n\n const promise = queue.promise = deferredPromise();\n heavyQueue[method](queue);\n processHeavyQueue();\n\n return promise;\n}\n\nfunction processHeavyQueue() {\n if(!processingQueue) {\n const queue = heavyQueue.shift();\n timedChunk(queue).finally(() => {\n processingQueue = false;\n if(heavyQueue.length) {\n processHeavyQueue();\n }\n });\n }\n}\n\nfunction timedChunk<T extends HeavyQueue<T>>(queue: HeavyQueue<T>) {\n if(!queue.items.length) {\n queue.promise.resolve([] as any);\n return Promise.resolve([]);\n }\n\n const todo = queue.items.slice();\n const results: ReturnType<T['process']>[] = [];\n\n return new Promise<typeof results>((resolve, reject) => {\n const f = async() => {\n const start = performance.now();\n\n do {\n await getHeavyAnimationPromise();\n const possiblePromise = queue.process.apply(queue.context, todo.shift());\n let realResult: typeof results[0];\n // @ts-ignore\n if(possiblePromise instanceof Promise) {\n try {\n realResult = await possiblePromise;\n } catch(err) {\n reject(err);\n return;\n }\n } else {\n realResult = possiblePromise;\n }\n\n results.push(realResult);\n } while(todo.length > 0 && (performance.now() - start) < 6);\n\n if(todo.length > 0) {\n fastRaf(f);\n // setTimeout(f, 25);\n } else {\n resolve(results);\n }\n };\n\n fastRaf(f);\n // setTimeout(f, 25);\n }).then(queue.promise.resolve.bind(queue.promise), queue.promise.reject.bind(queue.promise));\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\nimport type fastBlur from '../vendor/fastBlur';\nimport addHeavyTask from './heavyQueue';\nimport IS_CANVAS_FILTER_SUPPORTED from '../environment/canvasFilterSupport';\n\nconst RADIUS = 2;\nconst ITERATIONS = 2;\n\nlet requireBlurPromise: Promise<any>;\nlet fastBlurFunc: typeof fastBlur;\nif(!IS_CANVAS_FILTER_SUPPORTED) {\n requireBlurPromise = import('../vendor/fastBlur').then((m) => {\n fastBlurFunc = m.default;\n });\n} else {\n requireBlurPromise = Promise.resolve();\n}\n\nfunction processBlurNext(\n img: HTMLImageElement,\n radius: number,\n iterations: number,\n canvas: HTMLCanvasElement = document.createElement('canvas')\n) {\n canvas.width = img.width;\n canvas.height = img.height;\n\n const ctx = canvas.getContext('2d', {alpha: false});\n if(IS_CANVAS_FILTER_SUPPORTED) {\n ctx.filter = `blur(${radius}px)`;\n ctx.drawImage(img, -radius * 2, -radius * 2, canvas.width + radius * 4, canvas.height + radius * 4);\n } else {\n ctx.drawImage(img, 0, 0);\n fastBlurFunc(ctx, 0, 0, canvas.width, canvas.height, radius, iterations);\n }\n\n return canvas;\n}\n\ntype CacheValue = {canvas: HTMLCanvasElement, promise: Promise<void>};\nconst cache: Map<string, CacheValue> = new Map();\nconst CACHE_SIZE = 150;\n\nexport default function blur(dataUri: string, radius: number = RADIUS, iterations: number = ITERATIONS) {\n if(!dataUri) {\n throw 'no dataUri for blur: ' + dataUri;\n }\n\n if(cache.size > CACHE_SIZE) {\n cache.clear();\n }\n\n const canvas = document.createElement('canvas');\n canvas.className = 'canvas-thumbnail';\n\n let cached = cache.get(dataUri);\n if(!cached) {\n const promise: CacheValue['promise'] = new Promise((resolve) => {\n // return resolve(dataUri);\n requireBlurPromise.then(() => {\n const img = new Image();\n img.onload = () => {\n // if(IS_CANVAS_FILTER_SUPPORTED) {\n // resolve(processBlurNext(img, radius, iterations));\n // } else {\n const promise = addHeavyTask({\n items: [[img, radius, iterations, canvas]],\n context: null,\n process: processBlurNext\n }, 'unshift');\n\n promise.then(() => {\n resolve();\n });\n // }\n };\n img.src = dataUri;\n });\n });\n\n cache.set(dataUri, cached = {\n canvas,\n promise\n });\n } else {\n canvas.width = cached.canvas.width;\n canvas.height = cached.canvas.height;\n cached.promise.then(() => {\n canvas.getContext('2d').drawImage(cached.canvas, 0, 0, canvas.width, canvas.height);\n });\n }\n\n return {\n ...cached,\n canvas\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\nimport {PhotoSize} from '../layer';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {renderImageFromUrlPromise} from './dom/renderImageFromUrl';\nimport getPreviewURLFromThumb from './getPreviewURLFromThumb';\nimport blur from './blur';\n\nexport default function getImageFromStrippedThumb(\n photo: MyPhoto | MyDocument,\n thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize,\n useBlur: boolean | number,\n url = getPreviewURLFromThumb(photo, thumb, false)\n) {\n let element: HTMLImageElement | HTMLCanvasElement, loadPromise: Promise<void>;\n if(!useBlur) {\n element = new Image();\n loadPromise = renderImageFromUrlPromise(element, url);\n } else {\n const result = blur(url, typeof(useBlur) === 'number' ? useBlur : undefined);\n element = result.canvas;\n loadPromise = result.promise;\n }\n\n element.classList.add('thumbnail');\n\n return {image: element, loadPromise};\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\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport {applyColorOnContext} from '../lib/rlottie/rlottiePlayer';\nimport rootScope from '../lib/rootScope';\nimport getStickerThumbKey from '../lib/storages/utils/thumbs/getStickerThumbKey';\nimport customProperties from './dom/customProperties';\n\nconst savingLottiePreview: {[docId: DocId]: {width: number, height: number}} = {};\n\nexport function isSavingLottiePreview(doc: MyDocument, toneIndex: number | string, width: number, height: number) {\n const key = getStickerThumbKey(doc.id, toneIndex);\n const saving = savingLottiePreview[key];\n return saving && saving.width >= width && saving.height >= height;\n}\n\nlet sharedCanvas: HTMLCanvasElement, sharedContext: CanvasRenderingContext2D;\nconst createCanvas = () => {\n rootScope.addEventListener('theme_changed', () => {\n rootScope.managers.thumbsStorage.clearColoredStickerThumbs();\n\n for(const key in savingLottiePreview) {\n const [, toneIndex] = key.split('-');\n if(toneIndex && isNaN(+toneIndex)) {\n delete savingLottiePreview[key];\n }\n }\n });\n\n sharedCanvas = document.createElement('canvas');\n sharedContext = sharedCanvas.getContext('2d');\n};\n\nexport async function saveLottiePreview(doc: MyDocument, canvas: HTMLCanvasElement, toneIndex: number | string) {\n const key = getStickerThumbKey(doc.id, toneIndex);\n const {width, height} = canvas;\n if(isSavingLottiePreview(doc, toneIndex, width, height)) {\n return;\n }\n\n const saving = savingLottiePreview[key] = {\n width,\n height\n };\n\n const thumb = await rootScope.managers.thumbsStorage.getStickerCachedThumb(doc.id, toneIndex);\n if(savingLottiePreview[key] !== saving) {\n return;\n }\n\n if(thumb && thumb.w >= width && thumb.h >= height) {\n return;\n }\n\n if(typeof(toneIndex) === 'string') {\n if(!sharedCanvas) {\n createCanvas();\n }\n\n sharedCanvas.width = width;\n sharedCanvas.height = height;\n sharedContext.drawImage(canvas, 0, 0, width, height);\n applyColorOnContext(sharedContext, customProperties.getProperty(toneIndex), 0, 0, width, height);\n canvas = sharedCanvas;\n }\n\n const promise = new Promise<Blob>((resolve) => {\n canvas.toBlob((blob) => resolve(blob));\n });\n\n const blob = await promise;\n if(savingLottiePreview[key] !== saving) {\n return;\n }\n\n if(!blob) {\n console.error('trying to save sticker preview with no blob', arguments);\n debugger;\n return;\n }\n\n rootScope.managers.thumbsStorage.saveStickerPreview(doc.id, blob, width, height, toneIndex);\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\nimport tabId from '../config/tabId';\n\nlet uploadId = 0;\nexport default function getFileNameForUpload(file: File | Blob) {\n let fileName: string;\n const mimeType = file?.type;\n if(mimeType) { // the same like apiFileName in appMessagesManager for upload!\n const ext = `${tabId}_${uploadId++}.${mimeType.split('/')[1]}`;\n\n if(['image/jpeg', 'image/png', 'image/bmp'].indexOf(mimeType) >= 0) {\n fileName = 'photo' + ext;\n } else if(mimeType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(mimeType) >= 0) {\n fileName = 'audio' + ext;\n } else if(mimeType.indexOf('video/') === 0) {\n fileName = 'video' + ext;\n } else {\n fileName = 'document' + ext;\n }\n } else {\n fileName = `upload-${tabId}_${uploadId++}`;\n }\n\n return fileName;\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\nimport {Document, InputFileLocation} from '../../../../layer';\n\nexport default function getDocumentInputFileLocation(doc: Document.document, thumbSize?: string): InputFileLocation.inputDocumentFileLocation {\n return {\n _: 'inputDocumentFileLocation',\n id: doc.id,\n access_hash: doc.access_hash,\n file_reference: doc.file_reference,\n thumb_size: thumbSize\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\nimport type {Document, PhotoSize, VideoSize} from '../../../../layer';\nimport type {DownloadOptions} from '../../../mtproto/apiFileManager';\nimport getDocumentInputFileLocation from './getDocumentInputFileLocation';\n\nexport default function getDocumentDownloadOptions(\n doc: Document.document,\n thumb?: PhotoSize.photoSize | Extract<VideoSize, VideoSize.videoSize>,\n queueId?: number,\n onlyCache?: boolean\n): DownloadOptions {\n const inputFileLocation = getDocumentInputFileLocation(doc, thumb?.type);\n\n let mimeType: MTMimeType;\n if(thumb?._ === 'photoSize') {\n mimeType = doc.sticker ? 'image/webp' : (doc.mime_type.startsWith('image/') ? doc.mime_type : 'image/jpeg');\n } else {\n mimeType = doc.mime_type || 'application/octet-stream';\n }\n\n return {\n dcId: doc.dc_id,\n location: inputFileLocation,\n size: thumb ? thumb.size : doc.size,\n mimeType,\n fileName: doc.file_name,\n queueId,\n onlyCache\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\nimport type {PhotoSize, InputFileLocation} from '../../../../layer';\nimport type {DownloadOptions} from '../../../mtproto/apiFileManager';\nimport type {MyDocument} from '../../appDocsManager';\nimport type {MyPhoto} from '../../appPhotosManager';\n\nexport default function getPhotoDownloadOptions(photo: MyPhoto | MyDocument, photoSize: PhotoSize, queueId?: number, onlyCache?: boolean): DownloadOptions {\n const isDocument = photo._ === 'document';\n\n if(!photoSize || photoSize._ === 'photoSizeEmpty') {\n // console.error('no photoSize by photo:', photo);\n throw new Error('photoSizeEmpty!');\n }\n\n // maybe it's a thumb\n const isPhoto = !!((photoSize._ === 'photoSize' || photoSize._ === 'photoSizeProgressive') && photo.access_hash && photo.file_reference);\n const location: InputFileLocation.inputPhotoFileLocation | InputFileLocation.inputDocumentFileLocation = {\n _: isDocument ? 'inputDocumentFileLocation' : 'inputPhotoFileLocation',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference,\n thumb_size: photoSize.type\n };\n\n return {\n dcId: photo.dc_id,\n location,\n size: isPhoto ? (photoSize as PhotoSize.photoSize).size : undefined,\n mimeType: 'image/jpeg',\n queueId,\n onlyCache\n };\n}\n","import {InputWebFileLocation} from '../../../../layer';\nimport {DownloadOptions} from '../../../mtproto/apiFileManager';\n\nexport default function getWebFileDownloadOptions(location: InputWebFileLocation): DownloadOptions {\n const downloadOptions: DownloadOptions = {\n dcId: 0,\n location,\n size: 0,\n mimeType: 'image/jpeg'\n };\n\n // if(location._ === 'inputWebFileGeoPointLocation') {\n // downloadOptions.size = 512 * 1024;\n // downloadOptions.mimeType = 'image/jpeg';\n // }\n\n return downloadOptions;\n}\n","import {WebDocument} from '../../../../layer';\nimport {DownloadOptions} from '../../../mtproto/apiFileManager';\nimport getWebFileDownloadOptions from '../webFiles/getWebFileDownloadOptions';\n\nexport default function getWebDocumentDownloadOptions(webDocument: WebDocument): DownloadOptions {\n const downloadOptions = getWebFileDownloadOptions({\n _: 'inputWebFileLocation',\n access_hash: (webDocument as WebDocument.webDocument).access_hash,\n url: webDocument.url\n });\n\n downloadOptions.size = webDocument.size;\n downloadOptions.mimeType = webDocument.mime_type;\n\n return downloadOptions;\n}\n","import {WebDocument} from '../../../../layer';\n\nexport default function isWebDocument(webDocument: any): webDocument is WebDocument {\n return !!(webDocument && (webDocument._ === 'webDocument' || webDocument._ === 'webDocumentNoProxy'));\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\nimport {getFileNameByLocation} from '../../../../helpers/fileName';\nimport {DownloadOptions} from '../../../mtproto/apiFileManager';\n\nexport default function getDownloadFileNameFromOptions(options: DownloadOptions) {\n return getFileNameByLocation(options.location, options);\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\nimport type {DownloadMediaOptions, DownloadOptions} from '../../../mtproto/apiFileManager';\nimport getDocumentDownloadOptions from '../docs/getDocumentDownloadOptions';\nimport getPhotoDownloadOptions from '../photos/getPhotoDownloadOptions';\nimport getWebDocumentDownloadOptions from '../webDocs/getWebDocumentDownloadOptions';\nimport isWebDocument from '../webDocs/isWebDocument';\nimport getWebFileDownloadOptions from '../webFiles/getWebFileDownloadOptions';\nimport isWebFileLocation from '../webFiles/isWebFileLocation';\nimport getDownloadFileNameFromOptions from './getDownloadFileNameFromOptions';\n\nexport default function getDownloadMediaDetails(options: DownloadMediaOptions) {\n const {media, thumb, queueId, onlyCache} = options;\n\n let downloadOptions: DownloadOptions;\n if(media._ === 'document') downloadOptions = getDocumentDownloadOptions(media, thumb as any, queueId, onlyCache);\n else if(media._ === 'photo') downloadOptions = getPhotoDownloadOptions(media, thumb as any, queueId, onlyCache);\n else if(isWebDocument(media)) downloadOptions = getWebDocumentDownloadOptions(media);\n else if(isWebFileLocation(media)) downloadOptions = getWebFileDownloadOptions(media);\n\n downloadOptions.downloadId = options.downloadId;\n\n const fileName = getDownloadFileNameFromOptions(downloadOptions);\n return {fileName, downloadOptions};\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\nexport default function createDownloadAnchor(url: string, fileName: string, onRemove?: () => void) {\n const a = document.createElement('a');\n a.href = url;\n a.download = fileName;\n a.target = '_blank';\n\n a.style.position = 'absolute';\n a.style.top = '1px';\n a.style.left = '1px';\n\n document.body.append(a);\n\n try {\n const clickEvent = document.createEvent('MouseEvents');\n clickEvent.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n a.dispatchEvent(clickEvent);\n } catch(e) {\n console.error('Download click error', e);\n try {\n a.click();\n } catch(e) {\n window.open(url as string, '_blank');\n }\n }\n\n setTimeout(() => {\n a.remove();\n onRemove && onRemove();\n }, 100);\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\nimport type {DownloadMediaOptions, DownloadOptions} from '../mtproto/apiFileManager';\nimport type {AppMessagesManager} from './appMessagesManager';\nimport type {MyDocument} from './appDocsManager';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {InputFile, Photo, PhotoSize} from '../../layer';\nimport getFileNameForUpload from '../../helpers/getFileNameForUpload';\nimport {AppManagers} from './managers';\nimport rootScope from '../rootScope';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport noop from '../../helpers/noop';\nimport getDownloadMediaDetails from './utils/download/getDownloadMediaDetails';\nimport getDownloadFileNameFromOptions from './utils/download/getDownloadFileNameFromOptions';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport makeError from '../../helpers/makeError';\nimport createDownloadAnchor from '../../helpers/dom/createDownloadAnchor';\nimport {getFileNameByLocation} from '../../helpers/fileName';\nimport getDocumentDownloadOptions from './utils/docs/getDocumentDownloadOptions';\nimport getPhotoDownloadOptions from './utils/photos/getPhotoDownloadOptions';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport {IS_MOBILE_SAFARI} from '../../environment/userAgent';\n\nexport type ResponseMethodBlob = 'blob';\nexport type ResponseMethodJson = 'json';\nexport type ResponseMethod = ResponseMethodBlob | ResponseMethodJson;\n\n/* export type DownloadBlob = {promise: Promise<Blob>, controller: AbortController};\nexport type DownloadJson = {promise: Promise<any>, controller: AbortController}; */\nexport type DownloadBlob = CancellablePromise<Blob>;\nexport type DownloadUrl = CancellablePromise<string>;\nexport type DownloadJson = CancellablePromise<any>;\n// export type Download = DownloadBlob/* | DownloadJson */;\nexport type Download = DownloadBlob | DownloadUrl/* | DownloadJson */;\n\nexport type Progress = {done: number, fileName: string, total: number, offset: number};\nexport type ProgressCallback = (details: Progress) => void;\n\ntype DownloadType = 'url' | 'blob' | 'void' | 'disc';\n\nexport class AppDownloadManager {\n private downloads: {[fileName: string]: {main: Download} & {[type in DownloadType]?: Download}} = {};\n // private downloadsToDisc: {[fileName: string]: Download} = {};\n private progress: {[fileName: string]: Progress} = {};\n // private progressCallbacks: {[fileName: string]: Array<ProgressCallback>} = {};\n private managers: AppManagers;\n\n public construct(managers: AppManagers) {\n this.managers = managers;\n rootScope.addEventListener('download_progress', (details) => {\n // const callbacks = this.progressCallbacks[details.fileName];\n // if(callbacks) {\n // callbacks.forEach((callback) => callback(details));\n // }\n\n const download = this.downloads[details.fileName];\n if(download?.main?.notifyAll) {\n this.progress[details.fileName] = details;\n download.main.notifyAll(details);\n }\n });\n }\n\n private getNewDeferred<T>(fileName: string, type?: DownloadType) {\n const deferred = deferredPromise<T>();\n\n let download = this.downloads[fileName];\n if(!download) {\n download = this.downloads[fileName] = {\n main: deferred as any\n };\n\n deferred.cancel = () => {\n const error = makeError('DOWNLOAD_CANCELED');\n\n this.managers.apiFileManager.cancelDownload(fileName);\n\n deferred.reject(error);\n deferred.cancel = noop;\n };\n\n deferred.catch(() => {\n this.clearDownload(fileName, type);\n }).finally(() => {\n delete this.progress[fileName];\n // delete this.progressCallbacks[fileName];\n });\n } else {\n const main = download.main;\n (['cancel', 'addNotifyListener', 'notify', 'notifyAll'] as (keyof CancellablePromise<void>)[]).forEach((key) => {\n if(!main[key]) {\n return;\n }\n\n // @ts-ignore\n deferred[key] = main[key].bind(main);\n });\n }\n\n const haveToClear = type === 'disc';\n if(haveToClear) {\n deferred.catch(noop).finally(() => {\n this.clearDownload(fileName, type);\n });\n }\n\n return download[type] = deferred as any;\n }\n\n public getNewDeferredForUpload<T extends Promise<any>>(fileName: string, promise: T) {\n const deferred: CancellablePromise<Awaited<T>> = this.getNewDeferred<InputFile>(fileName);\n promise.then(deferred.resolve.bind(deferred), deferred.reject.bind(deferred));\n\n deferred.finally(() => {\n this.clearDownload(fileName);\n });\n\n return deferred;\n }\n\n private clearDownload(fileName: string, type?: DownloadType) {\n const downloads = this.downloads[fileName];\n if(!downloads) {\n return;\n }\n\n delete downloads[type];\n\n const length = Object.keys(downloads).length;\n if(!length || (downloads.main && length === 1)) {\n delete this.downloads[fileName];\n }\n }\n\n public getUpload(fileName: string): ReturnType<AppMessagesManager['sendFile']>['promise'] {\n let deferred: CancellablePromise<any> = this.getDownload(fileName);\n if(deferred) {\n return deferred;\n }\n\n deferred = this.getNewDeferred(fileName);\n this.managers.appMessagesManager.getUploadPromise(fileName).then(deferred.resolve.bind(deferred), deferred.reject.bind(deferred));\n return deferred;\n }\n\n /* public fakeDownload(fileName: string, value: Blob | string) {\n const deferred = this.getNewDeferred<Blob>(fileName);\n if(typeof(value) === 'string') {\n fetch(value)\n .then((response) => response.blob())\n .then((blob) => deferred.resolve(blob));\n } else {\n deferred.resolve(value);\n }\n\n return deferred;\n } */\n\n private d(fileName: string, getPromise: () => Promise<any>, type?: DownloadType) {\n let deferred = this.getDownload(fileName, type);\n if(deferred) return deferred;\n\n deferred = this.getNewDeferred<Blob>(fileName, type);\n getPromise().then(deferred.resolve.bind(deferred), deferred.reject.bind(deferred));\n return deferred;\n }\n\n public download(options: DownloadOptions): DownloadBlob {\n const fileName = getDownloadFileNameFromOptions(options);\n return this.d(fileName, () => this.managers.apiFileManager.download(options), 'blob') as any;\n }\n\n public downloadMedia(options: DownloadMediaOptions, type: DownloadType = 'blob', promiseBefore?: Promise<any>): DownloadBlob {\n const {downloadOptions, fileName} = getDownloadMediaDetails(options);\n\n return this.d(fileName, () => {\n let cb: any;\n if(type === 'url') {\n cb = this.managers.apiFileManager.downloadMediaURL;\n } else if(type === 'void'/* || type === 'disc' */) {\n cb = this.managers.apiFileManager.downloadMediaVoid;\n } else /* if(type === 'blob') */ {\n cb = this.managers.apiFileManager.downloadMedia;\n }\n\n if(promiseBefore) {\n return promiseBefore.then(() => {\n return cb(options);\n }, () => {\n delete options.downloadId;\n return cb(options);\n });\n }\n\n return cb(options);\n }, type) as any;\n }\n\n public downloadMediaURL(options: DownloadMediaOptions): DownloadUrl {\n return this.downloadMedia(options, 'url') as any;\n }\n\n public downloadMediaVoid(options: DownloadMediaOptions): DownloadBlob {\n return this.downloadMedia(options, 'void');\n }\n\n public upload(file: File | Blob, fileName?: string, promise?: Promise<any>) {\n if(!fileName) {\n fileName = getFileNameForUpload(file);\n }\n\n if(!promise) {\n promise = this.managers.apiFileManager.upload({file, fileName});\n }\n\n const deferred = this.getNewDeferredForUpload(fileName, promise);\n return deferred as any as CancellablePromise<InputFile>;\n }\n\n public getDownload(fileName: string, type?: DownloadType) {\n const d = this.downloads[fileName];\n return d && d[type];\n }\n\n // public addProgressCallback(fileName: string, callback: ProgressCallback) {\n // const progress = this.progress[fileName];\n // (this.progressCallbacks[fileName] ?? (this.progressCallbacks[fileName] = [])).push(callback);\n\n // if(progress) {\n // callback(progress);\n // }\n // }\n\n public downloadToDisc(options: DownloadMediaOptions, justAttach?: boolean) {\n const media = options.media;\n const isDocument = media._ === 'document';\n if(!isDocument && !options.thumb) {\n options.thumb = (media as Photo.photo).sizes.slice().pop() as PhotoSize.photoSize;\n }\n\n const USE_SW = !IS_MOBILE_SAFARI && !!apiManagerProxy.serviceMessagePort;\n // const USE_SW = true;\n\n const getOutFileName = () => {\n const downloadOptions = isDocument ?\n getDocumentDownloadOptions(media) :\n getPhotoDownloadOptions(media as any, options.thumb as PhotoSize.photoSize);\n return (options.media as MyDocument).file_name || getFileNameByLocation(downloadOptions.location);\n };\n\n // const {fileName: cacheFileName} = getDownloadMediaDetails(options);\n // if(justAttach) {\n // const promise = this.downloadsToDisc[cacheFileName];\n // if(promise) {\n // return promise;\n // }\n // }\n\n // const {downloadOptions, fileName} = getDownloadMediaDetails(options);\n // if(downloadOptions.size && downloadOptions.size > MAX_FILE_SAVE_SIZE) {\n let url: string, pingPromise: Promise<any>, iframe: HTMLIFrameElement;\n if(USE_SW) {\n const id = '' + (Math.random() * 0x7FFFFFFF | 0);\n // const id = 'test';\n url = `d/${id}`;\n options.downloadId = id;\n\n pingPromise = apiManagerProxy.pingServiceWorkerWithIframe();\n\n if(!justAttach) {\n const {iframe: _iframe, onSuccess, onError} = this.createDownloadIframe(url);\n iframe = _iframe;\n\n // * 1. make sure that SW is alive with a ping\n // * 2. send download request and wait for a pong (downloadRequestReceived)\n // * 3. if pong is missing (something with request and can't handle it with iframe events),\n // * fallback to regular download\n pingPromise = pingPromise.then(() => {\n const deferred = deferredPromise<void>();\n\n const onFinish = (good: boolean) => {\n clearTimeout(timeout);\n apiManagerProxy.serviceMessagePort.removeEventListener('downloadRequestReceived', onDownloadRequestReceived);\n if(good) deferred.resolve();\n else deferred.reject();\n };\n\n const onDownloadRequestReceived = (downloadId: string) => {\n if(downloadId === id) {\n onFinish(true);\n }\n };\n\n apiManagerProxy.serviceMessagePort.addEventListener('downloadRequestReceived', onDownloadRequestReceived);\n\n const timeout = window.setTimeout(() => {\n onFinish(false);\n }, 1500);\n\n onSuccess();\n\n return deferred;\n }, (err) => {\n onError();\n throw err;\n });\n }\n }\n\n const promise = this.downloadMedia(options, 'disc', pingPromise);\n // this.downloadsToDisc[cacheFileName] = promise;\n\n if(justAttach) {\n return promise;\n }\n\n let element: HTMLElement, hadProgress = false;\n const onProgress = () => {\n if(hadProgress) {\n return;\n }\n\n hadProgress = true;\n element = iframe;\n\n indexOfAndSplice(promise.listeners, onProgress);\n };\n\n promise.addNotifyListener(onProgress);\n promise.then((blob) => {\n if(!blob) {\n return;\n }\n\n const url = URL.createObjectURL(blob);\n createDownloadAnchor(url, getOutFileName(), () => {\n URL.revokeObjectURL(url);\n });\n }).catch(noop).finally(() => {\n if(!hadProgress) {\n onProgress();\n }\n\n setTimeout(() => {\n element?.remove();\n }, 1000);\n\n // if(this.downloadsToDisc[cacheFileName] === promise) {\n // delete this.downloadsToDisc[cacheFileName];\n // }\n });\n\n return promise;\n }\n\n private createDownloadIframe(url: string) {\n const iframe = document.createElement('iframe');\n iframe.hidden = true;\n\n return {\n iframe,\n onSuccess: () => {\n // const removeListeners = () => {\n // iframe.removeEventListener('load', onLoad);\n // iframe.removeEventListener('error', onError);\n // console.error('event', window.event);\n // };\n\n // const onLoad = () => {\n // removeListeners();\n // };\n\n // const onError = () => {\n // removeListeners();\n // };\n\n // iframe.addEventListener('load', onLoad);\n // iframe.addEventListener('error', onError);\n\n iframe.src = url;\n document.body.append(iframe);\n },\n onError: () => {\n console.error('falling back to normal download');\n }\n };\n }\n}\n\nconst appDownloadManager = new AppDownloadManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appDownloadManager = appDownloadManager);\nexport default appDownloadManager;\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 type {MyDocument} from '../../appDocsManager';\nimport type {MyPhoto} from '../../appPhotosManager';\nimport type {PhotoSize, VideoSize, WebDocument} from '../../../../layer';\nimport calcImageInBox from '../../../../helpers/calcImageInBox';\nimport {THUMB_TYPE_FULL} from '../../../mtproto/mtproto_config';\n\nexport default function choosePhotoSize(\n photo: MyPhoto | MyDocument | WebDocument,\n boxWidth = 0,\n boxHeight = 0,\n useBytes = false,\n pushDocumentSize = false\n) {\n if(window.devicePixelRatio > 1) {\n boxWidth *= 2;\n boxHeight *= 2;\n }\n\n /*\n s box 100x100\n m box 320x320\n x box 800x800\n y box 1280x1280\n w box 2560x2560\n a crop 160x160\n b crop 320x320\n c crop 640x640\n d crop 1280x1280 */\n\n let sizes: PhotoSize[] = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs as PhotoSize[];\n let bestPhotoSize: typeof sizes[0] = {_: 'photoSizeEmpty', type: THUMB_TYPE_FULL};\n if(pushDocumentSize && sizes && photo._ !== 'photo') {\n sizes = sizes.concat({\n _: 'photoSize',\n w: photo.w,\n h: photo.h,\n size: photo.size,\n type: THUMB_TYPE_FULL\n });\n }\n\n if(sizes?.length) {\n for(let i = 0, length = sizes.length; i < length; ++i) {\n const photoSize = sizes[i];\n if(!('w' in photoSize) && !('h' in photoSize)) continue;\n\n bestPhotoSize = photoSize;\n\n const size = calcImageInBox(photoSize.w, photoSize.h, boxWidth, boxHeight);\n if(size.width >= boxWidth || size.height >= boxHeight) {\n break;\n }\n }\n\n if(useBytes && bestPhotoSize._ === 'photoSizeEmpty' && sizes[0]._ === 'photoStrippedSize') {\n bestPhotoSize = sizes[0];\n }\n }\n\n return bestPhotoSize;\n}\n","import {MyDocument} from '../../appDocsManager';\nimport {VideoSize} from '../../../../layer';\n\nexport default function getStickerEffectThumb(doc: MyDocument) {\n return doc.video_thumbs?.[0] as Extract<VideoSize, VideoSize.videoSize>;\n}\n","// https://github.com/twitter/twemoji-parser/blob/master/src/lib/regex.js\n\nexport function encodeEmoji(emojiText: string) {\n const codepoints = toCodePoints(removeVS16s(emojiText)).join('-');\n return codepoints;\n}\n\nconst vs16RegExp = /\\uFE0F/g;\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\n\nconst removeVS16s = (rawEmoji: string) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji);\n\nexport function toCodePoints(unicodeSurrogates: string): Array<string> {\n const points = [];\n let char = 0;\n let previous = 0;\n let i = 0;\n while(i < unicodeSurrogates.length) {\n char = unicodeSurrogates.charCodeAt(i++);\n if(previous) {\n points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16));\n previous = 0;\n } else if(char > 0xd800 && char <= 0xdbff) {\n previous = char;\n } else {\n points.push(char.toString(16));\n }\n }\n\n if(points.length && points[0].length === 2) {\n points[0] = '00' + points[0];\n }\n\n return points;\n}\n\nexport function getEmojiToneIndex(input: string) {\n const match = input.match(/[\\uDFFB-\\uDFFF]/);\n return match ? 5 - (57343 - match[0].charCodeAt(0)) : 0;\n}\n\nconst VIRTUAL_COUNTRIES_EMOJIS: Map<string, string> = new Map([\n ['FT', '🏴☠']\n]);\n\nexport function getCountryEmoji(iso2: string) {\n return VIRTUAL_COUNTRIES_EMOJIS.get(iso2) ??\n String.fromCharCode(55356, 56741 + iso2.charCodeAt(0), 55356, 56741 + iso2.charCodeAt(1));\n}\n\nexport function emojiFromCodePoints(codePoints: string) {\n return codePoints.split('-').reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\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\nimport indexOfAndSplice from './array/indexOfAndSplice';\nimport makeError from './makeError';\n\nexport type Middleware = {\n (): boolean;\n create(): MiddlewareHelper;\n onClean: (callback: VoidFunction) => void;\n onDestroy: (callback: VoidFunction) => void;\n};\n\nconst createDetails = (): {\n cleaned?: boolean,\n inner: MiddlewareHelper[],\n onCleanCallbacks: VoidFunction[],\n middleware?: Middleware\n} => ({\n cleaned: false,\n inner: [],\n onCleanCallbacks: []\n});\n\nconst MIDDLEWARE_ERROR = makeError('MIDDLEWARE');\n\n// * onClean == cancel promises, etc\n// * onDestroy == destructor\nexport class MiddlewareHelper {\n private details = createDetails();\n private onDestroyCallbacks: VoidFunction[] = [];\n private parent: MiddlewareHelper;\n private destroyed: boolean;\n\n public clean() {\n const details = this.details;\n details.cleaned = true;\n details.inner.splice(0, details.inner.length).forEach((helper) => helper.destroy());\n details.onCleanCallbacks.splice(0, details.onCleanCallbacks.length).forEach((callback) => callback());\n details.middleware = undefined;\n this.details = createDetails();\n }\n\n public destroy() {\n this.destroyed = true;\n this.clean();\n this.onDestroyCallbacks.splice(0, this.onDestroyCallbacks.length).forEach((callback) => callback());\n\n if(this.parent) {\n indexOfAndSplice(this.parent.details.inner, this);\n this.parent = undefined;\n }\n }\n\n private createMiddlewareForDetails(details: ReturnType<typeof createDetails>, additionalCallback?: () => boolean) {\n const middleware: Middleware = () => {\n return !details.cleaned && (!additionalCallback || additionalCallback());\n };\n\n middleware.create = () => {\n if(!middleware()) throw MIDDLEWARE_ERROR;\n const helper = getMiddleware();\n helper.parent = this;\n details.inner.push(helper);\n return helper;\n };\n\n middleware.onClean = (callback) => {\n if(!middleware()) return callback();\n details.onCleanCallbacks.push(callback);\n };\n\n middleware.onDestroy = this.onDestroy;\n\n return middleware;\n }\n\n public get(additionalCallback?: () => boolean) {\n const details = this.details;\n if(details.cleaned) {\n return this.createMiddlewareForDetails(details);\n }\n\n if(additionalCallback) {\n return this.createMiddlewareForDetails(details, additionalCallback);\n }\n\n return details.middleware ??= this.createMiddlewareForDetails(details);\n }\n\n public onDestroy = (callback: VoidFunction) => {\n if(this.destroyed) return callback();\n this.onDestroyCallbacks.push(callback);\n };\n}\n\n// * will change .cleaned and new instance will be created\nexport function getMiddleware() {\n return new MiddlewareHelper();\n}\n","// * Jolly Cobra's schedulers\n\nimport {AnyToVoidFunction} from '../../types';\n\nexport default function throttleWith<F extends AnyToVoidFunction>(schedulerFn: AnyToVoidFunction, fn: F) {\n let waiting = false;\n let args: Parameters<F>;\n\n return (..._args: Parameters<F>) => {\n args = _args;\n\n if(!waiting) {\n waiting = true;\n\n schedulerFn(() => {\n waiting = false;\n // @ts-ignore\n fn(...args);\n });\n }\n };\n}\n","// * Jolly Cobra's schedulers\n\nimport {AnyToVoidFunction} from '../../types';\nimport {fastRaf} from '../schedulers';\nimport throttleWith from './throttleWith';\n\nexport default function throttleWithRaf<F extends AnyToVoidFunction>(fn: F) {\n return throttleWith(fastRaf, fn);\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\nimport type {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport IS_VIBRATE_SUPPORTED from '../../environment/vibrateSupport';\nimport assumeType from '../../helpers/assumeType';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport makeError from '../../helpers/makeError';\nimport {getMiddleware, Middleware} from '../../helpers/middleware';\nimport throttleWithRaf from '../../helpers/schedulers/throttleWithRaf';\nimport windowSize from '../../helpers/windowSize';\nimport {PhotoSize, VideoSize} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport Scrollable from '../scrollable';\nimport wrapSticker from './sticker';\n\nexport const emojiAnimationContainer = document.createElement('div');\nemojiAnimationContainer.classList.add('emoji-animation-container');\n\nconst NO_UNMOUNT = false;\n\nexport default function wrapStickerAnimation({\n size,\n stickerSize,\n doc,\n middleware,\n target,\n side,\n skipRatio,\n play,\n managers,\n fullThumb,\n withRandomOffset,\n relativeEffect,\n loopEffect,\n onUnmount,\n scrollable,\n textColor,\n addOffsetX: _addOffsetX = 0,\n addOffsetY: _addOffsetY = 0\n}: {\n size: number,\n stickerSize?: number,\n doc: MyDocument,\n middleware?: Middleware,\n target: HTMLElement,\n side: 'left' | 'center' | 'right',\n skipRatio?: number,\n play: boolean,\n managers?: AppManagers,\n fullThumb?: PhotoSize | Extract<VideoSize, VideoSize.videoSize>,\n withRandomOffset?: boolean,\n relativeEffect?: boolean,\n loopEffect?: boolean,\n onUnmount?: () => void,\n scrollable?: Scrollable,\n textColor?: string,\n addOffsetX?: number,\n addOffsetY?: number\n}) {\n const animationDiv = document.createElement('div');\n animationDiv.classList.add('emoji-animation');\n\n // const size = 280;\n animationDiv.style.width = size + 'px';\n animationDiv.style.height = size + 'px';\n\n let animation: RLottiePlayer;\n const unmountAnimation = () => {\n if(NO_UNMOUNT) {\n return;\n }\n\n middlewareHelper.destroy();\n const a = animation;\n animation = undefined;\n a?.remove();\n animationDiv.remove();\n onScroll && scrollable.container.removeEventListener('scroll', onScroll);\n if(a) {\n onUnmount?.();\n }\n };\n\n const middlewareHelper = middleware?.create() ?? getMiddleware();\n middleware = middlewareHelper.get();\n\n const stickerPromise = wrapSticker({\n div: animationDiv,\n doc,\n middleware,\n withThumb: false,\n needFadeIn: false,\n loop: !!loopEffect,\n width: stickerSize || size,\n height: stickerSize || size,\n play,\n group: 'none',\n skipRatio,\n managers,\n fullThumb,\n isEffect: true,\n textColor\n }).then(({render}) => render).then((_animation) => {\n assumeType<RLottiePlayer>(_animation);\n if(!middleware()) {\n _animation.remove();\n throw makeError('MIDDLEWARE');\n }\n\n animation = _animation;\n animation.addEventListener('enterFrame', (frameNo) => {\n if((!loopEffect && frameNo === animation.maxFrame) || !isInDOM(target)) {\n unmountAnimation();\n }\n });\n\n animation.addEventListener('destroy', unmountAnimation);\n\n if(IS_VIBRATE_SUPPORTED) {\n animation.addEventListener('firstFrame', () => {\n navigator.vibrate(100);\n }, {once: true});\n }\n\n animation.addEventListener('firstFrame', () => {\n setPosition();\n }, {once: true});\n\n return animation;\n });\n\n const generateRandomSigned = (max: number) => {\n const r = Math.random() * max * 2;\n return r > max ? -r % max : r;\n };\n\n const randomOffsetX = withRandomOffset ? generateRandomSigned(16) : 0;\n const randomOffsetY = withRandomOffset ? generateRandomSigned(4) : 0;\n const setPosition = () => {\n if(!isInDOM(target)) {\n unmountAnimation();\n return;\n }\n\n const rect = target.getBoundingClientRect();\n\n const factor = rect.width / 200;\n const stableOffsetX = side === 'center' ? 0 : 16 * (side === 'right' ? 1 : -1) * factor;\n // const stableOffsetY = side === 'center' ? 0 : -50 * factor;\n const stableOffsetY = side === 'center' ? 0 : 0 * factor;\n\n const rectX = side === 'right' ? rect.right : rect.left;\n const rectY = rect.top;\n\n const addOffsetX = (side === 'center' ? (rect.width - size) / 2 : (side === 'right' ? -size : 0)) + stableOffsetX + randomOffsetX + _addOffsetX * (side === 'right' ? 1 : -1);\n const addOffsetY = (side === 'center' || true ? (rect.height - size) / 2 : 0) + stableOffsetY + randomOffsetY + _addOffsetY;\n const x = rectX + addOffsetX;\n const y = rectY + addOffsetY;\n\n if(y <= -size || y >= windowSize.height) {\n unmountAnimation();\n return;\n }\n\n if(relativeEffect) {\n if(side !== 'center') animationDiv.style[side] = Math.abs(stableOffsetX) * -1 + 'px';\n else animationDiv.style.left = addOffsetX + 'px';\n animationDiv.style.top = addOffsetY + 'px';\n } else {\n animationDiv.style.top = y + 'px';\n animationDiv.style.left = x + 'px';\n }\n };\n\n let onScroll: () => void;\n if(scrollable) {\n onScroll = throttleWithRaf(setPosition);\n scrollable.container.addEventListener('scroll', onScroll);\n }\n\n // setPosition();\n\n if(relativeEffect) {\n animationDiv.classList.add('is-relative');\n target.parentElement.append(animationDiv);\n } else {\n emojiAnimationContainer.append(animationDiv);\n }\n\n return {animationDiv, stickerPromise};\n}\n","export default function setCurrentTime(media: HTMLMediaElement, currentTime: number) {\n media.isSeeking = true;\n media.currentTime = currentTime;\n}\n","import {IS_CHROMIUM} from '../../environment/userAgent';\nimport deferredPromise from '../cancellablePromise';\nimport noop from '../noop';\nimport deepEqual from '../object/deepEqual';\nimport onMediaLoad from '../onMediaLoad';\nimport safePlay from './safePlay';\nimport setCurrentTime from './setCurrentTime';\n\nconst USE_FIX = IS_CHROMIUM;\n\nexport const SHOULD_HANDLE_VIDEO_LEAK = USE_FIX;\n\nexport async function onVideoLeak(video: HTMLVideoElement) {\n // console.error('video is stuck', video.src, video, video.paused, videoPlaybackQuality);\n const firstElementChild = video.firstElementChild as HTMLSourceElement;\n if(!firstElementChild) {\n video.src = '';\n video.load();\n throw new Error('leak');\n }\n\n const paused = video.paused;\n firstElementChild.remove();\n video.load();\n\n if(!video.childElementCount && !video.src) {\n throw new Error('leak');\n }\n\n if(!paused) safePlay(video);\n else setCurrentTime(video, 0.0001);\n\n return handleVideoLeak(video, onMediaLoad(video));\n}\n\nexport async function testVideoLeak(\n video: HTMLVideoElement,\n isLeak = !video.getVideoPlaybackQuality().totalVideoFrames\n) {\n if(!isLeak) {\n return;\n }\n\n return onVideoLeak(video);\n}\n\n// * fix new memory leak of chrome\nexport default async function handleVideoLeak(\n video: HTMLVideoElement,\n loadPromise?: Promise<any>\n) {\n if(!USE_FIX) {\n return loadPromise;\n }\n\n const bindPromise = (promise: Promise<any>) => {\n promise.then(\n deferred.resolve.bind(deferred),\n deferred.reject.bind(deferred)\n );\n };\n\n const onTimeUpdate = () => bindPromise(testVideoLeak(video));\n\n const deferred = deferredPromise<void>();\n try {\n await loadPromise;\n } catch(err) {\n onTimeUpdate();\n return;\n }\n\n if(\n video.getVideoPlaybackQuality().totalVideoFrames ||\n video.readyState > video.HAVE_METADATA // * video can lose metadata on timeupdate if has no next chunk\n ) {\n deferred.resolve();\n return;\n }\n\n video.addEventListener('timeupdate', onTimeUpdate, {once: true});\n return deferred;\n}\n\nconst eventsOrder = [\n // 'timeupdate',\n 'seeked',\n 'canplay',\n 'canplaythrough',\n 'seeking'\n // 'play'\n];\nconst eventsOrderLength = eventsOrder.length;\n\nconst sawEvents = new WeakMap<HTMLElement, {events: Set<string>}>();\nexport const leakVideoFallbacks = new WeakMap<HTMLElement, () => void>();\n\nfunction onVideoLeakListener(e: Event) {\n const {type, target} = e;\n if(\n !(target instanceof HTMLVideoElement) ||\n target.readyState > target.HAVE_METADATA ||\n target.isSeeking ||\n target.ignoreLeak\n ) {\n return;\n }\n\n // const needLog = target.parentElement.dataset.docId === '';\n // if(needLog) {\n // console.log('video event', event/* , target */, target.currentTime, target.duration);\n // }\n\n let cache = sawEvents.get(target);\n if(!cache) {\n sawEvents.set(target, cache = {events: new Set()});\n }\n\n if(cache.events.has(type)) {\n return;\n }\n\n cache.events.add(type);\n\n if(cache.events.size === eventsOrderLength/* && event == eventsOrder[eventsOrderLength - 1] */) {\n const events = Array.from(cache.events);\n const index = eventsOrder.indexOf(events[0]);\n const normalized = eventsOrder.slice(index).concat(eventsOrder.slice(0, index));\n if(!deepEqual(events, normalized)) {\n return;\n }\n\n // console.log('bad video', target.currentTime, target.duration);\n\n const fallbackCallback = leakVideoFallbacks.get(target);\n if(fallbackCallback) {\n fallbackCallback();\n leakVideoFallbacks.delete(target);\n } else {\n onVideoLeak(target).catch(noop);\n }\n }\n\n // const lastEvent = sawEvents.get(target);\n // if(!lastEvent) {\n // if(eventsOrder[0] === event) {\n // sawEvents.set(target, event);\n // }\n // } else if(lastEvent !== event) {\n // const lastEventIndex = eventsOrder.indexOf(lastEvent);\n // const shouldBeEvent = eventsOrder[lastEventIndex + 1];\n // if(shouldBeEvent === event) { // save event for next check\n // sawEvents.set(target, event);\n // } else if(!shouldBeEvent) { // saw all events\n // onVideoLeak(target).catch(noop);\n // } else { // wrong event\n // sawEvents.delete(target);\n // }\n // }\n}\n\nfunction attachVideoLeakListener(element: HTMLElement | Document, event: string) {\n element.addEventListener(event, onVideoLeakListener, true);\n return () => element.removeEventListener(event, onVideoLeakListener, true);\n}\n\nexport function attachVideoLeakListeners(element: HTMLElement | Document) {\n if(!USE_FIX) {\n return;\n }\n\n const callbacks = eventsOrder.map((event) => {\n return attachVideoLeakListener(element, event);\n });\n\n return () => {\n callbacks.forEach((callback) => callback());\n };\n}\n\nattachVideoLeakListeners(document);\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 type RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport type {ThumbCache} from '../../lib/storages/thumbs';\nimport type {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport IS_WEBP_SUPPORTED from '../../environment/webpSupport';\nimport getPathFromBytes from '../../helpers/bytes/getPathFromBytes';\nimport deferredPromise from '../../helpers/cancellablePromise';\nimport computeLockColor from '../../helpers/computeLockColor';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport createVideo from '../../helpers/dom/createVideo';\nimport renderImageFromUrl, {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport getImageFromStrippedThumb from '../../helpers/getImageFromStrippedThumb';\nimport getPreviewURLFromThumb from '../../helpers/getPreviewURLFromThumb';\nimport makeError from '../../helpers/makeError';\nimport {makeMediaSize} from '../../helpers/mediaSize';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {Middleware} from '../../helpers/middleware';\nimport {isSavingLottiePreview, saveLottiePreview} from '../../helpers/saveLottiePreview';\nimport sequentialDom from '../../helpers/sequentialDom';\nimport {DocumentAttribute, PhotoSize, VideoSize} from '../../layer';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport getStickerEffectThumb from '../../lib/appManagers/utils/stickers/getStickerEffectThumb';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport rootScope from '../../lib/rootScope';\nimport webpWorkerController from '../../lib/webp/webpWorkerController';\nimport {Awaited} from '../../types';\nimport {getEmojiToneIndex} from '../../vendor/emoji';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport wrapStickerAnimation from './stickerAnimation';\nimport framesCache from '../../helpers/framesCache';\nimport liteMode, {LiteModeKey} from '../../helpers/liteMode';\nimport Scrollable from '../scrollable';\nimport apiManagerProxy from '../../lib/mtproto/mtprotoworker';\nimport Icon from '../icon';\nimport {SHOULD_HANDLE_VIDEO_LEAK, attachVideoLeakListeners, leakVideoFallbacks, onVideoLeak} from '../../helpers/dom/handleVideoLeak';\nimport noop from '../../helpers/noop';\nimport {IS_WEBM_SUPPORTED} from '../../environment/videoSupport';\nimport toArray from '../../helpers/array/toArray';\n\n// https://github.com/telegramdesktop/tdesktop/blob/master/Telegram/SourceFiles/history/view/media/history_view_sticker.cpp#L40\nexport const STICKER_EFFECT_MULTIPLIER = 1 + 0.245 * 2;\nconst EMOJI_EFFECT_MULTIPLIER = 3;\nconst UNMOUNT_THUMBS = true;\n\nconst locksUrls: {[docId: string]: string} = {};\n\nexport const videosCache: {[key: string]: Promise<any>} = {};\n\nconst onAnimationEnd = (element: HTMLElement, onAnimationEnd: () => void, timeout: number) => {\n const onEnd = () => {\n element.removeEventListener('animationend', onEnd);\n onAnimationEnd();\n clearTimeout(_timeout);\n };\n element.addEventListener('animationend', onEnd);\n const _timeout = setTimeout(onEnd, timeout);\n};\n\nconst isEmptyContainer = (container: HTMLElement) => {\n const childElementCount = container.childElementCount;\n if(!childElementCount) return true;\n const child = container.firstElementChild as HTMLElement;\n return child.classList.contains('premium-sticker-lock') && childElementCount === 1;\n};\n\nconst getThumbFromContainer = (container: HTMLElement) => {\n let element = container.firstElementChild as HTMLElement;\n if(element && element.classList.contains('premium-sticker-lock')) {\n element = element.nextElementSibling as HTMLElement;\n }\n\n return element;\n};\n\nexport default async function wrapSticker({doc, div, middleware, loadStickerMiddleware, lazyLoadQueue, exportLoad, group, play, onlyThumb, emoji, width, height, withThumb, loop, loadPromises, needFadeIn, needUpscale, skipRatio, static: asStatic, managers = rootScope.managers, fullThumb, isOut, noPremium, withLock, relativeEffect, loopEffect, isCustomEmoji, syncedVideo, liteModeKey, isEffect, textColor, scrollable, showPremiumInfo, useCache}: {\n doc: MyDocument,\n div: HTMLElement | HTMLElement[],\n middleware?: Middleware,\n loadStickerMiddleware?: Middleware,\n lazyLoadQueue?: LazyLoadQueue,\n exportLoad?: number,\n group?: AnimationItemGroup,\n play?: boolean,\n onlyThumb?: boolean,\n emoji?: string,\n width?: number,\n height?: number,\n withThumb?: boolean,\n loop?: RLottiePlayer['loop'],\n loadPromises?: Promise<any>[],\n needFadeIn?: boolean,\n needUpscale?: boolean,\n skipRatio?: number,\n static?: boolean,\n managers?: AppManagers,\n fullThumb?: PhotoSize | Extract<VideoSize, VideoSize.videoSize>,\n isOut?: boolean,\n noPremium?: boolean,\n withLock?: boolean,\n relativeEffect?: boolean,\n loopEffect?: boolean,\n isCustomEmoji?: boolean,\n syncedVideo?: boolean,\n liteModeKey?: LiteModeKey | false,\n isEffect?: boolean,\n textColor?: WrapSomethingOptions['textColor'],\n scrollable?: Scrollable\n showPremiumInfo?: () => void,\n useCache?: boolean\n}) {\n const options = arguments[0];\n div = toArray(div);\n\n liteModeKey ??= 'stickers_panel';\n\n if(isCustomEmoji) {\n emoji = doc.stickerEmojiRaw;\n }\n\n const stickerType = doc.sticker;\n if(stickerType === 1 || (stickerType === 3 && !IS_WEBM_SUPPORTED)) {\n asStatic = true;\n }\n\n if(!width && !height) {\n const sizes = mediaSizes.active;\n const boxSize = emoji ? sizes.emojiSticker : (doc.animated ? sizes.animatedSticker : sizes.staticSticker);\n const size = makeMediaSize(doc.w, doc.h).aspectFitted(boxSize);\n width = size.width;\n height = size.height;\n }\n\n if(stickerType === 2) {\n // LottieLoader.loadLottie();\n lottieLoader.loadLottieWorkers();\n }\n\n loop = !!(!emoji || isCustomEmoji) && loop;\n\n div.forEach((div) => {\n div.dataset.docId = '' + doc.id;\n if(emoji) {\n div.dataset.stickerEmoji = emoji;\n }\n\n // div.dataset.stickerPlay = '' + +(play || false);\n // div.dataset.stickerLoop = '' + +(loop || false);\n\n div.classList.add('media-sticker-wrapper');\n });\n\n if(play && liteModeKey && !liteMode.isAvailable(liteModeKey) && !isCustomEmoji && !isEffect) {\n play = false;\n loop = false;\n }\n\n /* if(stickerType === 3) {\n const videoRes = wrapVideo({\n doc,\n boxWidth: width,\n boxHeight: height,\n container: div,\n group,\n lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n loadPromises,\n noPlayButton: true,\n noInfo: true\n });\n\n if(videoRes.thumb) {\n if(videoRes.thumb.images.thumb) {\n videoRes.thumb.images.thumb.classList.add('media-sticker', 'thumbnail');\n }\n\n if(videoRes.thumb.images.full) {\n videoRes.thumb.images.full.classList.add('media-sticker');\n }\n }\n\n return videoRes.loadPromise;\n } */\n\n // console.log('wrap sticker', doc, div, onlyThumb);\n\n let cacheContext: ThumbCache;\n const getCacheContext = (type: string = cacheContext?.type) => {\n return cacheContext = apiManagerProxy.getCacheContext(doc, type);\n };\n\n const isAnimated = !asStatic && (stickerType === 2 || stickerType === 3);\n\n const effectThumb = getStickerEffectThumb(doc);\n if(isOut !== undefined && effectThumb && !isOut) {\n div.forEach((div) => div.classList.add('reflect-x'));\n }\n\n const willHaveLock = effectThumb && withLock;\n if(willHaveLock) {\n const lockUrl = locksUrls[doc.id];\n div.forEach((div) => {\n div.classList.add('is-premium-sticker');\n div.append(Icon('premium_lock', 'premium-sticker-lock'));\n lockUrl && div.style.setProperty('--lock-url', `url(${lockUrl})`);\n });\n }\n\n if(asStatic && stickerType !== 1) {\n const thumb = choosePhotoSize(doc, width, height, false) as PhotoSize.photoSize;\n getCacheContext(thumb.type);\n } else {\n getCacheContext(fullThumb?.type);\n }\n\n const customEmojiAttribute = doc.attributes.find((attribute) => attribute._ === 'documentAttributeCustomEmoji') as DocumentAttribute.documentAttributeCustomEmoji;\n if(!customEmojiAttribute || !customEmojiAttribute.pFlags.text_color) {\n textColor = undefined;\n } else if(!textColor) {\n textColor = 'primary-text-color';\n }\n\n const toneIndex = emoji && !isCustomEmoji ? getEmojiToneIndex(emoji) : -1;\n const lottieCachedThumbToneIndex = toneIndex === -1 ? textColor ?? toneIndex : toneIndex;\n const downloaded = cacheContext.downloaded && !needFadeIn;\n\n const isThumbNeededForType = isAnimated;\n const lottieCachedThumb = stickerType === 2 || stickerType === 3 ? apiManagerProxy.getStickerCachedThumb(doc.id, lottieCachedThumbToneIndex) : undefined;\n\n const ret = {\n render: undefined as typeof loadPromise,\n load: undefined as typeof load,\n width,\n height,\n downloaded\n };\n let loadThumbPromise = deferredPromise<void>();\n let haveThumbCached = false;\n if((\n doc.thumbs?.length ||\n lottieCachedThumb\n ) &&\n isEmptyContainer(div[0]) && (\n !downloaded ||\n isThumbNeededForType ||\n onlyThumb\n ) && withThumb !== false/* && doc.thumbs[0]._ !== 'photoSizeEmpty' */\n ) {\n let thumb = lottieCachedThumb || doc.thumbs[0];\n\n // console.log('wrap sticker', thumb, div);\n\n const afterRender = (div: HTMLElement, thumbImage: HTMLElement) => {\n if(isEmptyContainer(div)) {\n sequentialDom.mutateElement(div, () => {\n if(isEmptyContainer(div)) {\n thumbImage.classList.add('media-sticker', 'thumbnail');\n div.append(thumbImage);\n }\n\n loadThumbPromise.resolve();\n });\n } else {\n loadThumbPromise.resolve();\n }\n };\n\n if('url' in thumb) {\n haveThumbCached = true;\n div.forEach((div) => {\n const thumbImage = new Image();\n renderImageFromUrl(thumbImage, (thumb as any).url, () => afterRender(div, thumbImage));\n });\n } else if('bytes' in thumb) {\n if(thumb._ === 'photoPathSize') {\n if(!thumb.bytes.length) {\n thumb = doc.thumbs.find((t) => (t as PhotoSize.photoStrippedSize).bytes?.length) || thumb;\n }\n\n const d = getPathFromBytes((thumb as PhotoSize.photoStrippedSize).bytes);\n const ns = 'http://www.w3.org/2000/svg';\n const svg = document.createElementNS(ns, 'svg');\n svg.classList.add('rlottie-vector', 'media-sticker', 'thumbnail');\n svg.setAttributeNS(null, 'viewBox', `0 0 ${doc.w || 512} ${doc.h || 512}`);\n\n // const defs = document.createElementNS(ns, 'defs');\n // const linearGradient = document.createElementNS(ns, 'linearGradient');\n // linearGradient.setAttributeNS(null, 'id', 'g');\n // linearGradient.setAttributeNS(null, 'x1', '-300%');\n // linearGradient.setAttributeNS(null, 'x2', '-200%');\n // linearGradient.setAttributeNS(null, 'y1', '0');\n // linearGradient.setAttributeNS(null, 'y2', '0');\n // const stops = [\n // ['-10%', '.1'],\n // ['30%', '.07'],\n // ['70%', '.07'],\n // ['110%', '.1']\n // ].map(([offset, stopOpacity]) => {\n // const stop = document.createElementNS(ns, 'stop');\n // stop.setAttributeNS(null, 'offset', offset);\n // stop.setAttributeNS(null, 'stop-opacity', stopOpacity);\n // return stop;\n // });\n // const animates = [\n // ['-300%', '1200%'],\n // ['-200%', '1300%']\n // ].map(([from, to], idx) => {\n // const animate = document.createElementNS(ns, 'animate');\n // animate.setAttributeNS(null, 'attributeName', 'x' + (idx + 1));\n // animate.setAttributeNS(null, 'from', from);\n // animate.setAttributeNS(null, 'to', to);\n // animate.setAttributeNS(null, 'dur', '3s');\n // animate.setAttributeNS(null, 'repeatCount', 'indefinite');\n // return animate;\n // });\n // linearGradient.append(...stops, ...animates);\n // defs.append(linearGradient);\n // svg.append(defs);\n\n const path = document.createElementNS(ns, 'path');\n path.setAttributeNS(null, 'd', d);\n // if(liteMode.isAvailable('animations') && !isCustomEmoji) path.setAttributeNS(null, 'fill', 'url(#g)');\n svg.append(path);\n div.forEach((div, idx) => div.append(idx > 0 ? svg.cloneNode(true) : svg));\n haveThumbCached = true;\n loadThumbPromise.resolve();\n } else if(toneIndex <= 0) {\n const r = () => {\n (div as HTMLElement[]).forEach((div) => {\n const thumbImage = new Image();\n const url = getPreviewURLFromThumb(doc, thumb as PhotoSize.photoStrippedSize, true);\n renderImageFromUrl(thumbImage, url, () => afterRender(div, thumbImage), useCache);\n });\n };\n\n if((IS_WEBP_SUPPORTED || doc.pFlags.stickerThumbConverted || cacheContext.url)/* && false */) {\n haveThumbCached = true;\n r();\n } else {\n haveThumbCached = true;\n webpWorkerController.convert('main-' + doc.id, thumb.bytes).then((bytes) => {\n managers.appDocsManager.saveWebPConvertedStrippedThumb(doc.id, bytes);\n (thumb as PhotoSize.photoStrippedSize).bytes = bytes;\n doc.pFlags.stickerThumbConverted = true;\n\n if((middleware && !middleware()) || !isEmptyContainer((div as HTMLElement[])[0])) {\n loadThumbPromise.resolve();\n return;\n }\n\n r();\n }).catch(() => loadThumbPromise.resolve());\n }\n }\n } else if(((stickerType === 2 && toneIndex <= 0) || stickerType === 3) && (withThumb || onlyThumb)) {\n const load = async() => {\n if(!isEmptyContainer((div as HTMLElement[])[0]) || (middleware && !middleware())) {\n loadThumbPromise.resolve();\n return;\n }\n\n const r = (div: HTMLElement, thumbImage: HTMLElement, url: string) => {\n if(!isEmptyContainer(div) || (middleware && !middleware())) {\n loadThumbPromise.resolve();\n return;\n }\n\n if(!url) afterRender(div, thumbImage);\n else renderImageFromUrl(thumbImage, url, () => afterRender(div, thumbImage), useCache);\n };\n\n getCacheContext();\n (div as HTMLElement[]).forEach((div) => {\n if(cacheContext.url) {\n r(div, new Image(), cacheContext.url);\n } else if('bytes' in thumb) {\n const res = getImageFromStrippedThumb(doc, thumb as PhotoSize.photoStrippedSize, true);\n res.loadPromise.then(() => r(div, res.image, ''));\n\n // return managers.appDocsManager.getThumbURL(doc, thumb as PhotoSize.photoStrippedSize).promise.then(r);\n } else {\n appDownloadManager.downloadMediaURL({\n media: doc,\n thumb: thumb as PhotoSize\n }).then(async(url) => {\n return r(div, new Image(), url);\n });\n }\n });\n };\n\n if(lazyLoadQueue && onlyThumb) {\n lazyLoadQueue.push({div: div[0], load});\n loadThumbPromise.resolve();\n return ret;\n } else {\n load();\n\n if((thumb as any).url) {\n haveThumbCached = true;\n }\n }\n }\n }\n\n if(loadPromises && haveThumbCached) {\n loadPromises.push(loadThumbPromise);\n }\n\n if(onlyThumb/* || true */) { // for sticker panel\n return ret;\n }\n\n const middlewareError = makeError('MIDDLEWARE');\n const load = async() => {\n if(middleware && !middleware()) {\n throw middlewareError;\n }\n\n if(stickerType === 2 && !asStatic) {\n const blob = await appDownloadManager.downloadMedia({media: doc, queueId: lazyLoadQueue?.queueId, thumb: fullThumb});\n if(middleware && !middleware()) {\n throw middlewareError;\n }\n\n const animation = await lottieLoader.loadAnimationWorker({\n container: (div as HTMLElement[])[0],\n loop,\n autoplay: play,\n animationData: blob,\n width,\n height,\n name: 'doc' + doc.id,\n needUpscale,\n skipRatio,\n toneIndex,\n sync: isCustomEmoji,\n middleware: loadStickerMiddleware ?? middleware,\n group,\n liteModeKey: liteModeKey || undefined,\n textColor: !isCustomEmoji ? textColor : undefined\n });\n\n // const deferred = deferredPromise<void>();\n\n const setLockColor = willHaveLock ? () => {\n const lockUrl = locksUrls[doc.id] ??= computeLockColor(animation.canvas[0]);\n (div as HTMLElement[]).forEach((div) => div.style.setProperty('--lock-url', `url(${lockUrl})`));\n } : undefined;\n\n const onFirstFrame = (container: HTMLElement, canvas: HTMLCanvasElement) => {\n let element = getThumbFromContainer(container);\n element = element !== canvas && element as HTMLElement;\n if(needFadeIn !== false) {\n needFadeIn = (needFadeIn || !element || element.tagName === 'svg') && liteMode.isAvailable('animations');\n }\n\n const cb = () => {\n if(\n element &&\n element !== canvas &&\n element.tagName !== 'DIV'\n ) {\n element.remove();\n }\n };\n\n if(!needFadeIn) {\n if(element) {\n sequentialDom.mutate(cb);\n }\n } else {\n sequentialDom.mutate(() => {\n canvas && canvas.classList.add('fade-in');\n if(element) {\n element.classList.add('fade-out');\n }\n\n onAnimationEnd(canvas || element, () => {\n sequentialDom.mutate(() => {\n canvas && canvas.classList.remove('fade-in');\n cb();\n });\n }, 400);\n });\n }\n };\n\n animation.addEventListener('firstFrame', () => {\n const canvas = animation.canvas[0];\n if(withThumb !== false || isCustomEmoji) {\n saveLottiePreview(doc, canvas, lottieCachedThumbToneIndex);\n }\n\n if(willHaveLock) {\n setLockColor();\n }\n\n if(!isCustomEmoji) {\n (div as HTMLElement[]).forEach((container, idx) => {\n onFirstFrame(container, animation.canvas[idx]);\n });\n }\n }, {once: true});\n\n if(emoji) {\n managers.appStickersManager.preloadAnimatedEmojiStickerAnimation(emoji);\n }\n\n return animation;\n\n // return deferred;\n // await new Promise((resolve) => setTimeout(resolve, 5e3));\n } else if(asStatic || stickerType === 3) {\n const isSingleVideo = isAnimated && syncedVideo;\n const cacheName = isSingleVideo ? framesCache.generateName('' + doc.id, 0, 0, undefined, undefined) : undefined;\n\n const cachePromise = videosCache[cacheName];\n if(cachePromise) {\n return cachePromise as typeof promise;\n }\n\n const d = isSingleVideo ? (div as HTMLElement[]).slice(0, 1) : div as HTMLElement[];\n const media: HTMLElement[] = d.map(() => {\n let media: HTMLElement;\n if(asStatic) {\n media = new Image();\n } else {\n const video = media = createVideo({middleware});\n video.muted = true;\n if(play) video.autoplay = true;\n if(loop) video.loop = true;\n video._autoplay = play || false;\n video._loop = loop || false;\n\n if(loop && typeof(loop) === 'number') {\n let previousTime = 0, playedTimes = 0;\n function onTimeupdate(this: HTMLVideoElement) {\n if(previousTime > this.currentTime && ++playedTimes === loop as number) {\n this.autoplay = false;\n this.loop = false;\n this.pause();\n video.removeEventListener('timeupdate', onTimeupdate);\n }\n\n (this as any).timeUpdatedTimes = ((this as any).timeUpdatedTimes || 0) + 1;\n\n previousTime = this.currentTime;\n }\n\n video.addEventListener('timeupdate', onTimeupdate);\n middleware.onClean(() => {\n video.removeEventListener('timeupdate', onTimeupdate);\n });\n }\n }\n\n media.classList.add('media-sticker');\n return media;\n });\n\n const thumbImage = (div as HTMLElement[]).map((div, idx) => {\n const thumb = getThumbFromContainer(div);\n return (thumb as HTMLElement) !== media[idx] && thumb;\n }) as HTMLElement[];\n if(needFadeIn !== false) {\n needFadeIn = (needFadeIn || !downloaded || (asStatic ? thumbImage[0] : (!thumbImage[0] || thumbImage[0].tagName === 'svg'))) && liteMode.isAvailable('animations');\n }\n\n if(needFadeIn) {\n media.forEach((media) => media.classList.add('fade-in'));\n }\n\n const promise = new Promise<HTMLVideoElement[] | HTMLImageElement[]>(async(resolve, reject) => {\n const r = async() => {\n if(middleware && !middleware()) {\n reject(middlewareError);\n return;\n }\n\n const mediaLength = media.length;\n const loaded: HTMLElement[] = [];\n const onLoad = (div: HTMLElement, media: HTMLElement, thumbImage: HTMLElement) => {\n sequentialDom.mutateElement(div, () => {\n if(middleware && !middleware()) {\n reject(middlewareError);\n return;\n }\n\n if(!media) {\n if(!isSingleVideo || !isAnimated) {\n UNMOUNT_THUMBS && thumbImage?.remove();\n }\n\n return;\n }\n\n const isVideo = media instanceof HTMLVideoElement;\n if(isVideo/* && media.isConnected */) {\n // * video sticker can have arbitrary dimensions\n const {videoWidth, videoHeight} = media;\n const ratio = videoWidth / videoHeight;\n\n let w = width * window.devicePixelRatio;\n let h = height * window.devicePixelRatio;\n if(ratio < 1) {\n w = h * ratio;\n } else {\n h = w / ratio;\n }\n\n if(!isSavingLottiePreview(doc, toneIndex, w, h)) {\n // const perf = performance.now();\n const canvas = document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(media, 0, 0, canvas.width, canvas.height);\n saveLottiePreview(doc, canvas, toneIndex);\n // console.log('perf', performance.now() - perf);\n }\n }\n\n if(isSingleVideo) {\n resolve(media as any);\n return;\n }\n\n if(isVideo && SHOULD_HANDLE_VIDEO_LEAK) {\n leakVideoFallbacks.set(media, () => {\n const reset = () => {\n onVideoLeak(media).catch(noop);\n };\n\n if(!thumbImage || !(thumbImage instanceof HTMLImageElement)) {\n const d = document.createElement('div');\n wrapSticker({\n ...options,\n div: d,\n static: true,\n exportLoad: undefined,\n needFadeIn: false,\n lazyLoadQueue: undefined\n // onlyThumb: true\n }).then(({render}) => {\n return render;\n }).finally(() => {\n sequentialDom.mutateElement(media, () => {\n if(middleware()) div.append(...Array.from(d.children));\n media.remove();\n reset();\n });\n });\n } else {\n media.replaceWith(thumbImage);\n reset();\n }\n });\n\n if(media.duration < 1 ||\n media.getVideoPlaybackQuality().totalVideoFrames < 10) {\n const detach = attachVideoLeakListeners(media);\n middleware.onClean(detach);\n }\n }\n\n div.append(media);\n\n if(needFadeIn) {\n thumbImage && thumbImage.classList.add('fade-out');\n onAnimationEnd(media, () => {\n media.classList.remove('fade-in');\n UNMOUNT_THUMBS && thumbImage?.remove();\n }, 400);\n } else {\n UNMOUNT_THUMBS && thumbImage?.remove();\n }\n\n if(isAnimated) {\n animationIntersector.addAnimation({\n animation: media as HTMLVideoElement,\n observeElement: div,\n group,\n controlled: middleware,\n liteModeKey: liteModeKey || undefined,\n type: 'video'\n });\n }\n\n if(loaded.push(media) === mediaLength) {\n resolve(loaded as any);\n }\n });\n };\n\n getCacheContext();\n let lastPromise: Promise<any>;\n (div as HTMLElement[]).forEach((div, idx) => {\n const _media = media[idx];\n const cb = () => onLoad(div, _media, thumbImage[idx]);\n if(_media) lastPromise = renderImageFromUrlPromise(_media, cacheContext.url, useCache);\n lastPromise.then(cb);\n });\n };\n\n getCacheContext();\n if(cacheContext.url) r();\n else {\n let promise: Promise<any>;\n if(stickerType !== 1 && asStatic) {\n const thumb = choosePhotoSize(doc, width, height, false) as PhotoSize.photoSize;\n // promise = managers.appDocsManager.getThumbURL(doc, thumb).promise\n promise = appDownloadManager.downloadMediaURL({media: doc, thumb, queueId: lazyLoadQueue?.queueId});\n } else {\n promise = appDownloadManager.downloadMediaURL({media: doc, queueId: lazyLoadQueue?.queueId});\n }\n\n promise.then(r, reject);\n }\n });\n\n if(cacheName) {\n videosCache[cacheName] = promise as any;\n loadStickerMiddleware && promise.finally(() => {\n if(!loadStickerMiddleware()) {\n delete videosCache[cacheName];\n }\n });\n }\n\n return promise;\n }\n };\n\n if(exportLoad && ((exportLoad === 1 && (!downloaded || isAnimated)) || exportLoad === 2)) {\n ret.load = load;\n return ret;\n }\n\n const loadPromise: Promise<Awaited<ReturnType<typeof load>> | void> = lazyLoadQueue && (!downloaded || isAnimated) ?\n (lazyLoadQueue.push({div: div[0], load}), Promise.resolve()) :\n load();\n\n if(downloaded && (asStatic/* || stickerType === 3 */)) {\n loadThumbPromise = loadPromise as any;\n loadPromises?.push(loadThumbPromise);\n }\n\n if(stickerType === 2 && effectThumb && isOut !== undefined && !noPremium) {\n attachStickerEffectHandler({\n container: div[0],\n doc,\n managers,\n middleware,\n isOut,\n width,\n loadPromise,\n relativeEffect,\n loopEffect,\n scrollable,\n showPremiumInfo\n });\n }\n\n ret.render = loadPromise as any;\n return ret;\n}\n\nexport async function fireStickerEffect({e, container, doc, managers, middleware, isOut, width, loadPromise, relativeEffect, loopEffect, scrollable, showPremiumInfo}: {\n e: MouseEvent,\n container: HTMLElement,\n doc: MyDocument,\n managers: AppManagers,\n middleware: Middleware,\n isOut: boolean,\n width: number,\n loadPromise: Promise<any>,\n relativeEffect?: boolean,\n loopEffect?: boolean,\n scrollable?: Scrollable,\n showPremiumInfo?: () => void\n}) {\n const isAvailable = liteMode.isAvailable('effects_premiumstickers') || relativeEffect;\n cancelEvent(e);\n if(!e.isTrusted && !isAvailable) {\n return;\n }\n\n if(container.dataset.playing || !isAvailable) {\n showPremiumInfo?.();\n return;\n }\n\n container.dataset.playing = '1';\n\n await loadPromise;\n const {animationDiv, stickerPromise} = wrapStickerAnimation({\n doc,\n middleware,\n side: isOut ? 'right' : 'left',\n size: width * STICKER_EFFECT_MULTIPLIER,\n target: container,\n play: true,\n fullThumb: getStickerEffectThumb(doc),\n relativeEffect,\n loopEffect,\n scrollable\n });\n\n if(isOut !== undefined && !isOut/* && !relativeEffect */) {\n animationDiv.classList.add('reflect-x');\n }\n\n stickerPromise.then((player) => {\n player.addEventListener('destroy', () => {\n delete container.dataset.playing;\n });\n });\n}\n\nfunction attachStickerEffectHandler(options: Omit<Parameters<typeof fireStickerEffect>[0], 'e'>) {\n options.managers.appStickersManager.preloadSticker(options.doc.id, true);\n\n const detach = attachClickEvent(options.container, (e) => {\n fireStickerEffect({...options, e});\n });\n\n options.middleware.onDestroy(detach);\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\nimport windowSize from '../windowSize';\n\nexport default function getVisibleRect(\n element: HTMLElement,\n overflowElement: HTMLElement,\n lookForSticky?: boolean,\n rect: DOMRectMinified = element.getBoundingClientRect(),\n overflowRect: DOMRectMinified = overflowElement.getBoundingClientRect()\n) {\n let {top: overflowTop, right: overflowRight, bottom: overflowBottom, left: overflowLeft} = overflowRect;\n\n // * respect sticky headers\n if(lookForSticky) {\n const sticky = overflowElement.querySelector('.sticky');\n if(sticky) {\n const stickyRect = sticky.getBoundingClientRect();\n overflowTop = stickyRect.bottom;\n }\n }\n\n if(rect.top >= overflowBottom ||\n rect.bottom <= overflowTop ||\n rect.right <= overflowLeft ||\n rect.left >= overflowRight) {\n return null;\n }\n\n const overflow = {\n top: false,\n right: false,\n bottom: false,\n left: false,\n vertical: 0 as 0 | 1 | 2,\n horizontal: 0 as 0 | 1 | 2\n };\n\n const windowWidth = windowSize.width;\n const windowHeight = windowSize.height;\n\n return {\n rect: {\n top: rect.top < overflowTop && overflowTop !== 0 ? (overflow.top = true, ++overflow.vertical, overflowTop) : rect.top,\n right: rect.right > overflowRight && overflowRight !== windowWidth ? (overflow.right = true, ++overflow.horizontal, overflowRight) : rect.right,\n bottom: rect.bottom > overflowBottom && overflowBottom !== windowHeight ? (overflow.bottom = true, ++overflow.vertical, overflowBottom) : rect.bottom,\n left: rect.left < overflowLeft && overflowLeft !== 0 ? (overflow.left = true, ++overflow.horizontal, overflowLeft) : rect.left\n },\n overflow\n };\n}\n\n(window as any).getVisibleRect = getVisibleRect;\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 getVisibleRect from './getVisibleRect';\n\nexport type ViewportSlicePart = {element: HTMLElement, rect: DOMRect, visibleRect: ReturnType<typeof getVisibleRect>}[];\n\nexport default function getViewportSlice({\n overflowElement,\n overflowRect,\n selector,\n extraSize,\n extraMinLength,\n elements\n}: {\n overflowElement: HTMLElement,\n overflowRect?: DOMRectMinified,\n extraSize?: number,\n extraMinLength?: number,\n selector?: string,\n elements?: HTMLElement[]\n}) {\n // const perf = performance.now();\n overflowRect ??= overflowElement.getBoundingClientRect();\n elements ??= Array.from(overflowElement.querySelectorAll<HTMLElement>(selector));\n\n if(extraSize) {\n overflowRect = {\n top: overflowRect.top - extraSize,\n right: overflowRect.right + extraSize,\n bottom: overflowRect.bottom + extraSize,\n left: overflowRect.left - extraSize\n };\n }\n\n const invisibleTop: ViewportSlicePart = [],\n visible: typeof invisibleTop = [],\n invisibleBottom: typeof invisibleTop = [];\n let foundVisible = false;\n for(const element of elements) {\n const rect = element.getBoundingClientRect();\n const visibleRect = getVisibleRect(element, overflowElement, false, rect, overflowRect);\n\n const isVisible = !!visibleRect;\n let array: typeof invisibleTop;\n if(isVisible) {\n foundVisible = true;\n array = visible;\n } else if(foundVisible) {\n array = invisibleBottom;\n } else {\n array = invisibleTop;\n }\n\n array.push({\n element,\n rect,\n visibleRect\n });\n }\n\n if(extraMinLength) {\n visible.unshift(...invisibleTop.splice(Math.max(0, invisibleTop.length - extraMinLength), extraMinLength));\n visible.push(...invisibleBottom.splice(0, extraMinLength));\n }\n\n // if(extraSize && visible.length) {\n // const maxTop = visible[0].rect.top;\n // const minTop = maxTop - extraSize;\n // const minBottom = visible[visible.length - 1].rect.bottom;\n // const maxBottom = minBottom + extraSize;\n\n // for(let length = invisibleTop.length, i = length - 1; i >= 0; --i) {\n // const element = invisibleTop[i];\n // if(element.rect.top >= minTop) {\n // invisibleTop.splice(i, 1);\n // visible.unshift(element);\n // }\n // }\n\n // for(let i = 0, length = invisibleBottom.length; i < length; ++i) {\n // const element = invisibleBottom[i];\n // if(element.rect.bottom <= maxBottom) {\n // invisibleBottom.splice(i--, 1);\n // --length;\n // visible.push(element);\n // }\n // }\n // }\n\n // console.log('getViewportSlice time:', performance.now() - perf);\n\n return {invisibleTop, visible, invisibleBottom};\n}\n","const resizeObserverMap: WeakMap<Element, (entry: ResizeObserverEntry) => void> = new WeakMap();\nconst resizeObserver = new ResizeObserver((entries) => {\n for(const entry of entries) {\n const callback = resizeObserverMap.get(entry.target);\n callback(entry);\n }\n});\n\nexport function observeResize(element: Element, callback: (entry: ResizeObserverEntry) => void) {\n resizeObserverMap.set(element, callback);\n resizeObserver.observe(element);\n\n return () => {\n unobserveResize(element);\n };\n}\n\nexport function unobserveResize(element: Element) {\n resizeObserverMap.delete(element);\n resizeObserver.unobserve(element);\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\nimport type {MyDocument} from '../appManagers/appDocsManager';\nimport animationIntersector, {AnimationItemGroup} from '../../components/animationIntersector';\nimport LazyLoadQueue from '../../components/lazyLoadQueue';\nimport wrapSticker, {videosCache} from '../../components/wrappers/sticker';\nimport customProperties, {CustomProperty} from '../../helpers/dom/customProperties';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport getViewportSlice from '../../helpers/dom/getViewportSlice';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport framesCache from '../../helpers/framesCache';\nimport {MediaSize} from '../../helpers/mediaSize';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {Middleware, MiddlewareHelper, getMiddleware} from '../../helpers/middleware';\nimport noop from '../../helpers/noop';\nimport {DocumentAttribute} from '../../layer';\nimport wrapRichText from '../richTextProcessor/wrapRichText';\nimport RLottiePlayer, {applyColorOnContext, getLottiePixelRatio} from '../rlottie/rlottiePlayer';\nimport rootScope from '../rootScope';\nimport CustomEmojiElement, {CustomEmojiElements} from './element';\nimport assumeType from '../../helpers/assumeType';\nimport {IS_WEBM_SUPPORTED} from '../../environment/videoSupport';\nimport {observeResize, unobserveResize} from '../../components/resizeObserver';\n\nconst globalLazyLoadQueue = new LazyLoadQueue();\n\nexport class CustomEmojiRendererElement extends HTMLElement {\n public static globalLazyLoadQueue: LazyLoadQueue = globalLazyLoadQueue;\n\n public canvas: HTMLCanvasElement;\n public context: CanvasRenderingContext2D;\n\n public playersSynced: Map<CustomEmojiElements, RLottiePlayer | HTMLVideoElement>;\n public textColored: Set<CustomEmojiElements>;\n public clearedElements: WeakSet<CustomEmojiElements>;\n public customEmojis: Parameters<typeof wrapRichText>[1]['customEmojis'];\n public lastPausedVideo: HTMLVideoElement;\n\n public lastRect: {width: number, height: number};\n public isDimensionsSet: boolean;\n\n public animationGroup: AnimationItemGroup;\n public size: MediaSize;\n\n public isSelectable: boolean;\n public isCanvasClean: boolean;\n\n public ignoreSettingDimensions: boolean;\n\n public forceRenderAfterSize: boolean;\n\n public middlewareHelper: MiddlewareHelper;\n\n public auto: boolean;\n public textColor: CustomProperty;\n\n public observeResizeElement: HTMLElement | false;\n\n constructor() {\n super();\n\n this.classList.add('custom-emoji-renderer');\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('custom-emoji-canvas');\n this.context = this.canvas.getContext('2d');\n this.append(this.canvas);\n\n this.playersSynced = new Map();\n this.textColored = new Set();\n this.clearedElements = new WeakSet();\n this.customEmojis = new Map();\n\n this.animationGroup = 'EMOJI';\n this.isCanvasClean = false;\n }\n\n private onResizeEntry = (entry: ResizeObserverEntry) => {\n this.setDimensionsFromRect(entry.contentRect);\n };\n\n public connectedCallback() {\n if(emojiRenderers.has(this)) {\n return;\n }\n\n // this.setDimensions();\n // animationIntersector.addAnimation(this, this.animationGroup);\n const observeElement = this.observeResizeElement ?? this.canvas;\n if(observeElement) {\n observeResize(observeElement, this.onResizeEntry);\n }\n emojiRenderers.add(this);\n\n this.connectedCallback = undefined;\n }\n\n public disconnectedCallback() {\n if(this.isConnected || !this.auto) {\n return;\n }\n\n this.destroy?.();\n\n this.disconnectedCallback = undefined;\n }\n\n public destroy() {\n // if(this.isConnected) {\n // return;\n // }\n\n const observeElement = this.observeResizeElement ?? this.canvas;\n if(observeElement) {\n unobserveResize(observeElement);\n }\n\n this.customEmojis.forEach((elements) => {\n elements.forEach((element) => {\n element.clear();\n });\n });\n\n emojiRenderers.delete(this);\n this.playersSynced.clear();\n this.middlewareHelper?.clean();\n this.customEmojis.clear();\n this.textColored.clear();\n\n this.destroy =\n this.lastPausedVideo =\n undefined;\n }\n\n public getOffsets(offsetsMap: Map<CustomEmojiElements, {top: number, left: number, width: number}[]> = new Map()) {\n if(!this.playersSynced.size) {\n return offsetsMap;\n }\n\n const overflowElement = findUpClassName(this, 'scrollable') || this.offsetParent as HTMLElement;\n if(!overflowElement) {\n return offsetsMap;\n }\n\n const overflowRect = overflowElement.getBoundingClientRect();\n const rect = this.getBoundingClientRect();\n\n for(const elements of this.playersSynced.keys()) {\n const elementsArr = Array.from(elements);\n const placeholders = this.isSelectable ? elementsArr.map((element) => element.placeholder) : elementsArr;\n const {visible} = getViewportSlice({\n overflowElement,\n overflowRect,\n elements: placeholders,\n extraSize: this.size.height * 2.5 // let's add some margin\n });\n\n const offsets = visible.map(({rect: elementRect}) => {\n const top = elementRect.top - rect.top;\n const left = elementRect.left - rect.left;\n return {top, left, width: elementRect.width};\n });\n\n if(offsets.length) {\n offsetsMap.set(elements, offsets);\n }\n }\n\n // const rect = this.getBoundingClientRect();\n // const visibleRect = getVisibleRect(this, overflowElement, undefined, rect);\n // const minTop = visibleRect ? visibleRect.rect.top - this.size.height : 0;\n // const maxTop = Infinity;\n // for(const elements of this.playersSynced.keys()) {\n // const offsets = elements.map((element) => {\n // const elementRect = element.getBoundingClientRect();\n // const top = elementRect.top - rect.top;\n // const left = elementRect.left - rect.left;\n // return top >= minTop && (top + elementRect.height) <= maxTop ? {top, left} : undefined;\n // }).filter(Boolean);\n\n // if(offsets.length) {\n // offsetsMap.set(elements, offsets);\n // }\n // }\n\n return offsetsMap;\n }\n\n public clearCanvas() {\n if(this.isCanvasClean) {\n return;\n }\n\n const {context, canvas} = this;\n context.clearRect(0, 0, canvas.width, canvas.height);\n this.isCanvasClean = true;\n }\n\n public render(offsetsMap: ReturnType<CustomEmojiRendererElement['getOffsets']>) {\n const {context, canvas, isDimensionsSet} = this;\n if(!isDimensionsSet) {\n this.setDimensionsFromRect(undefined, false);\n }\n\n this.isCanvasClean = false;\n\n const {width, height, dpr} = canvas;\n for(const [elements, offsets] of offsetsMap) {\n const player = this.playersSynced.get(elements);\n const frame = syncedPlayersFrames.get(player) || (player instanceof HTMLVideoElement ? player : undefined);\n if(!frame) {\n continue;\n }\n\n const isImageData = frame instanceof ImageData;\n let frameWidth: number, frameHeight: number;\n if(player instanceof HTMLVideoElement) {\n frameWidth = this.size.width * dpr;\n frameHeight = this.size.height * dpr;\n } else {\n frameWidth = frame.width;\n frameHeight = frame.height;\n }\n\n // ! check performance of scaling\n const elementWidth = Math.round(offsets[0].width * dpr);\n if(elementWidth !== frameWidth) {\n // if(this.size.width === 36) {\n // console.warn('different width', elementWidth, frameWidth, this);\n // }\n\n frameWidth = elementWidth;\n frameHeight = elementWidth;\n }\n\n const maxTop = height - frameHeight;\n const maxLeft = width - frameWidth;\n const color = this.textColored.has(elements) ? customProperties.getProperty(this.textColor) : undefined;\n\n if(!this.clearedElements.has(elements) && !this.isSelectable) {\n if(this.isSelectable/* && false */) {\n elements.forEach((element) => {\n element.lastChildWas ??= element.lastChild;\n replaceContent(element, element.firstChild);\n });\n } else {\n elements.forEach((element) => {\n element.replaceChildren();\n });\n }\n\n this.clearedElements.add(elements);\n }\n\n offsets.forEach(({top, left}) => {\n top = Math.round(top * dpr), left = Math.round(left * dpr);\n if(left < 0 ||/* top > maxTop || */left > maxLeft) {\n return;\n }\n\n if(isImageData) {\n context.putImageData(frame, left, top);\n } else {\n // context.clearRect(left, top, width, height);\n context.drawImage(frame, left, top, frameWidth, frameHeight);\n }\n\n if(color) {\n applyColorOnContext(context, color, left, top, frameWidth, frameHeight);\n }\n });\n }\n }\n\n public checkForAnyFrame() {\n for(const player of this.playersSynced.values()) {\n if(syncedPlayersFrames.has(player) || player instanceof HTMLVideoElement) {\n return true;\n }\n }\n\n return false;\n }\n\n public remove() {\n super.remove();\n // this.canvas.remove();\n }\n\n // public setDimensions() {\n // const {canvas} = this;\n // sequentialDom.mutateElement(canvas, () => {\n // const rect = canvas.getBoundingClientRect();\n // this.setDimensionsFromRect(rect);\n // });\n // }\n\n public setDimensionsFromRect(rect: {width: number, height: number} = this.lastRect, forceRenderAfter = true) {\n const {canvas} = this;\n const {dpr} = canvas;\n\n if(this.lastRect !== rect) {\n this.lastRect = rect;\n }\n\n if(!rect || !dpr || this.ignoreSettingDimensions) {\n return;\n }\n\n const {width, height} = rect;\n // if(this.isSelectable) {\n // height = this.parentElement.scrollHeight || height;\n\n // this.style.width = width + 'px';\n // this.style.height = height + 'px';\n // }\n\n const newWidth = Math.floor(Math.round(width * dpr));\n const newHeight = Math.floor(Math.round(height * dpr));\n if(canvas.width === newWidth && canvas.height === newHeight) {\n return;\n }\n\n canvas.width = newWidth;\n canvas.height = newHeight;\n this.isDimensionsSet = true;\n this.isCanvasClean = true;\n\n if(this.observeResizeElement || this.observeResizeElement === false) {\n this.canvas.style.setProperty('width', width + 'px', 'important');\n this.canvas.style.setProperty('height', height + 'px', 'important');\n }\n\n if(this.forceRenderAfterSize || (this.isSelectable && forceRenderAfter)) {\n this.forceRenderAfterSize = undefined;\n this.forceRender();\n }\n }\n\n public forceRender() {\n if(!this.isDimensionsSet) {\n return;\n }\n\n if(!renderEmojis(new Set([this]))) {\n this.clearCanvas();\n }\n }\n\n private onElementCleanup = (element: CustomEmojiElement, syncedPlayer: SyncedPlayer, middleware: Middleware) => {\n element.clear(); // * it is correct\n\n syncedPlayer.middlewares.delete(middleware);\n\n // * still has some elements\n if(syncedPlayer.middlewares.size) {\n return;\n }\n\n if(syncedPlayer.player) {\n const frame = syncedPlayersFrames.get(syncedPlayer.player);\n if(frame) {\n (frame as ImageBitmap).close?.();\n syncedPlayersFrames.delete(syncedPlayer.player);\n }\n\n syncedPlayersFrames.delete(syncedPlayer.player);\n if(syncedPlayer.player instanceof RLottiePlayer) {\n syncedPlayer.player.overrideRender = noop;\n syncedPlayer.player.remove();\n } else if(syncedPlayer.player instanceof HTMLVideoElement) {\n const cacheName = framesCache.generateName('' + element.docId, 0, 0, undefined, undefined);\n delete videosCache[cacheName];\n }\n\n syncedPlayer.player = undefined;\n }\n\n if(\n syncedPlayers.get(syncedPlayer.key) === syncedPlayer &&\n syncedPlayers.delete(syncedPlayer.key) &&\n !syncedPlayers.size\n ) {\n clearRenderInterval();\n }\n };\n\n private wrap({\n doc,\n addCustomEmojis,\n usingOwnQueue,\n lazyLoadQueue,\n onlyThumb,\n withThumb,\n loadPromises\n }: {\n doc: MyDocument,\n addCustomEmojis: Parameters<typeof wrapRichText>[1]['customEmojis'],\n usingOwnQueue?: boolean,\n lazyLoadQueue?: LazyLoadQueue | false,\n onlyThumb?: boolean,\n withThumb?: boolean,\n loadPromises?: Promise<any>[]\n }) {\n const renderer = this;\n const size = this.size;\n const managers = rootScope.managers;\n const middleware = this.middlewareHelper.get();\n\n const docId = doc.id;\n const newElements = addCustomEmojis.get(docId);\n const customEmojis = renderer.customEmojis.get(docId);\n const newElementsArray = Array.from(newElements);\n const isLottie = doc.sticker === 2;\n const isStatic = newElementsArray[0].static || (doc.mime_type === 'video/webm' && !IS_WEBM_SUPPORTED);\n const willHaveSyncedPlayer = (isLottie || (doc.sticker === 3 && this.isSelectable)) && !onlyThumb && !isStatic;\n\n const attribute = doc.attributes.find((attribute) => attribute._ === 'documentAttributeCustomEmoji') as DocumentAttribute.documentAttributeCustomEmoji;\n if(attribute && attribute.pFlags.text_color) {\n renderer.textColored.add(customEmojis);\n }\n\n const loadStickerMiddleware = willHaveSyncedPlayer ? middleware.create().get(() => {\n return !!syncedPlayer.middlewares.size;\n }) : undefined;\n\n const _loadPromises: Promise<any>[] = [];\n const promise = wrapSticker({\n div: newElementsArray,\n doc,\n width: size.width,\n height: size.height,\n loop: true,\n play: CUSTOM_EMOJI_INSTANT_PLAY,\n managers,\n isCustomEmoji: true,\n group: 'none',\n loadPromises: _loadPromises,\n middleware,\n exportLoad: usingOwnQueue || lazyLoadQueue === false ? 2 : 1, // 2 - export load always, 1 - do not export load if cached static\n needFadeIn: false,\n loadStickerMiddleware,\n static: isStatic,\n onlyThumb,\n withThumb: withThumb ?? (renderer.clearedElements.has(customEmojis) ? false : undefined),\n syncedVideo: this.isSelectable,\n textColor: renderer.textColor\n });\n\n if(loadPromises) {\n promise.then(() => loadPromises.push(..._loadPromises));\n }\n\n const addition: {\n onRender?: (_p: Awaited<Awaited<typeof promise>['render']>) => Promise<void>,\n elements: typeof newElements\n } = {\n elements: newElements\n };\n\n const readyPromise = newElementsArray[0].readyPromise;\n if(readyPromise) {\n promise.then(({render}) => {\n if(!render) {\n readyPromise.resolve();\n return;\n }\n\n render.then(\n () => readyPromise.resolve(),\n readyPromise.reject.bind(readyPromise)\n );\n });\n }\n\n if(doc.sticker === 1 || onlyThumb || isStatic) {\n if(this.isSelectable) {\n addition.onRender = () => Promise.all(_loadPromises).then(() => {\n if(!middleware()) return;\n newElementsArray.forEach((element) => {\n const {placeholder} = element;\n placeholder.src = (element.firstElementChild as HTMLImageElement).src;\n });\n });\n }\n\n return promise.then((res) => ({...res, ...addition}));\n }\n\n // eslint-disable-next-line prefer-const\n addition.onRender = (_p) => Promise.all(_loadPromises).then(() => {\n if(!middleware() || !doc.animated) {\n return;\n }\n\n const players = Array.isArray(_p) ? _p as HTMLVideoElement[] : [_p as RLottiePlayer];\n const player = Array.isArray(players) ? players[0] : players;\n assumeType<RLottiePlayer | HTMLVideoElement>(player);\n newElementsArray.forEach((element, idx) => {\n const player = players[idx] || players[0];\n element.player = player;\n\n if(syncedPlayer) {\n element.syncedPlayer = syncedPlayer;\n if(element.paused) {\n element.syncedPlayer.pausedElements.add(element);\n } else if(player.paused) {\n player.play();\n }\n }\n\n if(element.isConnected || middleware()) {\n animationIntersector.addAnimation({\n animation: element,\n group: element.renderer.animationGroup,\n observeElement: element.placeholder ?? element,\n controlled: true,\n type: 'emoji'\n });\n }\n });\n\n if(player instanceof RLottiePlayer || (player instanceof HTMLVideoElement && this.isSelectable)) {\n syncedPlayer.player = player;\n renderer.playersSynced.set(customEmojis, player);\n }\n\n if(player instanceof RLottiePlayer) {\n player.group = renderer.animationGroup;\n\n player.overrideRender ??= (frame) => {\n syncedPlayersFrames.set(player, frame);\n // frames.set(containers, frame);\n };\n } else if(player instanceof HTMLVideoElement) {\n // player.play();\n\n // const cache = framesCache.getCache(key);\n // let {width, height} = renderer.size;\n // width *= dpr;\n // height *= dpr;\n\n // const onFrame = (frame: ImageBitmap | HTMLCanvasElement) => {\n // topFrames.set(player, frame);\n // player.requestVideoFrameCallback(callback);\n // };\n\n // let frameNo = -1, lastTime = 0;\n // const callback: VideoFrameRequestCallback = (now, metadata) => {\n // const time = player.currentTime;\n // if(lastTime > time) {\n // frameNo = -1;\n // }\n\n // const _frameNo = ++frameNo;\n // lastTime = time;\n // // const frameNo = Math.floor(player.currentTime * 1000 / CUSTOM_EMOJI_FRAME_INTERVAL);\n // // const frameNo = metadata.presentedFrames;\n // const imageBitmap = cache.framesNew.get(_frameNo);\n\n // if(imageBitmap) {\n // onFrame(imageBitmap);\n // } else if(IS_IMAGE_BITMAP_SUPPORTED) {\n // createImageBitmap(player, {resizeWidth: width, resizeHeight: height}).then((imageBitmap) => {\n // cache.framesNew.set(_frameNo, imageBitmap);\n // if(frameNo === _frameNo) onFrame(imageBitmap);\n // });\n // } else {\n // const canvas = document.createElement('canvas');\n // const context = canvas.getContext('2d');\n // canvas.width = width;\n // canvas.height = height;\n // context.drawImage(player, 0, 0);\n // cache.framesNew.set(_frameNo, canvas);\n // onFrame(canvas);\n // }\n // };\n\n // // player.requestVideoFrameCallback(callback);\n // // setInterval(callback, CUSTOM_EMOJI_FRAME_INTERVAL);\n }\n\n if(willHaveSyncedPlayer) {\n const dpr = getLottiePixelRatio(this.size.width, this.size.height);\n renderer.canvas.dpr = dpr;\n setRenderInterval();\n }\n });\n\n let syncedPlayer: SyncedPlayer;\n const key = [docId, size.width, size.height].join('-');\n if(willHaveSyncedPlayer) {\n syncedPlayer = syncedPlayers.get(key);\n if(!syncedPlayer) {\n syncedPlayer = {\n player: undefined,\n middlewares: new Set(),\n pausedElements: new Set(),\n key\n };\n\n syncedPlayers.set(key, syncedPlayer);\n }\n\n for(const element of newElements) {\n const middleware = element.middlewareHelper.get();\n syncedPlayer.middlewares.add(middleware);\n middleware.onClean(this.onElementCleanup.bind(this, element, syncedPlayer, middleware));\n }\n }\n\n return promise.then((res) => ({...res, ...addition}));\n }\n\n public add({\n addCustomEmojis,\n lazyLoadQueue,\n onlyThumb,\n withThumb\n }: {\n addCustomEmojis: Parameters<typeof wrapRichText>[1]['customEmojis'],\n lazyLoadQueue?: LazyLoadQueue | false,\n onlyThumb?: boolean,\n withThumb?: boolean\n }) {\n const renderer = this;\n const middleware = this.middlewareHelper.get();\n\n addCustomEmojis.forEach((addElements, docId) => { // prevent adding old elements\n let elements = this.customEmojis.get(docId);\n if(!elements) this.customEmojis.set(docId, elements = new Set());\n else this.clearedElements.delete(elements);\n\n for(const el of addElements) {\n if(elements.has(el)) {\n addElements.delete(el);\n } else {\n el.clean = false;\n el.renderer = renderer;\n el.elements = elements;\n el.middlewareHelper = middleware.create();\n elements.add(el);\n\n if(el.lastChildWas && !el.lastChildWas.parentNode) {\n el.append(el.lastChildWas);\n }\n }\n }\n\n if(!addElements.size) {\n addCustomEmojis.delete(docId);\n }\n });\n\n if(!addCustomEmojis.size) {\n return;\n }\n\n const usingOwnQueue = !!(!lazyLoadQueue && lazyLoadQueue !== false && globalLazyLoadQueue);\n const docIds = Array.from(addCustomEmojis.keys());\n const managers = rootScope.managers;\n\n const loadPromise = managers.appEmojiManager.getCachedCustomEmojiDocuments(docIds).then((docs) => {\n if(!middleware()) return;\n\n const wrapOptions: Omit<Parameters<CustomEmojiRendererElement['wrap']>[0], 'doc'> = {\n addCustomEmojis,\n usingOwnQueue,\n lazyLoadQueue,\n onlyThumb,\n withThumb\n };\n\n const loadPromises: Promise<any>[] = [];\n\n const missing: DocId[] = [];\n const cachedPromises = docs.map((doc, idx) => {\n if(!doc) {\n missing.push(docIds[idx]);\n return;\n }\n\n return this.wrap({...wrapOptions, doc, loadPromises});\n }).filter(Boolean);\n\n const uncachedPromisesPromise = !missing.length ?\n Promise.resolve([] as typeof cachedPromises) :\n managers.appEmojiManager.getCustomEmojiDocuments(missing).then((docs) => {\n if(!middleware()) return [];\n return docs.filter(Boolean).map((doc) => this.wrap({...wrapOptions, doc}));\n });\n\n const loadFromPromises = async(_promises: typeof cachedPromises) => {\n const arr = await Promise.all(_promises);\n const promises = arr.map(({load, onRender, elements}) => {\n if(!load) {\n return;\n }\n\n const l = () => load().then(onRender);\n\n if(!usingOwnQueue) {\n return l();\n }\n\n elements.forEach((element) => {\n globalLazyLoadQueue.push({\n div: element,\n load: () => {\n elements.forEach((element) => {\n globalLazyLoadQueue.delete({div: element});\n });\n\n return l();\n }\n });\n });\n });\n\n return Promise.all(promises.filter(Boolean));\n };\n\n const load = () => {\n if(!middleware()) return;\n const cached = loadFromPromises(cachedPromises);\n const uncached = uncachedPromisesPromise.then((promises) => loadFromPromises(promises));\n return Promise.all([cached, uncached]);\n };\n\n if(lazyLoadQueue) {\n lazyLoadQueue.push({\n div: renderer.canvas,\n load\n });\n } else {\n load();\n }\n\n return Promise.all(cachedPromises).then(() => Promise.all(loadPromises)).then(() => {});\n });\n\n // recordPromise(loadPromise, 'render emojis: ' + docIds.length);\n\n return loadPromise;\n }\n\n public setTextColor(textColor: string) {\n this.textColor = textColor;\n }\n\n public static create(options: CustomEmojiRendererElementOptions) {\n const renderer = new CustomEmojiRendererElement();\n renderer.animationGroup = options.animationGroup;\n renderer.size = options.customEmojiSize || mediaSizes.active.customEmoji;\n renderer.isSelectable = options.isSelectable;\n renderer.textColor = options.textColor;\n // renderer.textColor = typeof(options.textColor) === 'function' ? options.textColor() : options.textColor;\n renderer.observeResizeElement = options.observeResizeElement;\n if(options.wrappingDraft) {\n renderer.contentEditable = 'false';\n renderer.style.height = 'inherit';\n }\n // const middleware = () => !!renderer.disconnectedCallback && (!options.middleware || options.middleware());\n const middleware = options.middleware;\n if(middleware) {\n renderer.middlewareHelper = middleware.create();\n renderer.middlewareHelper.get().onDestroy(() => {\n renderer.destroy?.();\n });\n } else {\n // console.error('no middleware', this, options);\n renderer.auto = true;\n renderer.middlewareHelper = getMiddleware();\n }\n\n return renderer;\n }\n}\n\nexport type CustomEmojiRenderer = CustomEmojiRendererElement;\nexport type SyncedPlayer = {\n player: RLottiePlayer | HTMLVideoElement,\n middlewares: Set<Middleware>,\n pausedElements: Set<CustomEmojiElement>,\n key: string\n};\nexport type CustomEmojiFrame = Parameters<RLottiePlayer['overrideRender']>[0] | HTMLVideoElement;\n\nexport type CustomEmojiRendererElementOptions = Partial<{\n loadPromises: Promise<any>[],\n customEmojiRenderer: CustomEmojiRendererElement,\n\n isSelectable: boolean,\n wrappingDraft: boolean,\n\n observeResizeElement?: HTMLElement | false\n}> & WrapSomethingOptions;\n\nconst CUSTOM_EMOJI_INSTANT_PLAY = true; // do not wait for animationIntersector\nlet emojiRenderInterval: number;\nconst emojiRenderers: Set<CustomEmojiRenderer> = new Set();\nconst syncedPlayers: Map<string, SyncedPlayer> = new Map();\nconst syncedPlayersFrames: Map<RLottiePlayer | HTMLVideoElement, CustomEmojiFrame> = new Map();\nexport const renderEmojis = (renderers = emojiRenderers) => {\n const r = Array.from(renderers);\n const t = r.filter((r) => r.isConnected && r.checkForAnyFrame() && !r.ignoreSettingDimensions);\n if(!t.length) {\n return false;\n }\n\n const o = t.map((renderer) => {\n const paused = [...renderer.playersSynced.values()].reduce((acc, v) => acc + +!!v.paused, 0);\n if(renderer.playersSynced.size === paused) {\n return;\n }\n\n const offsets = renderer.getOffsets();\n if(offsets.size) {\n return [renderer, offsets] as const;\n }\n }).filter(Boolean);\n\n for(const [renderer] of o) {\n renderer.clearCanvas();\n }\n\n for(const [renderer, offsets] of o) {\n renderer.render(offsets);\n }\n\n return true;\n};\nconst CUSTOM_EMOJI_FPS = 60;\nconst CUSTOM_EMOJI_FRAME_INTERVAL = 1000 / CUSTOM_EMOJI_FPS;\nconst setRenderInterval = () => {\n if(emojiRenderInterval) {\n return;\n }\n\n emojiRenderInterval = window.setInterval(renderEmojis, CUSTOM_EMOJI_FRAME_INTERVAL);\n renderEmojis();\n};\nconst clearRenderInterval = () => {\n if(!emojiRenderInterval) {\n return;\n }\n\n clearInterval(emojiRenderInterval);\n emojiRenderInterval = undefined;\n};\n\n(window as any).syncedPlayers = syncedPlayers;\n(window as any).emojiRenderers = emojiRenderers;\n\ncustomElements.define('custom-emoji-renderer-element', CustomEmojiRendererElement);\n","export default function encodeEntities(value: string) {\n return value.replace(/&/g, '&').replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, (value) => {\n const hi = value.charCodeAt(0);\n const low = value.charCodeAt(1);\n return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';\n }).replace(/([^\\#-~| |!])/g, (value) => { // non-alphanumeric\n return '&#' + value.charCodeAt(0) + ';';\n }).replace(/</g, '<').replace(/>/g, '>');\n}\n","import encodeEntities from '../string/encodeEntities';\n\nexport default function documentFragmentToHTML(fragment: DocumentFragment) {\n return Array.from(fragment.childNodes).map((node) => {\n return node.nodeType === node.TEXT_NODE ? encodeEntities(node.textContent) : (node as Element).outerHTML;\n }).join('');\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\nexport default function findUpAttribute(el: any, attribute: string): HTMLElement {\n return el.closest(`[${attribute}]`);\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\n\n while(el.parentElement) {\n el = el.parentElement;\n if(el.getAttribute(attribute) !== null)\n return el;\n }\n return null; */\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\nexport default function findUpTag(el: any, tag: string): HTMLElement {\n return el.closest(tag);\n /* if(el.tagName === tag) return el; // 03.02.2020\n\n while(el.parentElement) {\n el = el.parentElement;\n if(el.tagName === tag)\n return el;\n }\n return null; */\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\nimport findUpAsChild from './findUpAsChild';\n\nexport default function getCaretPosNew(input: HTMLElement, anchor?: boolean): ReturnType<typeof getCaretPosF> & {selection: Selection} {\n const selection = document.getSelection();\n // let {focusNode: node, focusOffset: offset} = selection;\n const node = selection[anchor ? 'anchorNode' : 'focusNode'];\n const offset = selection[anchor ? 'anchorOffset' : 'focusOffset'];\n if(!findUpAsChild(node, input) && node !== input) {\n return {selection} as any;\n }\n\n return {...getCaretPosF(input, node, offset), selection};\n}\n\nexport function getCaretPosF(input: HTMLElement, node: Node, offset: number) {\n if(node === input) {\n const childNodes = input.childNodes;\n const childNodesLength = childNodes.length;\n if(childNodesLength && offset >= childNodesLength) {\n node = childNodes[childNodesLength - 1];\n offset = (node.textContent || (node as HTMLImageElement).alt || '').length;\n } else {\n node = childNodes[offset];\n offset = 0;\n }\n }\n\n return {node: node as ChildNode, offset};\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\nimport {MessageEntity} from '../../layer';\n\nconst CAN_COMBINE_ENTITIES: Set<MessageEntity['_']> = new Set([\n 'messageEntityBold',\n 'messageEntityItalic',\n 'messageEntityCode',\n 'messageEntityPre',\n 'messageEntityUnderline',\n 'messageEntityStrike',\n 'messageEntityBlockquote',\n 'messageEntitySpoiler'\n]);\nexport default function combineSameEntities(entities: MessageEntity[]) {\n // entities = entities.slice();\n for(let i = 0; i < entities.length; ++i) {\n const entity = entities[i];\n\n let nextEntityIdx = -1;\n do {\n nextEntityIdx = entities.findIndex((e, _i) => {\n return CAN_COMBINE_ENTITIES.has(e._) && _i !== i && e._ === entity._ && (e.offset - entity.length) === entity.offset;\n });\n\n if(nextEntityIdx !== -1) {\n const nextEntity = entities[nextEntityIdx];\n entity.length += nextEntity.length;\n entities.splice(nextEntityIdx, 1);\n }\n } while(nextEntityIdx !== -1);\n }\n // return entities;\n}\n","import {MessageEntity} from '../../layer';\n\nexport default function sortEntities(entities: MessageEntity[]) {\n entities.sort((a, b) => {\n return (a.offset - b.offset) || (b.length - a.length);\n });\n}\n","const BOM = '';\n// const BOM = 'K';\nexport default BOM;\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 {MessageEntity} from '../../layer';\nimport BOM from '../string/bom';\n\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' |\n 'monospace' | 'link' | 'mentionName' | 'spoiler' | 'quote'/* | 'customEmoji' */;\nexport type MarkdownTag = {\n match: string,\n entityName: Extract<\n MessageEntity['_'], 'messageEntityBold' | 'messageEntityUnderline' |\n 'messageEntityItalic' | 'messageEntityCode' | 'messageEntityStrike' |\n 'messageEntityTextUrl' | 'messageEntityMentionName' | 'messageEntitySpoiler' |\n 'messageEntityBlockquote'/* | 'messageEntityCustomEmoji' */\n >;\n};\n\n// https://core.telegram.org/bots/api#html-style\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\n bold: {\n match: '[style*=\"bold\"], [style*=\"font-weight: 700\"], [style*=\"font-weight: 600\"], [style*=\"font-weight:700\"], [style*=\"font-weight:600\"], b, strong',\n entityName: 'messageEntityBold'\n },\n underline: {\n match: '[style*=\"underline\"], u, ins',\n entityName: 'messageEntityUnderline'\n },\n italic: {\n match: '[style*=\"italic\"], i, em',\n entityName: 'messageEntityItalic'\n },\n monospace: {\n match: '[style*=\"monospace\"], [face*=\"monospace\"], pre',\n entityName: 'messageEntityCode'\n },\n strikethrough: {\n match: '[style*=\"line-through\"], [style*=\"strikethrough\"], strike, del, s',\n entityName: 'messageEntityStrike'\n },\n link: {\n match: 'A:not(.follow)',\n entityName: 'messageEntityTextUrl'\n },\n mentionName: {\n match: 'A.follow',\n entityName: 'messageEntityMentionName'\n },\n spoiler: {\n match: '[style*=\"spoiler\"]',\n entityName: 'messageEntitySpoiler'\n },\n quote: {\n match: '[style*=\"quote\"], .quote',\n entityName: 'messageEntityBlockquote'\n }\n // customEmoji: {\n // match: '.custom-emoji',\n // entityName: 'messageEntityCustomEmoji'\n // }\n};\n\nconst tabulationMatch = '[style*=\"table-cell\"], th, td';\n\n/* export function getDepth(child: Node, container?: Node) {\n let depth = 0;\n\n do {\n if(child === container) {\n return depth;\n }\n\n ++depth;\n } while((child = child.parentNode) !== null);\n\n return depth;\n} */\n\nconst BLOCK_TAGS = new Set([\n 'DIV',\n 'P',\n 'BR',\n 'LI',\n 'SECTION',\n 'H6',\n 'H5',\n 'H4',\n 'H3',\n 'H2',\n 'H1',\n 'TR',\n 'OL',\n 'UL',\n 'BLOCKQUOTE'\n]);\n\n// const INSERT_NEW_LINE_TAGS = new Set([\n// 'OL',\n// 'UL'\n// ]);\n\nconst BOM_REG_EXP = new RegExp(BOM, 'g');\nexport const SELECTION_SEPARATOR = '\\x01';\n\nfunction checkNodeForEntity(node: Node, value: string, entities: MessageEntity[], offset: {offset: number}) {\n const parentElement = node.parentElement;\n\n // let closestTag: MarkdownTag, closestElementByTag: Element, closestDepth = Infinity;\n for(const type in markdownTags) {\n const tag = markdownTags[type as MarkdownType];\n const closest: HTMLElement = parentElement.closest(tag.match + ', [contenteditable=\"true\"]');\n if(closest?.getAttribute('contenteditable') !== null) {\n /* const depth = getDepth(closest, parentElement.closest('[contenteditable]'));\n if(closestDepth > depth) {\n closestDepth = depth;\n closestTag = tag;\n closestElementByTag = closest;\n } */\n continue;\n }\n\n let codeElement: HTMLElement;\n if(tag.entityName === 'messageEntityCode' && (codeElement = parentElement.closest('[data-language]'))) {\n entities.push({\n _: 'messageEntityPre',\n language: codeElement.dataset.language || '',\n offset: offset.offset,\n length: value.length\n });\n } else if(tag.entityName === 'messageEntityTextUrl') {\n entities.push({\n _: tag.entityName,\n url: (closest as HTMLAnchorElement).href,\n offset: offset.offset,\n length: value.length\n });\n } else if(tag.entityName === 'messageEntityMentionName') {\n entities.push({\n _: tag.entityName,\n offset: offset.offset,\n length: value.length,\n user_id: (closest as HTMLElement).dataset.follow.toUserId()\n });\n } else if(tag.entityName === 'messageEntityBlockquote') {\n entities.push({\n _: tag.entityName,\n pFlags: {\n collapsed: /* closest.classList.contains('can-send-collapsd') && */!!closest.dataset.collapsed || undefined\n },\n offset: offset.offset,\n length: value.length\n });\n } /* else if(tag.entityName === 'messageEntityCustomEmoji') {\n entities.push({\n _: tag.entityName,\n document_id: (closest as HTMLElement).dataset.docId,\n offset: offset.offset,\n length: emoji.length\n });\n } */ else {\n entities.push({\n _: tag.entityName,\n offset: offset.offset,\n length: value.length\n });\n }\n }\n}\n\nfunction isLineEmpty(line: string[]) {\n const {length} = line;\n if(!length) {\n return true;\n }\n\n if(line[length - 1] === SELECTION_SEPARATOR && length === SELECTION_SEPARATOR.length) {\n return true;\n }\n\n return false;\n}\n\nexport default function getRichElementValue(\n node: HTMLElement,\n lines: string[],\n line: string[],\n selNode?: Node,\n selOffset?: number,\n entities?: MessageEntity[],\n offset: {offset: number, isInQuote?: boolean} = {offset: 0}\n) {\n if(node.nodeType === node.TEXT_NODE) { // TEXT\n let nodeValue = node.nodeValue;\n // if(nodeValue[0] === BOM) {\n nodeValue = nodeValue.replace(BOM_REG_EXP, '');\n // }\n\n /* const tabulation = node.parentElement?.closest(tabulationMatch + ', [contenteditable]');\n if(tabulation?.getAttribute('contenteditable') === null) {\n nodeValue += ' ';\n // line.push('\\t');\n // ++offset.offset;\n } */\n\n if(nodeValue) {\n // if(offset.isInQuote && nodeValue.endsWith('\\n')) { // slice last linebreak from quote\n // nodeValue = nodeValue.slice(0, -1);\n // }\n\n if(selNode === node) {\n line.push(nodeValue.substr(0, selOffset) + SELECTION_SEPARATOR + nodeValue.substr(selOffset));\n } else {\n line.push(nodeValue);\n }\n } else if(selNode === node) {\n line.push(SELECTION_SEPARATOR);\n }\n\n if(entities && nodeValue.length && node.parentNode) {\n checkNodeForEntity(node, nodeValue, entities, offset);\n }\n\n offset.offset += nodeValue.length;\n return;\n }\n\n if(node.nodeType !== node.ELEMENT_NODE) { // NON-ELEMENT\n return;\n }\n\n const pushLine = () => {\n lines.push(line.join(''));\n line.length = 0;\n ++offset.offset;\n };\n\n const isSelected = selNode === node;\n const isQuote = node.matches(markdownTags.quote.match);\n const isBlock = BLOCK_TAGS.has(node.tagName) || isQuote;\n if(isBlock && ((line.length && line[line.length - 1].slice(-1) !== '\\n') || node.tagName === 'BR'/* || (BLOCK_TAGS.has(node.tagName) && lines.length) */)) {\n pushLine();\n } else {\n const alt = node.dataset.stickerEmoji || (node as HTMLImageElement).alt;\n const stickerEmoji = node.dataset.stickerEmoji;\n\n if(alt && entities) {\n checkNodeForEntity(node, alt, entities, offset);\n }\n\n if(stickerEmoji && entities) {\n entities.push({\n _: 'messageEntityCustomEmoji',\n document_id: node.dataset.docId,\n offset: offset.offset,\n length: alt.length\n });\n }\n\n if(alt) {\n line.push(alt);\n offset.offset += alt.length;\n }\n }\n\n if(isSelected && !selOffset) {\n line.push(SELECTION_SEPARATOR);\n }\n\n const isTableCell = node.matches(tabulationMatch);\n const wasEntitiesLength = entities?.length;\n // const wasLinesLength = lines.length;\n let wasNodeEmpty = true;\n\n if(isQuote) {\n offset.isInQuote = true;\n }\n\n let curChild = node.firstChild as HTMLElement;\n while(curChild) {\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\n curChild = curChild.nextSibling as any;\n\n if(!isLineEmpty(line)) {\n wasNodeEmpty = false;\n }\n }\n\n if(isQuote) {\n const lastValue = line[line.length - 1];\n if(lastValue?.endsWith('\\n')) { // slice last linebreak from quote\n line[line.length - 1] = lastValue.slice(0, -1);\n offset.offset -= 1;\n }\n\n offset.isInQuote = false;\n }\n\n // can test on text with list (https://www.who.int/initiatives/sports-and-health)\n if(wasNodeEmpty && node.textContent?.replace(/[\\r\\n]/g, '')) {\n wasNodeEmpty = false;\n }\n\n if(isSelected && selOffset) {\n line.push(SELECTION_SEPARATOR);\n }\n\n if(isTableCell && node.nextSibling && !isLineEmpty(line)) {\n line.push(' ');\n ++offset.offset;\n\n // * combine entities such as url after adding space\n if(wasEntitiesLength !== undefined) {\n for(let i = wasEntitiesLength, length = entities.length; i < length; ++i) {\n ++entities[i].length;\n }\n }\n }\n\n if(isBlock && !wasNodeEmpty) {\n pushLine();\n }\n\n if(!wasNodeEmpty && node.tagName === 'P' && node.nextSibling) {\n lines.push('');\n ++offset.offset;\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 {MOUNT_CLASS_TO} from '../../config/debug';\nimport {MessageEntity} from '../../layer';\nimport combineSameEntities from '../../lib/richTextProcessor/combineSameEntities';\nimport sortEntities from '../../lib/richTextProcessor/sortEntities';\nimport getRichElementValue, {SELECTION_SEPARATOR} from './getRichElementValue';\n\nexport function getCaretPos(field: Node) {\n const sel = window.getSelection();\n let selNode: Node;\n let selOffset: number;\n if(sel?.rangeCount) {\n const range = sel.getRangeAt(0);\n const startOffset = range.startOffset;\n if(\n range.startContainer &&\n range.startContainer == range.endContainer &&\n startOffset == range.endOffset\n ) {\n // * if focused on img, or caret has been set via placeCaretAtEnd\n const possibleChildrenFocusOffset = startOffset - 1;\n const childNodes = field.childNodes;\n if(range.startContainer === field && childNodes[possibleChildrenFocusOffset]) {\n selNode = childNodes[possibleChildrenFocusOffset];\n selOffset = 0;\n\n for(let i = 0; i < range.endOffset; ++i) {\n const node = childNodes[i];\n const value = node.nodeValue || (node as HTMLImageElement).alt;\n\n if(value) {\n selOffset += value.length;\n }\n }\n } else {\n selNode = range.startContainer;\n selOffset = startOffset;\n }\n }\n }\n\n return {node: selNode, offset: selOffset};\n}\n\nexport default function getRichValueWithCaret(\n field: Node | HTMLElement | DocumentFragment,\n withEntities = true,\n withCaret = true\n) {\n const lines: string[] = [];\n const line: string[] = [];\n\n const {node: selNode, offset: selOffset} = !(field instanceof DocumentFragment) && withCaret && getCaretPos(field);\n\n const entities: MessageEntity[] = withEntities ? [] : undefined;\n const offset = {offset: 0};\n if(field instanceof DocumentFragment) {\n let curChild = field.firstChild as HTMLElement;\n while(curChild) {\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\n curChild = curChild.nextSibling as any;\n }\n } else {\n getRichElementValue(field as HTMLElement, lines, line, selNode, selOffset, entities, offset);\n }\n\n if(line.length) {\n lines.push(line.join(''));\n }\n\n let value = lines.join('\\n');\n const caretPos = value.indexOf(SELECTION_SEPARATOR);\n if(caretPos !== -1) {\n value = value.substr(0, caretPos) + value.substr(caretPos + 1);\n }\n value = value.replace(/\\u00A0/g, ' ');\n\n if(entities?.length) {\n // ! cannot do that here because have the same check before the sending in RichTextProcessor.parseMarkdown\n /* const entity = entities[entities.length - 1];\n const length = value.length;\n const trimmedLength = value.trimRight().length;\n if(length !== trimmedLength) {\n entity.length -= length - trimmedLength;\n } */\n\n combineSameEntities(entities);\n sortEntities(entities);\n }\n\n return {value, entities, caretPos};\n}\n\nMOUNT_CLASS_TO.getCaretPos = getCaretPos;\nMOUNT_CLASS_TO.getRichValueWithCaret = getRichValueWithCaret;\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\nexport default function isInputEmpty(element: HTMLElement, allowStartingSpace?: boolean) {\n let value: string;\n if(element.isContentEditable || element.tagName !== 'INPUT') {\n if(element.querySelector('.emoji, .custom-emoji, .custom-emoji-placeholder')) {\n return false;\n }\n /* const value = element.innerText;\n\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\n // return !getRichValueWithCaret(element, false, false).value.trim();\n value = element.textContent;\n } else {\n value = (element as HTMLInputElement).value;\n }\n\n if(!allowStartingSpace) {\n return !value.trim();\n }\n\n return !value;\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\nimport type {EMOJI_VERSION} from '../environment/emojiVersionsSupport';\n\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}};\n\nconst Emoji: {[emoji: string]: number} = EmojiVersions[''];\nfor(const version in EmojiVersions) {\n if(version) {\n Object.assign(Emoji, EmojiVersions[version as EMOJI_VERSION]);\n }\n}\n\nexport default Emoji;\n\n/* Emoji[\"00a9-fe0f\"] = 6362;\nEmoji[\"00ae-fe0f\"] = 6363;\nEmoji[\"2122-fe0f\"] = 6364; */\n","// just for the future\nexport default function buildURLHash(str: string) {\n return '#' + encodeURIComponent(str);\n}\n","export default function spoiler(text: string): string {\n const chars = '⠁⠂⠄⠈⠐⠠⡀⢀⠃⠅⠆⠉⠊⠌⠑⠒⠔⠘⠡⠢⠤⠨⠰⡁⡂⡄⡈⡐⡠⢁⢂⢄⢈⢐⢠⣀⠇⠋⠍⠎⠓⠕⠖⠙⠚⠜⠣⠥⠦⠩⠪⠬⠱⠲⠴⠸⡃⡅⡆⡉⡊⡌⡑⡒⡔⡘⡡⡢⡤⡨⡰⢃⢅⢆⢉⢊⢌⢑⢒⢔⢘⢡⢢⢤⢨⢰⣁⣂⣄⣈⣐⣠⠏⠗⠛⠝⠞⠧⠫⠭⠮⠳⠵⠶⠹⠺⠼⡇⡋⡍⡎⡓⡕⡖⡙⡚⡜⡣⡥⡦⡩⡪⡬⡱⡲⡴⡸⢇⢋⢍⢎⢓⢕⢖⢙⢚⢜⢣⢥⢦⢩⢪⢬⢱⢲⢴⢸⣃⣅⣆⣉⣊⣌⣑⣒⣔⣘⣡⣢⣤⣨⣰⠟⠯⠷⠻⠽⠾⡏⡗⡛⡝⡞⡧⡫⡭⡮⡳⡵⡶⡹⡺⡼⢏⢗⢛⢝⢞⢧⢫⢭⢮⢳⢵⢶⢹⢺⢼⣇⣋⣍⣎⣓⣕⣖⣙⣚⣜⣣⣥⣦⣩⣪⣬⣱⣲⣴⣸⠿⡟⡯⡷⡻⡽⡾⢟⢯⢷⢻⢽⢾⣏⣗⣛⣝⣞⣧⣫⣭⣮⣳⣵⣶⣹⣺⣼⡿⢿⣟⣯⣷⣻⣽⣾⣿';\n const charsLength = chars.length;\n\n const out: string[] = [];\n for(let i = 0; i < text.length; ++i) {\n const char = text.charCodeAt(i);\n out.push(chars[char % charsLength]);\n }\n\n return out.join('');\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\nimport {MessageEntity} from '../../layer';\nimport spoiler from './spoiler';\n\nexport default function encodeSpoiler(text: string, entity: MessageEntity.messageEntitySpoiler) {\n const before = text.slice(0, entity.offset);\n const spoilerBefore = text.slice(entity.offset, entity.offset + entity.length);\n const spoilerAfter = spoiler(spoilerBefore)/* '▚'.repeat(entity.length) */;\n const after = text.slice(entity.offset + entity.length);\n text = before + spoilerAfter + after;\n return {text, entityText: spoilerAfter};\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\n// From https://github.com/stephenmathieson/node-tlds/blob/master/index.js\nconst TLD = ['abogado', 'ac', 'academy', 'accountants', 'active', 'actor', 'ad', 'adult', 'ae', 'aero', 'af', 'ag', 'agency', 'ai', 'airforce', 'al', 'allfinanz', 'alsace', 'am', 'amsterdam', 'an', 'android', 'ao', 'apartments', 'aq', 'aquarelle', 'ar', 'archi', 'army', 'arpa', 'as', 'asia', 'associates', 'at', 'attorney', 'au', 'auction', 'audio', 'autos', 'aw', 'ax', 'axa', 'az', 'ba', 'band', 'bank', 'bar', 'barclaycard', 'barclays', 'bargains', 'bayern', 'bb', 'bd', 'be', 'beer', 'berlin', 'best', 'bf', 'bg', 'bh', 'bi', 'bid', 'bike', 'bingo', 'bio', 'biz', 'bj', 'black', 'blackfriday', 'bloomberg', 'blue', 'bm', 'bmw', 'bn', 'bnpparibas', 'bo', 'boo', 'boutique', 'br', 'brussels', 'bs', 'bt', 'budapest', 'build', 'builders', 'business', 'buzz', 'bv', 'bw', 'by', 'bz', 'bzh', 'ca', 'cab', 'cal', 'camera', 'camp', 'cancerresearch', 'canon', 'capetown', 'capital', 'caravan', 'cards', 'care', 'career', 'careers', 'cartier', 'casa', 'cash', 'cat', 'catering', 'cc', 'cd', 'center', 'ceo', 'cern', 'cf', 'cg', 'ch', 'channel', 'chat', 'cheap', 'christmas', 'chrome', 'church', 'ci', 'citic', 'city', 'ck', 'cl', 'claims', 'cleaning', 'click', 'clinic', 'clothing', 'club', 'cm', 'cn', 'co', 'coach', 'codes', 'coffee', 'college', 'cologne', 'com', 'community', 'company', 'computer', 'condos', 'construction', 'consulting', 'contractors', 'cooking', 'cool', 'coop', 'country', 'cr', 'credit', 'creditcard', 'cricket', 'crs', 'cruises', 'cu', 'cuisinella', 'cv', 'cw', 'cx', 'cy', 'cymru', 'cz', 'dabur', 'dad', 'dance', 'dating', 'day', 'dclk', 'de', 'deals', 'degree', 'delivery', 'democrat', 'dental', 'dentist', 'desi', 'design', 'dev', 'diamonds', 'diet', 'digital', 'direct', 'directory', 'discount', 'dj', 'dk', 'dm', 'dnp', 'do', 'docs', 'domains', 'doosan', 'durban', 'dvag', 'dz', 'eat', 'ec', 'edu', 'education', 'ee', 'eg', 'email', 'emerck', 'energy', 'engineer', 'engineering', 'enterprises', 'equipment', 'er', 'es', 'esq', 'estate', 'et', 'eu', 'eurovision', 'eus', 'events', 'everbank', 'exchange', 'expert', 'exposed', 'fail', 'farm', 'fashion', 'feedback', 'fi', 'finance', 'financial', 'firmdale', 'fish', 'fishing', 'fit', 'fitness', 'fj', 'fk', 'flights', 'florist', 'flowers', 'flsmidth', 'fly', 'fm', 'fo', 'foo', 'forsale', 'foundation', 'fr', 'frl', 'frogans', 'fund', 'furniture', 'futbol', 'ga', 'gal', 'gallery', 'garden', 'gb', 'gbiz', 'gd', 'ge', 'gent', 'gf', 'gg', 'ggee', 'gh', 'gi', 'gift', 'gifts', 'gives', 'gl', 'glass', 'gle', 'global', 'globo', 'gm', 'gmail', 'gmo', 'gmx', 'gn', 'goog', 'google', 'gop', 'gov', 'gp', 'gq', 'gr', 'graphics', 'gratis', 'green', 'gripe', 'gs', 'gt', 'gu', 'guide', 'guitars', 'guru', 'gw', 'gy', 'hamburg', 'hangout', 'haus', 'healthcare', 'help', 'here', 'hermes', 'hiphop', 'hiv', 'hk', 'hm', 'hn', 'holdings', 'holiday', 'homes', 'horse', 'host', 'hosting', 'house', 'how', 'hr', 'ht', 'hu', 'ibm', 'id', 'ie', 'ifm', 'il', 'im', 'immo', 'immobilien', 'in', 'industries', 'info', 'ing', 'ink', 'institute', 'insure', 'int', 'international', 'investments', 'io', 'iq', 'ir', 'irish', 'is', 'it', 'iwc', 'jcb', 'je', 'jetzt', 'jm', 'jo', 'jobs', 'joburg', 'jp', 'juegos', 'kaufen', 'kddi', 'ke', 'kg', 'kh', 'ki', 'kim', 'kitchen', 'kiwi', 'km', 'kn', 'koeln', 'kp', 'kr', 'krd', 'kred', 'kw', 'ky', 'kyoto', 'kz', 'la', 'lacaixa', 'land', 'lat', 'latrobe', 'lawyer', 'lb', 'lc', 'lds', 'lease', 'legal', 'lgbt', 'li', 'lidl', 'life', 'lighting', 'limited', 'limo', 'link', 'lk', 'loans', 'london', 'lotte', 'lotto', 'lr', 'ls', 'lt', 'ltda', 'lu', 'luxe', 'luxury', 'lv', 'ly', 'ma', 'madrid', 'maison', 'management', 'mango', 'market', 'marketing', 'marriott', 'mc', 'md', 'me', 'media', 'meet', 'melbourne', 'meme', 'memorial', 'menu', 'mg', 'mh', 'miami', 'mil', 'mini', 'mk', 'ml', 'mm', 'mn', 'mo', 'mobi', 'moda', 'moe', 'monash', 'money', 'mormon', 'mortgage', 'moscow', 'motorcycles', 'mov', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'museum', 'mv', 'mw', 'mx', 'my', 'mz', 'na', 'nagoya', 'name', 'navy', 'nc', 'ne', 'net', 'network', 'neustar', 'new', 'nexus', 'nf', 'ng', 'ngo', 'nhk', 'ni', 'nico', 'ninja', 'nl', 'no', 'np', 'nr', 'nra', 'nrw', 'ntt', 'nu', 'nyc', 'nz', 'okinawa', 'om', 'one', 'ong', 'onl', 'ooo', 'org', 'organic', 'osaka', 'otsuka', 'ovh', 'pa', 'paris', 'partners', 'parts', 'party', 'pe', 'pf', 'pg', 'ph', 'pharmacy', 'photo', 'photography', 'photos', 'physio', 'pics', 'pictures', 'pink', 'pizza', 'pk', 'pl', 'place', 'plumbing', 'pm', 'pn', 'pohl', 'poker', 'porn', 'post', 'pr', 'praxi', 'press', 'pro', 'prod', 'productions', 'prof', 'properties', 'property', 'ps', 'pt', 'pub', 'pw', 'py', 'qa', 'qpon', 'quebec', 're', 'realtor', 'recipes', 'red', 'rehab', 'reise', 'reisen', 'reit', 'ren', 'rentals', 'repair', 'report', 'republican', 'rest', 'restaurant', 'reviews', 'rich', 'rio', 'rip', 'ro', 'rocks', 'rodeo', 'rs', 'rsvp', 'ru', 'ruhr', 'rw', 'ryukyu', 'sa', 'saarland', 'sale', 'samsung', 'sarl', 'saxo', 'sb', 'sc', 'sca', 'scb', 'schmidt', 'schule', 'schwarz', 'science', 'scot', 'sd', 'se', 'services', 'sew', 'sexy', 'sg', 'sh', 'shiksha', 'shoes', 'shriram', 'si', 'singles', 'sj', 'sk', 'sky', 'sl', 'sm', 'sn', 'so', 'social', 'software', 'sohu', 'solar', 'solutions', 'soy', 'space', 'spiegel', 'sr', 'st', 'style', 'su', 'supplies', 'supply', 'support', 'surf', 'surgery', 'suzuki', 'sv', 'sx', 'sy', 'sydney', 'systems', 'sz', 'taipei', 'tatar', 'tattoo', 'tax', 'tc', 'td', 'technology', 'tel', 'temasek', 'tennis', 'tf', 'tg', 'th', 'tienda', 'tips', 'tires', 'tirol', 'tj', 'tk', 'tl', 'tm', 'tn', 'to', 'today', 'tokyo', 'tools', 'top', 'toshiba', 'town', 'toys', 'tp', 'tr', 'trade', 'training', 'travel', 'trust', 'tt', 'tui', 'tv', 'tw', 'tz', 'ua', 'ug', 'uk', 'university', 'uno', 'uol', 'us', 'uy', 'uz', 'va', 'vacations', 'vc', 've', 'vegas', 'ventures', 'versicherung', 'vet', 'vg', 'vi', 'viajes', 'video', 'villas', 'vision', 'vlaanderen', 'vn', 'vodka', 'vote', 'voting', 'voto', 'voyage', 'vu', 'wales', 'wang', 'watch', 'webcam', 'website', 'wed', 'wedding', 'wf', 'whoswho', 'wien', 'wiki', 'williamhill', 'wme', 'work', 'works', 'world', 'ws', 'wtc', 'wtf', '佛山', '集团', '在线', '한국', 'ভারত', '八卦', 'موقع', '公益', '公司', '移动', '我爱你', 'москва', 'қаз', 'онлайн', 'сайт', 'срб', '淡马锡', 'орг', '삼성', 'சிங்கப்பூர்', '商标', '商店', '商城', 'дети', 'мкд', '中文网', '中信', '中国', '中國', '谷歌', 'భారత్', 'ලංකා', 'ભારત', 'भारत', '网店', 'संगठन', '网络', 'укр', '香港', '台湾', '台灣', '手机', 'мон', 'الجزائر', 'عمان', 'ایران', 'امارات', 'بازار', 'الاردن', 'بھارت', 'المغرب', 'السعودية', 'مليسيا', 'شبكة', 'გე', '机构', '组织机构', 'ไทย', 'سورية', 'рус', 'рф', 'تونس', 'みんな', 'グーグル', '世界', 'ਭਾਰਤ', '网址', '游戏', 'vermögensberater', 'vermögensberatung', '企业', 'مصر', 'قطر', '广东', 'இலங்கை', 'இந்தியா', '新加坡', 'فلسطين', '政务', 'xxx', 'xyz', 'yachts', 'yandex', 'ye', 'yoga', 'yokohama', 'youtube', 'yt', 'za', 'zip', 'zm', 'zone', 'zuerich', 'zw'];\n\nexport default TLD;\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\nexport default function checkBrackets(url: string) {\n var urlLength = url.length;\n var urlOpenBrackets = url.split('(').length - 1;\n var urlCloseBrackets = url.split(')').length - 1;\n while(urlCloseBrackets > urlOpenBrackets &&\n url.charAt(urlLength - 1) === ')') {\n url = url.substr(0, urlLength - 1)\n urlCloseBrackets--;\n urlLength--;\n }\n if(urlOpenBrackets > urlCloseBrackets) {\n url = url.replace(/\\)+$/, '');\n }\n return url;\n}\n","import Emoji from '../../config/emoji';\nimport {encodeEmoji} from '../../vendor/emoji';\n\nexport default function getEmojiUnified(emojiCode: string) {\n const unified = encodeEmoji(emojiCode).replace(/-?fe0f/g, '');\n\n /* if(unified === '1f441-200d-1f5e8') {\n //unified = '1f441-fe0f-200d-1f5e8-fe0f';\n unified = '1f441-fe0f-200d-1f5e8';\n } */\n\n if(!Emoji.hasOwnProperty(unified)\n // && !emojiData.hasOwnProperty(unified.replace(/-?fe0f$/, ''))\n ) {\n // console.error('lol', unified);\n return;\n }\n\n return unified;\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 {EMAIL_REG_EXP, FULL_REG_EXP} from '.';\nimport TLD from '../../config/tld';\nimport {MessageEntity} from '../../layer';\nimport checkBrackets from './checkBrackets';\nimport getEmojiUnified from './getEmojiUnified';\n\nexport default function parseEntities(text: string) {\n let match: RegExpMatchArray;\n let raw = text;\n const entities: MessageEntity[] = [];\n let matchIndex;\n let rawOffset = 0;\n // var start = tsNow()\n FULL_REG_EXP.lastIndex = 0;\n while(match = raw.match(FULL_REG_EXP)) {\n matchIndex = rawOffset + match.index;\n\n // console.log('parseEntities match:', match);\n\n if(match[3]) { // mentions\n entities.push({\n _: 'messageEntityMention',\n offset: matchIndex + match[1].length,\n length: match[2].length + match[3].length\n });\n } else if(match[4]) {\n if(EMAIL_REG_EXP.test(match[4])) { // email\n entities.push({\n _: 'messageEntityEmail',\n offset: matchIndex,\n length: match[4].length\n });\n } else {\n let url: string;\n let protocol = match[5];\n const tld = match[6];\n // let excluded = '';\n if(tld) { // URL\n if(!protocol && (tld.substr(0, 4) === 'xn--' || TLD.indexOf(tld.toLowerCase()) !== -1)) {\n protocol = 'http://';\n }\n\n if(protocol) {\n const balanced = checkBrackets(match[4]);\n if(balanced.length !== match[4].length) {\n // excluded = match[4].substring(balanced.length);\n match[4] = balanced;\n }\n\n url = (match[5] ? '' : protocol) + match[4];\n }\n } else { // IP address\n url = (match[5] ? '' : 'http://') + match[4];\n }\n\n if(url) {\n entities.push({\n _: 'messageEntityUrl',\n offset: matchIndex,\n length: match[4].length\n });\n }\n }\n } else if(match[7]) { // New line\n entities.push({\n _: 'messageEntityLinebreak',\n offset: matchIndex,\n length: 1\n });\n } else if(match[8]) { // Emoji\n const unified = getEmojiUnified(match[8]);\n if(unified) {\n entities.push({\n _: 'messageEntityEmoji',\n offset: matchIndex,\n length: match[8].length,\n unicode: unified\n });\n }\n } else if(match[11]) { // Hashtag\n entities.push({\n _: 'messageEntityHashtag',\n offset: matchIndex + (match[10] ? match[10].length : 0),\n length: match[11].length\n });\n } else if(match[13]) { // Bot command\n entities.push({\n _: 'messageEntityBotCommand',\n offset: matchIndex + (match[11] ? match[11].length : 0) + (match[12] ? match[12].length : 0),\n length: 1 + match[13].length + (match[14] ? 1 + match[14].length : 0),\n unsafe: true\n });\n } else if(match[16]) { // Media timestamp\n const timestamp = match[16];\n const splitted: string[] = timestamp.split(':');\n const splittedLength = splitted.length;\n const hours = splittedLength === 3 ? +splitted[0] : 0;\n const minutes = +splitted[splittedLength === 3 ? 1 : 0];\n const seconds = +splitted[splittedLength - 1];\n entities.push({\n _: 'messageEntityTimestamp',\n offset: matchIndex + (/\\D/.test(match[0][0]) ? 1 : 0),\n length: timestamp.length,\n raw: timestamp,\n time: hours * 3600 + minutes * 60 + seconds\n });\n }\n\n raw = raw.substr(match.index + match[0].length);\n rawOffset += match.index + match[0].length;\n }\n\n // if (entities.length) {\n // console.log('parse entities', text, entities.slice())\n // }\n return entities;\n}\n","import IS_EMOJI_SUPPORTED from './emojiSupport';\n\nexport type EMOJI_VERSION = '' | '14';\n\nconst EMOJI_VERSIONS_SUPPORTED: {\n [v in EMOJI_VERSION]: boolean\n} = {} as any;\n\n// Thanks to WebZ for the detect\nfunction isEmojiSupported(emoji: string) {\n const ALLOWABLE_CALCULATION_ERROR_SIZE = 5;\n const inlineEl = document.createElement('span');\n inlineEl.classList.add('emoji');\n document.body.appendChild(inlineEl);\n\n inlineEl.innerText = emoji; // Emoji from 14.0 version\n const newEmojiWidth = inlineEl.offsetWidth;\n inlineEl.innerText = '❤️'; // Emoji from 1.0 version\n const legacyEmojiWidth = inlineEl.offsetWidth;\n\n document.body.removeChild(inlineEl);\n\n return Math.abs(newEmojiWidth - legacyEmojiWidth) < ALLOWABLE_CALCULATION_ERROR_SIZE;\n}\n\nif(IS_EMOJI_SUPPORTED) {\n EMOJI_VERSIONS_SUPPORTED[''] = true;\n\n const a: [keyof typeof EMOJI_VERSIONS_SUPPORTED, string][] = [\n ['14', '🫱🏻']\n ];\n\n a.forEach(([version, emoji]) => {\n EMOJI_VERSIONS_SUPPORTED[version] = isEmojiSupported(emoji);\n });\n}\n\nexport default EMOJI_VERSIONS_SUPPORTED;\n","import wrapUrl from './wrapUrl';\n\nexport default function wrapTelegramUrlToAnchor(url1: string) {\n const {url, onclick} = wrapUrl(url1);\n const element = document.createElement('a');\n (element as HTMLAnchorElement).href = url;\n if(onclick) {\n element.setAttribute('onclick', `${onclick}(this)`);\n }\n\n return element;\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\nimport type {CancellablePromise} from '../../helpers/cancellablePromise';\nimport animationIntersector from '../../components/animationIntersector';\nimport safePlay from '../../helpers/dom/safePlay';\nimport {MiddlewareHelper} from '../../helpers/middleware';\nimport {createCustomFiller} from '../richTextProcessor/wrapRichText';\nimport RLottiePlayer from '../rlottie/rlottiePlayer';\nimport {CustomEmojiRendererElement, SyncedPlayer} from './renderer';\n\nexport type CustomEmojiElements = Set<CustomEmojiElement>;\n\nexport default class CustomEmojiElement extends HTMLElement {\n public elements: CustomEmojiElements;\n public renderer: CustomEmojiRendererElement;\n public player: RLottiePlayer | HTMLVideoElement;\n public paused: boolean;\n public syncedPlayer: SyncedPlayer;\n public clean: boolean;\n public lastChildWas: Node;\n // public docId: DocId;\n public placeholder: HTMLImageElement;\n public middlewareHelper: MiddlewareHelper;\n public static: boolean;\n public readyPromise: CancellablePromise<void>;\n\n constructor() {\n super();\n this.paused = true;\n this.classList.add('custom-emoji');\n }\n\n public get docId() {\n return this.dataset.docId;\n }\n\n public set docId(docId: DocId) {\n this.dataset.docId = '' + docId;\n }\n\n public static create(docId?: DocId) {\n const element = new CustomEmojiElement();\n if(docId) element.docId = docId;\n return element;\n }\n\n public get isConnected() {\n return this.placeholder?.isConnected ?? super.isConnected;\n }\n\n public connectedCallback() {\n // if(this.isConnected) {\n // return;\n // }\n\n if(this.player) {\n animationIntersector.addAnimation({\n animation: this,\n group: this.renderer.animationGroup,\n observeElement: this.placeholder ?? this,\n controlled: true,\n type: 'emoji'\n });\n }\n\n // this.connectedCallback = undefined;\n }\n\n public disconnectedCallback() {\n if(this.isConnected || !this.renderer?.isSelectable) { // prepend on sibling can invoke disconnectedCallback\n return;\n }\n\n this.clear();\n }\n\n public destroy() {\n this.clear();\n }\n\n public clear(replaceChildren = true) {\n if(this.clean) {\n return;\n }\n\n // if(this.docId === '5399836826758290421') {\n // console.log('clear', this, this.isConnected);\n // }\n\n this.clean = true;\n this.pause();\n\n const {syncedPlayer} = this;\n if(syncedPlayer) {\n syncedPlayer.pausedElements.delete(this);\n }\n\n this.middlewareHelper?.clean();\n this.readyPromise?.reject();\n\n if(this.renderer) {\n const elements = this.renderer.customEmojis.get(this.docId);\n if(elements?.delete(this) && !elements.size) {\n this.renderer.customEmojis.delete(this.docId);\n this.renderer.textColored.delete(elements);\n this.renderer.playersSynced.delete(elements);\n }\n\n if(replaceChildren) {\n if(this.renderer.isSelectable) {\n this.replaceChildren(createCustomFiller(true));\n } else {\n // otherwise https://bugs.chromium.org/p/chromium/issues/detail?id=1144736#c27 will happen\n this.replaceChildren();\n }\n }\n }\n\n if(this.player) {\n animationIntersector.removeAnimationByPlayer(this);\n }\n\n CustomEmojiRendererElement.globalLazyLoadQueue?.delete({div: this});\n\n /* this.disconnectedCallback = */this.elements =\n this.renderer =\n this.player =\n this.syncedPlayer =\n undefined;\n }\n\n public pause() {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n\n if(this.player instanceof HTMLVideoElement && !this.syncedPlayer) {\n this.renderer.lastPausedVideo = this.player;\n this.player.pause();\n }\n\n if(this.syncedPlayer && !this.syncedPlayer.pausedElements.has(this)) {\n this.syncedPlayer.pausedElements.add(this);\n\n if(this.syncedPlayer.player && this.syncedPlayer.pausedElements.size === this.syncedPlayer.middlewares.size) {\n this.syncedPlayer.player.pause();\n }\n }\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n this.paused = false;\n\n if(this.player instanceof HTMLVideoElement) {\n this.player.currentTime = this.renderer.lastPausedVideo?.currentTime ?? this.player.currentTime;\n safePlay(this.player);\n }\n\n if(this.syncedPlayer && this.syncedPlayer.pausedElements.has(this)) {\n this.syncedPlayer.pausedElements.delete(this);\n\n if(this.syncedPlayer.pausedElements.size !== this.syncedPlayer.middlewares.size) {\n this.player.play();\n }\n }\n }\n\n public remove() {\n super.remove();\n this.clear();\n // this.elements = this.renderer = this.player = undefined;\n }\n\n public get autoplay() {\n return true;\n }\n\n public get loop() {\n return true;\n }\n}\n\ncustomElements.define('custom-emoji-element', CustomEmojiElement);\n","import callbackify from './helpers/callbackify';\n\nexport const CodeLanguageMap: {[key: string]: string[]} = {\n 'Markup': [\n 'markup',\n 'html',\n 'xml',\n 'svg',\n 'mathml',\n 'ssml',\n 'atom',\n 'rss'\n ],\n 'CSS': [\n 'css'\n ],\n 'C-like': [\n 'clike'\n ],\n 'Regex': [\n 'regex'\n ],\n 'JavaScript': [\n 'javascript',\n 'js'\n ],\n 'ABAP': [\n 'abap'\n ],\n 'ABNF': [\n 'abnf'\n ],\n 'ActionScript': [\n 'actionscript'\n ],\n 'Ada': [\n 'ada'\n ],\n 'Agda': [\n 'agda'\n ],\n 'AL': [\n 'al'\n ],\n 'ANTLR4': [\n 'antlr4',\n 'g4'\n ],\n 'Apache Configuration': [\n 'apacheconf'\n ],\n 'SQL': [\n 'sql'\n ],\n 'Apex': [\n 'apex'\n ],\n 'APL': [\n 'apl'\n ],\n 'AppleScript': [\n 'applescript'\n ],\n 'AQL': [\n 'aql'\n ],\n 'C': [\n 'c'\n ],\n 'C++': [\n 'cpp'\n ],\n 'Arduino': [\n 'arduino',\n 'ino'\n ],\n 'ARFF': [\n 'arff'\n ],\n 'ARM Assembly': [\n 'armasm',\n 'arm-asm'\n ],\n 'Bash': [\n 'bash',\n 'sh',\n 'shell'\n ],\n 'YAML': [\n 'yaml',\n 'yml'\n ],\n 'Markdown': [\n 'markdown',\n 'md'\n ],\n 'Arturo': [\n 'arturo',\n 'art'\n ],\n 'AsciiDoc': [\n 'asciidoc',\n 'adoc'\n ],\n 'C#': [\n 'csharp',\n 'cs',\n 'dotnet'\n ],\n 'ASP.NET (C#)': [\n 'aspnet'\n ],\n '6502 Assembly': [\n 'asm6502'\n ],\n 'Atmel AVR Assembly': [\n 'asmatmel'\n ],\n 'AutoHotkey': [\n 'autohotkey'\n ],\n 'AutoIt': [\n 'autoit'\n ],\n 'AviSynth': [\n 'avisynth',\n 'avs'\n ],\n 'Avro IDL': [\n 'avro-idl',\n 'avdl'\n ],\n 'AWK': [\n 'awk',\n 'gawk'\n ],\n 'BASIC': [\n 'basic'\n ],\n 'Batch': [\n 'batch'\n ],\n 'BBcode': [\n 'bbcode',\n 'shortcode'\n ],\n 'BBj': [\n 'bbj'\n ],\n 'Bicep': [\n 'bicep'\n ],\n 'Birb': [\n 'birb'\n ],\n 'Bison': [\n 'bison'\n ],\n 'BNF': [\n 'bnf',\n 'rbnf'\n ],\n 'BQN': [\n 'bqn'\n ],\n 'Brainfuck': [\n 'brainfuck'\n ],\n 'BrightScript': [\n 'brightscript'\n ],\n 'Bro': [\n 'bro'\n ],\n 'CFScript': [\n 'cfscript',\n 'cfc'\n ],\n 'ChaiScript': [\n 'chaiscript'\n ],\n 'CIL': [\n 'cil'\n ],\n 'Cilk/C': [\n 'cilkc',\n 'cilk-c'\n ],\n 'Cilk/C++': [\n 'cilkcpp',\n 'cilk-cpp',\n 'cilk'\n ],\n 'Clojure': [\n 'clojure'\n ],\n 'CMake': [\n 'cmake'\n ],\n 'COBOL': [\n 'cobol'\n ],\n 'CoffeeScript': [\n 'coffeescript',\n 'coffee'\n ],\n 'Concurnas': [\n 'concurnas',\n 'conc'\n ],\n 'Content-Security-Policy': [\n 'csp'\n ],\n 'Cooklang': [\n 'cooklang'\n ],\n 'Ruby': [\n 'ruby',\n 'rb'\n ],\n 'Crystal': [\n 'crystal'\n ],\n 'CSV': [\n 'csv'\n ],\n 'CUE': [\n 'cue'\n ],\n 'Cypher': [\n 'cypher'\n ],\n 'D': [\n 'd'\n ],\n 'Dart': [\n 'dart'\n ],\n 'DataWeave': [\n 'dataweave'\n ],\n 'DAX': [\n 'dax'\n ],\n 'Dhall': [\n 'dhall'\n ],\n 'Diff': [\n 'diff'\n ],\n 'Markup templating': [\n 'markup-templating'\n ],\n 'Django/Jinja2': [\n 'django',\n 'jinja2'\n ],\n 'DNS zone file': [\n 'dns-zone-file',\n 'dns-zone'\n ],\n 'Docker': [\n 'docker',\n 'dockerfile'\n ],\n 'DOT (Graphviz)': [\n 'dot',\n 'gv'\n ],\n 'EBNF': [\n 'ebnf'\n ],\n 'EditorConfig': [\n 'editorconfig'\n ],\n 'Eiffel': [\n 'eiffel'\n ],\n 'EJS': [\n 'ejs',\n 'eta'\n ],\n 'Elixir': [\n 'elixir'\n ],\n 'Elm': [\n 'elm'\n ],\n 'Lua': [\n 'lua'\n ],\n 'Embedded Lua templating': [\n 'etlua'\n ],\n 'ERB': [\n 'erb'\n ],\n 'Erlang': [\n 'erlang'\n ],\n 'Excel Formula': [\n 'excel-formula',\n 'xlsx',\n 'xls'\n ],\n 'F#': [\n 'fsharp'\n ],\n 'Factor': [\n 'factor'\n ],\n 'False': [\n 'false'\n ],\n 'Firestore security rules': [\n 'firestore-security-rules'\n ],\n 'Flow': [\n 'flow'\n ],\n 'Fortran': [\n 'fortran'\n ],\n 'FreeMarker Template Language': [\n 'ftl'\n ],\n 'GameMaker Language': [\n 'gml',\n 'gamemakerlanguage'\n ],\n 'GAP (CAS)': [\n 'gap'\n ],\n 'G-code': [\n 'gcode'\n ],\n 'GDScript': [\n 'gdscript'\n ],\n 'GEDCOM': [\n 'gedcom'\n ],\n 'gettext': [\n 'gettext',\n 'po'\n ],\n 'Git': [\n 'git'\n ],\n 'GLSL': [\n 'glsl'\n ],\n 'GN': [\n 'gn',\n 'gni'\n ],\n 'GNU Linker Script': [\n 'linker-script',\n 'ld'\n ],\n 'Go': [\n 'go'\n ],\n 'Go module': [\n 'go-module',\n 'go-mod'\n ],\n 'Gradle': [\n 'gradle'\n ],\n 'GraphQL': [\n 'graphql'\n ],\n 'Groovy': [\n 'groovy'\n ],\n 'Less': [\n 'less'\n ],\n 'Sass (SCSS)': [\n 'scss'\n ],\n 'Textile': [\n 'textile'\n ],\n 'Haml': [\n 'haml'\n ],\n 'Handlebars': [\n 'handlebars',\n 'hbs',\n 'mustache'\n ],\n 'Haskell': [\n 'haskell',\n 'hs'\n ],\n 'Haxe': [\n 'haxe'\n ],\n 'HCL': [\n 'hcl'\n ],\n 'HLSL': [\n 'hlsl'\n ],\n 'Hoon': [\n 'hoon'\n ],\n 'HTTP Public-Key-Pins': [\n 'hpkp'\n ],\n 'HTTP Strict-Transport-Security': [\n 'hsts'\n ],\n 'JSON': [\n 'json',\n 'webmanifest'\n ],\n 'URI': [\n 'uri',\n 'url'\n ],\n 'HTTP': [\n 'http'\n ],\n 'IchigoJam': [\n 'ichigojam'\n ],\n 'Icon': [\n 'icon'\n ],\n 'ICU Message Format': [\n 'icu-message-format'\n ],\n 'Idris': [\n 'idris',\n 'idr'\n ],\n '.ignore': [\n 'ignore',\n 'gitignore',\n 'hgignore',\n 'npmignore'\n ],\n 'Inform 7': [\n 'inform7'\n ],\n 'Ini': [\n 'ini'\n ],\n 'Io': [\n 'io'\n ],\n 'J': [\n 'j'\n ],\n 'Java': [\n 'java'\n ],\n 'Scala': [\n 'scala'\n ],\n 'PHP': [\n 'php'\n ],\n 'JavaDoc-like': [\n 'javadoclike'\n ],\n 'JavaDoc': [\n 'javadoc'\n ],\n 'Java stack trace': [\n 'javastacktrace'\n ],\n 'Jolie': [\n 'jolie'\n ],\n 'JQ': [\n 'jq'\n ],\n 'TypeScript': [\n 'typescript',\n 'ts'\n ],\n 'JSDoc': [\n 'jsdoc'\n ],\n 'N4JS': [\n 'n4js',\n 'n4jsd'\n ],\n 'JSON5': [\n 'json5'\n ],\n 'JSONP': [\n 'jsonp'\n ],\n 'JS stack trace': [\n 'jsstacktrace'\n ],\n 'Julia': [\n 'julia'\n ],\n 'Keepalived Configure': [\n 'keepalived'\n ],\n 'Keyman': [\n 'keyman'\n ],\n 'Kotlin': [\n 'kotlin',\n 'kt',\n 'kts'\n ],\n 'Kusto': [\n 'kusto'\n ],\n 'LaTeX': [\n 'latex',\n 'tex',\n 'context'\n ],\n 'Latte': [\n 'latte'\n ],\n 'Scheme': [\n 'scheme'\n ],\n 'LilyPond': [\n 'lilypond',\n 'ly'\n ],\n 'Liquid': [\n 'liquid'\n ],\n 'Lisp': [\n 'lisp',\n 'emacs',\n 'elisp',\n 'emacs-lisp'\n ],\n 'LiveScript': [\n 'livescript'\n ],\n 'LLVM IR': [\n 'llvm'\n ],\n 'Log file': [\n 'log'\n ],\n 'LOLCODE': [\n 'lolcode'\n ],\n 'Magma (CAS)': [\n 'magma'\n ],\n 'Makefile': [\n 'makefile'\n ],\n 'Mata': [\n 'mata'\n ],\n 'MATLAB': [\n 'matlab'\n ],\n 'MAXScript': [\n 'maxscript'\n ],\n 'MEL': [\n 'mel'\n ],\n 'Mermaid': [\n 'mermaid'\n ],\n 'METAFONT': [\n 'metafont'\n ],\n 'Mizar': [\n 'mizar'\n ],\n 'MongoDB': [\n 'mongodb'\n ],\n 'Monkey': [\n 'monkey'\n ],\n 'MoonScript': [\n 'moonscript',\n 'moon'\n ],\n 'N1QL': [\n 'n1ql'\n ],\n 'Nand To Tetris HDL': [\n 'nand2tetris-hdl'\n ],\n 'Naninovel Script': [\n 'naniscript',\n 'nani'\n ],\n 'NASM': [\n 'nasm'\n ],\n 'NEON': [\n 'neon'\n ],\n 'Nevod': [\n 'nevod'\n ],\n 'nginx': [\n 'nginx'\n ],\n 'Nim': [\n 'nim'\n ],\n 'Nix': [\n 'nix'\n ],\n 'NSIS': [\n 'nsis'\n ],\n 'Objective-C': [\n 'objectivec',\n 'objc'\n ],\n 'OCaml': [\n 'ocaml'\n ],\n 'Odin': [\n 'odin'\n ],\n 'OpenCL': [\n 'opencl'\n ],\n 'OpenQasm': [\n 'openqasm',\n 'qasm'\n ],\n 'Oz': [\n 'oz'\n ],\n 'PARI/GP': [\n 'parigp'\n ],\n 'Parser': [\n 'parser'\n ],\n 'Pascal': [\n 'pascal',\n 'objectpascal'\n ],\n 'Pascaligo': [\n 'pascaligo'\n ],\n 'PATROL Scripting Language': [\n 'psl'\n ],\n 'PC-Axis': [\n 'pcaxis',\n 'px'\n ],\n 'PeopleCode': [\n 'peoplecode',\n 'pcode'\n ],\n 'Perl': [\n 'perl'\n ],\n 'PHPDoc': [\n 'phpdoc'\n ],\n 'PlantUML': [\n 'plant-uml',\n 'plantuml'\n ],\n 'PL/SQL': [\n 'plsql'\n ],\n 'PowerQuery': [\n 'powerquery',\n 'pq',\n 'mscript'\n ],\n 'PowerShell': [\n 'powershell'\n ],\n 'Processing': [\n 'processing'\n ],\n 'Prolog': [\n 'prolog'\n ],\n 'PromQL': [\n 'promql'\n ],\n '.properties': [\n 'properties'\n ],\n 'Protocol Buffers': [\n 'protobuf'\n ],\n 'Stylus': [\n 'stylus'\n ],\n 'Twig': [\n 'twig'\n ],\n 'Pug': [\n 'pug'\n ],\n 'Puppet': [\n 'puppet'\n ],\n 'PureBasic': [\n 'purebasic',\n 'pbfasm'\n ],\n 'Python': [\n 'python',\n 'py'\n ],\n 'Q#': [\n 'qsharp',\n 'qs'\n ],\n 'Q (kdb+ database)': [\n 'q'\n ],\n 'QML': [\n 'qml'\n ],\n 'Qore': [\n 'qore'\n ],\n 'R': [\n 'r'\n ],\n 'Racket': [\n 'racket',\n 'rkt'\n ],\n 'Razor C#': [\n 'cshtml',\n 'razor'\n ],\n 'React JSX': [\n 'jsx'\n ],\n 'React TSX': [\n 'tsx'\n ],\n 'Reason': [\n 'reason'\n ],\n 'Rego': [\n 'rego'\n ],\n 'Ren\\'py': [\n 'renpy',\n 'rpy'\n ],\n 'ReScript': [\n 'rescript',\n 'res'\n ],\n 'reST (reStructuredText)': [\n 'rest'\n ],\n 'Rip': [\n 'rip'\n ],\n 'Roboconf': [\n 'roboconf'\n ],\n 'Robot Framework': [\n 'robotframework',\n 'robot'\n ],\n 'Rust': [\n 'rust'\n ],\n 'SAS': [\n 'sas'\n ],\n 'Sass (Sass)': [\n 'sass'\n ],\n 'Shell session': [\n 'shell-session',\n 'sh-session',\n 'shellsession'\n ],\n 'Smali': [\n 'smali'\n ],\n 'Smalltalk': [\n 'smalltalk'\n ],\n 'Smarty': [\n 'smarty'\n ],\n 'SML': [\n 'sml',\n 'smlnj'\n ],\n 'Solidity (Ethereum)': [\n 'solidity',\n 'sol'\n ],\n 'Solution file': [\n 'solution-file',\n 'sln'\n ],\n 'Soy (Closure Template)': [\n 'soy'\n ],\n 'Splunk SPL': [\n 'splunk-spl'\n ],\n 'SQF: Status Quo Function (Arma 3)': [\n 'sqf'\n ],\n 'Squirrel': [\n 'squirrel'\n ],\n 'Stan': [\n 'stan'\n ],\n 'Stata Ado': [\n 'stata'\n ],\n 'Structured Text (IEC 61131-3)': [\n 'iecst'\n ],\n 'SuperCollider': [\n 'supercollider',\n 'sclang'\n ],\n 'Swift': [\n 'swift'\n ],\n 'Systemd configuration file': [\n 'systemd'\n ],\n 'T4 templating': [\n 't4-templating'\n ],\n 'T4 Text Templates (C#)': [\n 't4-cs',\n 't4'\n ],\n 'VB.Net': [\n 'vbnet'\n ],\n 'T4 Text Templates (VB)': [\n 't4-vb'\n ],\n 'TAP': [\n 'tap'\n ],\n 'Tcl': [\n 'tcl'\n ],\n 'Template Toolkit 2': [\n 'tt2'\n ],\n 'TOML': [\n 'toml'\n ],\n 'Tremor': [\n 'tremor',\n 'trickle',\n 'troy'\n ],\n 'TypoScript': [\n 'typoscript',\n 'tsconfig'\n ],\n 'UnrealScript': [\n 'unrealscript',\n 'uscript',\n 'uc'\n ],\n 'UO Razor Script': [\n 'uorazor'\n ],\n 'V': [\n 'v'\n ],\n 'Vala': [\n 'vala'\n ],\n 'Velocity': [\n 'velocity'\n ],\n 'Verilog': [\n 'verilog'\n ],\n 'VHDL': [\n 'vhdl'\n ],\n 'vim': [\n 'vim'\n ],\n 'Visual Basic': [\n 'visual-basic',\n 'vb',\n 'vba'\n ],\n 'WarpScript': [\n 'warpscript'\n ],\n 'WebAssembly': [\n 'wasm'\n ],\n 'Web IDL': [\n 'web-idl',\n 'webidl'\n ],\n 'WGSL': [\n 'wgsl'\n ],\n 'Wiki markup': [\n 'wiki'\n ],\n 'Wolfram language': [\n 'wolfram',\n 'mathematica',\n 'nb',\n 'wl'\n ],\n 'Wren': [\n 'wren'\n ],\n 'Xeora': [\n 'xeora',\n 'xeoracube'\n ],\n 'Xojo (REALbasic)': [\n 'xojo'\n ],\n 'XQuery': [\n 'xquery'\n ],\n 'YANG': [\n 'yang'\n ],\n 'Zig': [\n 'zig'\n ]\n};\n\nexport const CodeLanguageAliases: {[key: string]: string} = {};\n\nfor(const language in CodeLanguageMap) {\n const aliases = CodeLanguageMap[language];\n aliases.unshift(language.toLowerCase());\n for(let i = 0, l = aliases.length; i < l; ++i) {\n CodeLanguageAliases[aliases[i]] = language;\n }\n}\n\nfunction importPrismLanguage(language: string) {\n const lowerCase = language.toLowerCase();\n const aliases = CodeLanguageMap[CodeLanguageAliases[lowerCase]] || [];\n for(const alias of aliases) {\n if(prism.languages[alias]) {\n return {language: alias, prism};\n }\n }\n\n console.error('No prism language ' + lowerCase);\n}\n\nlet prism: any;\nexport function importPrism(language: string) {\n if(prism) {\n return callbackify(prism, () => importPrismLanguage(language));\n }\n\n const hadBefore = !!(window as any).Prism;\n if(!hadBefore) {\n (window as any).Prism = window.Prism || {};\n (window as any).Prism.manual = true;\n }\n\n return prism = import('./vendor/prism').then((module) => {\n const Prism = module.default;\n if(!hadBefore) {\n Prism.hooks.add('wrap', (env) => {\n env.classes.forEach((className, i, arr) => {\n arr[i] = 'prism-' + className;\n });\n });\n }\n\n prism = Prism;\n return importPrismLanguage(language);\n });\n}\n\nexport function highlightCode(code: string, _language: string) {\n return callbackify(importPrism(_language), (imported) => {\n if(!imported) {\n console.error(`Language \"${_language}\" is not supported`, code);\n return;\n }\n\n const {prism, language} = imported;\n const html: string = prism.highlight(code, prism.languages[language], language);\n return html;\n });\n}\n\n// console.log(Object.keys(LanguageMap).map((key) => LanguageMap[key][0]));\n","export default function findIndexFrom<T>(\n arr: T[],\n predicate: (item: T, idx: number, arr: T[]) => boolean,\n i: number = 0\n): number {\n for(let length = arr.length; i < length; ++i) {\n if(predicate(arr[i], i, arr)) {\n return i;\n }\n }\n return -1;\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\nimport type {EMOJI_VERSION} from '../../environment/emojiVersionsSupport';\nimport {SITE_HASHTAGS} from '.';\nimport {EmojiVersions} from '../../config/emoji';\nimport IS_EMOJI_SUPPORTED from '../../environment/emojiSupport';\nimport buildURLHash from '../../helpers/buildURLHash';\nimport copy from '../../helpers/object/copy';\nimport encodeEntities from '../../helpers/string/encodeEntities';\nimport {MessageEntity} from '../../layer';\nimport encodeSpoiler from './encodeSpoiler';\nimport parseEntities from './parseEntities';\nimport setBlankToAnchor from './setBlankToAnchor';\nimport wrapUrl from './wrapUrl';\nimport EMOJI_VERSIONS_SUPPORTED from '../../environment/emojiVersionsSupport';\nimport {CLICK_EVENT_NAME} from '../../helpers/dom/clickEvent';\nimport IS_CUSTOM_EMOJI_SUPPORTED from '../../environment/customEmojiSupport';\nimport BOM from '../../helpers/string/bom';\nimport wrapTelegramUrlToAnchor from './wrapTelegramUrlToAnchor';\nimport {IS_FIREFOX} from '../../environment/userAgent';\nimport CustomEmojiElement, {CustomEmojiElements} from '../customEmoji/element';\nimport {CustomEmojiRendererElementOptions, CustomEmojiRendererElement} from '../customEmoji/renderer';\nimport {setDirection} from '../../helpers/dom/setInnerHTML';\nimport {i18n} from '../langPack';\nimport Icon from '../../components/icon';\nimport {CodeLanguageAliases, highlightCode} from '../../codeLanguages';\nimport callbackify from '../../helpers/callbackify';\nimport findIndexFrom from '../../helpers/array/findIndexFrom';\nimport {observeResize} from '../../components/resizeObserver';\n\nexport type WrapRichTextOptions = Partial<{\n entities: MessageEntity[],\n contextSite: string,\n highlightUsername: string,\n noLinks: boolean,\n noLinebreaks: boolean,\n noCommands: boolean,\n wrappingDraft: boolean,\n // mustWrapEmoji: boolean,\n fromBot: boolean,\n noTextFormat: boolean,\n passEntities: Partial<{\n [_ in MessageEntity['_']]: boolean\n }>,\n maxMediaTimestamp: number,\n noEncoding: boolean,\n isSelectable: boolean,\n whitelistedDomains?: string[],\n passMaskedLinks?: boolean,\n\n contextHashtag?: string,\n\n // ! recursive, do not provide\n nasty?: {\n i: number,\n usedLength: number,\n text: string,\n lastEntity?: MessageEntity\n },\n voodoo?: boolean,\n customEmojis?: Map<DocId, CustomEmojiElements>,\n customWraps?: Set<HTMLElement>,\n ignoreNextIndex?: number,\n doubleLinebreak?: number\n}> & CustomEmojiRendererElementOptions;\n\nfunction createMarkupFormatting(formatting: string) {\n const element = document.createElement('span');\n element.style.fontFamily = 'markup-' + formatting;\n element.classList.add('is-markup');\n element.dataset.markup = formatting;\n return element;\n}\n\nfunction onQuoteResize(entry: ResizeObserverEntry) {\n const target = entry.target as HTMLElement;\n if((target as any).ignoreQuoteResize) {\n if(Date.now() < (target as any).ignoreQuoteResize) {\n return;\n }\n\n delete (target as any).ignoreQuoteResize;\n }\n\n const scrollHeight = target.scrollHeight;\n if(!scrollHeight) {\n return;\n }\n\n const padding = entry.contentRect.bottom - entry.contentRect.height + entry.contentRect.top;\n // const margin = (entry.borderBoxSize[0].blockSize - entry.contentBoxSize[0].blockSize) * 2;\n const margin = 0;\n const diff = scrollHeight - padding - margin - Math.floor(entry.contentRect.height);\n const isExpanded = diff <= 1;\n\n // console.log('quote resize', entry, scrollHeight, entry.contentRect.height, isExpanded, diff);\n target.style.setProperty('--quote-max-height', scrollHeight + 'px');\n target.classList.toggle('is-truncated', !isExpanded);\n}\n\nfunction makeQuoteCollapsable(element: HTMLElement) {\n element.classList.add('quote-like-collapsable');\n\n const collapseIcon = document.createElement('span');\n collapseIcon.classList.add('quote-like-icon', 'quote-like-collapse');\n element.append(collapseIcon);\n\n return observeResize(element, onQuoteResize);\n}\n\n/**\n * * Expecting correctly sorted nested entities (RichTextProcessor.sortEntities)\n */\nexport default function wrapRichText(text: string, options: WrapRichTextOptions = {}) {\n const fragment = document.createDocumentFragment();\n if(!text) {\n return fragment;\n }\n\n const nasty = options.nasty ??= {\n i: 0,\n usedLength: 0,\n text\n };\n\n const wrapSomething = (wrapElement: HTMLElement, noFiller?: boolean) => {\n const element = document.createElement('span');\n // element.append(BOM, a, BOM);\n if(options.wrappingDraft) {\n element.contentEditable = 'false';\n }\n // element.style.display = 'inline-block';\n element.classList.add('input-something');\n element.append(/* BOM, */wrapElement);\n\n (lastElement || fragment).append(element);\n\n wrapElement.classList.add('input-selectable');\n // if(wrapElement instanceof HTMLImageElement) {\n // element.prepend(f());\n // } else {\n !noFiller && wrapElement.append(createCustomFiller(true));\n // }\n\n customWraps.add(element);\n\n return element;\n };\n\n options.isSelectable ||= options.wrappingDraft;\n\n const customEmojis = options.customEmojis ??= new Map() as Map<DocId, CustomEmojiElements>;\n const customWraps = options.customWraps ??= new Set();\n\n const entities = options.entities ??= parseEntities(nasty.text);\n\n const passEntities = options.passEntities ??= {};\n const contextSite = options.contextSite ??= 'Telegram';\n const contextExternal = contextSite !== 'Telegram';\n\n const textLength = nasty.text.length;\n const length = entities.length;\n let lastElement: HTMLElement | DocumentFragment;\n for(; nasty.i < length; ++nasty.i) {\n let entity = entities[nasty.i];\n\n // * check whether text was sliced\n // TODO: consider about moving it to other function\n if(entity.offset >= textLength) {\n if(entity._ !== 'messageEntityCaret') { // * can set caret to the end\n continue;\n }\n } else if((entity.offset + entity.length) > textLength) {\n entity = copy(entity);\n // entity.length = entity.offset + entity.length - textLength;\n entity.length = textLength - entity.offset;\n }\n\n if(entity.length) {\n nasty.lastEntity = entity;\n }\n\n let nextEntity = entities[nasty.i + 1];\n\n const startOffset = entity.offset;\n const endOffset = startOffset + entity.length;\n const endPartOffset = Math.min(endOffset, nextEntity?.offset ?? 0xFFFF);\n const fullEntityText = nasty.text.slice(startOffset, endOffset);\n const sliced = nasty.text.slice(startOffset, endPartOffset);\n let partText = sliced;\n\n if(nasty.usedLength < startOffset) {\n (lastElement || fragment).append(nasty.text.slice(nasty.usedLength, startOffset));\n }\n\n if(lastElement) {\n lastElement = fragment;\n }\n\n nasty.usedLength = endPartOffset;\n\n let element: HTMLElement,\n property: 'alt',\n usedText = false,\n processingBlockElement = false;\n switch(entity._) {\n case 'messageEntityBold': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n element = createMarkupFormatting('bold');\n } else {\n element = document.createElement('strong');\n }\n }\n\n break;\n }\n\n case 'messageEntityItalic': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n element = createMarkupFormatting('italic');\n } else {\n element = document.createElement('em');\n }\n }\n\n break;\n }\n\n case 'messageEntityStrike': {\n if(options.wrappingDraft) {\n element = createMarkupFormatting('strikethrough');\n // element = document.createElement('span');\n // const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n // element.style.cssText = `${styleName}: line-through;`;\n // element.style.fontFamily = 'markup-strikethrough';\n } else/* if(!options.noTextFormat) */ {\n element = document.createElement('del');\n }\n\n break;\n }\n\n case 'messageEntityUnderline': {\n if(options.wrappingDraft) {\n element = createMarkupFormatting('underline');\n // element = document.createElement('span');\n // const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n // element.style.cssText = `${styleName}: underline;`;\n // element.style.fontFamily = 'markup-underline';\n } else if(!options.noTextFormat) {\n element = document.createElement('u');\n }\n\n break;\n }\n\n case 'messageEntityPre':\n case 'messageEntityCode': {\n const entityLanguage = (entity as MessageEntity.messageEntityPre).language;\n if(options.wrappingDraft) {\n element = createMarkupFormatting('monospace');\n if(entityLanguage) {\n element.dataset.language = entityLanguage;\n }\n // element = document.createElement('span');\n // element.style.fontFamily = 'var(--font-monospace)';\n // element.style.fontFamily = 'markup-monospace';\n } else if(entity._ === 'messageEntityPre' && !options.noTextFormat) {\n const container = document.createElement('pre');\n const content = document.createElement('div');\n content.classList.add('code-content');\n element = document.createElement('code');\n element.classList.add('code-code');\n fragment.append(container);\n content.append(element);\n\n container.classList.add('quote-like', 'quote-like-border', 'code');\n\n const languageName = CodeLanguageAliases[entityLanguage.toLowerCase()];\n\n const header = document.createElement('div');\n header.classList.add('code-header');\n const headerName = document.createElement('span');\n headerName.classList.add('code-header-name');\n headerName.append(languageName || i18n('CopyCode'));\n const headerWrapButton = Icon('menu', 'code-header-button', 'code-header-toggle-wrap');\n header.append(headerName, headerWrapButton, Icon('copy', 'code-header-button', 'code-header-copy'));\n\n container.append(header, content);\n\n const result = languageName && highlightCode(fullEntityText, languageName);\n result && callbackify(result, (html) => {\n if(html) {\n element.innerHTML = html;\n }\n });\n\n usedText = true;\n if(!result || result instanceof Promise) {\n element.textContent = fullEntityText;\n }\n\n let lastInnerEntityIndex = findIndexFrom(entities, (n) => n.offset >= endOffset, nasty.i + 1);\n if(lastInnerEntityIndex === -1) lastInnerEntityIndex = entities.length - 1;\n else lastInnerEntityIndex -= 1;\n nasty.i = lastInnerEntityIndex;\n nasty.usedLength = endOffset;\n nasty.lastEntity = entities[lastInnerEntityIndex];\n nextEntity = undefined;\n processingBlockElement = true;\n } else if(!options.noTextFormat) {\n element = document.createElement('code');\n element.classList.add('monospace-text');\n }\n\n break;\n }\n\n // case 'messageEntityPre': {\n // if(options.wrappingDraft) {\n // element = document.createElement('span');\n // element.style.fontFamily = 'var(--font-monospace)';\n // } else if(!options.noTextFormat) {\n // element = document.createElement('pre');\n // const inner = document.createElement('code');\n // if(entity.language) {\n // inner.className = 'language-' + entity.language;\n // inner.textContent = entityText;\n // usedText = true;\n // }\n // }\n\n // break;\n // }\n\n case 'messageEntityHighlight': {\n element = document.createElement('i');\n element.className = 'text-highlight';\n break;\n }\n\n case 'messageEntityBotCommand': {\n // if(!(options.noLinks || options.noCommands || contextExternal)/* && !entity.unsafe */) {\n if(!options.noLinks && passEntities[entity._]) {\n let command = fullEntityText.slice(1);\n let bot: string | boolean;\n let atPos: number;\n if((atPos = command.indexOf('@')) !== -1) {\n bot = command.slice(atPos + 1);\n command = command.slice(0, atPos);\n } else {\n bot = options.fromBot;\n }\n\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = encodeEntities('tg://bot_command?command=' + encodeURIComponent(command) + (bot ? '&bot=' + encodeURIComponent(bot) : ''));\n if(!contextExternal) {\n element.setAttribute('onclick', 'execBotCommand(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityCustomEmoji': {\n if(!IS_CUSTOM_EMOJI_SUPPORTED) {\n break;\n }\n\n while(nextEntity?._ === 'messageEntityEmoji' && nextEntity.offset < endOffset) {\n ++nasty.i;\n nasty.lastEntity = nextEntity;\n nasty.usedLength += nextEntity.length;\n nextEntity = entities[nasty.i + 1];\n }\n\n const customEmojiElement = element = CustomEmojiElement.create(entity.document_id);\n const {docId} = customEmojiElement;\n let set = customEmojis.get(docId);\n if(!set) customEmojis.set(docId, set = new Set());\n set.add(customEmojiElement);\n customEmojiElement.dataset.stickerEmoji = fullEntityText;\n\n if(options.wrappingDraft) {\n element = document.createElement('img');\n (element as HTMLImageElement).alt = fullEntityText;\n for(const i in customEmojiElement.dataset) {\n element.dataset[i] = customEmojiElement.dataset[i];\n }\n (element as any).customEmojiElement = customEmojiElement;\n customEmojiElement.placeholder = element as HTMLImageElement;\n element.classList.add('custom-emoji-placeholder');\n (element as HTMLImageElement).src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAAtJREFUGFdjYAACAAAFAAGq1chRAAAAAElFTkSuQmCC';\n property = 'alt';\n break;\n }\n\n if(options.isSelectable) {\n // const s = document.createElement('span');\n // s.append(fullEntityText);\n // element.append(s);\n // element.textContent = fullEntityText;\n // element.textContent = 'a';\n // element.contentEditable = 'false';\n\n // const x = f();\n // x.style.display = 'inline-block';\n // x.contentEditable = 'false';\n // (lastElement || fragment).append(BOM);\n // (lastElement || fragment).append(x);\n\n element = wrapSomething(element, !!options.customEmojiRenderer);\n\n // const a = element;\n // element = document.createElement('span');\n // element.append(BOM, a, BOM);\n // element.contentEditable = 'false';\n }\n\n property = 'alt';\n break;\n }\n\n case 'messageEntityEmoji': {\n let isSupported = IS_EMOJI_SUPPORTED;\n if(isSupported) {\n for(const version in EmojiVersions) {\n if(version) {\n const emojiData = EmojiVersions[version as EMOJI_VERSION];\n if(emojiData.hasOwnProperty(entity.unicode) && !EMOJI_VERSIONS_SUPPORTED[version as EMOJI_VERSION]) {\n isSupported = false;\n break;\n }\n }\n }\n }\n\n // if(!(options.wrappingDraft && isSupported)) { // * fix safari emoji\n if(!isSupported) { // no wrapping needed\n // if(isSupported) { // ! contenteditable=\"false\" нужен для поля ввода, иначе там будет меняться шрифт в Safari, или же рендерить смайлик напрямую, без контейнера\n // insertPart(entity, '<span class=\"emoji\">', '</span>');\n // } else {\n element = document.createElement('img');\n (element as HTMLImageElement).src = `assets/img/emoji/${entity.unicode}.png`;\n property = 'alt';\n element.className = 'emoji emoji-image';\n\n // if(options.isSelectable) {\n // usedText = true;\n // (element as HTMLImageElement).alt = partText;\n // element = wrapSomething(element);\n // }\n\n // const a = element;\n // a.contentEditable = 'false';\n // element = document.createElement('span');\n // element.append(a);\n // element.contentEditable = 'false';\n // }\n // } else if(options.mustWrapEmoji) {\n } else if(!options.wrappingDraft) {\n element = document.createElement('span');\n element.className = 'emoji emoji-native';\n }/* else if(!IS_SAFARI) {\n insertPart(entity, '<span class=\"emoji\" contenteditable=\"false\">', '</span>');\n } */\n /* if(!isSupported) {\n insertPart(entity, `<img src=\"assets/img/emoji/${entity.unicode}.png\" alt=\"`, `\" class=\"emoji\">`);\n } */\n\n break;\n }\n\n case 'messageEntityCaret': {\n element = document.createElement('span');\n element.className = 'composer-sel';\n break;\n }\n\n case 'messageEntityLinebreak': {\n // slice linebreaks before and after quote\n if(options.ignoreNextIndex === nasty.i || (options.wrappingDraft && nextEntity?._ === 'messageEntityBlockquote' && nextEntity.offset === endOffset)) {\n usedText = true;\n } else if(options.wrappingDraft && IS_FIREFOX) {\n element = document.createElement('br');\n usedText = true;\n }\n\n if(options.doubleLinebreak === nasty.i) {\n options.doubleLinebreak = undefined;\n (element || fragment).append('\\n\\n');\n usedText = true;\n }\n // if(options.noLinebreaks) {\n // insertPart(entity, ' ');\n // } else {\n // insertPart(entity, '<br/>');\n // }\n\n break;\n }\n\n case 'messageEntityUrl':\n case 'messageEntityTextUrl': {\n if(!(options.noLinks && !passEntities[entity._])) {\n // let inner: string;\n let url: string = (entity as MessageEntity.messageEntityTextUrl).url || fullEntityText;\n let masked = false;\n let onclick: string;\n\n const wrapped = wrapUrl(url, true);\n url = wrapped.url;\n onclick = wrapped.onclick;\n\n if(options.whitelistedDomains) {\n try {\n const hostname = new URL(url).hostname;\n if(!options.whitelistedDomains.includes(hostname)) {\n break;\n }\n } catch(err) {\n break;\n }\n }\n\n if(entity._ === 'messageEntityTextUrl') {\n if(nextEntity?._ === 'messageEntityUrl' &&\n nextEntity.length === entity.length &&\n nextEntity.offset === entity.offset) {\n nasty.lastEntity = nextEntity;\n ++nasty.i;\n }\n\n if(url !== fullEntityText) {\n masked = true;\n }\n } else {\n // inner = encodeEntities(replaceUrlEncodings(entityText));\n }\n\n const currentContext = !!onclick;\n if(!onclick && masked && !currentContext && !options.passMaskedLinks) {\n onclick = 'showMaskedAlert';\n }\n\n if(options.wrappingDraft) {\n onclick = undefined;\n }\n\n const href = (currentContext || typeof electronHelpers === 'undefined') ?\n url :\n `javascript:electronHelpers.openExternal('${url}');`;\n\n element = document.createElement('a');\n element.className = 'anchor-url';\n (element as HTMLAnchorElement).href = href;\n\n if(!(currentContext || typeof electronHelpers !== 'undefined')) {\n setBlankToAnchor(element as HTMLAnchorElement);\n }\n\n if(onclick) {\n element.setAttribute('onclick', onclick + '(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityEmail': {\n if(!options.noLinks) {\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = encodeEntities('mailto:' + fullEntityText);\n setBlankToAnchor(element as HTMLAnchorElement);\n }\n\n break;\n }\n\n case 'messageEntityHashtag': {\n const contextUrl = !options.noLinks && SITE_HASHTAGS[contextSite];\n if(contextUrl) {\n const hashtag = fullEntityText.slice(1);\n element = document.createElement('a');\n element.className = 'anchor-hashtag';\n (element as HTMLAnchorElement).href = contextUrl.replace('{1}', encodeURIComponent(hashtag));\n if(contextExternal) {\n setBlankToAnchor(element as HTMLAnchorElement);\n } else {\n element.setAttribute('onclick', 'searchByHashtag(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityMentionName': {\n if(!(options.noLinks && !passEntities[entity._])) {\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = buildURLHash('' + entity.user_id);\n element.className = 'follow';\n element.dataset.follow = '' + entity.user_id;\n }\n\n break;\n }\n\n case 'messageEntityMention': {\n // const contextUrl = !options.noLinks && siteMentions[contextSite];\n if(!options.noLinks) {\n const username = fullEntityText.slice(1);\n\n element = wrapTelegramUrlToAnchor('t.me/' + username);\n element.className = 'mention';\n\n // insertPart(entity, `<a class=\"mention\" href=\"${contextUrl.replace('{1}', encodeURIComponent(username))}\"${contextExternal ? ' target=\"_blank\" rel=\"noopener noreferrer\"' : ''}>`, '</a>');\n }\n\n break;\n }\n\n case 'messageEntitySpoiler': {\n if(options.noTextFormat) {\n const encoded = encodeSpoiler(nasty.text, entity);\n nasty.text = encoded.text;\n partText = encoded.entityText;\n if(endPartOffset !== endOffset) {\n nasty.usedLength += endOffset - endPartOffset;\n }\n let n: MessageEntity;\n for(; n = entities[nasty.i + 1], n && n.offset < endOffset;) {\n // nasty.usedLength += n.length;\n ++nasty.i;\n nasty.lastEntity = n;\n nextEntity = entities[nasty.i + 1];\n }\n } else if(options.wrappingDraft) {\n element = createMarkupFormatting('spoiler');\n // element = document.createElement('span');\n // element.style.fontFamily = 'spoiler';\n // element.style.fontFamily = 'markup-spoiler';\n } else {\n const container = document.createElement('span');\n container.className = 'spoiler';\n element = document.createElement('span');\n element.className = 'spoiler-text';\n element.textContent = partText;\n usedText = true;\n container.append(element);\n fragment.append(container);\n\n container[`on${CLICK_EVENT_NAME}`] = (window as any).onSpoilerClick;\n }\n\n break;\n }\n\n case 'messageEntityTimestamp': {\n if(!options.maxMediaTimestamp || entity.time > options.maxMediaTimestamp) {\n break;\n }\n\n element = document.createElement('a');\n element.classList.add('timestamp');\n element.dataset.timestamp = '' + entity.time;\n (element as HTMLAnchorElement).href = '#';\n element.setAttribute('onclick', 'setMediaTimestamp(this)');\n\n if(options.maxMediaTimestamp === Infinity) {\n element.classList.add('is-disabled');\n }\n\n break;\n }\n\n case 'messageEntityBlockquote': {\n if(options.noTextFormat) {\n break;\n }\n\n if(options.wrappingDraft) {\n element = createMarkupFormatting('quote');\n\n // * ? because of layer migration\n if(entity.pFlags?.collapsed) {\n element.dataset.collapsed = '1';\n }\n } else {\n element = document.createElement('blockquote');\n element.classList.add('quote');\n\n // * ? because of layer migration\n if(entity.pFlags?.collapsed/* || true */) {\n const dispose = makeQuoteCollapsable(element);\n options.middleware.onClean(dispose);\n }\n }\n\n element.classList.add('quote-like', 'quote-like-border', 'quote-like-icon');\n setDirection(element);\n\n processingBlockElement = true;\n break;\n }\n }\n\n if(processingBlockElement) {\n let foundNextLinebreakIndex = -1;\n for(let i = nasty.i; i < length; ++i) {\n const n = entities[i];\n if(n._ === 'messageEntityLinebreak' && n.offset >= endOffset) {\n foundNextLinebreakIndex = i;\n break;\n }\n }\n\n if(foundNextLinebreakIndex !== -1 && nasty.text.slice(endOffset, entities[foundNextLinebreakIndex].offset).trim()) {\n foundNextLinebreakIndex = -1;\n }\n\n if(!options.wrappingDraft && endOffset < nasty.text.length) {\n // * ignore inner linebreak if found and double next linebreak\n if(!element.parentElement) {\n const container = document.createElement('div');\n container.append(element);\n fragment.append(container);\n }\n\n if(nasty.text[endOffset - 1] === '\\n') {\n let lastInnerLinebreakIndex = -1;\n for(let i = nasty.i; i < length; ++i) {\n const n = entities[i];\n if(n.offset >= endOffset) {\n break;\n }\n\n if(n._ === 'messageEntityLinebreak') {\n lastInnerLinebreakIndex = i;\n }\n }\n\n if(lastInnerLinebreakIndex !== -1) {\n options.ignoreNextIndex = lastInnerLinebreakIndex;\n }\n } else if(foundNextLinebreakIndex !== -1) {\n options.ignoreNextIndex = foundNextLinebreakIndex;\n }\n\n // if(nasty.text[endOffset - 1] === '\\n' &&\n // foundNextLinebreakIndex !== -1 &&\n // nasty.text[endPartOffset + 1] === '\\n') {\n // options.ignoreNextIndex = foundNextLinebreakIndex - 1;\n // options.doubleLinebreak = foundNextLinebreakIndex;\n // }\n }\n\n if(options.wrappingDraft && foundNextLinebreakIndex !== -1) {\n options.ignoreNextIndex = foundNextLinebreakIndex;\n }\n\n // if(!options.wrappingDraft) {\n // const i = Icon('quote', 'quote-icon');\n // element.textContent = partText;\n // usedText = true;\n // element.prepend(i);\n // } else {\n // element.classList.add('quote-use-before');\n // }\n }\n\n if(!usedText && partText) {\n if(element) {\n if(property) {\n // @ts-ignore\n element[property] = partText;\n } else {\n element.append(partText);\n }\n } else {\n (element || fragment).append(partText);\n }\n }\n\n if(element && !element.parentNode) {\n (lastElement || fragment).append(element);\n }\n\n while(nextEntity && nextEntity.offset < endOffset) {\n ++nasty.i;\n\n (element || fragment).append(wrapRichText(nasty.text, {\n ...options,\n voodoo: true\n }));\n\n nextEntity = entities[nasty.i + 1];\n }\n\n // if(!element?.parentNode) {\n // (lastElement || fragment).append(element ?? partText);\n // }\n\n if(nasty.usedLength <= endOffset) {\n if(nasty.usedLength < endOffset) {\n (element || fragment).append(nasty.text.slice(nasty.usedLength, endOffset));\n nasty.usedLength = endOffset;\n }\n\n lastElement = fragment;\n nasty.lastEntity = undefined;\n } else if(entity.length > partText.length && element) {\n lastElement = element;\n } else {\n lastElement = fragment;\n }\n\n if(options.voodoo) {\n return fragment;\n }\n }\n\n if(nasty.lastEntity) {\n nasty.usedLength = nasty.lastEntity.offset + nasty.lastEntity.length;\n }\n\n if(nasty.usedLength < textLength) {\n (lastElement || fragment).append(nasty.text.slice(nasty.usedLength));\n }\n\n if((!options.wrappingDraft || options.customEmojiRenderer) && customEmojis.size) {\n let renderer = options.customEmojiRenderer;\n if(!renderer) {\n renderer = CustomEmojiRendererElement.create(options);\n fragment.prepend(renderer);\n }\n\n const loadPromise = renderer.add({\n addCustomEmojis: customEmojis,\n lazyLoadQueue: options.lazyLoadQueue,\n onlyThumb: options.wrappingDraft\n });\n options.loadPromises?.push(loadPromise);\n // recordPromise(loadPromise, 'render emojis: ' + docIds.length);\n }\n\n if(customWraps.size) {\n insertCustomFillers(customWraps);\n }\n\n fragment.normalize();\n\n return fragment;\n}\n\nexport const createCustomFiller = (notFiller?: boolean) => {\n const x = document.createElement('span');\n x.classList.add(notFiller ? 'input-filler2' : 'input-filler');\n x.textContent = BOM;\n return x;\n};\n\nexport function isCustomFillerNeededBySiblingNode(node: ChildNode) {\n if(\n // !node?.textContent ||\n // node.textContent.endsWith('\\n') ||\n node?.textContent !== BOM ||\n (node as HTMLElement)?.getAttribute?.('contenteditable') === 'false'\n ) {\n // if(!node || (node as HTMLElement).firstElementChild || node.textContent.endsWith('\\n')) {\n if(!node || node.textContent !== BOM || (node as HTMLElement).firstElementChild) {\n return 2;\n } else if(node.nodeType === node.ELEMENT_NODE) {\n return 1;\n }/* else if(node.nodeType === node.TEXT_NODE && !node.nodeValue) {\n (node as CharacterData).insertData(0, BOM);\n } */\n }\n\n return 0;\n}\n\nexport function insertCustomFillers(elements: Iterable<HTMLElement>) {\n const check = (element: HTMLElement, node: ChildNode, method: 'before' | 'after') => {\n const needed = isCustomFillerNeededBySiblingNode(node);\n if(needed === 2) {\n element[method](createCustomFiller());\n } else if(needed === 1) {\n node.appendChild(document.createTextNode(BOM));\n }\n };\n\n for(const element of elements) {\n const {previousSibling, nextSibling} = element;\n check(element, previousSibling, 'before');\n check(element, nextSibling, 'after');\n }\n}\n\n(window as any).wrapRichText = wrapRichText;\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 type EventListenerBase from './eventListenerBase';\n\nexport type Listener = {\n element: ListenerElement,\n event: ListenerEvent,\n callback: ListenerCallback,\n options?: ListenerOptions,\n\n onceFired?: true, // will be set only when options.once is set\n onceCallback?: () => void,\n};\n\nexport type ListenerElement = Window | Document | HTMLElement | Element | EventListenerBase<any> | EventTarget;\nexport type ListenerEvent = string;\nexport type ListenerCallback = Function;\nexport type ListenerOptions = AddEventListenerOptions;\n\n/* const originalAddEventListener = HTMLElement.prototype.addEventListener;\nHTMLElement.prototype.addEventListener = function(this, name: string, callback: EventListenerOrEventListenerObject, options: AddEventListenerOptions) {\n console.log('nu zdarova', name);\n originalAddEventListener.call(this, name, callback, options);\n\n if(options?.ls) {\n return options.ls.addFromElement(this, name, callback as any, options);\n }\n}; */\n\nexport default class ListenerSetter {\n private listeners: Set<Listener> = new Set();\n\n public add<T extends ListenerElement>(element: T): T['addEventListener'] {\n return ((event: string, callback: Function, options: ListenerOptions) => {\n const listener: Listener = {element, event, callback, options};\n this.addManual(listener);\n return listener;\n }) as any;\n }\n\n /* public addFromElement<T extends ListenerElement>(element: T, event: ListenerEvent, callback: ListenerCallback, options: ListenerOptions) {\n const listener: Listener = {element, event, callback, options};\n this.addManual(listener);\n return listener;\n } */\n\n public addManual(listener: Listener) {\n // @ts-ignore\n listener.element.addEventListener(listener.event, listener.callback, listener.options);\n\n if(listener.options?.once) { // remove listener when its called\n listener.onceCallback = () => {\n this.remove(listener);\n listener.onceFired = true;\n };\n\n // @ts-ignore\n listener.element.addEventListener(listener.event, listener.onceCallback, listener.options);\n }\n\n this.listeners.add(listener);\n }\n\n public remove(listener: Listener) {\n if(!listener.onceFired) {\n // @ts-ignore\n listener.element.removeEventListener(listener.event, listener.callback, listener.options);\n\n if(listener.onceCallback) {\n // @ts-ignore\n listener.element.removeEventListener(listener.event, listener.onceCallback, listener.options);\n }\n }\n\n this.listeners.delete(listener);\n }\n\n public removeManual<T extends ListenerElement>(\n element: T,\n event: ListenerEvent,\n callback: ListenerCallback,\n options?: ListenerOptions\n ) {\n let listener: Listener;\n for(const _listener of this.listeners) {\n if(_listener.element === element &&\n _listener.event === event &&\n _listener.callback === callback &&\n _listener.options === options) {\n listener = _listener;\n break;\n }\n }\n\n if(listener) {\n this.remove(listener);\n }\n }\n\n public removeAll() {\n this.listeners.forEach((listener) => {\n this.remove(listener);\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\nimport clamp from '../number/clamp';\nimport findUpAsChild from './findUpAsChild';\nimport whichChild from './whichChild';\n\nexport default function compareNodes(node1: ChildNode, node1Offset: number, node2: ChildNode, node2Offset: number) {\n let diff: number;\n if(node1 === node2) {\n diff = node1Offset - node2Offset;\n } else if(node1.parentElement === node2.parentElement) {\n diff = whichChild(node1, true) - whichChild(node2, true);\n } else {\n const parents: HTMLElement[] = [];\n let parentElement = node1.parentElement;\n do {\n parents.push(parentElement);\n } while(parentElement = parentElement.parentElement);\n\n parentElement = node2.parentElement;\n do {\n if(parents.includes(parentElement)) {\n break;\n }\n } while(parentElement = parentElement.parentElement);\n\n const commonAncestorContainer = parentElement;\n // const range = document.createRange();\n // range.setStart(node1, 0);\n // range.setEnd(node2, node2.textContent.length);\n // const {commonAncestorContainer} = range;\n node1 = findUpAsChild(node1 as HTMLElement, commonAncestorContainer as HTMLElement);\n node2 = findUpAsChild(node2 as HTMLElement, commonAncestorContainer as HTMLElement);\n diff = whichChild(node1, true) - whichChild(node2, true);\n }\n\n return clamp(diff, -1, 1);\n}\n\n(window as any).compareNodes = compareNodes;\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 {IS_FIREFOX} from '../../environment/userAgent';\nimport {logger} from '../../lib/logger';\nimport {isCustomFillerNeededBySiblingNode} from '../../lib/richTextProcessor/wrapRichText';\nimport ListenerSetter from '../listenerSetter';\nimport BOM from '../string/bom';\nimport compareNodes from './compareNodes';\nimport getCaretPosNew from './getCaretPosNew';\nimport placeCaretAtEnd from './placeCaretAtEnd';\nimport whichChild from './whichChild';\n\nconst NOT_ONLY_BOMS_REG_EXP = new RegExp(`[^${BOM}]`);\n\nexport const USING_BOMS = false;\n\nexport default class RichInputHandler {\n private static INSTANCE: RichInputHandler;\n\n private listenerSetter: ListenerSetter;\n\n private lastNode: Node;\n private lastOffset: number;\n private savedRanges: WeakMap<HTMLElement, Range>;\n\n private log: ReturnType<typeof logger>;\n\n private inputCaptureCallbacks: Function[];\n\n constructor() {\n this.log = logger('RICH-INPUT');\n this.listenerSetter = new ListenerSetter();\n this.savedRanges = new WeakMap();\n\n this.listenerSetter.add(document)('selectionchange', this.saveSelectionOnChange);\n if(USING_BOMS) {\n this.listenerSetter.add(document)('focusout', this.onFocusOut);\n this.listenerSetter.add(document)('selectionchange', this.onSelectionChange);\n this.listenerSetter.add(document)('beforeinput', this.onBeforeInput);\n this.listenerSetter.add(document)('keydown', this.onKeyDown, {capture: true});\n\n if(IS_FIREFOX) {\n this.inputCaptureCallbacks = [];\n this.listenerSetter.add(document)('input', () => {\n this.inputCaptureCallbacks.forEach((callback) => callback());\n this.inputCaptureCallbacks.length = 0;\n }, {capture: true});\n }\n }\n }\n\n private get input() {\n const selection = document.getSelection();\n const {anchorNode: node} = selection;\n if(!node) return;\n return ((node as HTMLElement).closest ? node as HTMLElement : node.parentElement).closest<HTMLElement>('[contenteditable=\"true\"]');\n }\n\n private saveRangeForElement(element: HTMLElement) {\n if(element && (element.isContentEditable || element.tagName === 'INPUT')) {\n const selection = document.getSelection();\n if(selection.rangeCount) {\n this.savedRanges.set(element as HTMLElement, document.getSelection().getRangeAt(0));\n }\n }\n }\n\n private saveSelectionOnChange = (e: Event) => {\n const element = document.activeElement as HTMLElement; // e.target as HTMLElement;\n this.saveRangeForElement(element);\n };\n\n private onFocusOut = (e: FocusEvent) => {\n this.lastNode = this.lastOffset = undefined;\n };\n\n private findPreviousSmthIndex(input: HTMLElement, node: ChildNode, something?: NodeListOf<Element>) {\n // node = this.getFiller(node);\n // const childNodes = Array.from(node.parentElement.childNodes);\n // fillerIndex = childNodes.indexOf(node);\n // let smthIndex = -1;\n // for(let i = fillerIndex; i >= 0; --i) {\n // const node = childNodes[i];\n // if((node as HTMLElement)?.classList?.contains('input-something')) {\n // smthIndex = i;\n // break;\n // }\n // }\n // return smthIndex;\n\n const elements = Array.from(something ?? input.querySelectorAll('.input-something'));\n const index = elements.findIndex((element) => compareNodes(element, 0, node, 0) >= 0);\n return index === -1 ? elements.length - 1 : Math.max(0, index - 1);\n }\n\n private superMove(\n input: HTMLElement,\n caret: ReturnType<RichInputHandler['getCaretPosN']>,\n toLeft: boolean,\n fromSelectionChange: boolean\n ) {\n const {node, offset, move} = caret;\n const something = input.querySelectorAll('.input-something');\n const smthIndex = this.findPreviousSmthIndex(input, node, something);\n const r = document.createRange();\n r[toLeft ? 'setEnd' : 'setStart'](node, offset);\n\n if(fromSelectionChange) {\n move(toLeft);\n }\n\n const c = this.getCaretPosN();\n if(c.node?.nodeValue === BOM && (!fromSelectionChange || node === this.lastNode)) {\n const idx = this.findPreviousSmthIndex(input, c.node, something);\n\n let moved = !fromSelectionChange;\n\n do {\n const c = this.getCaretPosN();\n const idxidx = this.findPreviousSmthIndex(input, c.node, something);\n r[toLeft ? 'setStart' : 'setEnd'](c.node, c.offset);\n const rangeString = r.toString();\n const onlyBOMs = !NOT_ONLY_BOMS_REG_EXP.test(rangeString);\n this.log('test cursor', rangeString, onlyBOMs, idx, idxidx);\n if(\n onlyBOMs &&\n c.node?.nodeValue === BOM &&\n idxidx === idx &&\n // (idxidx > 1 || c.offset) &&\n // (idxidx < (getFiller(c.node).parentElement.childNodes.length - 2) || c.offset < BOM.length)\n (idxidx || c.offset) &&\n (idxidx < (something.length - 1) || c.offset < BOM.length)\n ) {\n move(toLeft);\n moved = true;\n } else if(!moved) {\n break;\n } else {\n if((!this.getFiller(node as HTMLElement).classList.contains('input-filler-text') && idx !== smthIndex) || c.offset === BOM.length) {\n move(!toLeft);\n }\n\n break;\n }\n } while(true);\n }\n }\n\n private onSelectionChange = (e: Event) => {\n const {input} = this;\n if(!input) {\n this.setSelectionClassName(document.getSelection());\n return;\n }\n\n // return;\n\n // this.log('selectionchange', document.getSelection(), document.getSelection().rangeCount && document.getSelection().getRangeAt(0), getCaretPosN());\n // let {node, offset} = getCaretPos(this.messageInput);\n\n let caret = this.getCaretPosN();\n do {\n const {node, offset, selection, move} = caret;\n\n const nodeValue = node?.nodeValue;\n // if(!nodeValue?.includes(BOM)) {\n if(nodeValue !== BOM || !this.lastNode) {\n break;\n }\n\n // node = getFiller(node);\n\n // const childIndex = whichChild(getFiller(node), true);\n // let toLeft: boolean;\n // // if(node === lastNode) toLeft = lastOffset >= offset;\n // if(node === lastNode) toLeft = lastOffset > offset;\n // else {\n // // toLeft = whichChild(getFiller(lastNode)) > childIndex;\n // toLeft = (lastNode.nodeValue === BOM ? whichChild(getFiller(lastNode), true) : whichChild(findUpAsChild(lastNode as any, getFiller(node).parentElement), true)) > childIndex;\n // }\n\n const toLeft = compareNodes(node, offset, this.lastNode as ChildNode, this.lastOffset) < 0;\n\n // const childNodes = Array.from(node.parentElement.childNodes);\n // if(toLeft) {\n // for(let i = childIndex; i >= 0; --i) {\n // const sibling = childNodes[i];\n // const {textContent} = sibling;\n // for()\n // }\n // }\n\n // {\n // if(toLeft === undefined) {\n // return;\n // }\n\n // const selection = window.getSelection();\n // selection.modify(selection.isCollapsed ? 'move' : 'extend', toLeft ? 'backward' : 'forward', 'character');\n // return;\n // }\n\n // const parent = getFiller(node);\n if(toLeft !== undefined) {\n // let newNode = toLeft ? parent.previousSibling : parent.nextSibling;\n if(selection.isCollapsed) {\n this.superMove(input, caret, toLeft, true);\n\n // if(offset === BOM.length) {\n // newNode = toLeft ? newNode.nextSibling.nextSibling : parent.previousSibling.previousSibling;\n // }\n\n // setCaretAt(newNode);\n } else {\n selection.modify(selection.isCollapsed ? 'move' : 'extend', toLeft ? 'backward' : 'forward', 'character');\n // const range = selection.getRangeAt(0);\n\n // if(toLeft) {\n // newNode = parent.previousSibling.previousSibling.firstChild;\n // const value = newNode.nodeValue;\n // range.setStart(newNode, value?.length);\n // } else {\n // newNode = parent.nextSibling.nextSibling.firstChild;\n // range.setEnd(newNode, 0);\n // }\n }\n }\n\n this.log('selectionchange',\n node,\n offset,\n this.lastNode,\n this.lastOffset,\n node === this.lastNode,\n whichChild(this.getFiller(node)),\n whichChild(this.getFiller(this.lastNode)),\n toLeft,\n selection,\n document.getSelection(),\n document.getSelection().getRangeAt(0),\n node?.parentNode,\n this.lastNode?.parentNode\n );\n\n caret = this.getCaretPosN();\n this.lastNode = node;\n this.lastOffset = offset;\n\n break;\n\n // if(findPreviousSmthIndex(caret.node) !== smthIndex) {\n // break;\n // }\n } while(true);\n\n this.lastNode = this.lastOffset = undefined;\n\n // if(offset === BOM.length) {\n // setCaretAt(parent);\n // } else {\n // setCaretAt(parent.nextSibling);\n // }\n\n this.setSelectionClassName(caret.selection, input);\n };\n\n public restoreSavedRange(input: HTMLElement) {\n const range = this.getSavedRange(input);\n if(!range) {\n return false;\n }\n\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n\n return true;\n }\n\n public getSavedRange(input: HTMLElement) {\n return this.savedRanges.get(input);\n }\n\n public makeFocused(input: HTMLElement) {\n if(document.activeElement !== input && !this.restoreSavedRange(input)) {\n placeCaretAtEnd(input, false, false);\n }\n }\n\n private fixInsertedLineBreaks(input: HTMLElement) {\n input.querySelectorAll('br').forEach((br) => {\n br.classList.add('br-not-br');\n });\n }\n\n private fixBuggedCaret() {\n const selection = document.getSelection();\n const range = selection.getRangeAt(0);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n public onBeforeInput = (e: Pick<InputEvent, 'inputType'>) => {\n const {input, log} = this;\n if(!input) {\n return;\n }\n\n const addInputCallback = this.addInputCallback.bind(this, input);\n\n const caretPos = this.getCaretPosN();\n let {node, offset, selection, move} = caretPos;\n log('beforeinput', e, node, offset, selection, caretPos);\n this.lastNode = this.lastOffset = undefined;\n\n if(e.inputType.startsWith('delete')) { // delete current BOM\n addInputCallback(() => {\n this.processEmptiedFillers(input);\n this.removeExtraBOMs(input);\n this.fixInsertedLineBreaks(input);\n });\n\n if(node?.nodeValue === BOM && selection.isCollapsed && e.inputType.includes('deleteContent')) {\n const toLeft = e.inputType.includes('Backward');\n const moveFirst = (offset === BOM.length && toLeft) || (!offset && !toLeft);\n this.superMove(input, caretPos, toLeft, moveFirst);\n // if((offset === BOM.length && toLeft) || (!offset && !toLeft)) {\n // move(toLeft);\n // }\n\n // addInputCallback(() => {\n // removePossibleBOMSiblingsByNode(getFiller(node));\n // });\n\n // if(node.parentNode.childNodes.length === 1) {\n // (node.parentNode as HTMLElement).remove();\n // move(e.inputType.includes('Backward') ? false : true);\n // } else {\n // move(e.inputType.includes('Backward') ? true : false);\n // addInputCallback(() => {\n // move(e.inputType.includes('Backward') ? false : true);\n // });\n // }\n\n // for(let i = 0, length = BOM.length + (direction === 'backward' ? offset : BOM.length - offset); i < length; ++i) {\n // selection.modify('extend', direction, 'character');\n // }\n\n // selection.modify('extend', direction, 'character');\n // selection.modify('extend', direction, 'character');\n\n // selection.deleteFromDocument();\n // e.preventDefault();\n } else {\n // const filler = getFiller(node);\n // if(filler?.classList?.contains('input-filler-text')) {\n // const {previousSibling, nextSibling} = filler;\n // addInputCallback(() => {\n // if(!filler.isConnected) {\n // removePossibleBOMSiblings(previousSibling, nextSibling);\n // }\n // // removeExtraBOMs();\n // // processEmptiedFillers();\n // });\n // }\n // addInputCallback(() => {\n // this.fixInsertedLineBreaks(input);\n // });\n }\n } else if(e.inputType.startsWith('insert')) { // clear current BOM\n if((node as HTMLElement)?.classList?.contains('input-something')/* || (node.textContent === BOM && offset === BOM.length) */) {\n node = node.previousSibling.firstChild;\n const range = selection.getRangeAt(0);\n range.setStart(node, 0);\n range.setEnd(node, 0);\n range.collapse(true);\n // selection.modify('move', 'backward', 'character');\n\n const c = this.getCaretPosN();\n node = c.node;\n selection = c.selection;\n offset = c.offset;\n }\n if(node && node.textContent === BOM && offset === BOM.length) {\n // const range = selection.getRangeAt(0);\n // range.setStart(node, 0);\n // range.setEnd(node, 0);\n // range.collapse(true);\n selection.modify('move', 'backward', 'character');\n\n const c = this.getCaretPosN();\n node = c.node;\n selection = c.selection;\n offset = c.offset;\n }\n // if(node && node.textContent === BOM && offset === 0) {\n // selection.modify('move', 'forward', 'character');\n // offset = BOM.length;\n // }\n\n if(e.inputType === 'insertLineBreak' || true) {\n // const appendix = 'X';\n // const textNode = document.createTextNode(appendix);\n // if(node.parentElement !== this.messageInput) node.parentElement.after(textNode);\n // else node.after(textNode);\n // selection.modify('move', 'forward', 'character');\n // selection.modify('move', 'forward', 'character');\n // addInputCallback(() => {\n // textNode.remove();\n // });\n\n /* if(node?.nodeValue === BOM) */ {\n // const parent = node.parentElement;\n // parent.contentEditable = 'false';\n // addInputCallback(() => {\n // parent.contentEditable = 'inherit';\n // });\n // node.parentElement.remove();\n\n // const textNode = document.createTextNode(appendix);\n // if(node.parentElement !== this.messageInput) node.parentElement.after(textNode);\n // else node.after(textNode);\n // // selection.modify('move', 'forward', 'character');\n // // selection.modify('move', 'forward', 'character');\n // addInputCallback(() => {\n // textNode.remove();\n // });\n\n // fix case when focused somehow on span instead of text node\n if(node && node.nodeType === node.ELEMENT_NODE) {\n node = node.firstChild;\n log.warn('fixing focus on span');\n }\n\n const isBOM = node?.nodeValue === BOM;\n log('inserting line break', isBOM, node, `\"${node?.nodeValue}\"`, node?.parentElement ? Array.from(node.parentElement.childNodes).slice() : []);\n if(isBOM) {\n // (node as ChildNode).replaceWith(this.messageInput.querySelector('.lol'));\n\n const parentElement = node.parentElement;\n parentElement.classList.replace('input-filler', 'input-filler-text');\n const childNodesLength = parentElement.childNodes.length;\n addInputCallback(() => {\n const newChildNodesLength = parentElement.childNodes.length;\n if(newChildNodesLength > 1/* && newChildNodesLength !== childNodesLength */) {\n log('inserting line break, remove');\n node = Array.from(parentElement.childNodes).find((node) => node.nodeValue === BOM);\n (parentElement as any).t = node;\n // node?.remove();\n\n // const n = parentElement.firstChild;\n // const range = selection.getRangeAt(0);\n // range.setStart(n, n.nodeValue.length);\n // range.setEnd(n, n.nodeValue.length);\n } else if(node.nodeValue !== BOM) {\n log('inserting line break, deleteData');\n (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // node = document.createTextNode(BOM);\n }\n\n this.fixInsertedLineBreaks(input);\n // (parentElement as any).t = node;\n // node.remove();\n });\n // addInputCallback(() => {\n // node.parentElement.classList.replace('input-filler', 'input-filler3');\n // const s = document.createElement('span');\n // s.style.display = 'none';\n // node.replaceWith(s);\n // s.prepend(node);\n // });\n } else if(e.inputType === 'insertLineBreak') {\n addInputCallback(() => {\n this.fixInsertedLineBreaks(input);\n });\n // const range = selection.getRangeAt(0);\n // this.messageInput.querySelectorAll<HTMLElement>('.input-something').forEach((el) => {\n // el.contentEditable = 'inherit';\n // });\n\n // addInputCallback(() => {\n // this.messageInput.querySelectorAll<HTMLElement>('.input-something').forEach((el) => {\n // el.contentEditable = 'false';\n // });\n\n // selection.removeAllRanges();\n // selection.addRange(range);\n // }, false);\n }/* else if(node &&\n node.nodeType === node.TEXT_NODE &&\n node.nodeValue.length === offset) {\n\n } */\n\n // if(e.inputType === 'insertLineBreak') {\n // e.preventDefault();\n // document.execCommand('insertHTML', false, '<span class=\"lol\">\\n</span>');\n\n // this.messageInputField.simulateInputEvent();\n // }\n\n // node.parentElement.replaceWith(node);\n // selection.removeAllRanges();\n // const range = new Range();\n // range.setStart(node, 0);\n // range.setEnd(node, node.nodeValue.length);\n // selection.addRange(range);\n // node.parentElement.classList.remove('input-filler');\n // node.parentElement\n }\n\n // document.execCommand('insertHTML', false, '\\n');\n // e.preventDefault();\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // if(node?.nodeValue === BOM) {\n // addInputCallback(() => {\n // node.remove();\n // });\n // }\n // this.messageInputField.simulateInputEvent();\n\n // this.messageInput.querySelectorAll<HTMLElement>('.input-something').forEach((el) => {\n // el.contentEditable = 'inherit';\n // });\n // addInputCallback(() => {\n // this.messageInput.querySelectorAll<HTMLElement>('.input-something').forEach((el) => {\n // el.contentEditable = 'false';\n // });\n // });\n return;\n }\n\n if(node?.nodeValue === BOM) {\n // node.nodeValue = ''; // ! will move cursor forward\n // addInputCallback(() => {\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // });\n\n if(e.inputType === 'insertLineBreak') {\n if(offset === BOM.length) {\n selection.modify('move', 'backward', 'character');\n }\n\n // if(offset !== BOM.length) {\n // selection.modify('move', 'forward', 'character');\n // }\n\n addInputCallback(() => {\n node.remove();\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // selection.modify('move', 'forward', 'character');\n\n setTimeout(() => {\n selection.modify('move', 'forward', 'character');\n }, 0);\n });\n }\n\n // node.parentElement.replaceWith(node);\n\n // node.parentElement.replaceWith(node);\n if(e.inputType === 'insertLineBreak') {\n // const previousParentSibling = node.parentNode.previousSibling;\n // addInputCallback(() => {\n // if(previousParentSibling.nextSibling.nodeValue === '\\n') {\n // previousParentSibling.nextSibling.remove();\n\n // setTimeout(() => {\n // // selection.modify('move', 'forward', 'character');\n // // selection.modify('move', 'forward', 'character');\n // }, 0);\n // } else {\n // previousParentSibling.nextSibling.nodeValue = previousParentSibling.nextSibling.nodeValue.replace('\\n\\n', '\\n');\n // }\n // });\n } else {\n // if(node.parentElement !== this.messageInput) {\n // node.parentElement.replaceWith(node);\n // }\n\n // setTimeout(() => {\n // this.log(JSON.stringify(node.parentElement.innerHTML));\n // node.nodeValue = node.nodeValue.replace(BOM, '');\n // // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // this.log(JSON.stringify(node.parentElement.innerHTML));\n // }, 1000);\n\n addInputCallback(() => {\n (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n if(!node.nodeValue) {\n node.remove();\n }\n\n // selection.modify('move', 'forward', 'character');\n });\n }\n\n if(selection.isCollapsed && false) {\n node.parentElement.replaceWith(node);\n // const textNode = document.createTextNode(BOM);\n // (node.parentNode as any as ChildNode).after(textNode);\n // setCaretAt(textNode.nextSibling);\n // selection.modify('move', 'forward', 'character');\n node.remove();\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // selection.modify('move', 'forward', 'character');\n // selection.collapseToEnd();\n\n // addInputCallback(() => {\n // (textNode as CharacterData).deleteData(textNode.nodeValue.indexOf(BOM), BOM.length);\n // node.parentElement.remove();\n // });\n }\n } else if(e.inputType === 'insertLineBreak' &&\n node &&\n node.nodeType === node.TEXT_NODE &&\n node.nodeValue.length === offset) {\n log('inserting line break');\n // const appendix = '\\x01';\n\n input.querySelectorAll<HTMLElement>('.input-something').forEach((el) => {\n el.contentEditable = 'inherit';\n });\n addInputCallback(() => {\n input.querySelectorAll<HTMLElement>('.input-something').forEach((el) => {\n el.contentEditable = 'false';\n });\n });\n\n // const textNode = document.createTextNode(appendix);\n // if(node.parentElement !== this.messageInput) node.parentElement.after(textNode);\n // else node.after(textNode);\n // // selection.modify('move', 'forward', 'character');\n // addInputCallback(() => {\n // textNode.remove();\n // });\n\n // const offset = node.nodeValue.length;\n // (node as CharacterData).insertData(offset, appendix);\n // addInputCallback(() => {\n // selection.modify('move', 'forward', 'character');\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(appendix), appendix.length);\n // if(!node.nodeValue) {\n // node.remove();\n // }\n // });\n }\n } else if(e.inputType === 'historyUndo') { // have to remove extra BOMs\n addInputCallback(() => {\n this.processFilledFillers(input);\n this.processEmptiedFillers(input);\n this.removeExtraBOMs(input);\n this.removeEmptyTextNodes(input);\n\n // ! lol what, caret will be at the wrong position, have to set it to the same\n this.fixBuggedCaret();\n\n // lol\n // this.messageInput.querySelectorAll('.has-text').forEach((el) => {\n // if(el.textContent === BOM) {\n // el.firstElementChild.replaceWith(el.firstElementChild.firstChild);\n // el.classList.replace('input-filler3', 'input-filler');\n // }\n // });\n });\n } else if(e.inputType === 'historyRedo') {\n // if(node?.nodeValue === BOM && offset === BOM.length) {\n // selection.modify('move', 'backward', 'character');\n // }\n\n addInputCallback(() => {\n this.processFilledFillers(input);\n this.processEmptiedFillers(input);\n\n // fix contenteditable attribute\n input.querySelectorAll<HTMLElement>('.input-something:not([contenteditable])').forEach((el) => {\n el.contentEditable = 'false';\n });\n\n this.removeExtraBOMs(input);\n\n // ! lol what, caret will be at the wrong position, have to set it to the same\n this.fixBuggedCaret();\n });\n }\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n const key = e.key;\n\n // // have to ignore line up and down\n if(key === 'ArrowDown' || key === 'ArrowUp') {\n this.lastNode = this.lastOffset = undefined;\n } else {\n const {node, offset} = this.getCaretPosN();\n this.lastNode = node/* getFiller(node) */, this.lastOffset = offset;\n if(this.lastNode === this.input) {\n this.lastNode = this.lastOffset = undefined;\n }\n }\n\n this.log('keydown', this.lastNode, this.lastNode?.parentNode, this.lastOffset, this.getCaretPosN(), e);\n };\n\n private addInputCallback(input: HTMLElement, callback: () => void, capture = true) {\n const newCallback = () => {\n this.log('input modify callback');\n callback();\n };\n\n if(capture && IS_FIREFOX) this.inputCaptureCallbacks.push(newCallback);\n else this.listenerSetter.add(input)('input', newCallback, {once: true, capture});\n }\n\n public removeExtraBOMs(input: HTMLElement) {\n const c = (sibling: ChildNode) => {\n return (sibling as HTMLElement)?.classList?.contains('input-something');\n };\n\n input.querySelectorAll('.input-filler').forEach((el) => {\n const {previousSibling, nextSibling} = el;\n let needed = false;\n\n // if(!(previousSibling as HTMLElement)?.classList?.contains('input-filler') && isCustomFillerNeededBySiblingNode(previousSibling)) {\n if(!(nextSibling as HTMLElement)?.classList?.contains('input-filler') && isCustomFillerNeededBySiblingNode(nextSibling)) {\n needed = c(previousSibling) || c(nextSibling);\n }\n\n if(!needed) {\n this.log.warn('removing empty bom node', el);\n el.remove();\n }\n });\n }\n\n private getFiller(node: Node) {\n return node && node.nodeType === node.TEXT_NODE && node.parentElement !== this.input ? node.parentElement : node as HTMLElement;\n }\n\n private getCaretPosN() {\n const ret = getCaretPosNew(this.input);\n // const {node} = ret;\n // if((node as HTMLElement)?.classList?.contains('input-something')) {\n // ret.node = node.previousSibling;\n // ret.offset = ret.node.textContent.length;\n // }\n\n return {...ret, move: this.move.bind(this, ret.selection)};\n }\n\n private removeEmptyTextNodes(input: HTMLElement) {\n const {log} = this;\n // let i = -1;\n // remove empty text nodes\n const treeWalker = document.createTreeWalker(\n input,\n NodeFilter.SHOW_TEXT,\n {acceptNode: (node) => node.parentElement === input && !node.nodeValue/* && !++i */ ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT}\n );\n\n let textNode: Text;\n while(textNode = treeWalker.nextNode() as Text) {\n log.warn('removing empty text node', textNode);\n textNode.remove();\n }\n }\n\n private removePossibleBOMSiblings(previousSibling: ChildNode, nextSibling: ChildNode) {\n [previousSibling, nextSibling].forEach((sibling) => {\n if((sibling as HTMLElement)?.classList?.contains('input-filler')) {\n sibling.remove();\n }\n });\n }\n\n private removePossibleBOMSiblingsByNode(node: ChildNode) {\n const {previousSibling, nextSibling} = node;\n this.removePossibleBOMSiblings(previousSibling, nextSibling);\n };\n\n private processEmptiedFillers(input: HTMLElement) {\n input.querySelectorAll<HTMLElement>('.input-filler-text').forEach((el) => {\n this.removeExtraBOMs(el);\n\n let cleanSiblings = true;\n if(!el.textContent) {\n el.classList.replace('input-filler-text', 'input-filler');\n\n const textNode = Array.from(el.childNodes).find((node) => node.nodeType === node.TEXT_NODE);\n if(textNode) {\n (textNode as CharacterData).insertData(0, BOM);\n } else if(((el as any).t as ChildNode)?.nodeValue) {\n el.append((el as any).t);\n } else {\n el.append(document.createTextNode(BOM));\n }\n } else if(!NOT_ONLY_BOMS_REG_EXP.test(el.textContent) && !el.querySelector('.input-something')) {\n el.classList.replace('input-filler-text', 'input-filler');\n } else {\n cleanSiblings = false;\n }\n\n if(cleanSiblings) {\n this.removePossibleBOMSiblingsByNode(el);\n }\n });\n }\n\n private processFilledFillers(input: HTMLElement) {\n // remove the BOM when changing to text\n input.querySelectorAll('.input-filler').forEach((el) => {\n if(el.textContent !== BOM) {\n el.classList.replace('input-filler', 'input-filler-text');\n const t = (el as any).t as ChildNode;\n const bomNode = Array.from(el.childNodes).find((node) => node.nodeType === node.TEXT_NODE && node.nodeValue.includes(BOM));\n if(bomNode && !t?.nodeValue) {\n const idx = bomNode.nodeValue.indexOf(BOM);\n if(idx !== -1) {\n (bomNode as CharacterData).deleteData(idx, BOM.length);\n }\n }\n\n // t?.remove();\n }\n });\n }\n\n private setSelectionClassName(selection: Selection, input?: HTMLElement) {\n // Array.from(this.messageInput.querySelectorAll('.selection')).forEach((element) => {\n // element.classList.remove('selection');\n // });\n\n if(selection.rangeCount) {\n const range = selection.getRangeAt(0);\n\n if(input) {\n Array.from(input.querySelectorAll('.input-selectable')).forEach((element) => {\n element.classList.toggle('selection', !range.collapsed && range.intersectsNode(element));\n });\n } else {\n Array.from(document.querySelectorAll('.input-selectable.selection')).forEach((element) => element.classList.remove('selection'));\n }\n }\n }\n\n private move(selection: Selection, left: boolean) {\n const {focusNode: focusNodeBefore, focusOffset: focusOffsetBefore} = selection;\n selection.modify('extend', left ? 'backward' : 'forward', 'character');\n // if(offset === nodeValue.length) {\n // selection.modify('extend', !left ? 'backward' : 'forward', 'character');\n // }\n if(left) selection.collapseToStart();\n else selection.collapseToEnd();\n const {focusNode: focusNodeAfter, focusOffset: focusOffsetAfter} = selection;\n this.log(\n 'moving cursor',\n left,\n focusNodeBefore,\n focusNodeBefore.nodeType === focusNodeBefore.ELEMENT_NODE ? focusNodeBefore : focusNodeBefore.parentElement,\n focusOffsetBefore,\n focusNodeAfter,\n focusNodeAfter.nodeType === focusNodeAfter.ELEMENT_NODE ? focusNodeAfter : focusNodeAfter.parentElement,\n focusOffsetAfter\n );\n }\n\n public prepareApplyingMarkdown() {\n const {input} = this;\n\n // do not wrap fillers into spans\n const fillers = input.querySelectorAll<HTMLElement>('.input-filler');\n // fillers.forEach((el) => {\n // el.contentEditable = 'false';\n // });\n\n const smths = input.querySelectorAll<HTMLElement>('.input-something');\n smths.forEach((el) => {\n el.contentEditable = 'inherit';\n });\n\n return () => {\n fillers.forEach((el) => {\n el.contentEditable = 'inherit';\n });\n\n smths.forEach((el) => {\n el.contentEditable = 'false';\n });\n\n this.removeExtraBOMs(input);\n };\n }\n\n public static getInstance() {\n return this.INSTANCE ??= new RichInputHandler();\n }\n}\n","// https://stackoverflow.com/a/6150060\nexport default function selectElementContents(el: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\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\nimport {PASS_CONFLICTING_ENTITIES, PASS_SINGLE_CONFLICTING_ENTITIES} from '.';\nimport {MessageEntity} from '../../layer';\n\nconst SINGLE_ENTITIES: Set<MessageEntity['_']> = new Set(['messageEntityPre', 'messageEntityCode']);\n\nexport default function findConflictingEntity(currentEntities: MessageEntity[], newEntity: MessageEntity) {\n let singleStart = -1, singleEnd = -1;\n return currentEntities.find((currentEntity) => {\n const {offset, length} = currentEntity;\n if(SINGLE_ENTITIES.has(currentEntity._)) {\n singleStart = offset;\n singleEnd = singleStart + length;\n }\n\n if(singleStart !== -1) {\n if(\n newEntity.offset >= singleStart &&\n newEntity.offset < singleEnd &&\n !PASS_SINGLE_CONFLICTING_ENTITIES.has(newEntity._)\n ) {\n return true;\n }\n }\n\n const isConflictingTypes = newEntity._ === currentEntity._ ||\n (!PASS_CONFLICTING_ENTITIES.has(newEntity._) && !PASS_CONFLICTING_ENTITIES.has(currentEntity._));\n\n if(!isConflictingTypes) {\n return false;\n }\n\n const isConflictingOffset = newEntity.offset >= offset &&\n (newEntity.length + newEntity.offset) <= (length + offset);\n\n return isConflictingOffset;\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\nimport {MessageEntity} from '../../layer';\nimport findConflictingEntity from './findConflictingEntity';\nimport sortEntities from './sortEntities';\n\nexport default function mergeEntities(currentEntities: MessageEntity[], newEntities: MessageEntity[]) {\n currentEntities = currentEntities.slice();\n const filtered = newEntities.filter((e) => {\n return !findConflictingEntity(currentEntities, e);\n });\n\n currentEntities.push(...filtered);\n sortEntities(currentEntities);\n // currentEntities.sort((a, b) => a.offset - b.offset);\n // currentEntities.sort((a, b) => (a.offset - b.offset) || (a._ === 'messageEntityCaret' && -1));\n\n // * fix splitted emoji. messageEntityTextUrl can split the emoji if starts before its end (e.g. on fe0f)\n // * have to fix even if emoji supported since it's being wrapped in span\n // if(!IS_EMOJI_SUPPORTED) {\n for(let i = 0; i < currentEntities.length; ++i) {\n let entity = currentEntities[i];\n if(entity._ === 'messageEntityEmoji') {\n const nextEntity = currentEntities[i + 1];\n if(nextEntity /* && nextEntity._ !== 'messageEntityCaret' */ && nextEntity.offset < (entity.offset + entity.length)) {\n entity = currentEntities[i] = {...entity};\n entity.length = nextEntity.offset - entity.offset;\n }\n }\n }\n // }\n\n return currentEntities;\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\nimport type {AnimationItemGroup} from '../../components/animationIntersector';\nimport rootScope from '../rootScope';\nimport wrapRichText from './wrapRichText';\n\nexport default function wrapDraftText(text: string, options: Partial<{\n wrappingForPeerId: PeerId,\n animationGroup?: AnimationItemGroup\n}> & Parameters<typeof wrapRichText>[1] = {}) {\n if(!text) {\n return wrapRichText('');\n }\n\n let entities = options.entities;\n if(entities && !rootScope.premium && options.wrappingForPeerId !== rootScope.myId) {\n entities = entities.filter((entity) => entity._ !== 'messageEntityCustomEmoji');\n }\n\n const fragment = wrapRichText(text, {\n ...options,\n entities,\n noLinks: true,\n wrappingDraft: true,\n passEntities: {\n messageEntityTextUrl: true,\n messageEntityMentionName: true\n }\n });\n\n return fragment;\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\nimport type CustomEmojiElement from '../lib/customEmoji/element';\nimport type {AnimationItemGroup} from './animationIntersector';\nimport {CustomEmojiRendererElement} from '../lib/customEmoji/renderer';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport simulateEvent from '../helpers/dom/dispatchEvent';\nimport documentFragmentToHTML from '../helpers/dom/documentFragmentToHTML';\nimport findUpAttribute from '../helpers/dom/findUpAttribute';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport getCaretPosNew from '../helpers/dom/getCaretPosNew';\nimport getRichValueWithCaret from '../helpers/dom/getRichValueWithCaret';\nimport isInputEmpty from '../helpers/dom/isInputEmpty';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport RichInputHandler, {USING_BOMS} from '../helpers/dom/richInputHandler';\nimport selectElementContents from '../helpers/dom/selectElementContents';\nimport setInnerHTML, {setDirection} from '../helpers/dom/setInnerHTML';\nimport {MessageEntity} from '../layer';\nimport {i18n, LangPackKey, _i18n} from '../lib/langPack';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport mergeEntities from '../lib/richTextProcessor/mergeEntities';\nimport parseEntities from '../lib/richTextProcessor/parseEntities';\nimport wrapDraftText from '../lib/richTextProcessor/wrapDraftText';\nimport {createCustomFiller, insertCustomFillers} from '../lib/richTextProcessor/wrapRichText';\nimport type {MarkupTooltipTypes} from './chat/markupTooltip';\n\nexport async function insertRichTextAsHTML(input: HTMLElement, text: string, entities: MessageEntity[], wrappingForPeerId: PeerId) {\n const loadPromises: Promise<any>[] = [];\n const wrappingCustomEmoji = entities?.some((entity) => entity._ === 'messageEntityCustomEmoji');\n const renderer = wrappingCustomEmoji ? createCustomEmojiRendererForInput() : undefined;\n const fragment = wrapDraftText(text, {entities, wrappingForPeerId, loadPromises, customEmojiRenderer: renderer});\n const something = fragment.querySelectorAll<HTMLElement>('[contenteditable=\"false\"]');\n something.forEach((el) => {\n el.contentEditable = 'inherit';\n el.classList.add('pc');\n });\n\n loadPromises.length && await Promise.all(loadPromises);\n\n fragment.querySelectorAll<HTMLElement>('.input-selectable').forEach((el) => {\n el.prepend(createCustomFiller(true));\n });\n\n const richInputHandler = USING_BOMS ? RichInputHandler.getInstance() : undefined;\n // const restore = richInputHandler.prepareApplyingMarkdown();\n\n // fragment.querySelectorAll('.input-filler').forEach((el) => el.remove());\n\n // const fillers = Array.from(input.querySelectorAll<HTMLElement>('.input-filler')).map((el) => {\n // el.contentEditable = 'false';\n // return el;\n // });\n\n const customEmojiElements = Array.from(fragment.querySelectorAll<HTMLImageElement>('.custom-emoji-placeholder')).map((el) => {\n el.dataset.ces = '1';\n return (el as any).customEmojiElement as CustomEmojiElement;\n });\n\n const html = documentFragmentToHTML(fragment);\n renderer?.destroy();\n\n // console.log(html);\n\n const pre = getCaretPosNew(input);\n // console.log('pre', pre);\n let textNode: ChildNode, textNodeValue: string;\n if(pre.node) {\n // if(pre.node?.nodeValue === BOM && false) {\n // textNode = document.createTextNode(textNodeValue = BOM);\n // (pre.node.parentNode as any as ChildNode).after(textNode);\n // pre.selection.modify('extend', 'forward', 'character');\n // pre.selection.collapseToEnd();\n // }\n } else {\n const range = document.createRange();\n let node = input.lastChild;\n if(!node) {\n input.append(node /* = textNode */ = document.createTextNode(''));\n }\n\n range.setStartAfter(node);\n range.collapse(true);\n pre.selection.removeAllRanges();\n pre.selection.addRange(range);\n }\n\n // const fragmentLastChild = fragment.lastChild;\n\n // const s = document.createElement('span');\n // (node as ChildNode).replaceWith(s);\n // s.append(node);\n input.addEventListener('input', cancelEvent, {capture: true, once: true, passive: false});\n richInputHandler?.onBeforeInput({inputType: 'insertContent'});\n window.document.execCommand('insertHTML', false, html);\n Array.from(input.querySelectorAll<HTMLImageElement>('[data-ces]')).forEach((el, idx) => {\n delete el.dataset.ces;\n const customEmojiElement = customEmojiElements[idx];\n (el as any).customEmojiElement = customEmojiElement;\n customEmojiElement.placeholder = el;\n });\n // fillers.forEach((el) => {\n // el.contentEditable = 'inherit';\n // });\n input.querySelectorAll<HTMLElement>('.pc').forEach((el) => {\n el.contentEditable = 'false';\n });\n if(textNode) {\n const {nodeValue} = textNode;\n if(nodeValue === textNodeValue) {\n textNode.remove();\n } else {\n (textNode as CharacterData).replaceData(nodeValue.indexOf(textNodeValue), textNodeValue.length, '');\n }\n }\n // restore();\n richInputHandler?.removeExtraBOMs(input);\n simulateEvent(input, 'input');\n\n // if(textNode) {\n // const selection = document.getSelection();\n // const node = fragmentLastChild.nextSibling || fragmentLastChild;\n // const range = document.createRange();\n // range.setStartAfter(node);\n // range.collapse(true);\n // selection.removeAllRanges();\n // selection.addRange(range);\n // }\n\n // const after = getCaretPosNew(input);\n // console.log('after', after);\n // if(after.node?.nodeValue === BOM) {\n // const smth = findUpClassName(after.node.parentElement, 'input-something');\n // if(smth) {\n // const selection = document.getSelection();\n // const node = smth.nextSibling;\n // const range = document.createRange();\n // range.setStartAfter(node);\n // range.collapse(true);\n // selection.removeAllRanges();\n // selection.addRange(range);\n\n // // if(after.offset === 0) after.selection.modify('extend', 'forward', 'character');\n // // after.selection.modify('extend', 'forward', 'character');\n // // after.selection.collapseToEnd();\n // }\n // }\n\n // setCaretAt(fragmentLastChild.nextSibling);\n\n // console.log('ASD');\n}\n\nlet init = () => {\n document.addEventListener('paste', (e) => {\n const input = findUpAttribute(e.target, 'contenteditable=\"true\"');\n if(!input) {\n return;\n }\n\n const noLinebreaks = !!input.dataset.noLinebreaks;\n e.preventDefault();\n let text: string, entities: MessageEntity[];\n\n // @ts-ignore\n let plainText: string = (e.originalEvent || e).clipboardData.getData('text/plain');\n let usePlainText = true;\n\n // @ts-ignore\n let html: string = (e.originalEvent || e).clipboardData.getData('text/html') || plainText;\n\n const filterEntity = (e: MessageEntity) => e._ === 'messageEntityEmoji' || (e._ === 'messageEntityLinebreak' && !noLinebreaks);\n if(noLinebreaks) {\n const regExp = /[\\r\\n]/g;\n plainText = plainText.replace(regExp, '');\n html = html.replace(regExp, '');\n }\n\n const peerId = (input.dataset.peerId || NULL_PEER_ID).toPeerId();\n if(html.trim()) {\n // console.log(html.replace(/ (style|class|id)=\".+?\"/g, ''));\n\n html = html.replace(/<style([\\s\\S]*)<\\/style>/, '');\n html = html.replace(/<!--([\\s\\S]*)-->/, '');\n html = html.replace('<br class=\"Apple-interchange-newline\">', '');\n\n const match = html.match(/<body>([\\s\\S]*)<\\/body>/);\n if(match) {\n html = match[1].trim();\n }\n\n // const s = cleanHTML(html, true) as NodeList;\n // console.log(s);\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n const span = doc.body || document.createElement('body');\n\n // const span: HTMLElement = document.createElement('span');\n // span.innerHTML = html;\n // span.append(...Array.from(s));\n\n let curChild = span.firstChild;\n while(curChild) { // * fix whitespace between elements like <p>asd</p>\\n<p>zxc</p>\n const nextSibling = curChild.nextSibling;\n if(curChild.nodeType === curChild.TEXT_NODE) {\n if(!curChild.nodeValue.trim()) {\n curChild.remove();\n }\n }\n\n curChild = nextSibling;\n }\n\n const richValue = getRichValueWithCaret(span, true, false);\n\n const canWrapCustomEmojis = !!peerId;\n if(!canWrapCustomEmojis) {\n richValue.entities = richValue.entities.filter((entity) => entity._ !== 'messageEntityCustomEmoji');\n }\n\n /* if(false) */ { // * fix extra new lines appearing from <p> (can have them from some sources, like macOS Terminal)\n const lines = richValue.value.split('\\n');\n let textLength = 0;\n for(let lineIndex = 0; lineIndex < lines.length; ++lineIndex) {\n const line = lines[lineIndex];\n textLength += line.length;\n\n const index = textLength;\n if(plainText[index] !== '\\n' && lineIndex !== (lines.length - 1)) {\n const nextLine = lines.splice(lineIndex + 1, 1)[0];\n lines[lineIndex] = line + nextLine;\n\n // fix entities\n richValue.entities.forEach((entity) => {\n if(entity.offset >= index) {\n entity.offset -= 1;\n }\n });\n\n textLength += nextLine.length;\n }\n\n textLength += 1;\n }\n\n const correctedText = lines.join('\\n');\n richValue.value = correctedText;\n }\n\n const richTextLength = richValue.value.replace(/\\s/g, '').length;\n const plainTextLength = plainText.replace(/\\s/g, '').length;\n if(richTextLength === plainTextLength ||\n richValue.entities.find((entity) => entity._ === 'messageEntityCustomEmoji')) {\n text = richValue.value;\n entities = richValue.entities;\n usePlainText = false;\n\n let entities2 = parseEntities(text);\n entities2 = entities2.filter(filterEntity);\n entities = mergeEntities(entities, entities2);\n }\n\n // console.log('usePlainText', usePlainText);\n }\n\n if(usePlainText) {\n text = plainText;\n entities = parseEntities(text);\n entities = entities.filter(filterEntity);\n }\n\n insertRichTextAsHTML(input, text, entities, peerId);\n });\n\n init = null;\n};\n\n// ! it doesn't respect symbols other than strongs\n/* const checkAndSetRTL = (input: HTMLElement) => {\n //const isEmpty = isInputEmpty(input);\n //console.log('input', isEmpty);\n\n //const char = [...getRichValue(input)][0];\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\n let direction = 'ltr';\n if(char && checkRTL(char)) {\n direction = 'rtl';\n }\n\n //console.log('RTL', direction, char);\n\n input.style.direction = direction;\n}; */\n\nexport enum InputState {\n Neutral = 0,\n Valid = 1,\n Error = 2\n};\n\nexport type InputFieldOptions = {\n placeholder?: LangPackKey,\n placeholderAsElement?: boolean,\n label?: LangPackKey,\n labelOptions?: any[],\n labelText?: string | DocumentFragment,\n name?: string,\n maxLength?: number,\n showLengthOn?: number,\n plainText?: true,\n required?: boolean,\n canBeEdited?: boolean,\n validate?: () => boolean,\n inputMode?: 'tel' | 'numeric',\n withLinebreaks?: boolean,\n autocomplete?: string,\n withBorder?: boolean,\n allowStartingSpace?: boolean,\n onRawInput?: (value: string) => void,\n canHaveFormatting?: Array<MarkupTooltipTypes>\n};\n\nfunction createCustomEmojiRendererForInput(textColor?: string, animationGroup?: AnimationItemGroup) {\n const renderer = CustomEmojiRendererElement.create({\n wrappingDraft: true,\n isSelectable: true,\n textColor: textColor || 'primary-text-color',\n animationGroup\n });\n\n return renderer;\n}\n\nfunction processCustomEmojisInInput(input: HTMLElement) {\n const customEmojiElements = Array.from(input.querySelectorAll<CustomEmojiElement | HTMLElement>('.custom-emoji, .custom-emoji-placeholder'));\n let renderer = input.querySelector<CustomEmojiRendererElement>('.custom-emoji-renderer');\n if(!renderer && customEmojiElements.length) {\n renderer = createCustomEmojiRendererForInput(input.dataset.textColor, input.dataset.animationGroup as AnimationItemGroup);\n input.prepend(renderer);\n } else if(renderer && !customEmojiElements.length) {\n renderer.remove();\n return;\n }\n\n if(!renderer) {\n return;\n }\n\n const customEmojis: Parameters<CustomEmojiRendererElement['add']>[0]['addCustomEmojis'] = new Map();\n customEmojiElements.forEach((element) => {\n const customEmojiElement: CustomEmojiElement = (element as CustomEmojiElement).loop !== undefined ? element as CustomEmojiElement : (element as any).customEmojiElement as CustomEmojiElement;\n const {docId} = customEmojiElement;\n let set = customEmojis.get(docId);\n if(!set) {\n customEmojis.set(docId, set = new Set());\n }\n\n set.add(customEmojiElement);\n });\n\n for(const [docId, customEmojiElements] of customEmojis) {\n let hasSet = renderer.customEmojis.get(docId);\n if(hasSet) {\n for(const customEmojiElement of hasSet) {\n if(!customEmojiElements.has(customEmojiElement)) {\n customEmojiElement.destroy();\n }\n }\n } else {\n hasSet = new Set();\n }\n\n for(const customEmojiElement of customEmojiElements) {\n if(!hasSet.has(customEmojiElement)) {\n customEmojiElement.connectedCallback();\n }\n }\n }\n\n renderer.add({\n addCustomEmojis: customEmojis,\n lazyLoadQueue: false\n });\n renderer.forceRender();\n}\n\nexport default class InputField {\n public container: HTMLElement;\n public input: HTMLElement;\n public label: HTMLLabelElement;\n public placeholder: HTMLElement;\n\n public originalValue: string;\n\n public required: boolean;\n public validate: () => boolean;\n\n public allowStartingSpace: boolean;\n\n constructor(public options: InputFieldOptions = {}) {\n this.container = document.createElement('div');\n this.container.classList.add('input-field');\n\n this.required = options.required;\n this.validate = options.validate;\n\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\n }\n\n const {placeholder, maxLength, showLengthOn, name, plainText, canBeEdited = true, autocomplete, withBorder, allowStartingSpace, canHaveFormatting} = options;\n const label = options.label || options.labelText;\n this.allowStartingSpace = allowStartingSpace;\n\n const onInputCallbacks: Array<() => void> = [];\n let input: HTMLElement;\n if(!plainText) {\n if(init) {\n init();\n }\n\n this.container.innerHTML = `<div class=\"input-field-input\"></div>`;\n\n input = this.container.firstElementChild as HTMLElement;\n input.contentEditable = '' + !!canBeEdited;\n // const observer = new MutationObserver(() => {\n // //checkAndSetRTL(input);\n\n // if(processInput) {\n // processInput();\n // }\n // });\n\n RichInputHandler.getInstance();\n\n input.addEventListener('mousedown', (e) => {\n const selection = document.getSelection();\n if(!selection.isCollapsed) {\n return;\n }\n\n const placeholder = findUpTag(e.target, 'IMG');\n if(!placeholder) {\n return;\n }\n\n const rect = placeholder.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const focusOnNext = e.clientX >= centerX;\n\n const range = document.createRange();\n range.setStartAfter(focusOnNext ? placeholder : placeholder.previousSibling ?? placeholder);\n selection.removeAllRanges();\n selection.addRange(range);\n });\n\n if(canHaveFormatting) {\n input.setAttribute('can-format', canHaveFormatting.join(','));\n }\n\n onInputCallbacks.push(() => {\n // console.log('input');\n // return;\n // * because if delete all characters there will br left\n const isEmpty = this.isEmpty();\n if(isEmpty) {\n // const textNode = Array.from(input.childNodes).find((node) => node.nodeType === node.TEXT_NODE) || document.createTextNode('');\n input.replaceChildren();\n // input.append(document.createTextNode('')); // need first text node to support history stack\n }\n\n this.setEmpty(isEmpty);\n\n // const fillers = Array.from(input.querySelectorAll('.emoji-filler')) as HTMLElement[];\n // fillers.forEach((filler) => {\n // const textContent = filler.textContent;\n // if(textContent === BOM) {\n // return;\n // }\n\n // if(textContent) {\n\n // } else {\n // let curChild = filler.firstChild;\n // while(curChild) {\n // curChild = curChild.nextSibling;\n // }\n // }\n\n // filler.classList.remove('emoji-filler');\n // });\n\n // Array.from(input.querySelectorAll('br, span:empty')).forEach((el) => {\n // const parentElement = el.parentElement;\n // (parentElement === input ? el : parentElement).remove();\n // });\n USING_BOMS && Array.from(input.querySelectorAll('br:not(.br-not-br)')).forEach((el) => {\n // const parentElement = el.parentElement;\n el.remove();\n // if(!parentElement.children.length && !parentElement.textContent) {\n // parentElement.textContent = '';\n // }\n });\n\n insertCustomFillers(Array.from(input.querySelectorAll('.input-something')));\n\n processCustomEmojisInInput(input);\n\n // .forEach((el) => el.remove());\n });\n\n // ! childList for paste first symbol\n // observer.observe(input, {characterData: true, childList: true, subtree: true});\n } else {\n this.container.innerHTML = `\n <input type=\"text\" ${name ? `name=\"${name}\"` : ''} autocomplete=\"${autocomplete ?? 'off'}\" ${label ? 'required=\"\"' : ''} class=\"input-field-input\">\n `;\n\n input = this.container.firstElementChild as HTMLElement;\n // input.addEventListener('input', () => checkAndSetRTL(input));\n\n onInputCallbacks.push(() => {\n const isEmpty = this.isEmpty();\n if(isEmpty) {\n (input as HTMLInputElement).value = '';\n }\n\n this.setEmpty(isEmpty);\n });\n }\n\n setDirection(input);\n\n if(options.inputMode) {\n input.inputMode = options.inputMode;\n }\n\n if(placeholder) {\n // if(options.placeholderAsElement) {\n this.placeholder = document.createElement('span');\n this.placeholder.classList.add('input-field-placeholder');\n this.container.append(this.placeholder);\n _i18n(this.placeholder, placeholder, undefined);\n // } else {\n // _i18n(input, placeholder, undefined, 'placeholder');\n // }\n }\n\n if(withBorder !== false && withBorder || label || placeholder) {\n const border = document.createElement('div');\n border.classList.add('input-field-border');\n this.container.append(border);\n }\n\n if(label) {\n this.label = document.createElement('label');\n this.setLabel();\n this.container.append(this.label);\n }\n\n if(maxLength) {\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\n let showingLength = false;\n\n const onInput = () => {\n const wasError = input.classList.contains('error');\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValueWithCaret(input, false, false).value].length;\n const diff = maxLength - inputLength;\n const isError = diff < 0;\n input.classList.toggle('error', isError);\n\n // this.onLengthChange && this.onLengthChange(inputLength, isError);\n\n if(isError || diff <= showLengthOn) {\n this.setLabel();\n labelEl.append(` (${maxLength - inputLength})`);\n if(!showingLength) showingLength = true;\n } else if((wasError && !isError) || showingLength) {\n this.setLabel();\n showingLength = false;\n }\n };\n\n onInputCallbacks.push(onInput);\n }\n\n const noLinebreaks = !options.withLinebreaks;\n if(noLinebreaks && !plainText) {\n input.dataset.noLinebreaks = '1';\n input.addEventListener('keypress', (e) => {\n if(e.key === 'Enter') {\n e.preventDefault();\n return false;\n }\n });\n }\n\n if(options.onRawInput) {\n onInputCallbacks.push(() => {\n options.onRawInput(this.value);\n });\n }\n\n if(onInputCallbacks.length) {\n input.addEventListener('input', () => {\n onInputCallbacks.forEach((callback) => callback());\n });\n }\n\n this.input = input;\n this.setEmpty(true);\n }\n\n public select() {\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\n return;\n }\n\n if(this.options.plainText) {\n (this.input as HTMLInputElement).select(); // * select text\n } else {\n selectElementContents(this.input);\n }\n }\n\n public setLabel() {\n this.label.textContent = '';\n if(this.options.labelText) {\n setInnerHTML(this.label, this.options.labelText);\n } else {\n this.label.append(i18n(this.options.label, this.options.labelOptions));\n }\n }\n\n get value(): string {\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValueWithCaret(this.input, false, false).value;\n // return getRichValue(this.input);\n }\n\n set value(value: Parameters<typeof replaceContent>[1]) {\n this.setValueSilently(value, true);\n this.simulateInputEvent();\n }\n\n public simulateInputEvent() {\n simulateEvent(this.input, 'input');\n }\n\n public setValueSilently(value: Parameters<typeof replaceContent>[1], fromSet?: boolean) {\n if(this.options.plainText) {\n (this.input as HTMLInputElement).value = value as string;\n } else {\n replaceContent(this.input, value);\n processCustomEmojisInInput(this.input);\n }\n\n this.setEmpty();\n }\n\n private setEmpty = (empty = this.isEmpty()) => {\n [this.input, this.placeholder].filter(Boolean).forEach((el) => {\n el.classList.toggle('is-empty', empty);\n });\n };\n\n public isEmpty() {\n return isInputEmpty(this.input, this.allowStartingSpace);\n }\n\n public isChanged() {\n return this.value !== this.originalValue;\n }\n\n public isValid() {\n return !this.input.classList.contains('error') &&\n (!this.validate || this.validate()) &&\n (!this.required || !this.isEmpty());\n }\n\n public isValidToChange() {\n return this.isValid() && this.isChanged();\n }\n\n public setDraftValue(value = '', silent?: boolean) {\n let _value: Parameters<typeof replaceContent>[1] = value;\n if(!this.options.plainText) {\n _value = /* documentFragmentToHTML */(wrapDraftText(value));\n }\n\n if(silent) {\n this.setValueSilently(_value, false);\n } else {\n this.value = _value;\n }\n }\n\n public setOriginalValue(value: InputField['originalValue'] = '', silent?: boolean) {\n this.originalValue = value;\n this.setDraftValue(value, silent);\n }\n\n public setState(state: InputState, label?: LangPackKey) {\n if(label) {\n this.label.textContent = '';\n this.label.append(i18n(label, this.options.labelOptions));\n } else {\n this.setLabel();\n }\n\n this.input.classList.toggle('error', !!(state & InputState.Error));\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\n }\n\n public setError(label?: LangPackKey) {\n this.setState(InputState.Error, label);\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\nimport {MessageEntity} from '../../layer';\nimport parseEntities from './parseEntities';\nimport wrapRichText from './wrapRichText';\n\nexport default function wrapEmojiText(text: string, isDraft = false, entities?: MessageEntity[]) {\n if(!text) return wrapRichText('');\n\n entities ??= parseEntities(text).filter((e) => e._ === 'messageEntityEmoji');\n return wrapRichText(text, {entities, wrappingDraft: isDraft});\n}\n"],"file":"wrapEmojiText-CZyOyt8f.js"} |