1
0
Fork 0
mirror of https://github.com/anyproto/anytype-heart.git synced 2025-06-08 05:47:07 +09:00

GO-5297 Merge branch 'main' of github.com:anyproto/anytype-heart into go-5297-push-service-1st-iteration

This commit is contained in:
AnastasiaShemyakinskaya 2025-03-28 11:09:54 +01:00
commit ea6d9b587d
No known key found for this signature in database
GPG key ID: CCD60ED83B103281
40 changed files with 3637 additions and 3438 deletions

View file

@ -194,6 +194,7 @@ jobs:
- name: Set up Python environment
continue-on-error: true
if: github.event_name == 'push'
run: |
cd ${{ github.workspace }}/devops-utils/release-utils
python3 -m venv linear-comment-venv

View file

@ -25,365 +25,364 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
func init() { proto.RegisterFile("pb/protos/service/service.proto", fileDescriptor_93a29dc403579097) }
var fileDescriptor_93a29dc403579097 = []byte{
// 5716 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x9d, 0xdf, 0x8f, 0x1c, 0x49,
0x52, 0xf8, 0xb7, 0x5f, 0xbe, 0xfb, 0xa5, 0x8e, 0x5b, 0xa0, 0x17, 0x96, 0xbd, 0xe5, 0xce, 0xf6,
0x7a, 0xed, 0x19, 0xdb, 0xe3, 0xe9, 0xf1, 0xda, 0xfb, 0x8b, 0x3b, 0x24, 0x68, 0xcf, 0xd8, 0xb3,
0x7d, 0x37, 0x33, 0x3b, 0x4c, 0xf7, 0xd8, 0x62, 0x25, 0x24, 0x6a, 0xba, 0x72, 0x7a, 0x8a, 0xa9,
0xae, 0xac, 0xab, 0xca, 0x1e, 0xbb, 0x0f, 0x81, 0x40, 0x20, 0x10, 0x88, 0x13, 0x27, 0x7e, 0x09,
0x9e, 0x90, 0xf8, 0x0b, 0xf8, 0x33, 0x78, 0xbc, 0x47, 0x1e, 0xd1, 0xee, 0xdf, 0x81, 0x84, 0x2a,
0x33, 0x2b, 0x7f, 0x44, 0x45, 0x64, 0xd5, 0x2c, 0x4f, 0xb6, 0x26, 0x3e, 0x11, 0x91, 0x59, 0x19,
0x99, 0x19, 0x99, 0x95, 0x95, 0x1d, 0xdd, 0x2c, 0xce, 0x76, 0x8a, 0x92, 0x0b, 0x5e, 0xed, 0x54,
0xac, 0xbc, 0x4a, 0xe7, 0xac, 0xf9, 0x77, 0x24, 0xff, 0x3c, 0x7c, 0x33, 0xce, 0xd7, 0x62, 0x5d,
0xb0, 0xf7, 0xde, 0xb5, 0xe4, 0x9c, 0x2f, 0x97, 0x71, 0x9e, 0x54, 0x0a, 0x79, 0xef, 0x1d, 0x2b,
0x61, 0x57, 0x2c, 0x17, 0xfa, 0xef, 0x8f, 0x7f, 0xfa, 0x3f, 0x83, 0xe8, 0xad, 0xdd, 0x2c, 0x65,
0xb9, 0xd8, 0xd5, 0x1a, 0xc3, 0x2f, 0xa3, 0x6f, 0x8f, 0x8b, 0x62, 0x9f, 0x89, 0x17, 0xac, 0xac,
0x52, 0x9e, 0x0f, 0x3f, 0x18, 0x69, 0x07, 0xa3, 0x93, 0x62, 0x3e, 0x1a, 0x17, 0xc5, 0xc8, 0x0a,
0x47, 0x27, 0xec, 0xc7, 0x2b, 0x56, 0x89, 0xf7, 0xee, 0x84, 0xa1, 0xaa, 0xe0, 0x79, 0xc5, 0x86,
0xe7, 0xd1, 0xaf, 0x8c, 0x8b, 0x62, 0xca, 0xc4, 0x1e, 0xab, 0x2b, 0x30, 0x15, 0xb1, 0x60, 0xc3,
0xcd, 0x96, 0xaa, 0x0f, 0x18, 0x1f, 0xf7, 0xba, 0x41, 0xed, 0x67, 0x16, 0x7d, 0xab, 0xf6, 0x73,
0xb1, 0x12, 0x09, 0x7f, 0x95, 0x0f, 0xdf, 0x6f, 0x2b, 0x6a, 0x91, 0xb1, 0x7d, 0x3b, 0x84, 0x68,
0xab, 0x2f, 0xa3, 0x5f, 0x7c, 0x19, 0x67, 0x19, 0x13, 0xbb, 0x25, 0xab, 0x0b, 0xee, 0xeb, 0x28,
0xd1, 0x48, 0xc9, 0x8c, 0xdd, 0x0f, 0x82, 0x8c, 0x36, 0xfc, 0x65, 0xf4, 0x6d, 0x25, 0x39, 0x61,
0x73, 0x7e, 0xc5, 0xca, 0x21, 0xaa, 0xa5, 0x85, 0xc4, 0x23, 0x6f, 0x41, 0xd0, 0xf6, 0x2e, 0xcf,
0xaf, 0x58, 0x29, 0x70, 0xdb, 0x5a, 0x18, 0xb6, 0x6d, 0x21, 0x6d, 0xfb, 0xaf, 0x07, 0xd1, 0x77,
0xc7, 0xf3, 0x39, 0x5f, 0xe5, 0xe2, 0x80, 0xcf, 0xe3, 0xec, 0x20, 0xcd, 0x2f, 0x8f, 0xd8, 0xab,
0xdd, 0x8b, 0x9a, 0xcf, 0x17, 0x6c, 0xf8, 0xc4, 0x7f, 0xaa, 0x0a, 0x1d, 0x19, 0x76, 0xe4, 0xc2,
0xc6, 0xf7, 0x47, 0xd7, 0x53, 0xd2, 0x65, 0xf9, 0xbb, 0x41, 0x74, 0x03, 0x96, 0x65, 0xca, 0xb3,
0x2b, 0x66, 0x4b, 0xf3, 0x71, 0x87, 0x61, 0x1f, 0x37, 0xe5, 0xf9, 0xe4, 0xba, 0x6a, 0xba, 0x44,
0x59, 0xf4, 0xb6, 0x1b, 0x2e, 0x53, 0x56, 0xc9, 0xee, 0x74, 0x9f, 0x8e, 0x08, 0x8d, 0x18, 0xcf,
0x0f, 0xfa, 0xa0, 0xda, 0x5b, 0x1a, 0x0d, 0xb5, 0xb7, 0x8c, 0x57, 0xc6, 0xd9, 0x3d, 0xd4, 0x82,
0x43, 0x18, 0x5f, 0xf7, 0x7b, 0x90, 0xda, 0xd5, 0x1f, 0x44, 0xbf, 0xf4, 0x92, 0x97, 0x97, 0x55,
0x11, 0xcf, 0x99, 0xee, 0x0a, 0x77, 0x7d, 0xed, 0x46, 0x0a, 0x7b, 0xc3, 0x46, 0x17, 0xe6, 0x04,
0x6d, 0x23, 0xfc, 0xa2, 0x60, 0x70, 0x0c, 0xb2, 0x8a, 0xb5, 0x90, 0x0a, 0x5a, 0x08, 0x69, 0xdb,
0x97, 0xd1, 0xd0, 0xda, 0x3e, 0xfb, 0x43, 0x36, 0x17, 0xe3, 0x24, 0x81, 0xad, 0x62, 0x75, 0x25,
0x31, 0x1a, 0x27, 0x09, 0xd5, 0x2a, 0x38, 0xaa, 0x9d, 0xbd, 0x8a, 0xde, 0x01, 0xce, 0x0e, 0xd2,
0x4a, 0x3a, 0xdc, 0x0e, 0x5b, 0xd1, 0x98, 0x71, 0x3a, 0xea, 0x8b, 0x6b, 0xc7, 0x7f, 0x3a, 0x88,
0xbe, 0x83, 0x78, 0x3e, 0x61, 0x4b, 0x7e, 0xc5, 0x86, 0x8f, 0xba, 0xad, 0x29, 0xd2, 0xf8, 0xff,
0xf0, 0x1a, 0x1a, 0x48, 0x98, 0x4c, 0x59, 0xc6, 0xe6, 0x82, 0x0c, 0x13, 0x25, 0xee, 0x0c, 0x13,
0x83, 0x39, 0x3d, 0xac, 0x11, 0xee, 0x33, 0xb1, 0xbb, 0x2a, 0x4b, 0x96, 0x0b, 0xb2, 0x2d, 0x2d,
0xd2, 0xd9, 0x96, 0x1e, 0x8a, 0xd4, 0x67, 0x9f, 0x89, 0x71, 0x96, 0x91, 0xf5, 0x51, 0xe2, 0xce,
0xfa, 0x18, 0x4c, 0x7b, 0x98, 0x47, 0xbf, 0xec, 0x3c, 0x31, 0x31, 0xc9, 0xcf, 0xf9, 0x90, 0x7e,
0x16, 0x52, 0x6e, 0x7c, 0x6c, 0x76, 0x72, 0x48, 0x35, 0x9e, 0xbd, 0x2e, 0x78, 0x49, 0x37, 0x8b,
0x12, 0x77, 0x56, 0xc3, 0x60, 0xda, 0xc3, 0xef, 0x47, 0x6f, 0xe9, 0x51, 0xb2, 0x99, 0xcf, 0xee,
0xa0, 0x43, 0x28, 0x9c, 0xd0, 0xee, 0x76, 0x50, 0x2d, 0xf3, 0x87, 0xe9, 0xa2, 0xac, 0x47, 0x1f,
0xdc, 0xbc, 0x96, 0x76, 0x98, 0xb7, 0x94, 0x36, 0xcf, 0xa3, 0x5f, 0xf5, 0xcd, 0xef, 0xc6, 0xf9,
0x9c, 0x65, 0xc3, 0x07, 0x21, 0x75, 0xc5, 0x18, 0x57, 0x5b, 0xbd, 0x58, 0x3b, 0xd8, 0x69, 0x42,
0x0f, 0xa6, 0x1f, 0xa0, 0xda, 0x60, 0x28, 0xbd, 0x13, 0x86, 0x5a, 0xb6, 0xf7, 0x58, 0xc6, 0x48,
0xdb, 0x4a, 0xd8, 0x61, 0xdb, 0x40, 0xda, 0x76, 0x19, 0xfd, 0x9a, 0x69, 0xe6, 0x3a, 0x2f, 0x90,
0xf2, 0x7a, 0xd2, 0xd9, 0x22, 0xda, 0xd1, 0x85, 0x8c, 0xaf, 0x87, 0xfd, 0xe0, 0x56, 0x7d, 0xf4,
0x88, 0x82, 0xd7, 0x07, 0x8c, 0x27, 0x77, 0xc2, 0x90, 0xb6, 0xfd, 0x37, 0x83, 0xe8, 0x7b, 0x5a,
0xf6, 0x2c, 0x8f, 0xcf, 0x32, 0x26, 0xa7, 0xf8, 0x23, 0x26, 0x5e, 0xf1, 0xf2, 0x72, 0xba, 0xce,
0xe7, 0x44, 0x3a, 0x83, 0xc3, 0x1d, 0xe9, 0x0c, 0xa9, 0xa4, 0x0b, 0xf3, 0x47, 0xd1, 0xbb, 0x4d,
0x50, 0x5c, 0xc4, 0xf9, 0x82, 0xfd, 0xb0, 0xe2, 0xf9, 0xb8, 0x48, 0xc7, 0x49, 0x52, 0x0e, 0x47,
0x78, 0xd3, 0x43, 0xce, 0x94, 0x60, 0xa7, 0x37, 0xef, 0xa4, 0xcf, 0xfa, 0x29, 0x0b, 0x5e, 0xc0,
0xf4, 0xb9, 0x79, 0x7c, 0x82, 0x17, 0x54, 0xfa, 0xec, 0x23, 0x2d, 0xab, 0x87, 0xf5, 0x1c, 0x84,
0x5b, 0x3d, 0x74, 0x27, 0x9d, 0xdb, 0x21, 0xc4, 0xce, 0x01, 0xcd, 0x83, 0xe2, 0xf9, 0x79, 0xba,
0x38, 0x2d, 0x92, 0xba, 0x0f, 0xdd, 0xc7, 0xeb, 0xec, 0x20, 0xc4, 0x1c, 0x40, 0xa0, 0xda, 0xdb,
0x4f, 0x6d, 0x96, 0xa9, 0xc7, 0xa5, 0xe7, 0x25, 0x5f, 0x1e, 0xb0, 0x45, 0x3c, 0x5f, 0xeb, 0xc1,
0xf4, 0xa3, 0xd0, 0x28, 0x06, 0x69, 0x53, 0x88, 0x8f, 0xaf, 0xa9, 0xa5, 0xcb, 0xf3, 0x6f, 0x83,
0xe8, 0x8e, 0x17, 0x27, 0x3a, 0x98, 0x54, 0xe9, 0xc7, 0x79, 0x72, 0xc2, 0x2a, 0x11, 0x97, 0x62,
0xf8, 0xfd, 0x40, 0x0c, 0x10, 0x3a, 0xa6, 0x6c, 0x3f, 0xf8, 0x46, 0xba, 0xb6, 0xd5, 0xa7, 0xf5,
0x2c, 0xa1, 0xc7, 0x1f, 0xbf, 0xd5, 0xa5, 0x04, 0x8e, 0x3e, 0xb7, 0x43, 0x88, 0x6d, 0x75, 0x29,
0x98, 0xe4, 0x57, 0xa9, 0x60, 0xfb, 0x2c, 0x67, 0x65, 0xbb, 0xd5, 0x95, 0xaa, 0x8f, 0x10, 0xad,
0x4e, 0xa0, 0x76, 0xa4, 0xf3, 0xbc, 0x99, 0x4c, 0x63, 0x2b, 0x60, 0xa4, 0x95, 0x6b, 0x3c, 0xec,
0x07, 0x13, 0x35, 0x14, 0xfb, 0xb5, 0x91, 0x60, 0x0d, 0x15, 0xd2, 0xab, 0x86, 0x06, 0xb5, 0x0b,
0x73, 0xc7, 0xdb, 0x09, 0xbb, 0xe2, 0x97, 0x70, 0x61, 0xee, 0x1a, 0x50, 0x00, 0xb1, 0x30, 0x47,
0x41, 0x9b, 0x7c, 0x38, 0x7e, 0x5e, 0xa4, 0xec, 0x15, 0x48, 0x3e, 0x5c, 0xe5, 0x5a, 0x4c, 0x24,
0x1f, 0x08, 0xa6, 0x3d, 0x1c, 0x45, 0xbf, 0x20, 0x85, 0x3f, 0xe4, 0x69, 0x3e, 0xbc, 0x89, 0x28,
0xd5, 0x02, 0x63, 0xf5, 0x16, 0x0d, 0x80, 0x12, 0xd7, 0x7f, 0xd5, 0x99, 0xc0, 0x5d, 0x42, 0x09,
0x24, 0x01, 0x1b, 0x5d, 0x98, 0xcd, 0xfa, 0xa4, 0xb0, 0x1e, 0x2d, 0xa7, 0x17, 0x71, 0x99, 0xe6,
0x8b, 0x21, 0xa6, 0xeb, 0xc8, 0x89, 0xac, 0x0f, 0xe3, 0x40, 0x38, 0x69, 0xc5, 0x71, 0x51, 0x94,
0xf5, 0x20, 0x8c, 0x85, 0x93, 0x8f, 0x04, 0xc3, 0xa9, 0x85, 0xe2, 0xde, 0xf6, 0xd8, 0x3c, 0x4b,
0xf3, 0xa0, 0x37, 0x8d, 0xf4, 0xf1, 0x66, 0x51, 0x10, 0xbc, 0x07, 0x2c, 0xbe, 0x62, 0x4d, 0xcd,
0xb0, 0x27, 0xe3, 0x02, 0xc1, 0xe0, 0x05, 0xa0, 0x5d, 0x62, 0x4b, 0xf1, 0x61, 0x7c, 0xc9, 0xea,
0x07, 0xcc, 0xea, 0x29, 0x7c, 0x88, 0xe9, 0x7b, 0x04, 0xb1, 0xc4, 0xc6, 0x49, 0xed, 0x6a, 0x15,
0xbd, 0x23, 0xe5, 0xc7, 0x71, 0x29, 0xd2, 0x79, 0x5a, 0xc4, 0x79, 0xb3, 0x74, 0xc3, 0x46, 0x91,
0x16, 0x65, 0x5c, 0x6e, 0xf7, 0xa4, 0xb5, 0xdb, 0x7f, 0x1e, 0x44, 0xef, 0x43, 0xbf, 0xc7, 0xac,
0x5c, 0xa6, 0x72, 0x07, 0xa0, 0x52, 0x43, 0xfe, 0xf0, 0xd3, 0xb0, 0xd1, 0x96, 0x82, 0x29, 0xcd,
0x67, 0xd7, 0x57, 0xb4, 0x79, 0xdf, 0x54, 0xaf, 0x8a, 0xbe, 0x28, 0x93, 0xd6, 0x0e, 0xd9, 0xb4,
0x59, 0xea, 0x48, 0x21, 0x91, 0xf7, 0xb5, 0x20, 0xd0, 0xc3, 0x4f, 0xf3, 0xaa, 0xb1, 0x8e, 0xf5,
0x70, 0x2b, 0x0e, 0xf6, 0x70, 0x0f, 0xb3, 0x3d, 0xfc, 0x78, 0x75, 0x96, 0xa5, 0xd5, 0x45, 0x9a,
0x2f, 0x74, 0x92, 0xef, 0xeb, 0x5a, 0x31, 0xcc, 0xf3, 0x37, 0x3b, 0x39, 0xcc, 0x89, 0x0e, 0x16,
0xd2, 0x09, 0x08, 0x93, 0xcd, 0x4e, 0xce, 0xae, 0xbd, 0xac, 0xb4, 0x5e, 0xf4, 0x83, 0xb5, 0x97,
0xa3, 0x5a, 0x4b, 0x89, 0xb5, 0x57, 0x9b, 0xb2, 0x6b, 0x2f, 0xb7, 0x0e, 0x15, 0xcf, 0xae, 0xd8,
0x69, 0x99, 0x82, 0xb5, 0x97, 0x57, 0xbe, 0x86, 0x21, 0xd6, 0x5e, 0x14, 0x6b, 0x07, 0x2a, 0x4b,
0xec, 0x33, 0x31, 0x15, 0xb1, 0x58, 0x55, 0x60, 0xa0, 0x72, 0x6c, 0x18, 0x84, 0x18, 0xa8, 0x08,
0x54, 0x7b, 0xfb, 0xdd, 0x28, 0x52, 0xfb, 0x25, 0x72, 0x4f, 0xcb, 0x9f, 0x7b, 0xf4, 0x46, 0x8a,
0xb7, 0xa1, 0xf5, 0x7e, 0x80, 0xb0, 0xe9, 0x95, 0xfa, 0xbb, 0xdc, 0xaa, 0x1b, 0xa2, 0x1a, 0x52,
0x44, 0xa4, 0x57, 0x00, 0x81, 0x05, 0x9d, 0x5e, 0xf0, 0x57, 0x78, 0x41, 0x6b, 0x49, 0xb8, 0xa0,
0x9a, 0xb0, 0x9b, 0xe7, 0xba, 0xa0, 0xd8, 0xe6, 0x79, 0x53, 0x8c, 0xd0, 0xe6, 0x39, 0x64, 0x6c,
0xcc, 0xb8, 0x86, 0x9f, 0x72, 0x7e, 0xb9, 0x8c, 0xcb, 0x4b, 0x10, 0x33, 0x9e, 0x72, 0xc3, 0x10,
0x31, 0x43, 0xb1, 0x36, 0x66, 0x5c, 0x87, 0x75, 0x72, 0x7e, 0x5a, 0x66, 0x20, 0x66, 0x3c, 0x1b,
0x1a, 0x21, 0x62, 0x86, 0x40, 0xed, 0xe8, 0xe4, 0x7a, 0x9b, 0x32, 0xb8, 0x5d, 0xe3, 0xa9, 0x4f,
0x19, 0xb5, 0x5d, 0x83, 0x60, 0x30, 0x84, 0xf6, 0xcb, 0xb8, 0xb8, 0xc0, 0x43, 0x48, 0x8a, 0xc2,
0x21, 0xd4, 0x20, 0xb0, 0xbd, 0xa7, 0x2c, 0x2e, 0xe7, 0x17, 0x78, 0x7b, 0x2b, 0x59, 0xb8, 0xbd,
0x0d, 0x03, 0xdb, 0x5b, 0x09, 0x5e, 0xa6, 0xe2, 0xe2, 0x90, 0x89, 0x18, 0x6f, 0x6f, 0x9f, 0x09,
0xb7, 0x77, 0x8b, 0xb5, 0xd9, 0xbf, 0xeb, 0x70, 0xba, 0x3a, 0xab, 0xe6, 0x65, 0x7a, 0xc6, 0x86,
0x01, 0x2b, 0x06, 0x22, 0xb2, 0x7f, 0x12, 0xd6, 0x3e, 0x7f, 0x36, 0x88, 0x6e, 0x36, 0xcd, 0xce,
0xab, 0x4a, 0xcf, 0x7d, 0xbe, 0xfb, 0x8f, 0xf1, 0xf6, 0x25, 0x70, 0xe2, 0x75, 0x46, 0x0f, 0x35,
0x27, 0x37, 0xc0, 0x8b, 0x74, 0x9a, 0x57, 0xa6, 0x50, 0x9f, 0xf6, 0xb1, 0xee, 0x28, 0x10, 0xb9,
0x41, 0x2f, 0x45, 0x9b, 0x96, 0xe9, 0xf6, 0x69, 0x64, 0x93, 0xa4, 0x02, 0x69, 0x59, 0xf3, 0xbc,
0x1d, 0x82, 0x48, 0xcb, 0x70, 0x12, 0x86, 0xc2, 0x7e, 0xc9, 0x57, 0x45, 0xd5, 0x11, 0x0a, 0x00,
0x0a, 0x87, 0x42, 0x1b, 0xd6, 0x3e, 0x5f, 0x47, 0xbf, 0xee, 0x86, 0x9f, 0xfb, 0xb0, 0xb7, 0xe9,
0x98, 0xc2, 0x1e, 0xf1, 0xa8, 0x2f, 0x6e, 0x33, 0x8a, 0xc6, 0xb3, 0xd8, 0x63, 0x22, 0x4e, 0xb3,
0x6a, 0xb8, 0x81, 0xdb, 0x68, 0xe4, 0x44, 0x46, 0x81, 0x71, 0x70, 0x7c, 0xdb, 0x5b, 0x15, 0x59,
0x3a, 0x6f, 0xbf, 0x4c, 0xd2, 0xba, 0x46, 0x1c, 0x1e, 0xdf, 0x5c, 0x0c, 0x8e, 0xd7, 0x75, 0xea,
0x27, 0xff, 0x33, 0x5b, 0x17, 0x0c, 0x1f, 0xaf, 0x3d, 0x24, 0x3c, 0x5e, 0x43, 0x14, 0xd6, 0x67,
0xca, 0xc4, 0x41, 0xbc, 0xe6, 0x2b, 0x62, 0xbc, 0x36, 0xe2, 0x70, 0x7d, 0x5c, 0xcc, 0xae, 0x0d,
0x8c, 0x87, 0x49, 0x2e, 0x58, 0x99, 0xc7, 0xd9, 0xf3, 0x2c, 0x5e, 0x54, 0x43, 0x62, 0x8c, 0xf1,
0x29, 0x62, 0x6d, 0x40, 0xd3, 0xc8, 0x63, 0x9c, 0x54, 0xcf, 0xe3, 0x2b, 0x5e, 0xa6, 0x82, 0x7e,
0x8c, 0x16, 0xe9, 0x7c, 0x8c, 0x1e, 0x8a, 0x7a, 0x1b, 0x97, 0xf3, 0x8b, 0xf4, 0x8a, 0x25, 0x01,
0x6f, 0x0d, 0xd2, 0xc3, 0x9b, 0x83, 0x22, 0x8d, 0x36, 0xe5, 0xab, 0x72, 0xce, 0xc8, 0x46, 0x53,
0xe2, 0xce, 0x46, 0x33, 0x98, 0xf6, 0xf0, 0x17, 0x83, 0xe8, 0x37, 0x94, 0xd4, 0x7d, 0xc3, 0xb3,
0x17, 0x57, 0x17, 0x67, 0x3c, 0x2e, 0x93, 0xe1, 0x87, 0x98, 0x1d, 0x14, 0x35, 0xae, 0x1f, 0x5f,
0x47, 0x05, 0x3e, 0xd6, 0x3a, 0xef, 0xb6, 0x3d, 0x0e, 0x7d, 0xac, 0x1e, 0x12, 0x7e, 0xac, 0x10,
0x85, 0x03, 0x88, 0x94, 0xab, 0x0d, 0xc0, 0x0d, 0x52, 0xdf, 0xdf, 0x05, 0xdc, 0xec, 0xe4, 0xe0,
0xf8, 0x58, 0x0b, 0xfd, 0x68, 0xd9, 0xa6, 0x6c, 0xe0, 0x11, 0x33, 0xea, 0x8b, 0x93, 0x9e, 0x4d,
0xaf, 0x08, 0x7b, 0x6e, 0xf5, 0x8c, 0x51, 0x5f, 0x9c, 0xf0, 0xec, 0x0c, 0x6b, 0x21, 0xcf, 0xc8,
0xd0, 0x36, 0xea, 0x8b, 0xc3, 0xec, 0x4b, 0x33, 0xcd, 0xbc, 0xf0, 0x20, 0x60, 0x07, 0xce, 0x0d,
0x5b, 0xbd, 0x58, 0xed, 0xf0, 0xaf, 0x06, 0xd1, 0x77, 0xad, 0xc7, 0x43, 0x9e, 0xa4, 0xe7, 0x6b,
0x05, 0xbd, 0x88, 0xb3, 0x15, 0xab, 0x86, 0x8f, 0x29, 0x6b, 0x6d, 0xd6, 0x94, 0xe0, 0xc9, 0xb5,
0x74, 0x60, 0xdf, 0x19, 0x17, 0x45, 0xb6, 0x9e, 0xb1, 0x65, 0x91, 0x91, 0x7d, 0xc7, 0x43, 0xc2,
0x7d, 0x07, 0xa2, 0x30, 0x2b, 0x9f, 0xf1, 0x3a, 0xe7, 0x47, 0xb3, 0x72, 0x29, 0x0a, 0x67, 0xe5,
0x0d, 0x02, 0x73, 0xa5, 0x19, 0xdf, 0xe5, 0x59, 0xc6, 0xe6, 0xa2, 0x7d, 0x4a, 0xc4, 0x68, 0x5a,
0x22, 0x9c, 0x2b, 0x01, 0xd2, 0xee, 0xca, 0x35, 0x6b, 0xc8, 0xb8, 0x64, 0x4f, 0xd7, 0x07, 0x69,
0x7e, 0x39, 0xc4, 0xd3, 0x02, 0x0b, 0x10, 0xbb, 0x72, 0x28, 0x08, 0xd7, 0xaa, 0xa7, 0x79, 0xc2,
0xf1, 0xb5, 0x6a, 0x2d, 0x09, 0xaf, 0x55, 0x35, 0x01, 0x4d, 0x9e, 0x30, 0xca, 0x64, 0x2d, 0x09,
0x9b, 0xd4, 0x04, 0x36, 0x14, 0xea, 0x37, 0x45, 0xe4, 0x50, 0x08, 0xde, 0x0d, 0x6d, 0x76, 0x72,
0x30, 0x42, 0x9b, 0x45, 0xeb, 0x73, 0x26, 0xe6, 0x17, 0x78, 0x84, 0x7a, 0x48, 0x38, 0x42, 0x21,
0x0a, 0xab, 0x34, 0xe3, 0x66, 0xd1, 0xbd, 0x81, 0xc7, 0x47, 0x6b, 0xc1, 0xbd, 0xd9, 0xc9, 0xc1,
0x65, 0xe4, 0x64, 0x29, 0x9f, 0x19, 0x1a, 0xe4, 0x4a, 0x16, 0x5e, 0x46, 0x1a, 0x06, 0x96, 0x5e,
0x09, 0xe4, 0x5e, 0xd6, 0x06, 0xad, 0xe8, 0xed, 0x66, 0x6d, 0x76, 0x72, 0xda, 0xc9, 0x3f, 0x9a,
0x65, 0x9c, 0x92, 0x1e, 0xf1, 0xba, 0x8f, 0xbc, 0x88, 0xb3, 0x34, 0x89, 0x05, 0x9b, 0xf1, 0x4b,
0x96, 0xe3, 0x2b, 0x26, 0x5d, 0x5a, 0xc5, 0x8f, 0x3c, 0x85, 0xf0, 0x8a, 0x29, 0xac, 0x08, 0xe3,
0x44, 0xd1, 0xa7, 0x15, 0xdb, 0x8d, 0x2b, 0x62, 0x24, 0xf3, 0x90, 0x70, 0x9c, 0x40, 0x14, 0xe6,
0xab, 0x4a, 0xfe, 0xec, 0x75, 0xc1, 0xca, 0x94, 0xe5, 0x73, 0x86, 0xe7, 0xab, 0x90, 0x0a, 0xe7,
0xab, 0x08, 0x0d, 0xd7, 0x6a, 0x7b, 0xb1, 0x60, 0x4f, 0xd7, 0xb3, 0x74, 0xc9, 0x2a, 0x11, 0x2f,
0x0b, 0x7c, 0xad, 0x06, 0xa0, 0xf0, 0x5a, 0xad, 0x0d, 0xb7, 0xb6, 0x86, 0xcc, 0x80, 0xd8, 0x3e,
0x5c, 0x06, 0x89, 0xc0, 0xe1, 0x32, 0x02, 0x85, 0x0f, 0xd6, 0x02, 0xe8, 0x4b, 0x82, 0x96, 0x95,
0xe0, 0x4b, 0x02, 0x9a, 0x6e, 0x6d, 0xb8, 0x19, 0x66, 0x5a, 0x77, 0xcd, 0x8e, 0xa2, 0x4f, 0xdd,
0x2e, 0xba, 0xd5, 0x8b, 0xc5, 0x77, 0xf8, 0x4e, 0x58, 0x16, 0xcb, 0x69, 0x2b, 0xb0, 0x8d, 0xd6,
0x30, 0x7d, 0x76, 0xf8, 0x1c, 0x56, 0x3b, 0xfc, 0xb3, 0x41, 0xf4, 0x1e, 0xe6, 0xf1, 0x8b, 0x42,
0xfa, 0x7d, 0xd4, 0x6d, 0x4b, 0x91, 0xc4, 0xe9, 0xb9, 0xb0, 0x86, 0x3d, 0x00, 0xd2, 0x88, 0xec,
0xe1, 0x3a, 0x5d, 0x00, 0x3f, 0x69, 0x33, 0xe5, 0x87, 0x1c, 0x71, 0x00, 0x24, 0xc4, 0xdb, 0xf5,
0x90, 0x5f, 0xae, 0x0a, 0xac, 0x87, 0x8c, 0x0d, 0x2d, 0x26, 0xd6, 0x43, 0x08, 0x66, 0x7b, 0xa7,
0x5b, 0xbd, 0x97, 0xa9, 0xb8, 0x90, 0xf9, 0x16, 0xe8, 0x9d, 0x5e, 0x59, 0x0d, 0x44, 0xf4, 0x4e,
0x12, 0x86, 0x19, 0x49, 0x03, 0xd6, 0x7d, 0x13, 0x1b, 0xcb, 0x8d, 0x21, 0xb7, 0x67, 0xde, 0xeb,
0x06, 0x61, 0xbc, 0x36, 0x62, 0xbd, 0xf4, 0x79, 0x10, 0xb2, 0x00, 0x96, 0x3f, 0x5b, 0xbd, 0x58,
0xed, 0xf0, 0x4f, 0xa2, 0xef, 0xb4, 0x2a, 0xf6, 0x9c, 0xc5, 0x62, 0x55, 0xb2, 0x64, 0xb8, 0xd3,
0x51, 0xee, 0x06, 0x34, 0xae, 0x1f, 0xf5, 0x57, 0x68, 0xe5, 0xe8, 0x0d, 0xa7, 0xc2, 0xca, 0x94,
0xe1, 0x71, 0xc8, 0xa4, 0xcf, 0x06, 0x73, 0x74, 0x5a, 0xa7, 0xb5, 0xcc, 0x76, 0xa3, 0x6b, 0x7c,
0x15, 0xa7, 0x99, 0x7c, 0x59, 0xfb, 0x61, 0xc8, 0xa8, 0x87, 0x06, 0x97, 0xd9, 0xa4, 0x4a, 0x6b,
0x64, 0x96, 0x7d, 0xdc, 0x59, 0x9e, 0x3d, 0xa4, 0x47, 0x02, 0x64, 0x75, 0xb6, 0xdd, 0x93, 0xd6,
0x6e, 0x45, 0x33, 0xe5, 0xd5, 0x7f, 0x76, 0x83, 0x1c, 0xf3, 0xaa, 0x55, 0x91, 0x48, 0xdf, 0xee,
0x49, 0x6b, 0xaf, 0x7f, 0x1c, 0xbd, 0xdb, 0xf6, 0xaa, 0x27, 0xa2, 0x9d, 0x4e, 0x53, 0x60, 0x2e,
0x7a, 0xd4, 0x5f, 0x41, 0xbb, 0xff, 0x17, 0xb3, 0x2f, 0xad, 0xfc, 0xcf, 0xf9, 0x72, 0xc9, 0xf2,
0x84, 0x25, 0x8d, 0x46, 0x55, 0xaf, 0x9f, 0x3e, 0xa3, 0xed, 0x1a, 0x85, 0x91, 0xab, 0x61, 0x4a,
0xf4, 0x9b, 0xdf, 0x40, 0x53, 0x17, 0xed, 0x3f, 0x06, 0xd1, 0x7d, 0xb4, 0x68, 0x4d, 0xe0, 0x7a,
0x45, 0xfc, 0x9d, 0x3e, 0x8e, 0x30, 0x4d, 0x53, 0xd4, 0xf1, 0xff, 0xc1, 0x82, 0x2e, 0xf2, 0xbf,
0x0e, 0xa2, 0xdb, 0x56, 0xb1, 0x0e, 0xef, 0x5d, 0x9e, 0x9f, 0x67, 0xe9, 0x5c, 0xc8, 0x37, 0xb2,
0x5a, 0x85, 0x7e, 0x9c, 0x94, 0x46, 0xf7, 0xe3, 0x0c, 0x68, 0xda, 0xc5, 0xeb, 0xe7, 0x69, 0x25,
0x78, 0xb9, 0x9e, 0x5e, 0xf0, 0x57, 0xcd, 0xe7, 0x49, 0xfe, 0xb8, 0xac, 0x81, 0x91, 0x43, 0x10,
0x8b, 0x57, 0x9c, 0x6c, 0xb9, 0xb2, 0x9f, 0x31, 0x55, 0x84, 0x2b, 0x87, 0xe8, 0x70, 0xe5, 0x93,
0x76, 0x56, 0x6a, 0x6a, 0x65, 0xbf, 0xb9, 0xda, 0xc4, 0x8b, 0xda, 0xfe, 0xee, 0xea, 0x5e, 0x37,
0x68, 0x73, 0x53, 0x2d, 0xde, 0x4b, 0xcf, 0xcf, 0x4d, 0x9d, 0xf0, 0x92, 0xba, 0x08, 0x91, 0x9b,
0x12, 0xa8, 0x5d, 0x5e, 0x3d, 0x4f, 0x33, 0x26, 0xdf, 0xdd, 0x7c, 0x71, 0x7e, 0x9e, 0xf1, 0x38,
0x01, 0xcb, 0xab, 0x5a, 0x3c, 0x72, 0xe5, 0xc4, 0xf2, 0x0a, 0xe3, 0xec, 0xa9, 0x90, 0x5a, 0x5a,
0x47, 0x77, 0x3e, 0x4f, 0x33, 0x78, 0xba, 0x59, 0x6a, 0x1a, 0x21, 0x71, 0x2a, 0xa4, 0x05, 0xd9,
0x14, 0xa8, 0x16, 0xd5, 0x51, 0xd9, 0x94, 0xff, 0x6e, 0x5b, 0xd1, 0x11, 0x13, 0x29, 0x10, 0x82,
0xd9, 0x5d, 0x86, 0x5a, 0x78, 0x5a, 0x48, 0xe3, 0xb7, 0xda, 0x5a, 0x4a, 0x42, 0xec, 0x32, 0xf8,
0x84, 0x5d, 0x2d, 0xd7, 0x7f, 0xdf, 0xe3, 0xaf, 0x72, 0x69, 0xf4, 0x76, 0x5b, 0xa5, 0x91, 0x11,
0xab, 0x65, 0xc8, 0x68, 0xc3, 0x3f, 0x8a, 0xfe, 0xbf, 0x34, 0x5c, 0xf2, 0x62, 0x78, 0x03, 0x51,
0x28, 0x9d, 0xb3, 0xc0, 0x37, 0x49, 0xb9, 0x3d, 0x44, 0x62, 0x62, 0xe3, 0xb4, 0x8a, 0x17, 0xf0,
0x00, 0xbf, 0x6d, 0x71, 0x29, 0x25, 0x0e, 0x91, 0xb4, 0x29, 0x3f, 0x2a, 0x8e, 0x78, 0xa2, 0xad,
0x23, 0x35, 0x34, 0xc2, 0x50, 0x54, 0xb8, 0x90, 0x4d, 0x5b, 0x8f, 0xe2, 0xab, 0x74, 0x61, 0x52,
0x0b, 0x35, 0x80, 0x55, 0x20, 0x6d, 0xb5, 0xcc, 0xc8, 0x81, 0x88, 0xb4, 0x95, 0x84, 0xb5, 0xcf,
0x7f, 0x18, 0x44, 0xb7, 0x2c, 0xb3, 0xdf, 0xec, 0xcb, 0x4e, 0xf2, 0x73, 0x5e, 0x27, 0xb9, 0x07,
0x69, 0x7e, 0x59, 0x0d, 0x3f, 0xa1, 0x4c, 0xe2, 0xbc, 0x29, 0xca, 0xa7, 0xd7, 0xd6, 0xb3, 0xeb,
0x93, 0x66, 0xd3, 0xd2, 0x9e, 0x5c, 0x50, 0x1a, 0x60, 0x7d, 0x62, 0xf6, 0x36, 0x21, 0x47, 0xac,
0x4f, 0x42, 0xbc, 0x6d, 0x62, 0xe3, 0x3c, 0xe3, 0x39, 0x6c, 0x62, 0x6b, 0xa1, 0x16, 0x12, 0x4d,
0xdc, 0x82, 0xec, 0x78, 0xdc, 0x88, 0xd4, 0xfe, 0xda, 0x38, 0xcb, 0xc0, 0x78, 0x6c, 0x54, 0x0d,
0x40, 0x8c, 0xc7, 0x28, 0xa8, 0xfd, 0x9c, 0x44, 0xdf, 0xaa, 0x1f, 0xe9, 0x71, 0xc9, 0xae, 0x52,
0x06, 0x0f, 0xd9, 0x38, 0x12, 0xa2, 0xff, 0xfb, 0x84, 0xed, 0x59, 0xa7, 0x79, 0x55, 0x64, 0x71,
0x75, 0xa1, 0x8f, 0x5d, 0xf8, 0x75, 0x6e, 0x84, 0xf0, 0xe0, 0xc5, 0xdd, 0x0e, 0xca, 0x0e, 0xea,
0x8d, 0xcc, 0x0c, 0x31, 0x1b, 0xb8, 0x6a, 0x6b, 0x98, 0xd9, 0xec, 0xe4, 0xec, 0xbb, 0x8d, 0xfd,
0x38, 0xcb, 0x58, 0xb9, 0x6e, 0x64, 0x87, 0x71, 0x9e, 0x9e, 0xb3, 0x4a, 0x80, 0x77, 0x1b, 0x9a,
0x1a, 0x41, 0x8c, 0x78, 0xb7, 0x11, 0xc0, 0xed, 0xba, 0x0d, 0x78, 0x9e, 0xe4, 0x09, 0x7b, 0x0d,
0xd6, 0x6d, 0xd0, 0x8e, 0x64, 0x88, 0x75, 0x1b, 0xc5, 0xda, 0x3d, 0xfe, 0xa7, 0x19, 0x9f, 0x5f,
0xea, 0x29, 0xc0, 0x6f, 0x60, 0x29, 0x81, 0x73, 0xc0, 0xed, 0x10, 0x62, 0x27, 0x01, 0x29, 0x38,
0x61, 0x45, 0x16, 0xcf, 0xe1, 0x49, 0x2b, 0xa5, 0xa3, 0x65, 0xc4, 0x24, 0x00, 0x19, 0x50, 0x5c,
0x7d, 0x82, 0x0b, 0x2b, 0x2e, 0x38, 0xc0, 0x75, 0x3b, 0x84, 0xd8, 0x69, 0x50, 0x0a, 0xa6, 0x45,
0x96, 0x0a, 0xd0, 0x0d, 0x94, 0x86, 0x94, 0x10, 0xdd, 0xc0, 0x27, 0x80, 0xc9, 0x43, 0x56, 0x2e,
0x18, 0x6a, 0x52, 0x4a, 0x82, 0x26, 0x1b, 0xc2, 0x1e, 0x2b, 0x57, 0x75, 0xe7, 0xc5, 0x1a, 0x1c,
0x2b, 0xd7, 0xd5, 0xe2, 0xc5, 0x9a, 0x38, 0x56, 0xee, 0x01, 0xa0, 0x88, 0xc7, 0x71, 0x25, 0xf0,
0x22, 0x4a, 0x49, 0xb0, 0x88, 0x0d, 0x61, 0xe7, 0x68, 0x55, 0xc4, 0x95, 0x00, 0x73, 0xb4, 0x2e,
0x80, 0x73, 0xd6, 0xe0, 0x26, 0x29, 0xb7, 0x23, 0x89, 0x6a, 0x15, 0x26, 0x9e, 0xa7, 0x2c, 0x4b,
0x2a, 0x30, 0x92, 0xe8, 0xe7, 0xde, 0x48, 0x89, 0x91, 0xa4, 0x4d, 0x81, 0x50, 0xd2, 0x6f, 0x42,
0xb0, 0xda, 0x81, 0x97, 0x20, 0xb7, 0x43, 0x88, 0x1d, 0x9f, 0x9a, 0x42, 0xef, 0xc6, 0x65, 0x99,
0xd6, 0x93, 0xff, 0x06, 0x5e, 0xa0, 0x46, 0x4e, 0x8c, 0x4f, 0x18, 0x07, 0xba, 0x57, 0x33, 0x70,
0x63, 0x05, 0x83, 0x43, 0xf7, 0x07, 0x41, 0xc6, 0x66, 0x9c, 0x52, 0xe2, 0xbc, 0x2c, 0xc7, 0x9e,
0x26, 0xf2, 0xae, 0x7c, 0xa3, 0x0b, 0x73, 0xbe, 0x70, 0x33, 0x2e, 0x0e, 0xf9, 0x15, 0x9b, 0xf1,
0x67, 0xaf, 0xd3, 0xaa, 0x5e, 0x6e, 0xe9, 0x99, 0xfb, 0x09, 0x61, 0x09, 0x83, 0x89, 0x2f, 0xdc,
0x3a, 0x95, 0x6c, 0x02, 0x01, 0xca, 0x72, 0xc4, 0x5e, 0xa1, 0x09, 0x04, 0xb4, 0x68, 0x38, 0x22,
0x81, 0x08, 0xf1, 0x76, 0xc7, 0xcc, 0x38, 0xd7, 0xd7, 0x1a, 0xcc, 0x78, 0x93, 0xcb, 0x51, 0xd6,
0x20, 0x48, 0x6c, 0x5a, 0x04, 0x15, 0xec, 0xfa, 0xd2, 0xf8, 0xb7, 0x5d, 0xec, 0x1e, 0x61, 0xa7,
0xdd, 0xcd, 0xee, 0xf7, 0x20, 0x11, 0x57, 0xf6, 0xc4, 0x07, 0xe5, 0xaa, 0x7d, 0xe0, 0xe3, 0x7e,
0x0f, 0xd2, 0xd9, 0x7d, 0x73, 0xab, 0xf5, 0x34, 0x9e, 0x5f, 0x2e, 0x4a, 0xbe, 0xca, 0x93, 0x5d,
0x9e, 0xf1, 0x12, 0xec, 0xbe, 0x79, 0xa5, 0x06, 0x28, 0xb1, 0xfb, 0xd6, 0xa1, 0x62, 0x33, 0x38,
0xb7, 0x14, 0xe3, 0x2c, 0x5d, 0xc0, 0x15, 0xb5, 0x67, 0x48, 0x02, 0x44, 0x06, 0x87, 0x82, 0x48,
0x10, 0xa9, 0x15, 0xb7, 0x48, 0xe7, 0x71, 0xa6, 0xfc, 0xed, 0xd0, 0x66, 0x3c, 0xb0, 0x33, 0x88,
0x10, 0x05, 0xa4, 0x9e, 0xb3, 0x55, 0x99, 0x4f, 0x72, 0xc1, 0xc9, 0x7a, 0x36, 0x40, 0x67, 0x3d,
0x1d, 0x10, 0x0c, 0xab, 0x33, 0xf6, 0xba, 0x2e, 0x4d, 0xfd, 0x0f, 0x36, 0xac, 0xd6, 0x7f, 0x1f,
0x69, 0x79, 0x68, 0x58, 0x05, 0x1c, 0xa8, 0x8c, 0x76, 0xa2, 0x02, 0x26, 0xa0, 0xed, 0x87, 0xc9,
0xbd, 0x6e, 0x10, 0xf7, 0x33, 0x15, 0xeb, 0x8c, 0x85, 0xfc, 0x48, 0xa0, 0x8f, 0x9f, 0x06, 0xb4,
0xdb, 0x2d, 0x5e, 0x7d, 0x2e, 0xd8, 0xfc, 0xb2, 0x75, 0x80, 0xcd, 0x2f, 0xa8, 0x42, 0x88, 0xed,
0x16, 0x02, 0xc5, 0x9b, 0x68, 0x32, 0xe7, 0x79, 0xa8, 0x89, 0x6a, 0x79, 0x9f, 0x26, 0xd2, 0x9c,
0x5d, 0xfc, 0x1a, 0xa9, 0x8e, 0x4c, 0xd5, 0x4c, 0x5b, 0x84, 0x05, 0x17, 0x22, 0x16, 0xbf, 0x24,
0x6c, 0x73, 0x72, 0xe8, 0xf3, 0xb0, 0x7d, 0xba, 0xbf, 0x65, 0xe5, 0x90, 0x3e, 0xdd, 0x4f, 0xb1,
0x74, 0x25, 0x55, 0x8c, 0x74, 0x58, 0xf1, 0xe3, 0xe4, 0x61, 0x3f, 0xd8, 0x2e, 0x79, 0x3c, 0x9f,
0xbb, 0x19, 0x8b, 0x4b, 0xe5, 0x75, 0x3b, 0x60, 0xc8, 0x62, 0xc4, 0x92, 0x27, 0x80, 0x83, 0x21,
0xcc, 0xf3, 0xbc, 0xcb, 0x73, 0xc1, 0x72, 0x81, 0x0d, 0x61, 0xbe, 0x31, 0x0d, 0x86, 0x86, 0x30,
0x4a, 0x01, 0xc4, 0xad, 0xdc, 0x0f, 0x62, 0xe2, 0x28, 0x5e, 0xa2, 0x19, 0x9b, 0xda, 0xeb, 0x51,
0xf2, 0x50, 0xdc, 0x02, 0xce, 0x79, 0x9d, 0xeb, 0x7a, 0x99, 0xc5, 0xe5, 0xc2, 0xec, 0x6e, 0x24,
0xc3, 0x47, 0xb4, 0x1d, 0x9f, 0x24, 0x5e, 0xe7, 0x86, 0x35, 0xc0, 0xb0, 0x33, 0x59, 0xc6, 0x0b,
0x53, 0x53, 0xa4, 0x06, 0x52, 0xde, 0xaa, 0xea, 0xbd, 0x6e, 0x10, 0xf8, 0x79, 0x91, 0x26, 0x8c,
0x07, 0xfc, 0x48, 0x79, 0x1f, 0x3f, 0x10, 0x04, 0xd9, 0x5b, 0x5d, 0x6f, 0xb5, 0xa2, 0x1b, 0xe7,
0x89, 0x5e, 0xc7, 0x8e, 0x88, 0xc7, 0x03, 0xb8, 0x50, 0xf6, 0x46, 0xf0, 0xa0, 0x8f, 0x36, 0x1b,
0xb4, 0xa1, 0x3e, 0x6a, 0xf6, 0x5f, 0xfb, 0xf4, 0x51, 0x0c, 0xd6, 0x3e, 0x7f, 0xa2, 0xfb, 0xe8,
0x5e, 0x2c, 0xe2, 0x3a, 0x6f, 0x7f, 0x91, 0xb2, 0x57, 0x7a, 0x21, 0x8c, 0xd4, 0xb7, 0xa1, 0x46,
0xf2, 0xe3, 0x64, 0xb0, 0x2a, 0xde, 0xe9, 0xcd, 0x07, 0x7c, 0xeb, 0x15, 0x42, 0xa7, 0x6f, 0xb0,
0x54, 0xd8, 0xe9, 0xcd, 0x07, 0x7c, 0xeb, 0x3b, 0x16, 0x3a, 0x7d, 0x83, 0x8b, 0x16, 0x76, 0x7a,
0xf3, 0xda, 0xf7, 0x9f, 0x37, 0x1d, 0xd7, 0x75, 0x5e, 0xe7, 0x61, 0x73, 0x91, 0x5e, 0x31, 0x2c,
0x9d, 0xf4, 0xed, 0x19, 0x34, 0x94, 0x4e, 0xd2, 0x2a, 0xce, 0x2d, 0x67, 0x58, 0x29, 0x8e, 0x79,
0x95, 0xca, 0xe3, 0x18, 0x4f, 0x7a, 0x18, 0x6d, 0xe0, 0xd0, 0xa2, 0x29, 0xa4, 0x64, 0x5f, 0x2c,
0x7b, 0xa8, 0x3d, 0xaf, 0xfe, 0x30, 0x60, 0xaf, 0x7d, 0x6c, 0x7d, 0xbb, 0x27, 0x6d, 0x5f, 0xf1,
0x7a, 0x8c, 0xfb, 0x6e, 0x39, 0xd4, 0xaa, 0xe8, 0xeb, 0xe5, 0x47, 0xfd, 0x15, 0xb4, 0xfb, 0xbf,
0x6c, 0xd6, 0x15, 0xd0, 0xbf, 0xee, 0x04, 0x8f, 0xfb, 0x58, 0x04, 0x1d, 0xe1, 0xc9, 0xb5, 0x74,
0x74, 0x41, 0xfe, 0xb6, 0x59, 0x40, 0x37, 0xa8, 0xfc, 0x6a, 0x47, 0x7e, 0xed, 0xab, 0xfb, 0x44,
0xa8, 0x59, 0x2d, 0x0c, 0x7b, 0xc6, 0xc7, 0xd7, 0xd4, 0x72, 0xee, 0xbc, 0xf3, 0x60, 0xfd, 0x75,
0xa9, 0x53, 0x9e, 0x90, 0x65, 0x87, 0x86, 0x05, 0xfa, 0xe4, 0xba, 0x6a, 0x54, 0x5f, 0x71, 0x60,
0x79, 0xeb, 0xcb, 0x93, 0x9e, 0x86, 0xbd, 0x7b, 0x60, 0x3e, 0xba, 0x9e, 0x92, 0x2e, 0xcb, 0xbf,
0x0f, 0xa2, 0xbb, 0x1e, 0x6b, 0xdf, 0x27, 0x80, 0x5d, 0x8f, 0x1f, 0x04, 0xec, 0x53, 0x4a, 0xa6,
0x70, 0xbf, 0xf5, 0xcd, 0x94, 0xed, 0x05, 0x71, 0x9e, 0xca, 0xf3, 0x34, 0x13, 0xac, 0x6c, 0x5f,
0x10, 0xe7, 0xdb, 0x55, 0xd4, 0x88, 0xbe, 0x20, 0x2e, 0x80, 0x3b, 0x17, 0xc4, 0x21, 0x9e, 0xd1,
0x0b, 0xe2, 0x50, 0x6b, 0xc1, 0x0b, 0xe2, 0xc2, 0x1a, 0xd4, 0xf0, 0xde, 0x14, 0x41, 0xed, 0x5b,
0xf7, 0xb2, 0xe8, 0x6f, 0x63, 0x3f, 0xbe, 0x8e, 0x0a, 0x31, 0xc1, 0x29, 0x4e, 0x9e, 0x68, 0xec,
0xf1, 0x4c, 0xbd, 0x53, 0x8d, 0x3b, 0xbd, 0x79, 0xed, 0xfb, 0xc7, 0x7a, 0x75, 0x63, 0x86, 0x73,
0x5e, 0xca, 0xcb, 0x01, 0xb7, 0x42, 0xc3, 0x73, 0x6d, 0xc1, 0x6d, 0xf9, 0x87, 0xfd, 0x60, 0xa2,
0xba, 0x35, 0xa1, 0x1b, 0x7d, 0xd4, 0x65, 0x08, 0x34, 0xf9, 0x4e, 0x6f, 0x9e, 0x98, 0x46, 0x94,
0x6f, 0xd5, 0xda, 0x3d, 0x8c, 0xf9, 0x6d, 0xfd, 0xa8, 0xbf, 0x82, 0x76, 0x7f, 0xa5, 0xd3, 0x46,
0xd7, 0xbd, 0x6c, 0xe7, 0xed, 0x2e, 0x53, 0x53, 0xaf, 0x99, 0x47, 0x7d, 0xf1, 0x50, 0x02, 0xe1,
0x4e, 0xa1, 0x5d, 0x09, 0x04, 0x3a, 0x8d, 0x7e, 0x74, 0x3d, 0x25, 0x5d, 0x96, 0xbf, 0x1f, 0x44,
0x37, 0xc9, 0xb2, 0xe8, 0x38, 0xf8, 0xa4, 0xaf, 0x65, 0x10, 0x0f, 0x9f, 0x5e, 0x5b, 0x4f, 0x17,
0xea, 0x9f, 0x06, 0xd1, 0xad, 0x40, 0xa1, 0x54, 0x80, 0x5c, 0xc3, 0xba, 0x1f, 0x28, 0x9f, 0x5d,
0x5f, 0x91, 0x9a, 0xee, 0x5d, 0x7c, 0xda, 0xbe, 0xec, 0x2b, 0x60, 0x7b, 0x4a, 0x5f, 0xf6, 0xd5,
0xad, 0x05, 0x37, 0x79, 0xe2, 0xb3, 0x66, 0xd1, 0x85, 0x6e, 0xf2, 0xc8, 0xb3, 0x88, 0xc1, 0x6b,
0x44, 0x30, 0x0e, 0x73, 0xf2, 0xec, 0x75, 0x11, 0xe7, 0x09, 0xed, 0x44, 0xc9, 0xbb, 0x9d, 0x18,
0x0e, 0x6e, 0x8e, 0xd5, 0xd2, 0x13, 0xde, 0x2c, 0xa4, 0xee, 0x53, 0xfa, 0x06, 0x09, 0x6e, 0x8e,
0xb5, 0x50, 0xc2, 0x9b, 0xce, 0x1a, 0x43, 0xde, 0x40, 0xb2, 0xf8, 0xa0, 0x0f, 0x0a, 0x52, 0x74,
0xe3, 0xcd, 0xec, 0xb9, 0x3f, 0x0c, 0x59, 0x69, 0xed, 0xbb, 0x6f, 0xf7, 0xa4, 0x09, 0xb7, 0x53,
0x26, 0x3e, 0x67, 0x71, 0xc2, 0xca, 0xa0, 0x5b, 0x43, 0xf5, 0x72, 0xeb, 0xd2, 0x98, 0xdb, 0x5d,
0x9e, 0xad, 0x96, 0xb9, 0x6e, 0x4c, 0xd2, 0xad, 0x4b, 0x75, 0xbb, 0x05, 0x34, 0xdc, 0x16, 0xb4,
0x6e, 0x65, 0x7a, 0xf9, 0x20, 0x6c, 0xc6, 0xcb, 0x2a, 0xb7, 0x7a, 0xb1, 0x74, 0x3d, 0x75, 0x18,
0x75, 0xd4, 0x13, 0x44, 0xd2, 0x76, 0x4f, 0x1a, 0xee, 0xcf, 0x39, 0x6e, 0x4d, 0x3c, 0xed, 0x74,
0xd8, 0x6a, 0x85, 0xd4, 0xa3, 0xfe, 0x0a, 0x70, 0x37, 0x54, 0x47, 0xd5, 0x41, 0x5a, 0x89, 0xe7,
0x69, 0x96, 0x0d, 0xb7, 0x02, 0x61, 0xd2, 0x40, 0xc1, 0xdd, 0x50, 0x04, 0x26, 0x22, 0xb9, 0xd9,
0x3d, 0xcc, 0x87, 0x5d, 0x76, 0x24, 0xd5, 0x2b, 0x92, 0x5d, 0x1a, 0xec, 0x68, 0x39, 0x8f, 0xda,
0xd4, 0x76, 0x14, 0x7e, 0x70, 0xad, 0x0a, 0xef, 0xf4, 0xe6, 0xc1, 0xeb, 0x76, 0x49, 0xc9, 0x99,
0xe5, 0x0e, 0x65, 0xc2, 0x9b, 0x49, 0xee, 0x76, 0x50, 0x60, 0x57, 0x50, 0x75, 0xa3, 0x97, 0x69,
0xb2, 0x60, 0x02, 0x7d, 0x53, 0xe4, 0x02, 0xc1, 0x37, 0x45, 0x00, 0x04, 0x4d, 0xa7, 0xfe, 0x6e,
0xb6, 0x43, 0x27, 0x09, 0xd6, 0x74, 0x5a, 0xd9, 0xa1, 0x42, 0x4d, 0x87, 0xd2, 0x60, 0x34, 0x30,
0x6e, 0xf5, 0xc5, 0x0b, 0x0f, 0x42, 0x66, 0xc0, 0xed, 0x0b, 0x5b, 0xbd, 0x58, 0x30, 0xa3, 0x58,
0x87, 0xe9, 0x32, 0x15, 0xd8, 0x8c, 0xe2, 0xd8, 0xa8, 0x91, 0xd0, 0x8c, 0xd2, 0x46, 0xa9, 0xea,
0xd5, 0x39, 0xc2, 0x24, 0x09, 0x57, 0x4f, 0x31, 0xfd, 0xaa, 0x67, 0xd8, 0xd6, 0x8b, 0xcd, 0xdc,
0x84, 0x8c, 0xb8, 0xd0, 0x8b, 0x65, 0x24, 0xb6, 0xe5, 0x07, 0xb9, 0x10, 0x0c, 0x8d, 0x3a, 0x94,
0x02, 0xdc, 0xb0, 0xaf, 0xb9, 0xe6, 0xdd, 0x6b, 0x51, 0xb0, 0xb8, 0x8c, 0xf3, 0x39, 0xba, 0x38,
0x95, 0x06, 0x5b, 0x64, 0x68, 0x71, 0x4a, 0x6a, 0x80, 0xd7, 0xe6, 0xfe, 0xa7, 0xb4, 0x48, 0x57,
0x30, 0xdf, 0xac, 0xfa, 0x5f, 0xd2, 0xde, 0xef, 0x41, 0xc2, 0xd7, 0xe6, 0x0d, 0x60, 0x36, 0xbe,
0x95, 0xd3, 0x0f, 0x03, 0xa6, 0x7c, 0x34, 0xb4, 0x10, 0xa6, 0x55, 0x40, 0x50, 0x9b, 0x04, 0x97,
0x89, 0x1f, 0xb1, 0x35, 0x16, 0xd4, 0x36, 0x3f, 0x95, 0x48, 0x28, 0xa8, 0xdb, 0x28, 0xc8, 0x33,
0xdd, 0x75, 0xd0, 0x46, 0x40, 0xdf, 0x5d, 0xfa, 0x6c, 0x76, 0x72, 0xa0, 0xe7, 0xec, 0xa5, 0x57,
0xde, 0x7b, 0x02, 0xa4, 0xa0, 0x7b, 0xe9, 0x15, 0xfe, 0x9a, 0x60, 0xab, 0x17, 0x0b, 0x5f, 0xc9,
0xc7, 0x82, 0xbd, 0x6e, 0xde, 0x95, 0x23, 0xc5, 0x95, 0xf2, 0xd6, 0xcb, 0xf2, 0x7b, 0xdd, 0xa0,
0x3d, 0x00, 0x7b, 0x5c, 0xf2, 0x39, 0xab, 0x2a, 0x7d, 0x27, 0xa9, 0x7f, 0xc2, 0x48, 0xcb, 0x46,
0xe0, 0x46, 0xd2, 0x3b, 0x61, 0xc8, 0xb9, 0x48, 0x50, 0x89, 0xec, 0xfd, 0x46, 0x1b, 0xa8, 0x66,
0xfb, 0x6a, 0xa3, 0xcd, 0x4e, 0xce, 0x76, 0x2f, 0x2d, 0x75, 0x2f, 0x34, 0xba, 0x87, 0xaa, 0x63,
0x77, 0x19, 0xdd, 0xef, 0x41, 0x6a, 0x57, 0x9f, 0x47, 0x6f, 0x1e, 0xf0, 0xc5, 0x94, 0xe5, 0xc9,
0xf0, 0x7b, 0xfe, 0x11, 0x5a, 0xbe, 0x18, 0xd5, 0x7f, 0x36, 0x46, 0x6f, 0x50, 0x62, 0x7b, 0x08,
0x70, 0x8f, 0x9d, 0xad, 0x16, 0x53, 0x11, 0x0b, 0x70, 0x08, 0x50, 0xfe, 0x7d, 0x54, 0x0b, 0x88,
0x43, 0x80, 0x1e, 0x00, 0xec, 0xcd, 0x4a, 0xc6, 0x50, 0x7b, 0xb5, 0x20, 0x68, 0x4f, 0x03, 0x36,
0x8b, 0x30, 0xf6, 0xea, 0x44, 0x1d, 0x1e, 0xda, 0xb3, 0x3a, 0x52, 0x4a, 0x64, 0x11, 0x6d, 0xca,
0x06, 0xb7, 0xaa, 0xbe, 0xbc, 0x5f, 0x66, 0xb5, 0x5c, 0xc6, 0xe5, 0x1a, 0x04, 0xb7, 0xae, 0xa5,
0x03, 0x10, 0xc1, 0x8d, 0x82, 0xb6, 0xd7, 0x36, 0x8f, 0x79, 0x7e, 0xb9, 0xcf, 0x4b, 0xbe, 0x12,
0x69, 0xce, 0xe0, 0x1d, 0x23, 0xe6, 0x81, 0xba, 0x0c, 0xd1, 0x6b, 0x29, 0xd6, 0x66, 0xb9, 0x92,
0x50, 0xe7, 0x09, 0xe5, 0xa5, 0xec, 0x95, 0xe0, 0x25, 0x7c, 0x9f, 0xa8, 0xac, 0x40, 0x88, 0xc8,
0x72, 0x49, 0x18, 0xb4, 0xfd, 0x71, 0x9a, 0x2f, 0xd0, 0xb6, 0x3f, 0x76, 0xef, 0xf9, 0xbd, 0x45,
0x03, 0xb6, 0x43, 0xa9, 0x87, 0xa6, 0x3a, 0x80, 0xfe, 0x6a, 0x17, 0x7d, 0xe8, 0x2e, 0x41, 0x74,
0x28, 0x9c, 0x04, 0xae, 0xbe, 0x28, 0x58, 0xce, 0x92, 0xe6, 0xd4, 0x1c, 0xe6, 0xca, 0x23, 0x82,
0xae, 0x20, 0x69, 0xc7, 0x22, 0x29, 0x3f, 0x59, 0xe5, 0xc7, 0x25, 0x3f, 0x4f, 0x33, 0x56, 0x82,
0xb1, 0x48, 0xa9, 0x3b, 0x72, 0x62, 0x2c, 0xc2, 0x38, 0x7b, 0xfc, 0x42, 0x4a, 0xbd, 0x5f, 0x16,
0x98, 0x95, 0xf1, 0x1c, 0x1e, 0xbf, 0x50, 0x36, 0xda, 0x18, 0xb1, 0x33, 0x18, 0xc0, 0x9d, 0x44,
0x47, 0xb9, 0xce, 0xd7, 0x32, 0x3e, 0xf4, 0x57, 0xa3, 0xf2, 0xf6, 0xdb, 0x0a, 0x24, 0x3a, 0xda,
0x1c, 0x46, 0x12, 0x89, 0x4e, 0x58, 0xc3, 0x4e, 0x25, 0x92, 0x3b, 0xd2, 0xc7, 0x8a, 0xc0, 0x54,
0xa2, 0x6c, 0x34, 0x42, 0x62, 0x2a, 0x69, 0x41, 0x60, 0x40, 0x6a, 0xba, 0xc1, 0x02, 0x1d, 0x90,
0x8c, 0x34, 0x38, 0x20, 0xb9, 0x94, 0x1d, 0x28, 0x26, 0x79, 0x2a, 0xd2, 0x38, 0x9b, 0x32, 0x71,
0x1c, 0x97, 0xf1, 0x92, 0x09, 0x56, 0xc2, 0x81, 0x42, 0x23, 0x23, 0x8f, 0x21, 0x06, 0x0a, 0x8a,
0xd5, 0x0e, 0x7f, 0x3b, 0x7a, 0xbb, 0x9e, 0xf7, 0x59, 0xae, 0x7f, 0x13, 0xe9, 0x99, 0xfc, 0x31,
0xb5, 0xe1, 0x3b, 0xc6, 0xc6, 0x54, 0x94, 0x2c, 0x5e, 0x36, 0xb6, 0xdf, 0x32, 0x7f, 0x97, 0xe0,
0xa3, 0x41, 0x1d, 0xcf, 0x47, 0x5c, 0xa4, 0xe7, 0xf5, 0x32, 0x5b, 0x7f, 0x41, 0x04, 0xe2, 0xd9,
0x15, 0x8f, 0x02, 0xb7, 0x8e, 0x60, 0x9c, 0x1d, 0xa7, 0x5d, 0xe9, 0x09, 0x2b, 0x32, 0x38, 0x4e,
0x7b, 0xda, 0x12, 0x20, 0xc6, 0x69, 0x14, 0xb4, 0x9d, 0xd3, 0x15, 0xcf, 0x58, 0xb8, 0x32, 0x33,
0xd6, 0xaf, 0x32, 0x33, 0xef, 0xa3, 0x8c, 0x2c, 0x7a, 0xfb, 0x90, 0x2d, 0xcf, 0x58, 0x59, 0x5d,
0xa4, 0x05, 0x75, 0x43, 0xaf, 0x25, 0x3a, 0x6f, 0xe8, 0x25, 0x50, 0x3b, 0x13, 0x58, 0x60, 0x52,
0x1d, 0xc5, 0x4b, 0x26, 0xef, 0x50, 0x01, 0x33, 0x81, 0x63, 0xc4, 0x81, 0x88, 0x99, 0x80, 0x84,
0x9d, 0xef, 0xbb, 0x2c, 0x73, 0xc2, 0x16, 0x75, 0x84, 0x95, 0xc7, 0xf1, 0x7a, 0xc9, 0x72, 0xa1,
0x4d, 0x82, 0x3d, 0x79, 0xc7, 0x24, 0xce, 0x13, 0x7b, 0xf2, 0x7d, 0xf4, 0x9c, 0xa1, 0xc9, 0x7b,
0xf0, 0xc7, 0xbc, 0x14, 0xea, 0x17, 0xcf, 0x4e, 0xcb, 0x0c, 0x0c, 0x4d, 0xfe, 0x43, 0xf5, 0x48,
0x62, 0x68, 0x0a, 0x6b, 0x38, 0xbf, 0x6e, 0xe1, 0x95, 0xe1, 0x05, 0x2b, 0x4d, 0x9c, 0x3c, 0x5b,
0xc6, 0x69, 0xa6, 0xa3, 0xe1, 0xfb, 0x01, 0xdb, 0x84, 0x0e, 0xf1, 0xeb, 0x16, 0x7d, 0x75, 0x9d,
0xdf, 0x03, 0x09, 0x97, 0x10, 0xbc, 0x22, 0xe8, 0xb0, 0x4f, 0xbc, 0x22, 0xe8, 0xd6, 0xb2, 0x2b,
0x77, 0xcb, 0x4a, 0x6e, 0x2d, 0x89, 0x5d, 0x9e, 0xc0, 0xfd, 0x42, 0xc7, 0x26, 0x00, 0x89, 0x95,
0x7b, 0x50, 0xc1, 0xa6, 0x06, 0x16, 0x7b, 0x9e, 0xe6, 0x71, 0x96, 0xfe, 0x04, 0xa6, 0xf5, 0x8e,
0x9d, 0x86, 0x20, 0x52, 0x03, 0x9c, 0xc4, 0x5c, 0xed, 0x33, 0x31, 0x4b, 0xeb, 0xa1, 0xff, 0x5e,
0xe0, 0xb9, 0x49, 0xa2, 0xdb, 0x95, 0x43, 0x3a, 0xb7, 0xf1, 0xc2, 0xc7, 0x3a, 0x2e, 0x8a, 0x69,
0x3d, 0xab, 0x9e, 0xb0, 0x39, 0x4b, 0x0b, 0x31, 0xfc, 0x38, 0xfc, 0xac, 0x00, 0x4e, 0x1c, 0xb4,
0xe8, 0xa1, 0xe6, 0xbc, 0xbe, 0xaf, 0xc7, 0x92, 0xa9, 0xfa, 0x29, 0xd0, 0xd3, 0x8a, 0x95, 0x3a,
0xd1, 0xd8, 0x67, 0x02, 0xf4, 0x4e, 0x87, 0x1b, 0x39, 0x60, 0x5d, 0x51, 0xa2, 0x77, 0x86, 0x35,
0xec, 0x66, 0x9f, 0xc3, 0xe9, 0xdb, 0xd5, 0xe5, 0x79, 0xc3, 0x87, 0xa4, 0x31, 0x87, 0x22, 0x36,
0xfb, 0x68, 0xda, 0x66, 0x6b, 0x6d, 0xb7, 0xe3, 0x7c, 0x3d, 0x81, 0x47, 0x26, 0x10, 0x4b, 0x12,
0x23, 0xb2, 0xb5, 0x00, 0xee, 0x6c, 0x86, 0x97, 0x3c, 0x4e, 0xe6, 0x71, 0x25, 0x8e, 0xe3, 0x75,
0xc6, 0xe3, 0x44, 0xce, 0xeb, 0x70, 0x33, 0xbc, 0x61, 0x46, 0x2e, 0x44, 0x6d, 0x86, 0x53, 0xb0,
0x9b, 0x9d, 0xc9, 0x5f, 0x38, 0xd5, 0x67, 0x39, 0x61, 0x76, 0x26, 0xcb, 0x0b, 0xcf, 0x71, 0xde,
0x09, 0x43, 0xf6, 0x1b, 0x34, 0x25, 0x92, 0x69, 0xc8, 0x2d, 0x4c, 0xc7, 0x4b, 0x40, 0xde, 0x0f,
0x10, 0xf6, 0x06, 0x12, 0xf5, 0xf7, 0xe6, 0x47, 0xad, 0x84, 0xbe, 0xb3, 0xfc, 0x21, 0xa6, 0xeb,
0x42, 0x23, 0xf7, 0x22, 0x8b, 0xed, 0x9e, 0xb4, 0x4d, 0x33, 0x77, 0x2f, 0x62, 0x31, 0x4e, 0x92,
0x43, 0x56, 0x21, 0x1f, 0x94, 0xd7, 0xc2, 0x91, 0x95, 0x12, 0x69, 0x66, 0x9b, 0xb2, 0x81, 0x5e,
0xcb, 0x9e, 0x25, 0xa9, 0xd0, 0xb2, 0xe6, 0x84, 0xf4, 0xc3, 0xb6, 0x81, 0x36, 0x45, 0xd4, 0x8a,
0xa6, 0xed, 0x58, 0x5e, 0x33, 0x33, 0xbe, 0x58, 0x64, 0x4c, 0x43, 0x27, 0x2c, 0x56, 0x57, 0x36,
0xee, 0xb4, 0x6d, 0xa1, 0x20, 0x31, 0x96, 0x07, 0x15, 0x6c, 0x1a, 0x59, 0x63, 0xea, 0x95, 0x54,
0xf3, 0x60, 0x37, 0xdb, 0x66, 0x3c, 0x80, 0x48, 0x23, 0x51, 0xd0, 0x7e, 0xf7, 0x56, 0x8b, 0xf7,
0x59, 0xf3, 0x24, 0xe0, 0x65, 0x53, 0x52, 0xd9, 0x11, 0x13, 0xdf, 0xbd, 0x21, 0x98, 0x5d, 0x27,
0x00, 0x0f, 0x4f, 0xd7, 0x93, 0x04, 0xae, 0x13, 0xa0, 0xbe, 0x64, 0x88, 0x75, 0x02, 0xc5, 0xfa,
0x4d, 0x67, 0xf6, 0xbd, 0x0e, 0xe2, 0xca, 0x56, 0x0e, 0x69, 0x3a, 0x14, 0x0c, 0x35, 0x1d, 0xa5,
0xe0, 0x3f, 0x52, 0x77, 0x6b, 0x0d, 0x79, 0xa4, 0xd8, 0xbe, 0xda, 0x46, 0x17, 0x66, 0x73, 0xff,
0x5a, 0x78, 0xc2, 0xe2, 0xc4, 0x54, 0x0c, 0xd1, 0x75, 0xe5, 0x44, 0xee, 0x8f, 0x71, 0xda, 0xc9,
0xef, 0x45, 0x43, 0x55, 0x8d, 0xd2, 0x75, 0x73, 0x0b, 0x2b, 0x62, 0x4d, 0x10, 0x03, 0x95, 0x4f,
0x38, 0x89, 0x9b, 0xd7, 0x44, 0x33, 0xae, 0x1d, 0xe8, 0xef, 0x32, 0x2b, 0x90, 0xb8, 0xf9, 0x8f,
0xbd, 0x45, 0x13, 0x89, 0x5b, 0xb7, 0x96, 0x73, 0xef, 0x0e, 0x68, 0xb2, 0xe7, 0x25, 0x5f, 0xc2,
0x32, 0x7d, 0x16, 0x6c, 0x1e, 0x44, 0x83, 0xb8, 0x77, 0xa7, 0x9f, 0xa6, 0x9d, 0x83, 0xcc, 0xde,
0x81, 0x3c, 0x9e, 0x86, 0xff, 0x2e, 0x87, 0x12, 0x12, 0x73, 0x50, 0x0b, 0x72, 0x7e, 0xcc, 0x73,
0xf2, 0xb2, 0x4c, 0x45, 0x9a, 0x2f, 0x66, 0x9c, 0x67, 0x70, 0xcb, 0x72, 0x3c, 0x19, 0xb9, 0x52,
0xea, 0xc7, 0x3c, 0x5b, 0x94, 0x9d, 0xe2, 0xc6, 0x93, 0xf1, 0x4a, 0xf0, 0xf3, 0x34, 0xcb, 0x40,
0xe4, 0x8c, 0x27, 0xa3, 0x46, 0x42, 0x44, 0x8e, 0x4f, 0x38, 0x3f, 0x41, 0x39, 0x91, 0xbb, 0xff,
0x7a, 0x07, 0xf4, 0x03, 0xa8, 0xe3, 0x08, 0xa9, 0x9f, 0xa0, 0x84, 0x90, 0xf3, 0x93, 0x9a, 0x13,
0xec, 0xc7, 0x45, 0xb6, 0xa0, 0x3a, 0x02, 0x51, 0x3f, 0xa9, 0x49, 0xc1, 0xce, 0x47, 0xc1, 0xc7,
0xab, 0xea, 0xc2, 0xdf, 0x32, 0x50, 0x8b, 0x43, 0x75, 0x43, 0xe9, 0x13, 0xf0, 0x13, 0x37, 0x3e,
0x3b, 0xf2, 0x60, 0xe2, 0x78, 0x5a, 0xa7, 0x92, 0x2a, 0xcc, 0xd3, 0xf7, 0xff, 0xf3, 0xab, 0x1b,
0x83, 0x9f, 0x7f, 0x75, 0x63, 0xf0, 0xdf, 0x5f, 0xdd, 0x18, 0xfc, 0xec, 0xeb, 0x1b, 0x6f, 0xfc,
0xfc, 0xeb, 0x1b, 0x6f, 0xfc, 0xd7, 0xd7, 0x37, 0xde, 0xf8, 0xf2, 0x4d, 0xfd, 0xa3, 0xf7, 0x67,
0xff, 0x4f, 0xfe, 0x74, 0xfd, 0x93, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x06, 0xe4, 0x0a, 0x54,
0x18, 0x7f, 0x00, 0x00,
// 5705 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x9d, 0x5f, 0x6f, 0x1d, 0x49,
0x56, 0xc0, 0xc7, 0x2f, 0x0c, 0xf4, 0xb2, 0x03, 0xdc, 0x81, 0x61, 0x76, 0xd8, 0x4d, 0x32, 0x99,
0xc4, 0x4e, 0xe2, 0xf8, 0x3a, 0x93, 0xcc, 0x3f, 0x76, 0x91, 0xe0, 0xc6, 0x8e, 0x3d, 0x77, 0xc7,
0x76, 0x8c, 0xef, 0x75, 0x22, 0x46, 0x42, 0xa2, 0x7d, 0xbb, 0x7c, 0xdd, 0xb8, 0x6f, 0x57, 0x6f,
0x77, 0x5d, 0x27, 0x77, 0x11, 0x08, 0x04, 0x02, 0x81, 0x40, 0xac, 0xf8, 0x27, 0x78, 0x42, 0xe2,
0x13, 0xf0, 0x31, 0x78, 0xdc, 0x47, 0x1e, 0xd1, 0xcc, 0xd7, 0x40, 0x02, 0x75, 0x75, 0xfd, 0x3d,
0x7d, 0x4e, 0x75, 0x7b, 0xf6, 0x29, 0x91, 0xcf, 0xef, 0x9c, 0x53, 0xd5, 0x75, 0xaa, 0xea, 0x54,
0x75, 0x75, 0xdd, 0xe8, 0x66, 0x71, 0xb6, 0x5d, 0x94, 0x5c, 0xf0, 0x6a, 0xbb, 0x62, 0xe5, 0x55,
0x3a, 0x63, 0xfa, 0xdf, 0xa1, 0xfc, 0xf3, 0xe0, 0xcd, 0x38, 0x5f, 0x89, 0x55, 0xc1, 0xde, 0x7b,
0xd7, 0x92, 0x33, 0xbe, 0x58, 0xc4, 0x79, 0x52, 0x35, 0xc8, 0x7b, 0xef, 0x58, 0x09, 0xbb, 0x62,
0xb9, 0x50, 0x7f, 0x7f, 0xfc, 0x7f, 0xff, 0xbb, 0x16, 0xbd, 0xb5, 0x93, 0xa5, 0x2c, 0x17, 0x3b,
0x4a, 0x63, 0xf0, 0x65, 0xf4, 0xed, 0x51, 0x51, 0xec, 0x33, 0xf1, 0x82, 0x95, 0x55, 0xca, 0xf3,
0xc1, 0x07, 0x43, 0xe5, 0x60, 0x78, 0x52, 0xcc, 0x86, 0xa3, 0xa2, 0x18, 0x5a, 0xe1, 0xf0, 0x84,
0xfd, 0x68, 0xc9, 0x2a, 0xf1, 0xde, 0x9d, 0x30, 0x54, 0x15, 0x3c, 0xaf, 0xd8, 0xe0, 0x3c, 0xfa,
0x95, 0x51, 0x51, 0x4c, 0x98, 0xd8, 0x65, 0x75, 0x05, 0x26, 0x22, 0x16, 0x6c, 0xb0, 0xd1, 0x52,
0xf5, 0x01, 0xe3, 0xe3, 0x5e, 0x37, 0xa8, 0xfc, 0x4c, 0xa3, 0x6f, 0xd5, 0x7e, 0x2e, 0x96, 0x22,
0xe1, 0xaf, 0xf2, 0xc1, 0xfb, 0x6d, 0x45, 0x25, 0x32, 0xb6, 0x6f, 0x87, 0x10, 0x65, 0xf5, 0x65,
0xf4, 0x8b, 0x2f, 0xe3, 0x2c, 0x63, 0x62, 0xa7, 0x64, 0x75, 0xc1, 0x7d, 0x9d, 0x46, 0x34, 0x6c,
0x64, 0xc6, 0xee, 0x07, 0x41, 0x46, 0x19, 0xfe, 0x32, 0xfa, 0x76, 0x23, 0x39, 0x61, 0x33, 0x7e,
0xc5, 0xca, 0x01, 0xaa, 0xa5, 0x84, 0xc4, 0x23, 0x6f, 0x41, 0xd0, 0xf6, 0x0e, 0xcf, 0xaf, 0x58,
0x29, 0x70, 0xdb, 0x4a, 0x18, 0xb6, 0x6d, 0x21, 0x65, 0xfb, 0xaf, 0xd7, 0xa2, 0xef, 0x8e, 0x66,
0x33, 0xbe, 0xcc, 0xc5, 0x01, 0x9f, 0xc5, 0xd9, 0x41, 0x9a, 0x5f, 0x1e, 0xb1, 0x57, 0x3b, 0x17,
0x35, 0x9f, 0xcf, 0xd9, 0xe0, 0x89, 0xff, 0x54, 0x1b, 0x74, 0x68, 0xd8, 0xa1, 0x0b, 0x1b, 0xdf,
0x1f, 0x5d, 0x4f, 0x49, 0x95, 0xe5, 0xef, 0xd7, 0xa2, 0x1b, 0xb0, 0x2c, 0x13, 0x9e, 0x5d, 0x31,
0x5b, 0x9a, 0x8f, 0x3b, 0x0c, 0xfb, 0xb8, 0x29, 0xcf, 0x27, 0xd7, 0x55, 0x53, 0x25, 0xca, 0xa2,
0xb7, 0xdd, 0x70, 0x99, 0xb0, 0x4a, 0x76, 0xa7, 0xfb, 0x74, 0x44, 0x28, 0xc4, 0x78, 0x7e, 0xd0,
0x07, 0x55, 0xde, 0xd2, 0x68, 0xa0, 0xbc, 0x65, 0xbc, 0x32, 0xce, 0xee, 0xa1, 0x16, 0x1c, 0xc2,
0xf8, 0xba, 0xdf, 0x83, 0x54, 0xae, 0xfe, 0x20, 0xfa, 0xa5, 0x97, 0xbc, 0xbc, 0xac, 0x8a, 0x78,
0xc6, 0x54, 0x57, 0xb8, 0xeb, 0x6b, 0x6b, 0x29, 0xec, 0x0d, 0xeb, 0x5d, 0x98, 0x13, 0xb4, 0x5a,
0xf8, 0xbc, 0x60, 0x70, 0x0c, 0xb2, 0x8a, 0xb5, 0x90, 0x0a, 0x5a, 0x08, 0x29, 0xdb, 0x97, 0xd1,
0xc0, 0xda, 0x3e, 0xfb, 0x43, 0x36, 0x13, 0xa3, 0x24, 0x81, 0xad, 0x62, 0x75, 0x25, 0x31, 0x1c,
0x25, 0x09, 0xd5, 0x2a, 0x38, 0xaa, 0x9c, 0xbd, 0x8a, 0xde, 0x01, 0xce, 0x0e, 0xd2, 0x4a, 0x3a,
0xdc, 0x0a, 0x5b, 0x51, 0x98, 0x71, 0x3a, 0xec, 0x8b, 0x2b, 0xc7, 0x7f, 0xba, 0x16, 0x7d, 0x07,
0xf1, 0x7c, 0xc2, 0x16, 0xfc, 0x8a, 0x0d, 0x1e, 0x75, 0x5b, 0x6b, 0x48, 0xe3, 0xff, 0xc3, 0x6b,
0x68, 0x20, 0x61, 0x32, 0x61, 0x19, 0x9b, 0x09, 0x32, 0x4c, 0x1a, 0x71, 0x67, 0x98, 0x18, 0xcc,
0xe9, 0x61, 0x5a, 0xb8, 0xcf, 0xc4, 0xce, 0xb2, 0x2c, 0x59, 0x2e, 0xc8, 0xb6, 0xb4, 0x48, 0x67,
0x5b, 0x7a, 0x28, 0x52, 0x9f, 0x7d, 0x26, 0x46, 0x59, 0x46, 0xd6, 0xa7, 0x11, 0x77, 0xd6, 0xc7,
0x60, 0xca, 0xc3, 0x2c, 0xfa, 0x65, 0xe7, 0x89, 0x89, 0x71, 0x7e, 0xce, 0x07, 0xf4, 0xb3, 0x90,
0x72, 0xe3, 0x63, 0xa3, 0x93, 0x43, 0xaa, 0xf1, 0xec, 0x75, 0xc1, 0x4b, 0xba, 0x59, 0x1a, 0x71,
0x67, 0x35, 0x0c, 0xa6, 0x3c, 0xfc, 0x7e, 0xf4, 0x96, 0x1a, 0x25, 0xf5, 0x7c, 0x76, 0x07, 0x1d,
0x42, 0xe1, 0x84, 0x76, 0xb7, 0x83, 0x6a, 0x99, 0x3f, 0x4c, 0xe7, 0x65, 0x3d, 0xfa, 0xe0, 0xe6,
0x95, 0xb4, 0xc3, 0xbc, 0xa5, 0x94, 0x79, 0x1e, 0xfd, 0xaa, 0x6f, 0x7e, 0x27, 0xce, 0x67, 0x2c,
0x1b, 0x3c, 0x08, 0xa9, 0x37, 0x8c, 0x71, 0xb5, 0xd9, 0x8b, 0xb5, 0x83, 0x9d, 0x22, 0xd4, 0x60,
0xfa, 0x01, 0xaa, 0x0d, 0x86, 0xd2, 0x3b, 0x61, 0xa8, 0x65, 0x7b, 0x97, 0x65, 0x8c, 0xb4, 0xdd,
0x08, 0x3b, 0x6c, 0x1b, 0x48, 0xd9, 0x2e, 0xa3, 0x5f, 0x33, 0xcd, 0x5c, 0xe7, 0x05, 0x52, 0x5e,
0x4f, 0x3a, 0x9b, 0x44, 0x3b, 0xba, 0x90, 0xf1, 0xf5, 0xb0, 0x1f, 0xdc, 0xaa, 0x8f, 0x1a, 0x51,
0xf0, 0xfa, 0x80, 0xf1, 0xe4, 0x4e, 0x18, 0x52, 0xb6, 0xff, 0x66, 0x2d, 0xfa, 0x9e, 0x92, 0x3d,
0xcb, 0xe3, 0xb3, 0x8c, 0xc9, 0x29, 0xfe, 0x88, 0x89, 0x57, 0xbc, 0xbc, 0x9c, 0xac, 0xf2, 0x19,
0x91, 0xce, 0xe0, 0x70, 0x47, 0x3a, 0x43, 0x2a, 0xa9, 0xc2, 0xfc, 0x51, 0xf4, 0xae, 0x0e, 0x8a,
0x8b, 0x38, 0x9f, 0xb3, 0x1f, 0x56, 0x3c, 0x1f, 0x15, 0xe9, 0x28, 0x49, 0xca, 0xc1, 0x10, 0x6f,
0x7a, 0xc8, 0x99, 0x12, 0x6c, 0xf7, 0xe6, 0x9d, 0xf4, 0x59, 0x3d, 0x65, 0xc1, 0x0b, 0x98, 0x3e,
0xeb, 0xc7, 0x27, 0x78, 0x41, 0xa5, 0xcf, 0x3e, 0xd2, 0xb2, 0x7a, 0x58, 0xcf, 0x41, 0xb8, 0xd5,
0x43, 0x77, 0xd2, 0xb9, 0x1d, 0x42, 0xec, 0x1c, 0xa0, 0x1f, 0x14, 0xcf, 0xcf, 0xd3, 0xf9, 0x69,
0x91, 0xd4, 0x7d, 0xe8, 0x3e, 0x5e, 0x67, 0x07, 0x21, 0xe6, 0x00, 0x02, 0x55, 0xde, 0xfe, 0xce,
0x66, 0x99, 0x6a, 0x5c, 0xda, 0x2b, 0xf9, 0xe2, 0x80, 0xcd, 0xe3, 0xd9, 0x4a, 0x0d, 0xa6, 0x1f,
0x85, 0x46, 0x31, 0x48, 0x9b, 0x42, 0x7c, 0x7c, 0x4d, 0x2d, 0x55, 0x9e, 0x7f, 0x5f, 0x8b, 0xee,
0x78, 0x71, 0xa2, 0x82, 0xa9, 0x29, 0xfd, 0x28, 0x4f, 0x4e, 0x58, 0x25, 0xe2, 0x52, 0x0c, 0xbe,
0x1f, 0x88, 0x01, 0x42, 0xc7, 0x94, 0xed, 0x07, 0xdf, 0x48, 0xd7, 0xb6, 0xfa, 0xa4, 0x9e, 0x25,
0xd4, 0xf8, 0xe3, 0xb7, 0xba, 0x94, 0xc0, 0xd1, 0xe7, 0x76, 0x08, 0xb1, 0xad, 0x2e, 0x05, 0xe3,
0xfc, 0x2a, 0x15, 0x6c, 0x9f, 0xe5, 0xac, 0x6c, 0xb7, 0x7a, 0xa3, 0xea, 0x23, 0x44, 0xab, 0x13,
0xa8, 0x1d, 0xe9, 0x3c, 0x6f, 0x26, 0xd3, 0xd8, 0x0c, 0x18, 0x69, 0xe5, 0x1a, 0x0f, 0xfb, 0xc1,
0x44, 0x0d, 0xc5, 0x7e, 0x6d, 0x24, 0x58, 0xc3, 0x06, 0xe9, 0x55, 0x43, 0x83, 0xda, 0x85, 0xb9,
0xe3, 0xed, 0x84, 0x5d, 0xf1, 0x4b, 0xb8, 0x30, 0x77, 0x0d, 0x34, 0x00, 0xb1, 0x30, 0x47, 0x41,
0x9b, 0x7c, 0x38, 0x7e, 0x5e, 0xa4, 0xec, 0x15, 0x48, 0x3e, 0x5c, 0xe5, 0x5a, 0x4c, 0x24, 0x1f,
0x08, 0xa6, 0x3c, 0x1c, 0x45, 0xbf, 0x20, 0x85, 0x3f, 0xe4, 0x69, 0x3e, 0xb8, 0x89, 0x28, 0xd5,
0x02, 0x63, 0xf5, 0x16, 0x0d, 0x80, 0x12, 0xd7, 0x7f, 0x55, 0x99, 0xc0, 0x5d, 0x42, 0x09, 0x24,
0x01, 0xeb, 0x5d, 0x98, 0xcd, 0xfa, 0xa4, 0xb0, 0x1e, 0x2d, 0x27, 0x17, 0x71, 0x99, 0xe6, 0xf3,
0x01, 0xa6, 0xeb, 0xc8, 0x89, 0xac, 0x0f, 0xe3, 0x40, 0x38, 0x29, 0xc5, 0x51, 0x51, 0x94, 0xf5,
0x20, 0x8c, 0x85, 0x93, 0x8f, 0x04, 0xc3, 0xa9, 0x85, 0xe2, 0xde, 0x76, 0xd9, 0x2c, 0x4b, 0xf3,
0xa0, 0x37, 0x85, 0xf4, 0xf1, 0x66, 0x51, 0x10, 0xbc, 0x07, 0x2c, 0xbe, 0x62, 0xba, 0x66, 0xd8,
0x93, 0x71, 0x81, 0x60, 0xf0, 0x02, 0xd0, 0x2e, 0xb1, 0xa5, 0xf8, 0x30, 0xbe, 0x64, 0xf5, 0x03,
0x66, 0xf5, 0x14, 0x3e, 0xc0, 0xf4, 0x3d, 0x82, 0x58, 0x62, 0xe3, 0xa4, 0x72, 0xb5, 0x8c, 0xde,
0x91, 0xf2, 0xe3, 0xb8, 0x14, 0xe9, 0x2c, 0x2d, 0xe2, 0x5c, 0x2f, 0xdd, 0xb0, 0x51, 0xa4, 0x45,
0x19, 0x97, 0x5b, 0x3d, 0x69, 0xe5, 0xf6, 0x5f, 0xd6, 0xa2, 0xf7, 0xa1, 0xdf, 0x63, 0x56, 0x2e,
0x52, 0xb9, 0x03, 0x50, 0x35, 0x43, 0xfe, 0xe0, 0xd3, 0xb0, 0xd1, 0x96, 0x82, 0x29, 0xcd, 0x67,
0xd7, 0x57, 0xb4, 0x79, 0xdf, 0x44, 0xad, 0x8a, 0x9e, 0x97, 0x49, 0x6b, 0x87, 0x6c, 0xa2, 0x97,
0x3a, 0x52, 0x48, 0xe4, 0x7d, 0x2d, 0x08, 0xf4, 0xf0, 0xd3, 0xbc, 0xd2, 0xd6, 0xb1, 0x1e, 0x6e,
0xc5, 0xc1, 0x1e, 0xee, 0x61, 0xb6, 0x87, 0x1f, 0x2f, 0xcf, 0xb2, 0xb4, 0xba, 0x48, 0xf3, 0xb9,
0x4a, 0xf2, 0x7d, 0x5d, 0x2b, 0x86, 0x79, 0xfe, 0x46, 0x27, 0x87, 0x39, 0x51, 0xc1, 0x42, 0x3a,
0x01, 0x61, 0xb2, 0xd1, 0xc9, 0xd9, 0xb5, 0x97, 0x95, 0xd6, 0x8b, 0x7e, 0xb0, 0xf6, 0x72, 0x54,
0x6b, 0x29, 0xb1, 0xf6, 0x6a, 0x53, 0x76, 0xed, 0xe5, 0xd6, 0xa1, 0xe2, 0xd9, 0x15, 0x3b, 0x2d,
0x53, 0xb0, 0xf6, 0xf2, 0xca, 0xa7, 0x19, 0x62, 0xed, 0x45, 0xb1, 0x76, 0xa0, 0xb2, 0xc4, 0x3e,
0x13, 0x13, 0x11, 0x8b, 0x65, 0x05, 0x06, 0x2a, 0xc7, 0x86, 0x41, 0x88, 0x81, 0x8a, 0x40, 0x95,
0xb7, 0xdf, 0x8d, 0xa2, 0x66, 0xbf, 0x44, 0xee, 0x69, 0xf9, 0x73, 0x8f, 0xda, 0x48, 0xf1, 0x36,
0xb4, 0xde, 0x0f, 0x10, 0x36, 0xbd, 0x6a, 0xfe, 0x2e, 0xb7, 0xea, 0x06, 0xa8, 0x86, 0x14, 0x11,
0xe9, 0x15, 0x40, 0x60, 0x41, 0x27, 0x17, 0xfc, 0x15, 0x5e, 0xd0, 0x5a, 0x12, 0x2e, 0xa8, 0x22,
0xec, 0xe6, 0xb9, 0x2a, 0x28, 0xb6, 0x79, 0xae, 0x8b, 0x11, 0xda, 0x3c, 0x87, 0x8c, 0x8d, 0x19,
0xd7, 0xf0, 0x53, 0xce, 0x2f, 0x17, 0x71, 0x79, 0x09, 0x62, 0xc6, 0x53, 0xd6, 0x0c, 0x11, 0x33,
0x14, 0x6b, 0x63, 0xc6, 0x75, 0x58, 0x27, 0xe7, 0xa7, 0x65, 0x06, 0x62, 0xc6, 0xb3, 0xa1, 0x10,
0x22, 0x66, 0x08, 0xd4, 0x8e, 0x4e, 0xae, 0xb7, 0x09, 0x83, 0xdb, 0x35, 0x9e, 0xfa, 0x84, 0x51,
0xdb, 0x35, 0x08, 0x06, 0x43, 0x68, 0xbf, 0x8c, 0x8b, 0x0b, 0x3c, 0x84, 0xa4, 0x28, 0x1c, 0x42,
0x1a, 0x81, 0xed, 0x3d, 0x61, 0x71, 0x39, 0xbb, 0xc0, 0xdb, 0xbb, 0x91, 0x85, 0xdb, 0xdb, 0x30,
0xb0, 0xbd, 0x1b, 0xc1, 0xcb, 0x54, 0x5c, 0x1c, 0x32, 0x11, 0xe3, 0xed, 0xed, 0x33, 0xe1, 0xf6,
0x6e, 0xb1, 0x36, 0xfb, 0x77, 0x1d, 0x4e, 0x96, 0x67, 0xd5, 0xac, 0x4c, 0xcf, 0xd8, 0x20, 0x60,
0xc5, 0x40, 0x44, 0xf6, 0x4f, 0xc2, 0xca, 0xe7, 0x4f, 0xd6, 0xa2, 0x9b, 0xba, 0xd9, 0x79, 0x55,
0xa9, 0xb9, 0xcf, 0x77, 0xff, 0x31, 0xde, 0xbe, 0x04, 0x4e, 0xbc, 0xce, 0xe8, 0xa1, 0xe6, 0xe4,
0x06, 0x78, 0x91, 0x4e, 0xf3, 0xca, 0x14, 0xea, 0xd3, 0x3e, 0xd6, 0x1d, 0x05, 0x22, 0x37, 0xe8,
0xa5, 0x68, 0xd3, 0x32, 0xd5, 0x3e, 0x5a, 0x36, 0x4e, 0x2a, 0x90, 0x96, 0xe9, 0xe7, 0xed, 0x10,
0x44, 0x5a, 0x86, 0x93, 0x30, 0x14, 0xf6, 0x4b, 0xbe, 0x2c, 0xaa, 0x8e, 0x50, 0x00, 0x50, 0x38,
0x14, 0xda, 0xb0, 0xf2, 0xf9, 0x3a, 0xfa, 0x75, 0x37, 0xfc, 0xdc, 0x87, 0xbd, 0x45, 0xc7, 0x14,
0xf6, 0x88, 0x87, 0x7d, 0x71, 0x9b, 0x51, 0x68, 0xcf, 0x62, 0x97, 0x89, 0x38, 0xcd, 0xaa, 0xc1,
0x3a, 0x6e, 0x43, 0xcb, 0x89, 0x8c, 0x02, 0xe3, 0xe0, 0xf8, 0xb6, 0xbb, 0x2c, 0xb2, 0x74, 0xd6,
0x7e, 0x99, 0xa4, 0x74, 0x8d, 0x38, 0x3c, 0xbe, 0xb9, 0x18, 0x1c, 0xaf, 0xeb, 0xd4, 0x4f, 0xfe,
0x67, 0xba, 0x2a, 0x18, 0x3e, 0x5e, 0x7b, 0x48, 0x78, 0xbc, 0x86, 0x28, 0xac, 0xcf, 0x84, 0x89,
0x83, 0x78, 0xc5, 0x97, 0xc4, 0x78, 0x6d, 0xc4, 0xe1, 0xfa, 0xb8, 0x98, 0x5d, 0x1b, 0x18, 0x0f,
0xe3, 0x5c, 0xb0, 0x32, 0x8f, 0xb3, 0xbd, 0x2c, 0x9e, 0x57, 0x03, 0x62, 0x8c, 0xf1, 0x29, 0x62,
0x6d, 0x40, 0xd3, 0xc8, 0x63, 0x1c, 0x57, 0x7b, 0xf1, 0x15, 0x2f, 0x53, 0x41, 0x3f, 0x46, 0x8b,
0x74, 0x3e, 0x46, 0x0f, 0x45, 0xbd, 0x8d, 0xca, 0xd9, 0x45, 0x7a, 0xc5, 0x92, 0x80, 0x37, 0x8d,
0xf4, 0xf0, 0xe6, 0xa0, 0x48, 0xa3, 0x4d, 0xf8, 0xb2, 0x9c, 0x31, 0xb2, 0xd1, 0x1a, 0x71, 0x67,
0xa3, 0x19, 0x4c, 0x79, 0xf8, 0x8b, 0xb5, 0xe8, 0x37, 0x1a, 0xa9, 0xfb, 0x86, 0x67, 0x37, 0xae,
0x2e, 0xce, 0x78, 0x5c, 0x26, 0x83, 0x0f, 0x31, 0x3b, 0x28, 0x6a, 0x5c, 0x3f, 0xbe, 0x8e, 0x0a,
0x7c, 0xac, 0x75, 0xde, 0x6d, 0x7b, 0x1c, 0xfa, 0x58, 0x3d, 0x24, 0xfc, 0x58, 0x21, 0x0a, 0x07,
0x10, 0x29, 0x6f, 0x36, 0x00, 0xd7, 0x49, 0x7d, 0x7f, 0x17, 0x70, 0xa3, 0x93, 0x83, 0xe3, 0x63,
0x2d, 0xf4, 0xa3, 0x65, 0x8b, 0xb2, 0x81, 0x47, 0xcc, 0xb0, 0x2f, 0x4e, 0x7a, 0x36, 0xbd, 0x22,
0xec, 0xb9, 0xd5, 0x33, 0x86, 0x7d, 0x71, 0xc2, 0xb3, 0x33, 0xac, 0x85, 0x3c, 0x23, 0x43, 0xdb,
0xb0, 0x2f, 0x0e, 0xb3, 0x2f, 0xc5, 0xe8, 0x79, 0xe1, 0x41, 0xc0, 0x0e, 0x9c, 0x1b, 0x36, 0x7b,
0xb1, 0xca, 0xe1, 0x5f, 0xad, 0x45, 0xdf, 0xb5, 0x1e, 0x0f, 0x79, 0x92, 0x9e, 0xaf, 0x1a, 0xe8,
0x45, 0x9c, 0x2d, 0x59, 0x35, 0x78, 0x4c, 0x59, 0x6b, 0xb3, 0xa6, 0x04, 0x4f, 0xae, 0xa5, 0x03,
0xfb, 0xce, 0xa8, 0x28, 0xb2, 0xd5, 0x94, 0x2d, 0x8a, 0x8c, 0xec, 0x3b, 0x1e, 0x12, 0xee, 0x3b,
0x10, 0x85, 0x59, 0xf9, 0x94, 0xd7, 0x39, 0x3f, 0x9a, 0x95, 0x4b, 0x51, 0x38, 0x2b, 0xd7, 0x08,
0xcc, 0x95, 0xa6, 0x7c, 0x87, 0x67, 0x19, 0x9b, 0x89, 0xf6, 0x29, 0x11, 0xa3, 0x69, 0x89, 0x70,
0xae, 0x04, 0x48, 0xbb, 0x2b, 0xa7, 0xd7, 0x90, 0x71, 0xc9, 0x9e, 0xae, 0x0e, 0xd2, 0xfc, 0x72,
0x80, 0xa7, 0x05, 0x16, 0x20, 0x76, 0xe5, 0x50, 0x10, 0xae, 0x55, 0x4f, 0xf3, 0x84, 0xe3, 0x6b,
0xd5, 0x5a, 0x12, 0x5e, 0xab, 0x2a, 0x02, 0x9a, 0x3c, 0x61, 0x94, 0xc9, 0x5a, 0x12, 0x36, 0xa9,
0x08, 0x6c, 0x28, 0x54, 0x6f, 0x8a, 0xc8, 0xa1, 0x10, 0xbc, 0x1b, 0xda, 0xe8, 0xe4, 0x60, 0x84,
0xea, 0x45, 0xeb, 0x1e, 0x13, 0xb3, 0x0b, 0x3c, 0x42, 0x3d, 0x24, 0x1c, 0xa1, 0x10, 0x85, 0x55,
0x9a, 0x72, 0xb3, 0xe8, 0x5e, 0xc7, 0xe3, 0xa3, 0xb5, 0xe0, 0xde, 0xe8, 0xe4, 0xe0, 0x32, 0x72,
0xbc, 0x90, 0xcf, 0x0c, 0x0d, 0xf2, 0x46, 0x16, 0x5e, 0x46, 0x1a, 0x06, 0x96, 0xbe, 0x11, 0xc8,
0xbd, 0xac, 0x75, 0x5a, 0xd1, 0xdb, 0xcd, 0xda, 0xe8, 0xe4, 0x94, 0x93, 0x7f, 0x32, 0xcb, 0xb8,
0x46, 0x7a, 0xc4, 0xeb, 0x3e, 0xf2, 0x22, 0xce, 0xd2, 0x24, 0x16, 0x6c, 0xca, 0x2f, 0x59, 0x8e,
0xaf, 0x98, 0x54, 0x69, 0x1b, 0x7e, 0xe8, 0x29, 0x84, 0x57, 0x4c, 0x61, 0x45, 0x18, 0x27, 0x0d,
0x7d, 0x5a, 0xb1, 0x9d, 0xb8, 0x22, 0x46, 0x32, 0x0f, 0x09, 0xc7, 0x09, 0x44, 0x61, 0xbe, 0xda,
0xc8, 0x9f, 0xbd, 0x2e, 0x58, 0x99, 0xb2, 0x7c, 0xc6, 0xf0, 0x7c, 0x15, 0x52, 0xe1, 0x7c, 0x15,
0xa1, 0xe1, 0x5a, 0x6d, 0x37, 0x16, 0xec, 0xe9, 0x6a, 0x9a, 0x2e, 0x58, 0x25, 0xe2, 0x45, 0x81,
0xaf, 0xd5, 0x00, 0x14, 0x5e, 0xab, 0xb5, 0xe1, 0xd6, 0xd6, 0x90, 0x19, 0x10, 0xdb, 0x87, 0xcb,
0x20, 0x11, 0x38, 0x5c, 0x46, 0xa0, 0xf0, 0xc1, 0x5a, 0x00, 0x7d, 0x49, 0xd0, 0xb2, 0x12, 0x7c,
0x49, 0x40, 0xd3, 0xad, 0x0d, 0x37, 0xc3, 0x4c, 0xea, 0xae, 0xd9, 0x51, 0xf4, 0x89, 0xdb, 0x45,
0x37, 0x7b, 0xb1, 0xf8, 0x0e, 0xdf, 0x09, 0xcb, 0x62, 0x39, 0x6d, 0x05, 0xb6, 0xd1, 0x34, 0xd3,
0x67, 0x87, 0xcf, 0x61, 0x95, 0xc3, 0x3f, 0x5b, 0x8b, 0xde, 0xc3, 0x3c, 0x3e, 0x2f, 0xa4, 0xdf,
0x47, 0xdd, 0xb6, 0x1a, 0x92, 0x38, 0x3d, 0x17, 0xd6, 0xb0, 0x07, 0x40, 0xb4, 0xc8, 0x1e, 0xae,
0x53, 0x05, 0xf0, 0x93, 0x36, 0x53, 0x7e, 0xc8, 0x11, 0x07, 0x40, 0x42, 0xbc, 0x5d, 0x0f, 0xf9,
0xe5, 0xaa, 0xc0, 0x7a, 0xc8, 0xd8, 0x50, 0x62, 0x62, 0x3d, 0x84, 0x60, 0xb6, 0x77, 0xba, 0xd5,
0x7b, 0x99, 0x8a, 0x0b, 0x99, 0x6f, 0x81, 0xde, 0xe9, 0x95, 0xd5, 0x40, 0x44, 0xef, 0x24, 0x61,
0x98, 0x91, 0x68, 0xb0, 0xee, 0x9b, 0xd8, 0x58, 0x6e, 0x0c, 0xb9, 0x3d, 0xf3, 0x5e, 0x37, 0x08,
0xe3, 0x55, 0x8b, 0xd5, 0xd2, 0xe7, 0x41, 0xc8, 0x02, 0x58, 0xfe, 0x6c, 0xf6, 0x62, 0x95, 0xc3,
0x3f, 0x89, 0xbe, 0xd3, 0xaa, 0xd8, 0x1e, 0x8b, 0xc5, 0xb2, 0x64, 0xc9, 0x60, 0xbb, 0xa3, 0xdc,
0x1a, 0x34, 0xae, 0x1f, 0xf5, 0x57, 0x68, 0xe5, 0xe8, 0x9a, 0x6b, 0xc2, 0xca, 0x94, 0xe1, 0x71,
0xc8, 0xa4, 0xcf, 0x06, 0x73, 0x74, 0x5a, 0xa7, 0xb5, 0xcc, 0x76, 0xa3, 0x6b, 0x74, 0x15, 0xa7,
0x99, 0x7c, 0x59, 0xfb, 0x61, 0xc8, 0xa8, 0x87, 0x06, 0x97, 0xd9, 0xa4, 0x4a, 0x6b, 0x64, 0x96,
0x7d, 0xdc, 0x59, 0x9e, 0x3d, 0xa4, 0x47, 0x02, 0x64, 0x75, 0xb6, 0xd5, 0x93, 0x56, 0x6e, 0x85,
0x9e, 0xf2, 0xea, 0x3f, 0xbb, 0x41, 0x8e, 0x79, 0x55, 0xaa, 0x48, 0xa4, 0x6f, 0xf5, 0xa4, 0x95,
0xd7, 0x3f, 0x8e, 0xde, 0x6d, 0x7b, 0x55, 0x13, 0xd1, 0x76, 0xa7, 0x29, 0x30, 0x17, 0x3d, 0xea,
0xaf, 0xa0, 0xdc, 0xff, 0xab, 0xd9, 0x97, 0x6e, 0xfc, 0xcf, 0xf8, 0x62, 0xc1, 0xf2, 0x84, 0x25,
0x5a, 0xa3, 0xaa, 0xd7, 0x4f, 0x9f, 0xd1, 0x76, 0x8d, 0xc2, 0xd0, 0xd5, 0x30, 0x25, 0xfa, 0xcd,
0x6f, 0xa0, 0xa9, 0x8a, 0xf6, 0x9f, 0x6b, 0xd1, 0x7d, 0xb4, 0x68, 0x3a, 0x70, 0xbd, 0x22, 0xfe,
0x4e, 0x1f, 0x47, 0x98, 0xa6, 0x29, 0xea, 0xe8, 0x67, 0xb0, 0xa0, 0x8a, 0xfc, 0x6f, 0x6b, 0xd1,
0x6d, 0xab, 0x58, 0x87, 0xf7, 0x0e, 0xcf, 0xcf, 0xb3, 0x74, 0x26, 0xe4, 0x1b, 0x59, 0xa5, 0x42,
0x3f, 0x4e, 0x4a, 0xa3, 0xfb, 0x71, 0x06, 0x34, 0xed, 0xe2, 0xf5, 0xf3, 0xb4, 0x12, 0xbc, 0x5c,
0x4d, 0x2e, 0xf8, 0x2b, 0xfd, 0x79, 0x92, 0x3f, 0x2e, 0x2b, 0x60, 0xe8, 0x10, 0xc4, 0xe2, 0x15,
0x27, 0x5b, 0xae, 0xec, 0x67, 0x4c, 0x15, 0xe1, 0xca, 0x21, 0x3a, 0x5c, 0xf9, 0xa4, 0x9d, 0x95,
0x74, 0xad, 0xec, 0x37, 0x57, 0x1b, 0x78, 0x51, 0xdb, 0xdf, 0x5d, 0xdd, 0xeb, 0x06, 0x6d, 0x6e,
0xaa, 0xc4, 0xbb, 0xe9, 0xf9, 0xb9, 0xa9, 0x13, 0x5e, 0x52, 0x17, 0x21, 0x72, 0x53, 0x02, 0xb5,
0xcb, 0xab, 0xbd, 0x34, 0x63, 0xf2, 0xdd, 0xcd, 0xf3, 0xf3, 0xf3, 0x8c, 0xc7, 0x09, 0x58, 0x5e,
0xd5, 0xe2, 0xa1, 0x2b, 0x27, 0x96, 0x57, 0x18, 0x67, 0x4f, 0x85, 0xd4, 0xd2, 0x3a, 0xba, 0xf3,
0x59, 0x9a, 0xc1, 0xd3, 0xcd, 0x52, 0xd3, 0x08, 0x89, 0x53, 0x21, 0x2d, 0xc8, 0xa6, 0x40, 0xb5,
0xa8, 0x8e, 0x4a, 0x5d, 0xfe, 0xbb, 0x6d, 0x45, 0x47, 0x4c, 0xa4, 0x40, 0x08, 0x66, 0x77, 0x19,
0x6a, 0xe1, 0x69, 0x21, 0x8d, 0xdf, 0x6a, 0x6b, 0x35, 0x12, 0x62, 0x97, 0xc1, 0x27, 0xec, 0x6a,
0xb9, 0xfe, 0xfb, 0x2e, 0x7f, 0x95, 0x4b, 0xa3, 0xb7, 0xdb, 0x2a, 0x5a, 0x46, 0xac, 0x96, 0x21,
0xa3, 0x0c, 0x7f, 0x11, 0xfd, 0xbc, 0x34, 0x5c, 0xf2, 0x62, 0x70, 0x03, 0x51, 0x28, 0x9d, 0xb3,
0xc0, 0x37, 0x49, 0xb9, 0x3d, 0x44, 0x62, 0x62, 0xe3, 0xb4, 0x8a, 0xe7, 0xf0, 0x00, 0xbf, 0x6d,
0x71, 0x29, 0x25, 0x0e, 0x91, 0xb4, 0x29, 0x3f, 0x2a, 0x8e, 0x78, 0xa2, 0xac, 0x23, 0x35, 0x34,
0xc2, 0x50, 0x54, 0xb8, 0x90, 0x4d, 0x5b, 0x8f, 0xe2, 0xab, 0x74, 0x6e, 0x52, 0x8b, 0x66, 0x00,
0xab, 0x40, 0xda, 0x6a, 0x99, 0xa1, 0x03, 0x11, 0x69, 0x2b, 0x09, 0x2b, 0x9f, 0xff, 0xb8, 0x16,
0xdd, 0xb2, 0xcc, 0xbe, 0xde, 0x97, 0x1d, 0xe7, 0xe7, 0xbc, 0x4e, 0x72, 0x0f, 0xd2, 0xfc, 0xb2,
0x1a, 0x7c, 0x42, 0x99, 0xc4, 0x79, 0x53, 0x94, 0x4f, 0xaf, 0xad, 0x67, 0xd7, 0x27, 0x7a, 0xd3,
0xd2, 0x9e, 0x5c, 0x68, 0x34, 0xc0, 0xfa, 0xc4, 0xec, 0x6d, 0x42, 0x8e, 0x58, 0x9f, 0x84, 0x78,
0xdb, 0xc4, 0xc6, 0x79, 0xc6, 0x73, 0xd8, 0xc4, 0xd6, 0x42, 0x2d, 0x24, 0x9a, 0xb8, 0x05, 0xd9,
0xf1, 0x58, 0x8b, 0x9a, 0xfd, 0xb5, 0x51, 0x96, 0x81, 0xf1, 0xd8, 0xa8, 0x1a, 0x80, 0x18, 0x8f,
0x51, 0x50, 0xf9, 0x39, 0x89, 0xbe, 0x55, 0x3f, 0xd2, 0xe3, 0x92, 0x5d, 0xa5, 0x0c, 0x1e, 0xb2,
0x71, 0x24, 0x44, 0xff, 0xf7, 0x09, 0xdb, 0xb3, 0x4e, 0xf3, 0xaa, 0xc8, 0xe2, 0xea, 0x42, 0x1d,
0xbb, 0xf0, 0xeb, 0xac, 0x85, 0xf0, 0xe0, 0xc5, 0xdd, 0x0e, 0xca, 0x0e, 0xea, 0x5a, 0x66, 0x86,
0x98, 0x75, 0x5c, 0xb5, 0x35, 0xcc, 0x6c, 0x74, 0x72, 0xf6, 0xdd, 0xc6, 0x7e, 0x9c, 0x65, 0xac,
0x5c, 0x69, 0xd9, 0x61, 0x9c, 0xa7, 0xe7, 0xac, 0x12, 0xe0, 0xdd, 0x86, 0xa2, 0x86, 0x10, 0x23,
0xde, 0x6d, 0x04, 0x70, 0xbb, 0x6e, 0x03, 0x9e, 0xc7, 0x79, 0xc2, 0x5e, 0x83, 0x75, 0x1b, 0xb4,
0x23, 0x19, 0x62, 0xdd, 0x46, 0xb1, 0x76, 0x8f, 0xff, 0x69, 0xc6, 0x67, 0x97, 0x6a, 0x0a, 0xf0,
0x1b, 0x58, 0x4a, 0xe0, 0x1c, 0x70, 0x3b, 0x84, 0xd8, 0x49, 0x40, 0x0a, 0x4e, 0x58, 0x91, 0xc5,
0x33, 0x78, 0xd2, 0xaa, 0xd1, 0x51, 0x32, 0x62, 0x12, 0x80, 0x0c, 0x28, 0xae, 0x3a, 0xc1, 0x85,
0x15, 0x17, 0x1c, 0xe0, 0xba, 0x1d, 0x42, 0xec, 0x34, 0x28, 0x05, 0x93, 0x22, 0x4b, 0x05, 0xe8,
0x06, 0x8d, 0x86, 0x94, 0x10, 0xdd, 0xc0, 0x27, 0x80, 0xc9, 0x43, 0x56, 0xce, 0x19, 0x6a, 0x52,
0x4a, 0x82, 0x26, 0x35, 0x61, 0x8f, 0x95, 0x37, 0x75, 0xe7, 0xc5, 0x0a, 0x1c, 0x2b, 0x57, 0xd5,
0xe2, 0xc5, 0x8a, 0x38, 0x56, 0xee, 0x01, 0xa0, 0x88, 0xc7, 0x71, 0x25, 0xf0, 0x22, 0x4a, 0x49,
0xb0, 0x88, 0x9a, 0xb0, 0x73, 0x74, 0x53, 0xc4, 0xa5, 0x00, 0x73, 0xb4, 0x2a, 0x80, 0x73, 0xd6,
0xe0, 0x26, 0x29, 0xb7, 0x23, 0x49, 0xd3, 0x2a, 0x4c, 0xec, 0xa5, 0x2c, 0x4b, 0x2a, 0x30, 0x92,
0xa8, 0xe7, 0xae, 0xa5, 0xc4, 0x48, 0xd2, 0xa6, 0x40, 0x28, 0xa9, 0x37, 0x21, 0x58, 0xed, 0xc0,
0x4b, 0x90, 0xdb, 0x21, 0xc4, 0x8e, 0x4f, 0xba, 0xd0, 0x3b, 0x71, 0x59, 0xa6, 0xf5, 0xe4, 0xbf,
0x8e, 0x17, 0x48, 0xcb, 0x89, 0xf1, 0x09, 0xe3, 0x40, 0xf7, 0xd2, 0x03, 0x37, 0x56, 0x30, 0x38,
0x74, 0x7f, 0x10, 0x64, 0x6c, 0xc6, 0x29, 0x25, 0xce, 0xcb, 0x72, 0xec, 0x69, 0x22, 0xef, 0xca,
0xd7, 0xbb, 0x30, 0xe7, 0x0b, 0x37, 0xe3, 0xe2, 0x90, 0x5f, 0xb1, 0x29, 0x7f, 0xf6, 0x3a, 0xad,
0xea, 0xe5, 0x96, 0x9a, 0xb9, 0x9f, 0x10, 0x96, 0x30, 0x98, 0xf8, 0xc2, 0xad, 0x53, 0xc9, 0x26,
0x10, 0xa0, 0x2c, 0x47, 0xec, 0x15, 0x9a, 0x40, 0x40, 0x8b, 0x86, 0x23, 0x12, 0x88, 0x10, 0x6f,
0x77, 0xcc, 0x8c, 0x73, 0x75, 0xad, 0xc1, 0x94, 0xeb, 0x5c, 0x8e, 0xb2, 0x06, 0x41, 0x62, 0xd3,
0x22, 0xa8, 0x60, 0xd7, 0x97, 0xc6, 0xbf, 0xed, 0x62, 0xf7, 0x08, 0x3b, 0xed, 0x6e, 0x76, 0xbf,
0x07, 0x89, 0xb8, 0xb2, 0x27, 0x3e, 0x28, 0x57, 0xed, 0x03, 0x1f, 0xf7, 0x7b, 0x90, 0xce, 0xee,
0x9b, 0x5b, 0xad, 0xa7, 0xf1, 0xec, 0x72, 0x5e, 0xf2, 0x65, 0x9e, 0xec, 0xf0, 0x8c, 0x97, 0x60,
0xf7, 0xcd, 0x2b, 0x35, 0x40, 0x89, 0xdd, 0xb7, 0x0e, 0x15, 0x9b, 0xc1, 0xb9, 0xa5, 0x18, 0x65,
0xe9, 0x1c, 0xae, 0xa8, 0x3d, 0x43, 0x12, 0x20, 0x32, 0x38, 0x14, 0x44, 0x82, 0xa8, 0x59, 0x71,
0x8b, 0x74, 0x16, 0x67, 0x8d, 0xbf, 0x6d, 0xda, 0x8c, 0x07, 0x76, 0x06, 0x11, 0xa2, 0x80, 0xd4,
0x73, 0xba, 0x2c, 0xf3, 0x71, 0x2e, 0x38, 0x59, 0x4f, 0x0d, 0x74, 0xd6, 0xd3, 0x01, 0xc1, 0xb0,
0x3a, 0x65, 0xaf, 0xeb, 0xd2, 0xd4, 0xff, 0x60, 0xc3, 0x6a, 0xfd, 0xf7, 0xa1, 0x92, 0x87, 0x86,
0x55, 0xc0, 0x81, 0xca, 0x28, 0x27, 0x4d, 0xc0, 0x04, 0xb4, 0xfd, 0x30, 0xb9, 0xd7, 0x0d, 0xe2,
0x7e, 0x26, 0x62, 0x95, 0xb1, 0x90, 0x1f, 0x09, 0xf4, 0xf1, 0xa3, 0x41, 0xbb, 0xdd, 0xe2, 0xd5,
0xe7, 0x82, 0xcd, 0x2e, 0x5b, 0x07, 0xd8, 0xfc, 0x82, 0x36, 0x08, 0xb1, 0xdd, 0x42, 0xa0, 0x78,
0x13, 0x8d, 0x67, 0x3c, 0x0f, 0x35, 0x51, 0x2d, 0xef, 0xd3, 0x44, 0x8a, 0xb3, 0x8b, 0x5f, 0x23,
0x55, 0x91, 0xd9, 0x34, 0xd3, 0x26, 0x61, 0xc1, 0x85, 0x88, 0xc5, 0x2f, 0x09, 0xdb, 0x9c, 0x1c,
0xfa, 0x3c, 0x6c, 0x9f, 0xee, 0x6f, 0x59, 0x39, 0xa4, 0x4f, 0xf7, 0x53, 0x2c, 0x5d, 0xc9, 0x26,
0x46, 0x3a, 0xac, 0xf8, 0x71, 0xf2, 0xb0, 0x1f, 0x6c, 0x97, 0x3c, 0x9e, 0xcf, 0x9d, 0x8c, 0xc5,
0x65, 0xe3, 0x75, 0x2b, 0x60, 0xc8, 0x62, 0xc4, 0x92, 0x27, 0x80, 0x83, 0x21, 0xcc, 0xf3, 0xbc,
0xc3, 0x73, 0xc1, 0x72, 0x81, 0x0d, 0x61, 0xbe, 0x31, 0x05, 0x86, 0x86, 0x30, 0x4a, 0x01, 0xc4,
0xad, 0xdc, 0x0f, 0x62, 0xe2, 0x28, 0x5e, 0xa0, 0x19, 0x5b, 0xb3, 0xd7, 0xd3, 0xc8, 0x43, 0x71,
0x0b, 0x38, 0xe7, 0x75, 0xae, 0xeb, 0x65, 0x1a, 0x97, 0x73, 0xb3, 0xbb, 0x91, 0x0c, 0x1e, 0xd1,
0x76, 0x7c, 0x92, 0x78, 0x9d, 0x1b, 0xd6, 0x00, 0xc3, 0xce, 0x78, 0x11, 0xcf, 0x4d, 0x4d, 0x91,
0x1a, 0x48, 0x79, 0xab, 0xaa, 0xf7, 0xba, 0x41, 0xe0, 0xe7, 0x45, 0x9a, 0x30, 0x1e, 0xf0, 0x23,
0xe5, 0x7d, 0xfc, 0x40, 0x10, 0x64, 0x6f, 0x75, 0xbd, 0x9b, 0x15, 0xdd, 0x28, 0x4f, 0xd4, 0x3a,
0x76, 0x48, 0x3c, 0x1e, 0xc0, 0x85, 0xb2, 0x37, 0x82, 0x07, 0x7d, 0x54, 0x6f, 0xd0, 0x86, 0xfa,
0xa8, 0xd9, 0x7f, 0xed, 0xd3, 0x47, 0x31, 0x58, 0xf9, 0xfc, 0xb1, 0xea, 0xa3, 0xbb, 0xb1, 0x88,
0xeb, 0xbc, 0xfd, 0x45, 0xca, 0x5e, 0xa9, 0x85, 0x30, 0x52, 0x5f, 0x4d, 0x0d, 0xe5, 0xc7, 0xc9,
0x60, 0x55, 0xbc, 0xdd, 0x9b, 0x0f, 0xf8, 0x56, 0x2b, 0x84, 0x4e, 0xdf, 0x60, 0xa9, 0xb0, 0xdd,
0x9b, 0x0f, 0xf8, 0x56, 0x77, 0x2c, 0x74, 0xfa, 0x06, 0x17, 0x2d, 0x6c, 0xf7, 0xe6, 0x95, 0xef,
0x3f, 0xd7, 0x1d, 0xd7, 0x75, 0x5e, 0xe7, 0x61, 0x33, 0x91, 0x5e, 0x31, 0x2c, 0x9d, 0xf4, 0xed,
0x19, 0x34, 0x94, 0x4e, 0xd2, 0x2a, 0xce, 0x2d, 0x67, 0x58, 0x29, 0x8e, 0x79, 0x95, 0xca, 0xe3,
0x18, 0x4f, 0x7a, 0x18, 0xd5, 0x70, 0x68, 0xd1, 0x14, 0x52, 0xb2, 0x2f, 0x96, 0x3d, 0xd4, 0x9e,
0x57, 0x7f, 0x18, 0xb0, 0xd7, 0x3e, 0xb6, 0xbe, 0xd5, 0x93, 0xb6, 0xaf, 0x78, 0x3d, 0x46, 0xbf,
0x9c, 0x9b, 0x30, 0x74, 0x96, 0x30, 0xa6, 0xcc, 0x4b, 0x5b, 0xf7, 0x2d, 0xe5, 0xa3, 0xfe, 0x0a,
0x1d, 0xee, 0x47, 0x49, 0xd2, 0xcf, 0xbd, 0xfb, 0x76, 0xfb, 0x51, 0x7f, 0x05, 0xe5, 0xfe, 0x2f,
0xf5, 0xb2, 0x06, 0xfa, 0x57, 0x7d, 0xf0, 0x71, 0x1f, 0x8b, 0xa0, 0x1f, 0x3e, 0xb9, 0x96, 0x8e,
0x2a, 0xc8, 0xdf, 0xea, 0xf5, 0xbb, 0x46, 0xe5, 0x47, 0x43, 0xf2, 0x63, 0x63, 0xd5, 0x25, 0x43,
0x51, 0x65, 0x61, 0xd8, 0x31, 0x3f, 0xbe, 0xa6, 0x96, 0x73, 0xe5, 0x9e, 0x07, 0xab, 0x8f, 0x5b,
0x9d, 0xf2, 0x84, 0x2c, 0x3b, 0x34, 0x2c, 0xd0, 0x27, 0xd7, 0x55, 0xa3, 0xba, 0xaa, 0x03, 0xcb,
0x4b, 0x67, 0x9e, 0xf4, 0x34, 0xec, 0x5d, 0x43, 0xf3, 0xd1, 0xf5, 0x94, 0x54, 0x59, 0xfe, 0x63,
0x2d, 0xba, 0xeb, 0xb1, 0xf6, 0x75, 0x06, 0xd8, 0x74, 0xf9, 0x41, 0xc0, 0x3e, 0xa5, 0x64, 0x0a,
0xf7, 0x5b, 0xdf, 0x4c, 0xd9, 0xde, 0x4f, 0xe7, 0xa9, 0xec, 0xa5, 0x99, 0x60, 0x65, 0xfb, 0x7e,
0x3a, 0xdf, 0x6e, 0x43, 0x0d, 0xe9, 0xfb, 0xe9, 0x02, 0xb8, 0x73, 0x3f, 0x1d, 0xe2, 0x19, 0xbd,
0x9f, 0x0e, 0xb5, 0x16, 0xbc, 0x9f, 0x2e, 0xac, 0x41, 0xcd, 0x2e, 0xba, 0x08, 0xcd, 0xb6, 0x79,
0x2f, 0x8b, 0xfe, 0x2e, 0xfa, 0xe3, 0xeb, 0xa8, 0x10, 0xf3, 0x6b, 0xc3, 0xc9, 0x03, 0x95, 0x3d,
0x9e, 0xa9, 0x77, 0xa8, 0x72, 0xbb, 0x37, 0xaf, 0x7c, 0xff, 0x48, 0x2d, 0xae, 0xcc, 0x6c, 0xc2,
0x4b, 0x79, 0x37, 0xe1, 0x66, 0x68, 0x76, 0xa8, 0x2d, 0xb8, 0x2d, 0xff, 0xb0, 0x1f, 0x4c, 0x54,
0xb7, 0x26, 0x54, 0xa3, 0x0f, 0xbb, 0x0c, 0x81, 0x26, 0xdf, 0xee, 0xcd, 0x13, 0xd3, 0x48, 0xe3,
0xbb, 0x69, 0xed, 0x1e, 0xc6, 0xfc, 0xb6, 0x7e, 0xd4, 0x5f, 0x41, 0xb9, 0xbf, 0x52, 0x59, 0xab,
0xeb, 0x5e, 0xb6, 0xf3, 0x56, 0x97, 0xa9, 0x89, 0xd7, 0xcc, 0xc3, 0xbe, 0x78, 0x28, 0x7f, 0x71,
0xa7, 0xd0, 0xae, 0xfc, 0x05, 0x9d, 0x46, 0x3f, 0xba, 0x9e, 0x92, 0x2a, 0xcb, 0x3f, 0xac, 0x45,
0x37, 0xc9, 0xb2, 0xa8, 0x38, 0xf8, 0xa4, 0xaf, 0x65, 0x10, 0x0f, 0x9f, 0x5e, 0x5b, 0x4f, 0x15,
0xea, 0x9f, 0xd7, 0xa2, 0x5b, 0x81, 0x42, 0x35, 0x01, 0x72, 0x0d, 0xeb, 0x7e, 0xa0, 0x7c, 0x76,
0x7d, 0x45, 0x6a, 0xba, 0x77, 0xf1, 0x49, 0xfb, 0xae, 0xb1, 0x80, 0xed, 0x09, 0x7d, 0xd7, 0x58,
0xb7, 0x16, 0xdc, 0x63, 0x8a, 0xcf, 0xf4, 0x9a, 0x0f, 0xdd, 0x63, 0x92, 0x47, 0x21, 0x83, 0xb7,
0x98, 0x60, 0x1c, 0xe6, 0xe4, 0xd9, 0xeb, 0x22, 0xce, 0x13, 0xda, 0x49, 0x23, 0xef, 0x76, 0x62,
0x38, 0xb8, 0x37, 0x57, 0x4b, 0x4f, 0xb8, 0x5e, 0xc7, 0xdd, 0xa7, 0xf4, 0x0d, 0x12, 0xdc, 0x9b,
0x6b, 0xa1, 0x84, 0x37, 0x95, 0x35, 0x86, 0xbc, 0x81, 0x64, 0xf1, 0x41, 0x1f, 0x14, 0xac, 0x10,
0x8c, 0x37, 0xb3, 0xe5, 0xff, 0x30, 0x64, 0xa5, 0xb5, 0xed, 0xbf, 0xd5, 0x93, 0x26, 0xdc, 0x4e,
0x98, 0xf8, 0x9c, 0xc5, 0x09, 0x2b, 0x83, 0x6e, 0x0d, 0xd5, 0xcb, 0xad, 0x4b, 0x63, 0x6e, 0x77,
0x78, 0xb6, 0x5c, 0xe4, 0xaa, 0x31, 0x49, 0xb7, 0x2e, 0xd5, 0xed, 0x16, 0xd0, 0x70, 0x57, 0xd2,
0xba, 0x95, 0xe9, 0xe5, 0x83, 0xb0, 0x19, 0x2f, 0xab, 0xdc, 0xec, 0xc5, 0xd2, 0xf5, 0x54, 0x61,
0xd4, 0x51, 0x4f, 0x10, 0x49, 0x5b, 0x3d, 0x69, 0xb8, 0x3d, 0xe8, 0xb8, 0x35, 0xf1, 0xb4, 0xdd,
0x61, 0xab, 0x15, 0x52, 0x8f, 0xfa, 0x2b, 0xc0, 0xcd, 0x58, 0x15, 0x55, 0x07, 0x69, 0x25, 0xf6,
0xd2, 0x2c, 0x1b, 0x6c, 0x06, 0xc2, 0x44, 0x43, 0xc1, 0xcd, 0x58, 0x04, 0x26, 0x22, 0x59, 0x6f,
0x5e, 0xe6, 0x83, 0x2e, 0x3b, 0x92, 0xea, 0x15, 0xc9, 0x2e, 0x0d, 0x36, 0xd4, 0x9c, 0x47, 0x6d,
0x6a, 0x3b, 0x0c, 0x3f, 0xb8, 0x56, 0x85, 0xb7, 0x7b, 0xf3, 0xe0, 0x6d, 0xbf, 0xa4, 0xe4, 0xcc,
0x72, 0x87, 0x32, 0xe1, 0xcd, 0x24, 0x77, 0x3b, 0x28, 0xb0, 0x29, 0xd9, 0x74, 0xa3, 0x97, 0x69,
0x32, 0x67, 0x02, 0x7d, 0x51, 0xe5, 0x02, 0xc1, 0x17, 0x55, 0x00, 0x04, 0x4d, 0xd7, 0xfc, 0xdd,
0xec, 0xc6, 0x8e, 0x13, 0xac, 0xe9, 0x94, 0xb2, 0x43, 0x85, 0x9a, 0x0e, 0xa5, 0xc1, 0x68, 0x60,
0xdc, 0xaa, 0x7b, 0x1f, 0x1e, 0x84, 0xcc, 0x80, 0xcb, 0x1f, 0x36, 0x7b, 0xb1, 0x60, 0x46, 0xb1,
0x0e, 0xd3, 0x45, 0x2a, 0xb0, 0x19, 0xc5, 0xb1, 0x51, 0x23, 0xa1, 0x19, 0xa5, 0x8d, 0x52, 0xd5,
0xab, 0x73, 0x84, 0x71, 0x12, 0xae, 0x5e, 0xc3, 0xf4, 0xab, 0x9e, 0x61, 0x5b, 0xef, 0x55, 0x73,
0x13, 0x32, 0xe2, 0x42, 0x2d, 0x96, 0x91, 0xd8, 0x96, 0xdf, 0x03, 0x43, 0x30, 0x34, 0xea, 0x50,
0x0a, 0xf0, 0x7d, 0x41, 0xcd, 0xe9, 0x57, 0xbf, 0x45, 0xc1, 0xe2, 0x32, 0xce, 0x67, 0xe8, 0xe2,
0x54, 0x1a, 0x6c, 0x91, 0xa1, 0xc5, 0x29, 0xa9, 0x01, 0xde, 0xda, 0xfb, 0x5f, 0xf2, 0x22, 0x5d,
0xc1, 0x7c, 0x32, 0xeb, 0x7f, 0xc8, 0x7b, 0xbf, 0x07, 0x09, 0xdf, 0xda, 0x6b, 0xc0, 0xec, 0xbb,
0x37, 0x4e, 0x3f, 0x0c, 0x98, 0xf2, 0xd1, 0xd0, 0x42, 0x98, 0x56, 0x01, 0x41, 0xed, 0xec, 0x2d,
0x7e, 0xc1, 0x56, 0x58, 0x50, 0xbb, 0x9b, 0x84, 0x5f, 0xb0, 0x55, 0x28, 0xa8, 0xdb, 0x28, 0xc8,
0x33, 0xdd, 0x75, 0xd0, 0x7a, 0x40, 0xdf, 0x5d, 0xfa, 0x6c, 0x74, 0x72, 0xa0, 0xe7, 0xec, 0xa6,
0x57, 0xde, 0x6b, 0x0a, 0xa4, 0xa0, 0xbb, 0xe9, 0x15, 0xfe, 0x96, 0x62, 0xb3, 0x17, 0x0b, 0x4f,
0x04, 0xc4, 0x82, 0xbd, 0xd6, 0xaf, 0xea, 0x91, 0xe2, 0x4a, 0x79, 0xeb, 0x5d, 0xfd, 0xbd, 0x6e,
0xd0, 0x9e, 0xbf, 0x3d, 0x2e, 0xf9, 0x8c, 0x55, 0x95, 0xba, 0x12, 0xd5, 0x3f, 0xe0, 0xa4, 0x64,
0x43, 0x70, 0x21, 0xea, 0x9d, 0x30, 0xe4, 0xdc, 0x63, 0xd8, 0x88, 0xec, 0xf5, 0x4a, 0xeb, 0xa8,
0x66, 0xfb, 0x66, 0xa5, 0x8d, 0x4e, 0xce, 0x76, 0x2f, 0x25, 0x75, 0xef, 0x53, 0xba, 0x87, 0xaa,
0x63, 0x57, 0x29, 0xdd, 0xef, 0x41, 0x2a, 0x57, 0x9f, 0x47, 0x6f, 0x1e, 0xf0, 0xf9, 0x84, 0xe5,
0xc9, 0xe0, 0x7b, 0xfe, 0x09, 0x5e, 0x3e, 0x1f, 0xd6, 0x7f, 0x36, 0x46, 0x6f, 0x50, 0x62, 0x7b,
0x06, 0x71, 0x97, 0x9d, 0x2d, 0xe7, 0x13, 0x11, 0x0b, 0x70, 0x06, 0x51, 0xfe, 0x7d, 0x58, 0x0b,
0x88, 0x33, 0x88, 0x1e, 0x00, 0xec, 0x4d, 0x4b, 0xc6, 0x50, 0x7b, 0xb5, 0x20, 0x68, 0x4f, 0x01,
0x36, 0x8b, 0x30, 0xf6, 0xea, 0x44, 0x1d, 0x9e, 0x19, 0xb4, 0x3a, 0x52, 0x4a, 0x64, 0x11, 0x6d,
0xca, 0x06, 0x77, 0x53, 0x7d, 0x79, 0xbd, 0xcd, 0x72, 0xb1, 0x88, 0xcb, 0x15, 0x08, 0x6e, 0x55,
0x4b, 0x07, 0x20, 0x82, 0x1b, 0x05, 0x6d, 0xaf, 0xd5, 0x8f, 0x79, 0x76, 0xb9, 0xcf, 0x4b, 0xbe,
0x14, 0x69, 0xce, 0xe0, 0x15, 0x27, 0xe6, 0x81, 0xba, 0x0c, 0xd1, 0x6b, 0x29, 0xd6, 0x66, 0xb9,
0x92, 0x68, 0x8e, 0x33, 0xca, 0x3b, 0xe1, 0x2b, 0xc1, 0x4b, 0xf8, 0x3a, 0xb3, 0xb1, 0x02, 0x21,
0x22, 0xcb, 0x25, 0x61, 0xd0, 0xf6, 0xc7, 0x69, 0x3e, 0x47, 0xdb, 0xfe, 0xd8, 0xbd, 0x66, 0xf8,
0x16, 0x0d, 0xd8, 0x0e, 0xd5, 0x3c, 0xb4, 0xa6, 0x03, 0xa8, 0x8f, 0x86, 0xd1, 0x87, 0xee, 0x12,
0x44, 0x87, 0xc2, 0x49, 0xe0, 0xea, 0x79, 0xc1, 0x72, 0x96, 0xe8, 0x43, 0x7b, 0x98, 0x2b, 0x8f,
0x08, 0xba, 0x82, 0xa4, 0x1d, 0x8b, 0xa4, 0xfc, 0x64, 0x99, 0x1f, 0x97, 0xfc, 0x3c, 0xcd, 0x58,
0x09, 0xc6, 0xa2, 0x46, 0xdd, 0x91, 0x13, 0x63, 0x11, 0xc6, 0xd9, 0xd3, 0x1f, 0x52, 0xea, 0xfd,
0xb0, 0xc1, 0xb4, 0x8c, 0x67, 0xf0, 0xf4, 0x47, 0x63, 0xa3, 0x8d, 0x11, 0x3b, 0x83, 0x01, 0xdc,
0x49, 0x74, 0x1a, 0xd7, 0xf9, 0x4a, 0xc6, 0x87, 0xfa, 0x68, 0x55, 0x5e, 0xbe, 0x5b, 0x81, 0x44,
0x47, 0x99, 0xc3, 0x48, 0x22, 0xd1, 0x09, 0x6b, 0xd8, 0xa9, 0x44, 0x72, 0x47, 0xea, 0x54, 0x13,
0x98, 0x4a, 0x1a, 0x1b, 0x5a, 0x48, 0x4c, 0x25, 0x2d, 0x08, 0x0c, 0x48, 0xba, 0x1b, 0xcc, 0xd1,
0x01, 0xc9, 0x48, 0x83, 0x03, 0x92, 0x4b, 0xd9, 0x81, 0x62, 0x9c, 0xa7, 0x22, 0x8d, 0xb3, 0x09,
0x13, 0xc7, 0x71, 0x19, 0x2f, 0x98, 0x60, 0x25, 0x1c, 0x28, 0x14, 0x32, 0xf4, 0x18, 0x62, 0xa0,
0xa0, 0x58, 0xe5, 0xf0, 0xb7, 0xa3, 0xb7, 0xeb, 0x79, 0x9f, 0xe5, 0xea, 0x27, 0x99, 0x9e, 0xc9,
0xdf, 0x72, 0x1b, 0xbc, 0x63, 0x6c, 0x4c, 0x44, 0xc9, 0xe2, 0x85, 0xb6, 0xfd, 0x96, 0xf9, 0xbb,
0x04, 0x1f, 0xad, 0xd5, 0xf1, 0x7c, 0xc4, 0x45, 0x7a, 0x5e, 0x2f, 0xb3, 0xd5, 0x07, 0x4c, 0x20,
0x9e, 0x5d, 0xf1, 0x30, 0x70, 0xe9, 0x09, 0xc6, 0xd9, 0x71, 0xda, 0x95, 0x9e, 0xb0, 0x22, 0x83,
0xe3, 0xb4, 0xa7, 0x2d, 0x01, 0x62, 0x9c, 0x46, 0x41, 0xdb, 0x39, 0x5d, 0xf1, 0x94, 0x85, 0x2b,
0x33, 0x65, 0xfd, 0x2a, 0x33, 0xf5, 0xbe, 0x09, 0xc9, 0xa2, 0xb7, 0x0f, 0xd9, 0xe2, 0x8c, 0x95,
0xd5, 0x45, 0x5a, 0x50, 0x17, 0x04, 0x5b, 0xa2, 0xf3, 0x82, 0x60, 0x02, 0xb5, 0x33, 0x81, 0x05,
0xc6, 0xd5, 0x51, 0xbc, 0x60, 0xf2, 0x0a, 0x17, 0x30, 0x13, 0x38, 0x46, 0x1c, 0x88, 0x98, 0x09,
0x48, 0xd8, 0xf9, 0xbc, 0xcc, 0x32, 0x27, 0x6c, 0x5e, 0x47, 0x58, 0x79, 0x1c, 0xaf, 0x16, 0x2c,
0x17, 0xca, 0x24, 0xd8, 0x93, 0x77, 0x4c, 0xe2, 0x3c, 0xb1, 0x27, 0xdf, 0x47, 0xcf, 0x19, 0x9a,
0xbc, 0x07, 0x7f, 0xcc, 0x4b, 0xd1, 0xfc, 0xe0, 0xda, 0x69, 0x99, 0x81, 0xa1, 0xc9, 0x7f, 0xa8,
0x1e, 0x49, 0x0c, 0x4d, 0x61, 0x0d, 0xe7, 0xc7, 0x35, 0xbc, 0x32, 0xbc, 0x60, 0xa5, 0x89, 0x93,
0x67, 0x8b, 0x38, 0xcd, 0x54, 0x34, 0x7c, 0x3f, 0x60, 0x9b, 0xd0, 0x21, 0x7e, 0x5c, 0xa3, 0xaf,
0xae, 0xf3, 0x73, 0x24, 0xe1, 0x12, 0x82, 0x57, 0x04, 0x1d, 0xf6, 0x89, 0x57, 0x04, 0xdd, 0x5a,
0x76, 0xe5, 0x6e, 0x59, 0xc9, 0xad, 0x24, 0xb1, 0xc3, 0x13, 0xb8, 0x5f, 0xe8, 0xd8, 0x04, 0x20,
0xb1, 0x72, 0x0f, 0x2a, 0xd8, 0xd4, 0xc0, 0x62, 0x7b, 0x69, 0x1e, 0x67, 0xe9, 0x8f, 0x61, 0x5a,
0xef, 0xd8, 0xd1, 0x04, 0x91, 0x1a, 0xe0, 0x24, 0xe6, 0x6a, 0x9f, 0x89, 0x69, 0x5a, 0x0f, 0xfd,
0xf7, 0x02, 0xcf, 0x4d, 0x12, 0xdd, 0xae, 0x1c, 0xd2, 0xb9, 0x0c, 0x18, 0x3e, 0xd6, 0x51, 0x51,
0x4c, 0xea, 0x59, 0xf5, 0x84, 0xcd, 0x58, 0x5a, 0x88, 0xc1, 0xc7, 0xe1, 0x67, 0x05, 0x70, 0xe2,
0xa0, 0x45, 0x0f, 0x35, 0xe7, 0xf5, 0x7d, 0x3d, 0x96, 0x4c, 0x9a, 0x5f, 0x22, 0x3d, 0xad, 0x58,
0xa9, 0x12, 0x8d, 0x7d, 0x26, 0x40, 0xef, 0x74, 0xb8, 0xa1, 0x03, 0xd6, 0x15, 0x25, 0x7a, 0x67,
0x58, 0xc3, 0x6e, 0xf6, 0x39, 0x9c, 0xba, 0xdc, 0x5d, 0x1e, 0x77, 0x7c, 0x48, 0x1a, 0x73, 0x28,
0x62, 0xb3, 0x8f, 0xa6, 0x6d, 0xb6, 0xd6, 0x76, 0x3b, 0xca, 0x57, 0x63, 0x78, 0x64, 0x02, 0xb1,
0x24, 0x31, 0x22, 0x5b, 0x0b, 0xe0, 0xce, 0x66, 0x78, 0xc9, 0xe3, 0x64, 0x16, 0x57, 0xe2, 0x38,
0x5e, 0x65, 0x3c, 0x4e, 0xe4, 0xbc, 0x0e, 0x37, 0xc3, 0x35, 0x33, 0x74, 0x21, 0x6a, 0x33, 0x9c,
0x82, 0xdd, 0xec, 0x4c, 0xfe, 0xc0, 0xaa, 0x3a, 0x4a, 0x0a, 0xb3, 0x33, 0x59, 0x5e, 0x78, 0x8c,
0xf4, 0x4e, 0x18, 0xb2, 0x9f, 0xc0, 0x35, 0x22, 0x99, 0x86, 0xdc, 0xc2, 0x74, 0xbc, 0x04, 0xe4,
0xfd, 0x00, 0x61, 0x2f, 0x40, 0x69, 0xfe, 0xae, 0x7f, 0x53, 0x4b, 0xa8, 0x2b, 0xd3, 0x1f, 0x62,
0xba, 0x2e, 0xe4, 0x9d, 0x50, 0xdb, 0xea, 0x49, 0xdb, 0x34, 0x73, 0xe7, 0x22, 0x16, 0xa3, 0x24,
0x39, 0x64, 0x15, 0xf2, 0x3d, 0x7b, 0x2d, 0x1c, 0x5a, 0x29, 0x91, 0x66, 0xb6, 0x29, 0x1b, 0xe8,
0xb5, 0xec, 0x59, 0x92, 0x0a, 0x25, 0xd3, 0x07, 0xb4, 0x1f, 0xb6, 0x0d, 0xb4, 0x29, 0xa2, 0x56,
0x34, 0x6d, 0xc7, 0xf2, 0x9a, 0x99, 0xf2, 0xf9, 0x3c, 0x63, 0x0a, 0x3a, 0x61, 0x71, 0x73, 0x63,
0xe4, 0x76, 0xdb, 0x16, 0x0a, 0x12, 0x63, 0x79, 0x50, 0xc1, 0xa6, 0x91, 0x35, 0xd6, 0xbc, 0x92,
0xd2, 0x0f, 0x76, 0xa3, 0x6d, 0xc6, 0x03, 0x88, 0x34, 0x12, 0x05, 0xed, 0x67, 0x77, 0xb5, 0x78,
0x9f, 0xe9, 0x27, 0x01, 0xef, 0xba, 0x92, 0xca, 0x8e, 0x98, 0xf8, 0xec, 0x0e, 0xc1, 0xec, 0x3a,
0x01, 0x78, 0x78, 0xba, 0x1a, 0x27, 0x70, 0x9d, 0x00, 0xf5, 0x25, 0x43, 0xac, 0x13, 0x28, 0xd6,
0x6f, 0x3a, 0xb3, 0xef, 0x75, 0x10, 0x57, 0xb6, 0x72, 0x48, 0xd3, 0xa1, 0x60, 0xa8, 0xe9, 0x28,
0x05, 0xff, 0x91, 0xba, 0x5b, 0x6b, 0xc8, 0x23, 0xc5, 0xf6, 0xd5, 0xd6, 0xbb, 0x30, 0x9b, 0xfb,
0xd7, 0xc2, 0x13, 0x16, 0x27, 0xa6, 0x62, 0x88, 0xae, 0x2b, 0x27, 0x72, 0x7f, 0x8c, 0x53, 0x4e,
0x7e, 0x2f, 0x1a, 0x34, 0xd5, 0x28, 0x5d, 0x37, 0xb7, 0xb0, 0x22, 0xd6, 0x04, 0x31, 0x50, 0xf9,
0x84, 0x93, 0xb8, 0x79, 0x4d, 0x34, 0xe5, 0xca, 0x81, 0xfa, 0x2c, 0xb4, 0x02, 0x89, 0x9b, 0xff,
0xd8, 0x5b, 0x34, 0x91, 0xb8, 0x75, 0x6b, 0x39, 0xd7, 0xfe, 0x80, 0x26, 0xdb, 0x2b, 0xf9, 0x02,
0x96, 0xe9, 0xb3, 0x60, 0xf3, 0x20, 0x1a, 0xc4, 0xb5, 0x3f, 0xfd, 0x34, 0xed, 0x1c, 0x64, 0xf6,
0x0e, 0xe4, 0xf1, 0x34, 0xfc, 0x67, 0x41, 0x1a, 0x21, 0x31, 0x07, 0xb5, 0x20, 0xe7, 0xb7, 0x44,
0xc7, 0x2f, 0xcb, 0x54, 0xa4, 0xf9, 0x7c, 0xca, 0x79, 0x06, 0xb7, 0x2c, 0x47, 0xe3, 0xa1, 0x2b,
0xa5, 0x7e, 0x4b, 0xb4, 0x45, 0xd9, 0x29, 0x6e, 0x34, 0x1e, 0x2d, 0x05, 0x3f, 0x4f, 0xb3, 0x0c,
0x44, 0xce, 0x68, 0x3c, 0xd4, 0x12, 0x22, 0x72, 0x7c, 0xc2, 0xf9, 0x05, 0xcc, 0xb1, 0xdc, 0xfd,
0x57, 0x3b, 0xa0, 0x1f, 0x40, 0x1d, 0x47, 0x48, 0xfd, 0x02, 0x26, 0x84, 0x9c, 0x5f, 0xf4, 0x1c,
0x63, 0xbf, 0x6d, 0xb2, 0x09, 0xd5, 0x11, 0x88, 0xfa, 0x45, 0x4f, 0x0a, 0x6e, 0x7c, 0x3e, 0x7d,
0xff, 0xbf, 0xbe, 0xba, 0xb1, 0xf6, 0xd3, 0xaf, 0x6e, 0xac, 0xfd, 0xcf, 0x57, 0x37, 0xd6, 0x7e,
0xf2, 0xf5, 0x8d, 0x37, 0x7e, 0xfa, 0xf5, 0x8d, 0x37, 0xfe, 0xfb, 0xeb, 0x1b, 0x6f, 0x7c, 0xf9,
0xa6, 0xfa, 0x99, 0xfb, 0xb3, 0x9f, 0x93, 0x3f, 0x56, 0xff, 0xe4, 0xff, 0x03, 0x00, 0x00, 0xff,
0xff, 0x90, 0xd5, 0x09, 0x36, 0x0a, 0x7f, 0x00, 0x00,
}
// This is a compile-time assertion to ensure that this generated file
@ -617,6 +616,7 @@ type ClientCommandsHandler interface {
BlockDataviewViewSetActive(context.Context, *pb.RpcBlockDataviewViewSetActiveRequest) *pb.RpcBlockDataviewViewSetActiveResponse
BlockDataviewViewSetPosition(context.Context, *pb.RpcBlockDataviewViewSetPositionRequest) *pb.RpcBlockDataviewViewSetPositionResponse
BlockDataviewSetSource(context.Context, *pb.RpcBlockDataviewSetSourceRequest) *pb.RpcBlockDataviewSetSourceResponse
BlockDataviewRelationSet(context.Context, *pb.RpcBlockDataviewRelationSetRequest) *pb.RpcBlockDataviewRelationSetResponse
BlockDataviewRelationAdd(context.Context, *pb.RpcBlockDataviewRelationAddRequest) *pb.RpcBlockDataviewRelationAddResponse
BlockDataviewRelationDelete(context.Context, *pb.RpcBlockDataviewRelationDeleteRequest) *pb.RpcBlockDataviewRelationDeleteResponse
BlockDataviewGroupOrderUpdate(context.Context, *pb.RpcBlockDataviewGroupOrderUpdateRequest) *pb.RpcBlockDataviewGroupOrderUpdateResponse
@ -747,8 +747,6 @@ type ClientCommandsHandler interface {
AIAutofill(context.Context, *pb.RpcAIAutofillRequest) *pb.RpcAIAutofillResponse
AIListSummary(context.Context, *pb.RpcAIListSummaryRequest) *pb.RpcAIListSummaryResponse
AIObjectCreateFromUrl(context.Context, *pb.RpcAIObjectCreateFromUrlRequest) *pb.RpcAIObjectCreateFromUrlResponse
// Push
PushNotificationRegisterToken(context.Context, *pb.RpcPushNotificationRegisterTokenRequest) *pb.RpcPushNotificationRegisterTokenResponse
}
func registerClientCommandsHandler(srv ClientCommandsHandler) {
@ -4515,6 +4513,26 @@ func BlockDataviewSetSource(b []byte) (resp []byte) {
return resp
}
func BlockDataviewRelationSet(b []byte) (resp []byte) {
defer func() {
if PanicHandler != nil {
if r := recover(); r != nil {
resp, _ = (&pb.RpcBlockDataviewRelationSetResponse{Error: &pb.RpcBlockDataviewRelationSetResponseError{Code: pb.RpcBlockDataviewRelationSetResponseError_UNKNOWN_ERROR, Description: "panic recovered"}}).Marshal()
PanicHandler(r)
}
}
}()
in := new(pb.RpcBlockDataviewRelationSetRequest)
if err := in.Unmarshal(b); err != nil {
resp, _ = (&pb.RpcBlockDataviewRelationSetResponse{Error: &pb.RpcBlockDataviewRelationSetResponseError{Code: pb.RpcBlockDataviewRelationSetResponseError_BAD_INPUT, Description: err.Error()}}).Marshal()
return resp
}
resp, _ = clientCommandsHandler.BlockDataviewRelationSet(context.Background(), in).Marshal()
return resp
}
func BlockDataviewRelationAdd(b []byte) (resp []byte) {
defer func() {
if PanicHandler != nil {
@ -6535,26 +6553,6 @@ func AIObjectCreateFromUrl(b []byte) (resp []byte) {
return resp
}
func PushNotificationRegisterToken(b []byte) (resp []byte) {
defer func() {
if PanicHandler != nil {
if r := recover(); r != nil {
resp, _ = (&pb.RpcPushNotificationRegisterTokenResponse{Error: &pb.RpcPushNotificationRegisterTokenResponseError{Code: pb.RpcPushNotificationRegisterTokenResponseError_UNKNOWN_ERROR, Description: "panic recovered"}}).Marshal()
PanicHandler(r)
}
}
}()
in := new(pb.RpcPushNotificationRegisterTokenRequest)
if err := in.Unmarshal(b); err != nil {
resp, _ = (&pb.RpcPushNotificationRegisterTokenResponse{Error: &pb.RpcPushNotificationRegisterTokenResponseError{Code: pb.RpcPushNotificationRegisterTokenResponseError_BAD_INPUT, Description: err.Error()}}).Marshal()
return resp
}
resp, _ = clientCommandsHandler.PushNotificationRegisterToken(context.Background(), in).Marshal()
return resp
}
var PanicHandler func(v interface{})
func CommandAsync(cmd string, data []byte, callback func(data []byte)) {
@ -6937,6 +6935,8 @@ func CommandAsync(cmd string, data []byte, callback func(data []byte)) {
cd = BlockDataviewViewSetPosition(data)
case "BlockDataviewSetSource":
cd = BlockDataviewSetSource(data)
case "BlockDataviewRelationSet":
cd = BlockDataviewRelationSet(data)
case "BlockDataviewRelationAdd":
cd = BlockDataviewRelationAdd(data)
case "BlockDataviewRelationDelete":
@ -7139,8 +7139,6 @@ func CommandAsync(cmd string, data []byte, callback func(data []byte)) {
cd = AIListSummary(data)
case "AIObjectCreateFromUrl":
cd = AIObjectCreateFromUrl(data)
case "PushNotificationRegisterToken":
cd = PushNotificationRegisterToken(data)
default:
log.Errorf("unknown command type: %s\n", cmd)
}
@ -9795,6 +9793,20 @@ func (h *ClientCommandsHandlerProxy) BlockDataviewSetSource(ctx context.Context,
call, _ := actualCall(ctx, req)
return call.(*pb.RpcBlockDataviewSetSourceResponse)
}
func (h *ClientCommandsHandlerProxy) BlockDataviewRelationSet(ctx context.Context, req *pb.RpcBlockDataviewRelationSetRequest) *pb.RpcBlockDataviewRelationSetResponse {
actualCall := func(ctx context.Context, req any) (any, error) {
return h.client.BlockDataviewRelationSet(ctx, req.(*pb.RpcBlockDataviewRelationSetRequest)), nil
}
for _, interceptor := range h.interceptors {
toCall := actualCall
currentInterceptor := interceptor
actualCall = func(ctx context.Context, req any) (any, error) {
return currentInterceptor(ctx, req, "BlockDataviewRelationSet", toCall)
}
}
call, _ := actualCall(ctx, req)
return call.(*pb.RpcBlockDataviewRelationSetResponse)
}
func (h *ClientCommandsHandlerProxy) BlockDataviewRelationAdd(ctx context.Context, req *pb.RpcBlockDataviewRelationAddRequest) *pb.RpcBlockDataviewRelationAddResponse {
actualCall := func(ctx context.Context, req any) (any, error) {
return h.client.BlockDataviewRelationAdd(ctx, req.(*pb.RpcBlockDataviewRelationAddRequest)), nil
@ -11209,17 +11221,3 @@ func (h *ClientCommandsHandlerProxy) AIObjectCreateFromUrl(ctx context.Context,
call, _ := actualCall(ctx, req)
return call.(*pb.RpcAIObjectCreateFromUrlResponse)
}
func (h *ClientCommandsHandlerProxy) PushNotificationRegisterToken(ctx context.Context, req *pb.RpcPushNotificationRegisterTokenRequest) *pb.RpcPushNotificationRegisterTokenResponse {
actualCall := func(ctx context.Context, req any) (any, error) {
return h.client.PushNotificationRegisterToken(ctx, req.(*pb.RpcPushNotificationRegisterTokenRequest)), nil
}
for _, interceptor := range h.interceptors {
toCall := actualCall
currentInterceptor := interceptor
actualCall = func(ctx context.Context, req any) (any, error) {
return currentInterceptor(ctx, req, "PushNotificationRegisterToken", toCall)
}
}
call, _ := actualCall(ctx, req)
return call.(*pb.RpcPushNotificationRegisterTokenResponse)
}

View file

@ -51,6 +51,7 @@ type Service interface {
SetDataviewViewPosition(ctx session.Context, req pb.RpcBlockDataviewViewSetPositionRequest) error
CreateDataviewView(ctx session.Context, req pb.RpcBlockDataviewViewCreateRequest) (id string, err error)
SetDataviewRelation(ctx session.Context, req pb.RpcBlockDataviewRelationSetRequest) error
AddDataviewRelation(ctx session.Context, req pb.RpcBlockDataviewRelationAddRequest) error
DeleteDataviewRelation(ctx session.Context, req pb.RpcBlockDataviewRelationDeleteRequest) error
SetDataviewSource(ctx session.Context, contextId, blockId string, source []string) error
@ -391,6 +392,12 @@ func (s *service) CreateDataviewView(
return
}
func (s *service) SetDataviewRelation(ctx session.Context, req pb.RpcBlockDataviewRelationSetRequest) error {
return cache.Do(s.getter, req.ContextId, func(b dataview.Dataview) error {
return b.SetRelations(ctx, req.BlockId, req.RelationKeys, true)
})
}
func (s *service) AddDataviewRelation(ctx session.Context, req pb.RpcBlockDataviewRelationAddRequest) error {
return cache.Do(s.getter, req.ContextId, func(b dataview.Dataview) error {
return b.AddRelations(ctx, req.BlockId, req.RelationKeys, true)

View file

@ -90,7 +90,7 @@ func (s *Service) deleteDerivedObject(id domain.FullID, sbType coresb.SmartBlock
return fmt.Errorf("failed to delete relation options of deleted relation: %w", err)
}
case coresb.SmartBlockTypeTemplate:
if err = s.resetDefaultTemplateId(id, targetTypeId, spc); err != nil {
if err = s.unsetDefaultTemplateId(id.ObjectID, targetTypeId, spc); err != nil {
return fmt.Errorf("failed to reset default template id: %w", err)
}
}
@ -124,56 +124,22 @@ func (s *Service) deleteRelationOptions(spaceId string, relationKey string) erro
return nil
}
func (s *Service) resetDefaultTemplateId(templateId domain.FullID, typeId string, spc clientspace.Space) error {
spaceId := templateId.SpaceID
records, err := s.objectStore.SpaceIndex(spaceId).QueryByIds([]string{typeId})
func (s *Service) unsetDefaultTemplateId(templateId, typeId string, spc clientspace.Space) error {
records, err := s.objectStore.SpaceIndex(spc.Id()).QueryByIds([]string{typeId})
if err != nil {
return fmt.Errorf("failed to query type object: %w", err)
}
if len(records) != 1 {
return fmt.Errorf("failed to query type object: 1 record expected")
}
if records[0].Details.GetString(bundle.RelationKeyDefaultTemplateId) != templateId.ObjectID {
if records[0].Details.GetString(bundle.RelationKeyDefaultTemplateId) != templateId {
// template that is about to be deleted was not set as default for type, so we do nothing
return nil
}
ctx := context.Background()
templateTypeId, err := spc.GetTypeIdByKey(ctx, bundle.TypeKeyTemplate)
if err != nil {
return fmt.Errorf("failed to derive template type id from space: %w", err)
}
if records, err = s.objectStore.SpaceIndex(spaceId).Query(database.Query{
Filters: []database.FilterRequest{
{
RelationKey: bundle.RelationKeyType,
Condition: model.BlockContentDataviewFilter_Equal,
Value: domain.String(templateTypeId),
},
{
RelationKey: bundle.RelationKeyTargetObjectType,
Condition: model.BlockContentDataviewFilter_Equal,
Value: domain.String(typeId),
},
},
Sorts: []database.SortRequest{{
RelationKey: bundle.RelationKeyLastModifiedDate,
Type: model.BlockContentDataviewSort_Desc,
}},
}); err != nil {
return fmt.Errorf("failed to query templates: %w", err)
}
// in case no templates were found we explicitly set empty default template id to type object
newTemplateId := ""
if len(records) != 0 {
newTemplateId = records[0].Details.GetString(bundle.RelationKeyId)
}
return spc.Do(typeId, func(sb smartblock.SmartBlock) error {
st := sb.NewState()
st.SetDetail(bundle.RelationKeyDefaultTemplateId, domain.String(newTemplateId))
st.SetDetail(bundle.RelationKeyDefaultTemplateId, domain.String(""))
return sb.Apply(st)
})
}

View file

@ -347,6 +347,7 @@ func TestService_SetListIsFavorite(t *testing.T) {
widget := smarttest.New(widgetId)
widget.AddBlock(simple.New(&model.Block{Id: widgetId, ChildrenIds: []string{}}))
fx.store.AddObjects(t, spaceId, objects)
fx.space.EXPECT().Id().Return(spaceId)
fx.space.EXPECT().DerivedIDs().Return(threads.DerivedSmartblockIds{Home: homeId, Widgets: widgetId})
fx.getter.EXPECT().GetObject(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, objectId string) (smartblock.SmartBlock, error) {
switch objectId {
@ -406,6 +407,7 @@ func TestService_SetListIsFavorite(t *testing.T) {
widget := smarttest.New(widgetId)
widget.AddBlock(simple.New(&model.Block{Id: widgetId, ChildrenIds: []string{}}))
fx.store.AddObjects(t, spaceId, objects)
fx.space.EXPECT().Id().Return(spaceId)
fx.space.EXPECT().DerivedIDs().Return(threads.DerivedSmartblockIds{Home: homeId, Widgets: widgetId})
flag := false
fx.getter.EXPECT().GetObject(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, objectId string) (smartblock.SmartBlock, error) {

View file

@ -4,6 +4,7 @@ import (
"context"
"errors"
"fmt"
"slices"
"go.uber.org/zap"
@ -13,13 +14,12 @@ import (
"github.com/anyproto/anytype-heart/core/block/editor/smartblock"
"github.com/anyproto/anytype-heart/core/block/editor/state"
"github.com/anyproto/anytype-heart/core/block/editor/widget"
"github.com/anyproto/anytype-heart/core/block/simple"
"github.com/anyproto/anytype-heart/core/domain"
"github.com/anyproto/anytype-heart/core/session"
"github.com/anyproto/anytype-heart/pb"
"github.com/anyproto/anytype-heart/pkg/lib/bundle"
coresb "github.com/anyproto/anytype-heart/pkg/lib/core/smartblock"
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
"github.com/anyproto/anytype-heart/space/clientspace"
"github.com/anyproto/anytype-heart/util/slice"
)
@ -75,7 +75,7 @@ func (s *service) SetIsFavorite(objectId string, isFavorite, createWidget bool)
}
if createWidget && isFavorite {
err = s.createFavoriteWidget(spc.DerivedIDs().Widgets)
err = s.createFavoriteWidget(spc)
if err != nil {
log.Error("failed to create favorite widget", zap.Error(err))
}
@ -261,41 +261,18 @@ func (s *service) modifyArchiveLinks(
return
}
func (s *service) createFavoriteWidget(widgetObjectId string) error {
func (s *service) createFavoriteWidget(spc clientspace.Space) error {
widgetObjectId := spc.DerivedIDs().Widgets
widgetDetails, err := s.store.SpaceIndex(spc.Id()).GetDetails(widgetObjectId)
if err != nil {
return fmt.Errorf("get widget details: %w", err)
}
targetIds := widgetDetails.GetStringList(bundle.RelationKeyAutoWidgetTargets)
if slices.Contains(targetIds, widget.DefaultWidgetFavorite) {
return nil
}
return cache.DoState(s.objectGetter, widgetObjectId, func(st *state.State, w widget.Widget) (err error) {
var favoriteBlockFound bool
err = st.Iterate(func(b simple.Block) (isContinue bool) {
link := b.Model().GetLink()
if link == nil {
return true
}
if link.TargetBlockId == widget.DefaultWidgetFavorite {
favoriteBlockFound = true
return false
}
return true
})
if err != nil {
return err
}
if favoriteBlockFound {
log.Debug("favorite widget block is already presented")
return nil
}
_, err = w.CreateBlock(st, &pb.RpcBlockCreateWidgetRequest{
ContextId: widgetObjectId,
ObjectLimit: 6,
WidgetLayout: model.BlockContentWidget_List,
Position: model.Block_Bottom,
Block: &model.Block{
Content: &model.BlockContentOfLink{Link: &model.BlockContentLink{
TargetBlockId: widget.DefaultWidgetFavorite,
}},
},
})
return err
return w.AddAutoWidget(st, widget.DefaultWidgetFavorite, widget.DefaultWidgetFavorite, "", model.BlockContentWidget_CompactList)
})
}

View file

@ -2,6 +2,7 @@ package editor
import (
"errors"
"slices"
"github.com/anyproto/any-sync/commonspace/object/tree/treestorage"
"github.com/anyproto/any-sync/commonspace/spacestorage"
@ -10,6 +11,7 @@ import (
"github.com/anyproto/anytype-heart/core/block/editor/smartblock"
"github.com/anyproto/anytype-heart/core/block/editor/state"
"github.com/anyproto/anytype-heart/core/block/editor/template"
"github.com/anyproto/anytype-heart/core/block/editor/widget"
"github.com/anyproto/anytype-heart/core/block/migration"
"github.com/anyproto/anytype-heart/core/domain"
"github.com/anyproto/anytype-heart/core/relationutils"
@ -26,7 +28,8 @@ var archiveRequiredRelations = []domain.RelationKey{}
type Archive struct {
smartblock.SmartBlock
collection.Collection
objectStore spaceindex.Store
objectStore spaceindex.Store
autoWidgetWasInstalled bool
}
func NewArchive(
@ -77,6 +80,40 @@ func (p *Archive) Relations(_ *state.State) relationutils.Relations {
return nil
}
// autoInstallBinWidget installs bin widget for the existing users if it was not added/removed before and the user has archived objects
func (p *Archive) autoInstallBinWidget() error {
if p.autoWidgetWasInstalled {
return nil
}
widgetObjectId := p.Space().DerivedIDs().Widgets
widgetDetails, err := p.objectStore.GetDetails(widgetObjectId)
if err != nil {
return err
}
keys := widgetDetails.Get(bundle.RelationKeyAutoWidgetTargets).StringList()
if slices.Contains(keys, widget.DefaultWidgetBin) {
// cache to avoid unnecessary objectstore requests
p.autoWidgetWasInstalled = true
return nil
}
err = p.Space().Do(widgetObjectId, func(sb smartblock.SmartBlock) error {
st := sb.NewState()
if w, ok := sb.(widget.Widget); ok {
// We rely on AddAutoWidget to check if the widget was already installed/removed before
err = w.AddAutoWidget(st, widget.DefaultWidgetBin, widget.DefaultWidgetBin, "", model.BlockContentWidget_Link)
if err != nil {
return err
}
}
return sb.Apply(st)
})
if err != nil {
return err
}
p.autoWidgetWasInstalled = true
return nil
}
func (p *Archive) updateObjects(_ smartblock.ApplyInfo) (err error) {
archivedIds, err := p.GetIds()
if err != nil {
@ -88,6 +125,12 @@ func (p *Archive) updateObjects(_ smartblock.ApplyInfo) (err error) {
log.Errorf("archive: can't update in store: %v", uErr)
}
}()
if len(archivedIds) > 0 {
err = p.autoInstallBinWidget()
if err != nil {
log.Errorf("archive: can't install auto widget: %v", err)
}
}
return nil
}

View file

@ -87,6 +87,7 @@ func (p *Dashboard) updateObjects(info smartblock.ApplyInfo) (err error) {
log.Errorf("favorite: can't update in store: %v", uErr)
}
}()
return nil
}

View file

@ -39,6 +39,7 @@ type Dataview interface {
CreateView(ctx session.Context, blockID string,
view model.BlockContentDataviewView, source []string) (*model.BlockContentDataviewView, error)
SetViewPosition(ctx session.Context, blockId string, viewId string, position uint32) error
SetRelations(ctx session.Context, blockId string, relationIds []string, showEvent bool) error
AddRelations(ctx session.Context, blockId string, relationIds []string, showEvent bool) error
DeleteRelations(ctx session.Context, blockId string, relationIds []string, showEvent bool) error
UpdateView(ctx session.Context, blockID string, viewID string, view *model.BlockContentDataviewView, showEvent bool) error
@ -146,6 +147,28 @@ func (d *sdataview) SetSourceInSet(ctx session.Context, source []string) (err er
return d.Apply(s, smartblock.NoRestrictions, smartblock.KeepInternalFlags)
}
func (d *sdataview) SetRelations(ctx session.Context, blockId string, relationKeys []string, showEvent bool) error {
s := d.NewStateCtx(ctx)
tb, err := getDataviewBlock(s, blockId)
if err != nil {
return err
}
var links []*model.RelationLink
for _, key := range relationKeys {
relation, err2 := d.objectStore.FetchRelationByKey(key)
if err2 != nil {
return err2
}
links = append(links, relation.RelationLink())
}
tb.SetRelations(links)
if showEvent {
return d.Apply(s)
} else {
return d.Apply(s, smartblock.NoEvent)
}
}
func (d *sdataview) AddRelations(ctx session.Context, blockId string, relationKeys []string, showEvent bool) error {
s := d.NewStateCtx(ctx)
tb, err := getDataviewBlock(s, blockId)

View file

@ -25,13 +25,12 @@ import (
"github.com/anyproto/anytype-heart/pkg/lib/bundle"
coresb "github.com/anyproto/anytype-heart/pkg/lib/core/smartblock"
"github.com/anyproto/anytype-heart/pkg/lib/database"
"github.com/anyproto/anytype-heart/pkg/lib/localstore/addr"
"github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore/spaceindex"
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
"github.com/anyproto/anytype-heart/util/pbtypes"
)
const ObjectTypeAllViewId = "all"
var typeRequiredRelations = append(typeAndRelationRequiredRelations,
bundle.RelationKeyRecommendedRelations,
bundle.RelationKeyRecommendedFeaturedRelations,
@ -414,7 +413,7 @@ func (ot *ObjectType) dataviewTemplates() []template.StateTransformer {
Key: bundle.RelationKeyName.String(),
Format: model.RelationFormat_longtext,
},
}, ObjectTypeAllViewId)
}, addr.ObjectTypeAllViewId)
dvContent.Dataview.TargetObjectId = ot.Id()
return []template.StateTransformer{

View file

@ -15,6 +15,7 @@ import (
"github.com/anyproto/anytype-heart/core/domain"
"github.com/anyproto/anytype-heart/core/session"
"github.com/anyproto/anytype-heart/pkg/lib/bundle"
"github.com/anyproto/anytype-heart/pkg/lib/localstore/addr"
"github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore/spaceindex"
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
)
@ -106,8 +107,8 @@ func (w *WidgetObject) StateMigrations() migration.Migrations {
if err != nil {
return
}
replaceWidgetTarget(s, widget.DefaultWidgetCollection, collectionTypeId, ObjectTypeAllViewId, model.BlockContentWidget_View)
replaceWidgetTarget(s, widget.DefaultWidgetSet, setTypeId, ObjectTypeAllViewId, model.BlockContentWidget_View)
replaceWidgetTarget(s, widget.DefaultWidgetCollection, collectionTypeId, addr.ObjectTypeAllViewId, model.BlockContentWidget_View)
replaceWidgetTarget(s, widget.DefaultWidgetSet, setTypeId, addr.ObjectTypeAllViewId, model.BlockContentWidget_View)
},
},

View file

@ -2,11 +2,14 @@ package widget
import (
"fmt"
"slices"
"github.com/anyproto/anytype-heart/core/block/editor/smartblock"
"github.com/anyproto/anytype-heart/core/block/editor/state"
"github.com/anyproto/anytype-heart/core/block/simple"
"github.com/anyproto/anytype-heart/core/domain"
"github.com/anyproto/anytype-heart/pb"
"github.com/anyproto/anytype-heart/pkg/lib/bundle"
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
)
@ -15,11 +18,16 @@ const (
DefaultWidgetSet = "set"
DefaultWidgetRecent = "recent"
DefaultWidgetCollection = "collection"
DefaultWidgetBin = "bin"
DefaultWidgetRecentOpen = "recentOpen"
autoWidgetBlockIdPrefix = "auto_" // in case blockId is specifically provided to avoid bad tree merges
)
type Widget interface {
CreateBlock(s *state.State, req *pb.RpcBlockCreateWidgetRequest) (string, error)
// AddAutoWidget adds a widget block. If widget with the same targetId was installed/removed before, it will not be added again.
// blockId is optional and used to protect from multi-device conflicts.
AddAutoWidget(s *state.State, targetId, blockId, viewId string, layout model.BlockContentWidgetLayout) error
}
type widget struct {
@ -63,6 +71,77 @@ func NewWidget(sb smartblock.SmartBlock) Widget {
}
}
func (w *widget) AddAutoWidget(st *state.State, targetId, widgetBlockId, viewId string, layout model.BlockContentWidgetLayout) error {
targets := st.Details().Get(bundle.RelationKeyAutoWidgetTargets).StringList()
if slices.Contains(targets, targetId) {
return nil
}
targets = append(targets, targetId)
st.SetDetail(bundle.RelationKeyAutoWidgetTargets, domain.StringList(targets))
var (
binBlockWrapperId string
binIsTheLast bool
typeBlockAlreadyExists bool
)
err := st.Iterate(func(b simple.Block) (isContinue bool) {
link := b.Model().GetLink()
if link == nil {
return true
}
if link.TargetBlockId == targetId {
// check by targetBlockId in case user created the same block manually
typeBlockAlreadyExists = true
}
if link.TargetBlockId == DefaultWidgetBin {
binBlockWrapperId = st.GetParentOf(b.Model().Id).Model().Id
rootBlock := st.Get(st.RootId())
if len(rootBlock.Model().GetChildrenIds()) == 0 {
return true
}
if rootBlock.Model().GetChildrenIds()[len(rootBlock.Model().GetChildrenIds())-1] == binBlockWrapperId {
binIsTheLast = true
}
}
return true
})
if err != nil {
return err
}
if typeBlockAlreadyExists {
return nil
}
var (
targetBlockId string
position model.BlockPosition
)
if binIsTheLast {
targetBlockId = binBlockWrapperId
position = model.Block_Top
} else {
targetBlockId = ""
position = model.Block_Bottom
}
_, err = w.CreateBlock(st, &pb.RpcBlockCreateWidgetRequest{
ContextId: st.RootId(),
ObjectLimit: 6,
WidgetLayout: layout,
Position: position,
TargetId: targetBlockId,
ViewId: viewId,
Block: &model.Block{
Id: widgetBlockId, // hardcode id to avoid duplicates
Content: &model.BlockContentOfLink{Link: &model.BlockContentLink{
TargetBlockId: targetId,
}},
},
})
return err
}
func (w *widget) CreateBlock(s *state.State, req *pb.RpcBlockCreateWidgetRequest) (string, error) {
if req.Block.Content == nil {
return "", fmt.Errorf("block has no content")
@ -78,7 +157,13 @@ func (w *widget) CreateBlock(s *state.State, req *pb.RpcBlockCreateWidgetRequest
return "", fmt.Errorf("validate block: %w", err)
}
var wrapperBlockId string
if b.Model().Id != "" {
wrapperBlockId = autoWidgetBlockIdPrefix + b.Model().Id
}
wrapper := simple.New(&model.Block{
Id: wrapperBlockId,
ChildrenIds: []string{
b.Model().Id,
},

View file

@ -171,11 +171,7 @@ func (s *service) createTemplate(
if err != nil {
return
}
id, resultDetails, err = s.CreateSmartBlockFromStateInSpace(ctx, space, []domain.TypeKey{req.ObjectTypeKey}, createState)
if e := s.templateService.SetDefaultTemplateInType(ctx, target, id); e != nil {
log.Errorf("failed to set defaultTemplateId to type: %v", e)
}
return
return s.CreateSmartBlockFromStateInSpace(ctx, space, []domain.TypeKey{req.ObjectTypeKey}, createState)
}
func (s *service) createCommonObject(

View file

@ -71,11 +71,6 @@ func TestService_CreateObject(t *testing.T) {
st.SetDetails(req.Details)
return st, nil
})
f.templateService.EXPECT().SetDefaultTemplateInType(mock.Anything, mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, typeId string, templateId string) error {
assert.Equal(t, "test", templateId)
assert.Equal(t, bundle.TypeKeyTask.URL(), typeId)
return nil
})
f.objectStore.AddObjects(t, spaceId, []objectstore.TestObject{
{

View file

@ -42,6 +42,8 @@ func (v *bundledObjectType) Type() smartblock.SmartBlockType {
return smartblock.SmartBlockTypeBundledObjectType
}
// getDetailsForBundledObjectType returns extra relations and details for bundled object type
// return bundle.ErrNotFound if object type not found
func getDetailsForBundledObjectType(id string) (extraRels []*model.RelationLink, p *domain.Details, err error) {
ot, err := bundle.GetTypeByUrl(id)
if err != nil {
@ -71,7 +73,8 @@ func (v *bundledObjectType) ReadDoc(ctx context.Context, receiver ChangeReceiver
s := state.NewDocWithUniqueKey(v.id, nil, uk).(*state.State)
rels, d, err := getDetailsForBundledObjectType(v.id)
if err != nil {
return nil, err
// it is either not found or invalid id. We return not found for both cases
return nil, domain.ErrObjectNotFound
}
for _, r := range rels {
s.AddRelationLinks(&model.RelationLink{Format: r.Format, Key: r.Key})

View file

@ -75,7 +75,9 @@ func (v *bundledRelation) ReadDoc(_ context.Context, _ ChangeReceiver, empty boo
s := state.NewDocWithUniqueKey(v.id, nil, uk).(*state.State)
d, err := v.getDetails(v.id)
if err != nil {
return nil, err
// it is either not found or invalid id. We return not found for both cases
return nil, domain.ErrObjectNotFound
}
for k, v := range d.Iterate() {
s.SetDetailAndBundledRelation(k, v)

View file

@ -275,54 +275,6 @@ func (_c *MockService_ObjectApplyTemplate_Call) RunAndReturn(run func(string, st
return _c
}
// SetDefaultTemplateInType provides a mock function with given fields: ctx, typeId, templateId
func (_m *MockService) SetDefaultTemplateInType(ctx context.Context, typeId string, templateId string) error {
ret := _m.Called(ctx, typeId, templateId)
if len(ret) == 0 {
panic("no return value specified for SetDefaultTemplateInType")
}
var r0 error
if rf, ok := ret.Get(0).(func(context.Context, string, string) error); ok {
r0 = rf(ctx, typeId, templateId)
} else {
r0 = ret.Error(0)
}
return r0
}
// MockService_SetDefaultTemplateInType_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetDefaultTemplateInType'
type MockService_SetDefaultTemplateInType_Call struct {
*mock.Call
}
// SetDefaultTemplateInType is a helper method to define mock.On call
// - ctx context.Context
// - typeId string
// - templateId string
func (_e *MockService_Expecter) SetDefaultTemplateInType(ctx interface{}, typeId interface{}, templateId interface{}) *MockService_SetDefaultTemplateInType_Call {
return &MockService_SetDefaultTemplateInType_Call{Call: _e.mock.On("SetDefaultTemplateInType", ctx, typeId, templateId)}
}
func (_c *MockService_SetDefaultTemplateInType_Call) Run(run func(ctx context.Context, typeId string, templateId string)) *MockService_SetDefaultTemplateInType_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(context.Context), args[1].(string), args[2].(string))
})
return _c
}
func (_c *MockService_SetDefaultTemplateInType_Call) Return(_a0 error) *MockService_SetDefaultTemplateInType_Call {
_c.Call.Return(_a0)
return _c
}
func (_c *MockService_SetDefaultTemplateInType_Call) RunAndReturn(run func(context.Context, string, string) error) *MockService_SetDefaultTemplateInType_Call {
_c.Call.Return(run)
return _c
}
// TemplateClone provides a mock function with given fields: spaceId, id
func (_m *MockService) TemplateClone(spaceId string, id string) (string, error) {
ret := _m.Called(spaceId, id)

View file

@ -38,7 +38,5 @@ type Service interface {
TemplateExportAll(ctx context.Context, path string) (string, error)
SetDefaultTemplateInType(ctx context.Context, typeId, templateId string) error
app.Component
}

View file

@ -11,7 +11,6 @@ import (
"golang.org/x/exp/slices"
"github.com/anyproto/anytype-heart/core/block/cache"
"github.com/anyproto/anytype-heart/core/block/editor/basic"
"github.com/anyproto/anytype-heart/core/block/editor/converter"
"github.com/anyproto/anytype-heart/core/block/editor/smartblock"
"github.com/anyproto/anytype-heart/core/block/editor/state"
@ -36,10 +35,8 @@ import (
)
const (
CName = "template"
BlankTemplateId = "blank"
DefaultTemplateId = "default"
LastEditedTemplateId = "lastEdited"
CName = "template"
blankTemplateId = "blank"
)
var (
@ -84,8 +81,7 @@ func (s *service) Init(a *app.App) error {
}
// CreateTemplateStateWithDetails creates clone of template object state with empty localDetails and updated objectTypes.
// If withTemplateValidation=true, templateId is queried in store. If template is empty or not found, last edited template is taken.
// Blank template is created in case template object is deleted or blank/empty templateId is provided
// If withTemplateValidation=true, templateId is queried in store. If template is empty or not found, empty template is used
func (s *service) CreateTemplateStateWithDetails(req templateSvc.CreateTemplateRequest) (targetState *state.State, err error) {
if validationErr := req.IsValid(); validationErr != nil {
return nil, fmt.Errorf("create template request validation error: %s", validationErr.Error())
@ -98,7 +94,7 @@ func (s *service) CreateTemplateStateWithDetails(req templateSvc.CreateTemplateR
}
}
switch req.TemplateId {
case "", BlankTemplateId:
case "", blankTemplateId:
targetState = s.createBlankTemplateState(domain.FullID{SpaceID: req.SpaceId, ObjectID: req.TypeId}, req.Layout)
default:
targetState, err = s.createCustomTemplateState(req.TemplateId)
@ -112,23 +108,8 @@ func (s *service) CreateTemplateStateWithDetails(req templateSvc.CreateTemplateR
}
func (s *service) resolveValidTemplateId(spaceId, templateId, typeId string) (string, error) {
switch templateId {
case BlankTemplateId:
return BlankTemplateId, nil
case DefaultTemplateId:
return s.getDefaultTemplateId(spaceId, typeId)
case LastEditedTemplateId:
return s.getLastEditedTemplateId(spaceId, typeId)
case "":
defaultTemplateId, err := s.getDefaultTemplateId(spaceId, typeId)
if err == nil && defaultTemplateId != "" {
return defaultTemplateId, nil
}
lastEditedTemplateId, err := s.getLastEditedTemplateId(spaceId, typeId)
if err == nil && lastEditedTemplateId != "" {
return lastEditedTemplateId, nil
}
return BlankTemplateId, nil
if templateId == "" {
return "", nil
}
records, err := s.queryTemplatesByType(spaceId, typeId)
@ -137,52 +118,19 @@ func (s *service) resolveValidTemplateId(spaceId, templateId, typeId string) (st
}
if len(records) == 0 {
// if no templates presented, we should create new object with blank template
return BlankTemplateId, nil
// if no templates presented, we should use empty template
return "", nil
}
defaultTemplateId, err := s.getDefaultTemplateId(spaceId, typeId)
if err != nil {
defaultTemplateId = ""
}
var defaultTemplateIsValid bool
for _, record := range records {
recordId := record.Details.GetString(bundle.RelationKeyId)
if recordId == templateId {
return templateId, nil
}
if !defaultTemplateIsValid && defaultTemplateId != "" && recordId == defaultTemplateId {
defaultTemplateIsValid = true
}
}
// if requested templateId was not found in store, we should use default template
if defaultTemplateIsValid {
return defaultTemplateId, nil
}
// if default template is not set or not valid, we should use last edited template
return records[0].Details.GetString(bundle.RelationKeyId), nil
}
func (s *service) getDefaultTemplateId(spaceId, typeId string) (string, error) {
details, err := s.store.SpaceIndex(spaceId).GetDetails(typeId)
if err != nil {
return "", fmt.Errorf("failed to get details of type object from store: %w", err)
}
return details.GetString(bundle.RelationKeyDefaultTemplateId), nil
}
func (s *service) getLastEditedTemplateId(spaceId, typeId string) (string, error) {
records, err := s.queryTemplatesByType(spaceId, typeId)
if err != nil {
return "", fmt.Errorf("failed to query templates: %w", err)
}
if len(records) == 0 {
return "", nil
}
return records[0].Details.GetString(bundle.RelationKeyId), nil
// if requested templateId was not found in store, we should use empty template
return "", nil
}
// queryTemplatesByType queries templates by particular type sorted by lastModifiedDate
@ -355,25 +303,10 @@ func (s *service) TemplateCreateFromObject(ctx context.Context, id string) (temp
return "", fmt.Errorf("resolve spaceId: %w", err)
}
spc, err := s.spaceService.Get(ctx, spaceId)
if err != nil {
return "", fmt.Errorf("get space: %w", err)
}
templateId, _, err = s.creator.CreateSmartBlockFromStateInSpace(ctx, spc, objectTypeKeys, st)
templateId, _, err = s.creator.CreateSmartBlockFromState(ctx, spaceId, objectTypeKeys, st)
if err != nil {
return
}
typeId, err2 := spc.GetTypeIdByKey(ctx, objectTypeKeys[0])
if err2 != nil {
log.Errorf("failed to get typeId: %v", err2)
return
}
if err2 = s.SetDefaultTemplateInType(ctx, typeId, templateId); err != nil {
log.Errorf("failed to set defaultTemplateId to type: %v", err2)
}
return
}
@ -466,25 +399,8 @@ func (s *service) TemplateExportAll(ctx context.Context, path string) (string, e
return path, err
}
// SetDefaultTemplateInType sets defaultTemplateId to type object in case it is empty
func (s *service) SetDefaultTemplateInType(ctx context.Context, typeId, templateId string) error {
return cache.DoContext(s.picker, ctx, typeId, func(sb smartblock.SmartBlock) error {
if sb.Details().GetString(bundle.RelationKeyDefaultTemplateId) != "" {
return nil
}
ds := sb.(basic.DetailsSettable)
if ds == nil {
return fmt.Errorf("cannot set defaultTemplateId as type object does not support DetailsSettable interface")
}
return ds.SetDetails(nil, []domain.Detail{{
Key: bundle.RelationKeyDefaultTemplateId,
Value: domain.String(templateId),
}}, false)
})
}
func (s *service) createBlankTemplateState(typeId domain.FullID, layout model.ObjectTypeLayout) (st *state.State) {
st = state.NewDoc(BlankTemplateId, nil).NewState()
st = state.NewDoc(blankTemplateId, nil).NewState()
template.InitTemplate(st, template.WithEmpty,
template.WithFeaturedRelationsBlock,
template.WithDetail(bundle.RelationKeyTag, domain.StringList(nil)),

View file

@ -127,7 +127,7 @@ func TestService_CreateTemplateStateWithDetails(t *testing.T) {
assert.Equal(t, st.Get(template.TitleBlockId).Model().GetText().Text, templateName)
})
for templateIndex, templateName := range []string{templateName, "", BlankTemplateId} {
for templateIndex, templateName := range []string{templateName, "", blankTemplateId} {
for addedDetail, expected := range map[string][]string{
"custom": {"custom", "custom", "custom"},
"": {templateName, "", ""},
@ -155,7 +155,7 @@ func TestService_CreateTemplateStateWithDetails(t *testing.T) {
for _, testCase := range [][]string{
{"templateId is empty", ""},
{"templateId is blank", BlankTemplateId},
{"templateId is blank", blankTemplateId},
{"target template is deleted", deletedTemplateId},
{"target template is archived", archivedTemplateId},
} {
@ -169,7 +169,7 @@ func TestService_CreateTemplateStateWithDetails(t *testing.T) {
// then
assert.NoError(t, err)
assert.Equal(t, BlankTemplateId, st.RootId())
assert.Equal(t, blankTemplateId, st.RootId())
assert.True(t, st.Details().Has(bundle.RelationKeyTag))
})
}
@ -213,7 +213,7 @@ func TestService_CreateTemplateStateWithDetails(t *testing.T) {
s := service{converter: converter.NewLayoutConverter()}
// when
st, err := s.CreateTemplateStateWithDetails(templateSvc.CreateTemplateRequest{TemplateId: BlankTemplateId, Layout: layout})
st, err := s.CreateTemplateStateWithDetails(templateSvc.CreateTemplateRequest{TemplateId: blankTemplateId, Layout: layout})
// then
assert.NoError(t, err)
@ -253,7 +253,7 @@ func TestCreateTemplateStateFromSmartBlock(t *testing.T) {
st := s.CreateTemplateStateFromSmartBlock(nil, templateSvc.CreateTemplateRequest{Layout: model.ObjectType_todo})
// then
assert.Equal(t, BlankTemplateId, st.RootId())
assert.Equal(t, blankTemplateId, st.RootId())
assert.True(t, st.Details().Has(bundle.RelationKeyTag))
})
@ -277,8 +277,6 @@ func TestService_resolveValidTemplateId(t *testing.T) {
templateId1 = "template1"
templateId2 = "template2"
templateId3 = "template3"
templateIdP = "projectTemplate"
now = time.Now().Unix()
)
store := objectstore.NewStoreFixture(t)
@ -287,30 +285,18 @@ func TestService_resolveValidTemplateId(t *testing.T) {
bundle.RelationKeyId: domain.String(templateId1),
bundle.RelationKeyType: domain.String(bundle.TypeKeyTemplate.URL()),
bundle.RelationKeyTargetObjectType: domain.String(bundle.TypeKeyTask.URL()),
bundle.RelationKeyLastModifiedDate: domain.Int64(now),
},
{
bundle.RelationKeyId: domain.String(templateId2),
bundle.RelationKeyType: domain.String(bundle.TypeKeyTemplate.URL()),
bundle.RelationKeyTargetObjectType: domain.String(bundle.TypeKeyTask.URL()),
bundle.RelationKeyLastModifiedDate: domain.Int64(now - 60),
},
{
bundle.RelationKeyId: domain.String(templateId3),
bundle.RelationKeyType: domain.String(bundle.TypeKeyTemplate.URL()),
bundle.RelationKeyTargetObjectType: domain.String(bundle.TypeKeyTask.URL()),
bundle.RelationKeyLastModifiedDate: domain.Int64(now - 120),
bundle.RelationKeyIsDeleted: domain.Bool(true),
},
{
bundle.RelationKeyId: domain.String(bundle.TypeKeyTask.URL()),
bundle.RelationKeyDefaultTemplateId: domain.String(templateId2),
},
{
bundle.RelationKeyId: domain.String(templateIdP),
bundle.RelationKeyType: domain.String(bundle.TypeKeyTemplate.URL()),
bundle.RelationKeyTargetObjectType: domain.String(bundle.TypeKeyProject.URL()),
},
})
spaceService := mock_space.NewMockService(t)
@ -332,14 +318,10 @@ func TestService_resolveValidTemplateId(t *testing.T) {
expectedTemplateId string
}{
{"requested template is valid", bundle.TypeKeyTask, templateId2, templateId2},
{"requested template is invalid", bundle.TypeKeyTask, "invalid", templateId2},
{"requested template is deleted", bundle.TypeKeyTask, templateId3, templateId2},
{"requested template is default", bundle.TypeKeyTask, DefaultTemplateId, templateId2},
{"requested template is lastEdited", bundle.TypeKeyTask, LastEditedTemplateId, templateId1},
{"requested template is empty", bundle.TypeKeyTask, "", templateId2},
{"fallback to lastEdited if no default", bundle.TypeKeyProject, "", templateIdP},
{"requested template is blank", bundle.TypeKeyTask, BlankTemplateId, BlankTemplateId},
{"no valid template exists", bundle.TypeKeyBook, "templateId", BlankTemplateId},
{"requested template is invalid", bundle.TypeKeyTask, "invalid", ""},
{"requested template is deleted", bundle.TypeKeyTask, templateId3, ""},
{"requested template is empty", bundle.TypeKeyTask, "", ""},
{"no valid template exists", bundle.TypeKeyBook, "templateId", ""},
} {
t.Run(tc.name, func(t *testing.T) {
// when

View file

@ -3,9 +3,9 @@ package block
import (
"context"
"fmt"
"slices"
"github.com/anyproto/anytype-heart/core/block/cache"
"github.com/anyproto/anytype-heart/core/block/editor"
"github.com/anyproto/anytype-heart/core/block/editor/basic"
"github.com/anyproto/anytype-heart/core/block/editor/smartblock"
"github.com/anyproto/anytype-heart/core/block/editor/state"
@ -15,9 +15,21 @@ import (
"github.com/anyproto/anytype-heart/core/session"
"github.com/anyproto/anytype-heart/pb"
"github.com/anyproto/anytype-heart/pkg/lib/bundle"
"github.com/anyproto/anytype-heart/pkg/lib/database"
"github.com/anyproto/anytype-heart/pkg/lib/localstore/addr"
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
)
var skippedTypesForAutoWidget = []domain.TypeKey{
bundle.TypeKeyTemplate,
bundle.TypeKeyObjectType,
bundle.TypeKeyDate,
bundle.TypeKeyRelation,
bundle.TypeKeyRelationOption,
bundle.TypeKeyDashboard,
bundle.TypeKeyChatDerived,
}
func (s *Service) SetWidgetBlockTargetId(ctx session.Context, req *pb.RpcBlockWidgetSetTargetIdRequest) error {
return cache.Do(s, req.ContextId, func(b smartblock.SmartBlock) error {
st := b.NewStateCtx(ctx)
@ -71,66 +83,52 @@ func (s *Service) SetWidgetBlockViewId(ctx session.Context, req *pb.RpcBlockWidg
}
func (s *Service) CreateTypeWidgetIfMissing(ctx context.Context, spaceId string, key domain.TypeKey) error {
if slices.Contains(skippedTypesForAutoWidget, key) {
return nil
}
space, err := s.spaceService.Get(ctx, spaceId)
if err != nil {
return err
}
widgetObjectId := space.DerivedIDs().Widgets
typeId, err := space.GetTypeIdByKey(ctx, key)
if err != nil {
return err
}
widgetDetails, err := s.objectStore.SpaceIndex(spaceId).GetDetails(widgetObjectId)
widgetObjectId := space.DerivedIDs().Widgets
widgetDetails, err := s.objectStore.SpaceIndex(space.Id()).GetDetails(widgetObjectId)
if err == nil {
keys := widgetDetails.Get(bundle.RelationKeyAutoWidgetTargets).StringList()
for _, k := range keys {
if k == typeId {
return nil
}
}
}
widgetBlockId := key.String()
return cache.DoState(s, widgetObjectId, func(st *state.State, w widget.Widget) (err error) {
targets := st.Details().Get(bundle.RelationKeyAutoWidgetTargets).StringList()
targets = append(targets, typeId)
st.SetDetail(bundle.RelationKeyAutoWidgetTargets, domain.StringList(targets))
var typeBlockAlreadyExists bool
err = st.Iterate(func(b simple.Block) (isContinue bool) {
link := b.Model().GetLink()
if link == nil {
return true
}
if link.TargetBlockId == typeId {
// check by targetBlockId in case user created the same block manually
typeBlockAlreadyExists = true
return false
}
return true
})
if err != nil {
return err
}
if typeBlockAlreadyExists {
if slices.Contains(keys, typeId) {
// widget was created before
return nil
}
_, err = w.CreateBlock(st, &pb.RpcBlockCreateWidgetRequest{
ContextId: widgetObjectId,
ObjectLimit: 6,
WidgetLayout: model.BlockContentWidget_View,
Position: model.Block_Bottom,
ViewId: editor.ObjectTypeAllViewId,
Block: &model.Block{
Id: widgetBlockId, // hardcode id to avoid duplicates
Content: &model.BlockContentOfLink{Link: &model.BlockContentLink{
TargetBlockId: typeId,
}},
},
})
return err
}
// this is not optimal, maybe it should be some cheaper way
records, err := s.objectStore.SpaceIndex(space.Id()).QueryRaw(&database.Filters{FilterObj: database.FiltersAnd{
database.FilterEq{
Key: bundle.RelationKeyType,
Cond: model.BlockContentDataviewFilter_Equal,
Value: domain.String(typeId),
},
database.FilterEq{
Key: bundle.RelationKeyIsHiddenDiscovery,
Cond: model.BlockContentDataviewFilter_NotEqual,
Value: domain.Bool(true),
},
database.FilterEq{
Key: bundle.RelationKeyOrigin,
Cond: model.BlockContentDataviewFilter_NotEqual,
Value: domain.Int64(model.ObjectOrigin_usecase),
},
}}, 1, 1)
if err != nil {
log.Warnf("failed to query records for type '%s' in space '%s': %v", key, spaceId, err)
}
if len(records) > 0 {
// only create widget if this was the first object of this type created
return nil
}
return cache.DoState(s, widgetObjectId, func(st *state.State, w widget.Widget) (err error) {
return w.AddAutoWidget(st, typeId, key.String(), addr.ObjectTypeAllViewId, model.BlockContentWidget_View)
})
}

View file

@ -185,6 +185,26 @@ func (mw *Middleware) BlockDataviewViewSetPosition(cctx context.Context, req *pb
return response(pb.RpcBlockDataviewViewSetPositionResponseError_NULL, nil)
}
func (mw *Middleware) BlockDataviewRelationSet(cctx context.Context, req *pb.RpcBlockDataviewRelationSetRequest) *pb.RpcBlockDataviewRelationSetResponse {
ctx := mw.newContext(cctx)
response := func(code pb.RpcBlockDataviewRelationSetResponseErrorCode, err error) *pb.RpcBlockDataviewRelationSetResponse {
m := &pb.RpcBlockDataviewRelationSetResponse{Error: &pb.RpcBlockDataviewRelationSetResponseError{Code: code}}
if err != nil {
m.Error.Description = getErrorDescription(err)
} else {
m.Event = mw.getResponseEvent(ctx)
}
return m
}
err := mustService[dataviewservice.Service](mw).SetDataviewRelation(ctx, *req)
if err != nil {
return response(pb.RpcBlockDataviewRelationSetResponseError_BAD_INPUT, err)
}
return response(pb.RpcBlockDataviewRelationSetResponseError_NULL, nil)
}
func (mw *Middleware) BlockDataviewRelationAdd(cctx context.Context, req *pb.RpcBlockDataviewRelationAddRequest) *pb.RpcBlockDataviewRelationAddResponse {
ctx := mw.newContext(cctx)
response := func(code pb.RpcBlockDataviewRelationAddResponseErrorCode, err error) *pb.RpcBlockDataviewRelationAddResponse {

View file

@ -27,6 +27,7 @@ import (
var (
ftIndexInterval = 1 * time.Second
ftMaxIndexInterval = time.Second * 32
ftIndexForceMinInterval = time.Second * 10
ftBatchLimit uint = 1000
ftBlockMaxSize = 1024 * 1024
@ -45,10 +46,10 @@ func (i *indexer) ForceFTIndex() {
// ftLoop runs full-text indexer
// MUST NOT be called more than once
func (i *indexer) ftLoopRoutine() {
ticker := time.NewTicker(ftIndexInterval)
tickerDuration := ftIndexInterval
ticker := time.NewTicker(tickerDuration)
ctx := i.runCtx
i.runFullTextIndexer(ctx)
prevError := i.runFullTextIndexer(ctx)
defer close(i.ftQueueFinished)
var lastForceIndex time.Time
for {
@ -56,10 +57,25 @@ func (i *indexer) ftLoopRoutine() {
case <-ctx.Done():
return
case <-ticker.C:
i.runFullTextIndexer(ctx)
err := i.runFullTextIndexer(ctx)
if err != nil {
if prevError != nil {
// we have an error in the previous run
// double the ticker duration, but not more than ftMaxIndexInterval
if tickerDuration*2 <= ftMaxIndexInterval {
tickerDuration *= 2
ticker.Reset(tickerDuration)
}
}
} else if tickerDuration != ftIndexInterval {
// reset ticker to the initial value
tickerDuration = ftIndexInterval
ticker.Reset(tickerDuration)
}
prevError = err
case <-i.forceFt:
if time.Since(lastForceIndex) > ftIndexForceMinInterval {
i.runFullTextIndexer(ctx)
prevError = i.runFullTextIndexer(ctx)
lastForceIndex = time.Now()
}
}
@ -88,20 +104,30 @@ func (i *indexer) activeSpaces() []string {
return lo.Keys(i.spaces)
}
func (i *indexer) runFullTextIndexer(ctx context.Context) {
func (i *indexer) runFullTextIndexer(ctx context.Context) error {
batcher := i.ftsearch.NewAutoBatcher()
err := i.store.BatchProcessFullTextQueue(ctx, i.activeSpaces, ftBatchLimit, func(objectIds []domain.FullID) ([]string, error) {
toRemove := make([]string, 0, len(objectIds))
err := i.store.BatchProcessFullTextQueue(ctx, i.activeSpaces, ftBatchLimit, func(objectIds []domain.FullID) (succeedIds []string, err error) {
if len(objectIds) == 0 {
return nil, nil
}
for _, objectId := range objectIds {
select {
case <-ctx.Done():
return nil, ctx.Err()
default:
}
objDocs, err := i.prepareSearchDocument(ctx, objectId.ObjectID)
if err != nil &&
!errors.Is(err, domain.ErrObjectNotFound) &&
!errors.Is(err, spacestorage.ErrTreeStorageAlreadyDeleted) {
log.With("id", objectId).Errorf("prepare document for full-text indexing: %s", err)
if err != nil {
if errors.Is(err, context.Canceled) {
return nil, err
}
continue
if !errors.Is(err, domain.ErrObjectNotFound) &&
!errors.Is(err, spacestorage.ErrTreeStorageAlreadyDeleted) {
// some error that doesn't mean object is no longer exists
log.With("id", objectId).Errorf("prepare document for full-text indexing: %s", err)
continue
}
}
objDocs, objRemovedIds, err := i.filterOutNotChangedDocuments(objectId.ObjectID, objDocs)
@ -123,20 +149,23 @@ func (i *indexer) runFullTextIndexer(ctx context.Context) {
return nil, fmt.Errorf("batcher add: %w", err)
}
}
toRemove = append(toRemove, objectId.ObjectID)
succeedIds = append(succeedIds, objectId.ObjectID)
}
err := batcher.Finish()
err = batcher.Finish()
if err != nil {
return nil, fmt.Errorf("finish batch: %w", err)
return nil, fmt.Errorf("finish batch failed: %w", err)
}
return toRemove, nil
return succeedIds, nil
})
if err != nil && maxErrSent.Load() < maxErrorsPerSession {
maxErrSent.Add(1)
log.Errorf("list ids from full-text queue: %v", err)
return
}
return err
}
func (i *indexer) filterOutNotChangedDocuments(id string, newDocs []ftsearch.SearchDoc) (changed []ftsearch.SearchDoc, removedIds []string, err error) {
@ -208,7 +237,7 @@ func (i *indexer) prepareSearchDocument(ctx context.Context, id string) (docs []
if bundledRel, err := bundle.PickRelation(domain.RelationKey(rel.Key)); err == nil {
layout, _ := sb.Layout()
skip := bundledRel.ReadOnly || bundledRel.Hidden
if rel.Key == bundle.RelationKeyName.String() {
if isName(rel) {
skip = false
}
if layout == model.ObjectType_note && rel.Key == bundle.RelationKeySnippet.String() {
@ -227,7 +256,7 @@ func (i *indexer) prepareSearchDocument(ctx context.Context, id string) (docs []
Text: val,
}
if rel.Key == bundle.RelationKeyName.String() {
if isName(rel) {
layout, layoutValid := sb.Layout()
if layoutValid {
if _, contains := filesLayouts[layout]; !contains {
@ -276,14 +305,20 @@ func (i *indexer) prepareSearchDocument(ctx context.Context, id string) (docs []
// we need to avoid TryRemoveFromCache in this case
return docs, nil
}
if err != nil {
return nil, err
}
_, cacheErr := i.picker.TryRemoveFromCache(ctx, id)
if cacheErr != nil &&
!errors.Is(err, domain.ErrObjectNotFound) {
log.With("objectId", id).Errorf("object cache remove: %v", err)
}
return docs, err
return docs, nil
}
func isName(rel *model.RelationLink) bool {
return rel.Key == bundle.RelationKeyName.String() || rel.Key == bundle.RelationKeyPluralName.String()
}
func (i *indexer) ftInit() error {

View file

@ -192,6 +192,30 @@ func TestPrepareSearchDocument_RelationShortText_Success(t *testing.T) {
assert.Equal(t, "", docs[0].Title)
}
func TestPrepareSearchDocument_System_Plural_Success(t *testing.T) {
indexerFx := NewIndexerFixture(t)
smartTest := smarttest.New("objectId1")
smartTest.Doc.(*state.State).AddRelationLinks(&model.RelationLink{
Key: bundle.RelationKeyPluralName.String(),
Format: model.RelationFormat_shorttext,
})
smartTest.Doc.(*state.State).SetDetails(domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{
bundle.RelationKeyPluralName: domain.String("Plural title Text"),
}))
smartTest.Doc.(*state.State).SetLocalDetails(domain.NewDetailsFromMap(map[domain.RelationKey]domain.Value{
bundle.RelationKeyResolvedLayout: domain.Int64(0),
}))
smartTest.Doc.Layout()
indexerFx.pickerFx.EXPECT().GetObject(mock.Anything, mock.Anything).Return(smartTest, nil)
docs, err := indexerFx.prepareSearchDocument(context.Background(), "objectId1")
assert.NoError(t, err)
assert.Len(t, docs, 1)
assert.Equal(t, "objectId1/r/pluralName", docs[0].Id)
assert.Equal(t, "", docs[0].Text)
assert.Equal(t, "Plural title Text", docs[0].Title)
}
func TestPrepareSearchDocument_RelationLongText_Success(t *testing.T) {
indexerFx := NewIndexerFixture(t)
smartTest := smarttest.New("objectId1")

View file

@ -306,6 +306,10 @@
- [Rpc.BlockDataview.Relation.Delete.Request](#anytype-Rpc-BlockDataview-Relation-Delete-Request)
- [Rpc.BlockDataview.Relation.Delete.Response](#anytype-Rpc-BlockDataview-Relation-Delete-Response)
- [Rpc.BlockDataview.Relation.Delete.Response.Error](#anytype-Rpc-BlockDataview-Relation-Delete-Response-Error)
- [Rpc.BlockDataview.Relation.Set](#anytype-Rpc-BlockDataview-Relation-Set)
- [Rpc.BlockDataview.Relation.Set.Request](#anytype-Rpc-BlockDataview-Relation-Set-Request)
- [Rpc.BlockDataview.Relation.Set.Response](#anytype-Rpc-BlockDataview-Relation-Set-Response)
- [Rpc.BlockDataview.Relation.Set.Response.Error](#anytype-Rpc-BlockDataview-Relation-Set-Response-Error)
- [Rpc.BlockDataview.SetSource](#anytype-Rpc-BlockDataview-SetSource)
- [Rpc.BlockDataview.SetSource.Request](#anytype-Rpc-BlockDataview-SetSource-Request)
- [Rpc.BlockDataview.SetSource.Response](#anytype-Rpc-BlockDataview-SetSource-Response)
@ -1407,6 +1411,7 @@
- [Rpc.BlockDataview.ObjectOrder.Update.Response.Error.Code](#anytype-Rpc-BlockDataview-ObjectOrder-Update-Response-Error-Code)
- [Rpc.BlockDataview.Relation.Add.Response.Error.Code](#anytype-Rpc-BlockDataview-Relation-Add-Response-Error-Code)
- [Rpc.BlockDataview.Relation.Delete.Response.Error.Code](#anytype-Rpc-BlockDataview-Relation-Delete-Response-Error-Code)
- [Rpc.BlockDataview.Relation.Set.Response.Error.Code](#anytype-Rpc-BlockDataview-Relation-Set-Response-Error-Code)
- [Rpc.BlockDataview.SetSource.Response.Error.Code](#anytype-Rpc-BlockDataview-SetSource-Response-Error-Code)
- [Rpc.BlockDataview.Sort.Add.Response.Error.Code](#anytype-Rpc-BlockDataview-Sort-Add-Response-Error-Code)
- [Rpc.BlockDataview.Sort.Remove.Response.Error.Code](#anytype-Rpc-BlockDataview-Sort-Remove-Response-Error-Code)
@ -2278,6 +2283,7 @@
| BlockDataviewViewSetActive | [Rpc.BlockDataview.View.SetActive.Request](#anytype-Rpc-BlockDataview-View-SetActive-Request) | [Rpc.BlockDataview.View.SetActive.Response](#anytype-Rpc-BlockDataview-View-SetActive-Response) | |
| BlockDataviewViewSetPosition | [Rpc.BlockDataview.View.SetPosition.Request](#anytype-Rpc-BlockDataview-View-SetPosition-Request) | [Rpc.BlockDataview.View.SetPosition.Response](#anytype-Rpc-BlockDataview-View-SetPosition-Response) | |
| BlockDataviewSetSource | [Rpc.BlockDataview.SetSource.Request](#anytype-Rpc-BlockDataview-SetSource-Request) | [Rpc.BlockDataview.SetSource.Response](#anytype-Rpc-BlockDataview-SetSource-Response) | |
| BlockDataviewRelationSet | [Rpc.BlockDataview.Relation.Set.Request](#anytype-Rpc-BlockDataview-Relation-Set-Request) | [Rpc.BlockDataview.Relation.Set.Response](#anytype-Rpc-BlockDataview-Relation-Set-Response) | |
| BlockDataviewRelationAdd | [Rpc.BlockDataview.Relation.Add.Request](#anytype-Rpc-BlockDataview-Relation-Add-Request) | [Rpc.BlockDataview.Relation.Add.Response](#anytype-Rpc-BlockDataview-Relation-Add-Response) | |
| BlockDataviewRelationDelete | [Rpc.BlockDataview.Relation.Delete.Request](#anytype-Rpc-BlockDataview-Relation-Delete-Request) | [Rpc.BlockDataview.Relation.Delete.Response](#anytype-Rpc-BlockDataview-Relation-Delete-Response) | |
| BlockDataviewGroupOrderUpdate | [Rpc.BlockDataview.GroupOrder.Update.Request](#anytype-Rpc-BlockDataview-GroupOrder-Update-Request) | [Rpc.BlockDataview.GroupOrder.Update.Response](#anytype-Rpc-BlockDataview-GroupOrder-Update-Response) | |
@ -6805,6 +6811,65 @@ Makes blocks copy by given ids and paste it to shown place
<a name="anytype-Rpc-BlockDataview-Relation-Set"></a>
### Rpc.BlockDataview.Relation.Set
<a name="anytype-Rpc-BlockDataview-Relation-Set-Request"></a>
### Rpc.BlockDataview.Relation.Set.Request
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| contextId | [string](#string) | | |
| blockId | [string](#string) | | id of dataview block to set relation |
| relationKeys | [string](#string) | repeated | |
<a name="anytype-Rpc-BlockDataview-Relation-Set-Response"></a>
### Rpc.BlockDataview.Relation.Set.Response
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| error | [Rpc.BlockDataview.Relation.Set.Response.Error](#anytype-Rpc-BlockDataview-Relation-Set-Response-Error) | | |
| event | [ResponseEvent](#anytype-ResponseEvent) | | |
<a name="anytype-Rpc-BlockDataview-Relation-Set-Response-Error"></a>
### Rpc.BlockDataview.Relation.Set.Response.Error
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| code | [Rpc.BlockDataview.Relation.Set.Response.Error.Code](#anytype-Rpc-BlockDataview-Relation-Set-Response-Error-Code) | | |
| description | [string](#string) | | |
<a name="anytype-Rpc-BlockDataview-SetSource"></a>
### Rpc.BlockDataview.SetSource
@ -22756,6 +22821,19 @@ Middleware-to-front-end response, that can contain a NULL error or a non-NULL er
<a name="anytype-Rpc-BlockDataview-Relation-Set-Response-Error-Code"></a>
### Rpc.BlockDataview.Relation.Set.Response.Error.Code
| Name | Number | Description |
| ---- | ------ | ----------- |
| NULL | 0 | |
| UNKNOWN_ERROR | 1 | |
| BAD_INPUT | 2 | |
<a name="anytype-Rpc-BlockDataview-SetSource-Response-Error-Code"></a>
### Rpc.BlockDataview.SetSource.Response.Error.Code

8
go.mod
View file

@ -7,7 +7,7 @@ require (
github.com/PuerkitoBio/goquery v1.10.2
github.com/VividCortex/ewma v1.2.0
github.com/adrium/goheif v0.0.0-20230113233934-ca402e77a786
github.com/anyproto/any-store v0.1.11
github.com/anyproto/any-store v0.1.12
github.com/anyproto/any-sync v0.6.9-0.20250321175140-e2082b9b3781
github.com/anyproto/anytype-publish-server/publishclient v0.0.0-20250131145601-de288583ff2a
github.com/anyproto/anytype-push-server/pushclient v0.0.0-20250319134422-fd3f261ea023
@ -191,7 +191,7 @@ require (
github.com/golang/protobuf v1.5.4 // indirect
github.com/google/flatbuffers v1.12.1 // indirect
github.com/google/go-querystring v1.1.0 // indirect
github.com/google/pprof v0.0.0-20250208200701-d0013a598941 // indirect
github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e // indirect
github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c // indirect
github.com/gorilla/css v1.0.1 // indirect
github.com/gosimple/unidecode v1.0.1 // indirect
@ -294,8 +294,8 @@ require (
lukechampine.com/blake3 v1.4.0 // indirect
modernc.org/libc v1.61.13 // indirect
modernc.org/mathutil v1.7.1 // indirect
modernc.org/memory v1.8.2 // indirect
modernc.org/sqlite v1.36.1 // indirect
modernc.org/memory v1.9.1 // indirect
modernc.org/sqlite v1.36.2 // indirect
nhooyr.io/websocket v1.8.7 // indirect
)

22
go.sum
View file

@ -82,14 +82,12 @@ github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h
github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kktS1LM=
github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA=
github.com/anyproto/any-store v0.1.11 h1:xoaDVF8FJEI6V37fMw/R3ptBCLHj0kYiImwWxC1Ryu8=
github.com/anyproto/any-store v0.1.11/go.mod h1:X3UkQ2zLATYNED3gFhY2VcdfDOeJvpEQ0PmDO90A9Yo=
github.com/anyproto/any-sync v0.6.9-0.20250321175140-e2082b9b3781 h1:xtY2Jr7MdSBCyvXEk4c8DNO1a178HTz3iPGrqcjhXNc=
github.com/anyproto/any-sync v0.6.9-0.20250321175140-e2082b9b3781/go.mod h1:P1hd0Hrc66juMNlr/k7SG55aEwOrBAsKGkh9TsLdml8=
github.com/anyproto/any-store v0.1.12 h1:VgTyfxM4BvFnYMbwWxV9FQmXWNlwp9xriWFh6VOjcm0=
github.com/anyproto/any-store v0.1.12/go.mod h1:T6WNuCHcuXIRiaZ+QAcBHdxIbPbgNCMIf1u3P9jvAyU=
github.com/anyproto/any-sync v0.6.8 h1:aMS7U+RWCqAqaCokCQjtBbiEsoBSBdLGz0kckxqMB2w=
github.com/anyproto/any-sync v0.6.8/go.mod h1:P1hd0Hrc66juMNlr/k7SG55aEwOrBAsKGkh9TsLdml8=
github.com/anyproto/anytype-publish-server/publishclient v0.0.0-20250131145601-de288583ff2a h1:ZZM+0OUCQMWSLSflpkf0ZMVo3V76qEDDIXPpQOClNs0=
github.com/anyproto/anytype-publish-server/publishclient v0.0.0-20250131145601-de288583ff2a/go.mod h1:4fkueCZcGniSMXkrwESO8zzERrh/L7WHimRNWecfGM0=
github.com/anyproto/anytype-push-server/pushclient v0.0.0-20250319134422-fd3f261ea023 h1:c7zj0NKKxFxqmK2PjNofpNB2yRCOzbA0gMLCiaEuLeY=
github.com/anyproto/anytype-push-server/pushclient v0.0.0-20250319134422-fd3f261ea023/go.mod h1:IjVnEyh6QiLsPPfZinTTnOtxe79uJUKZyC1z65b2Yuc=
github.com/anyproto/badger/v4 v4.2.1-0.20240110160636-80743fa3d580 h1:Ba80IlCCxkZ9H1GF+7vFu/TSpPvbpDCxXJ5ogc4euYc=
github.com/anyproto/badger/v4 v4.2.1-0.20240110160636-80743fa3d580/go.mod h1:T/uWAYxrXdaXw64ihI++9RMbKTCpKd/yE9+saARew7k=
github.com/anyproto/go-chash v0.1.0 h1:I9meTPjXFRfXZHRJzjOHC/XF7Q5vzysKkiT/grsogXY=
@ -485,8 +483,8 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf
github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20250208200701-d0013a598941 h1:43XjGa6toxLpeksjcxs1jIoIyr+vUfOqY2c6HB4bpoc=
github.com/google/pprof v0.0.0-20250208200701-d0013a598941/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs=
github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
@ -1695,14 +1693,14 @@ modernc.org/libc v1.61.13 h1:3LRd6ZO1ezsFiX1y+bHd1ipyEHIJKvuprv0sLTBwLW8=
modernc.org/libc v1.61.13/go.mod h1:8F/uJWL/3nNil0Lgt1Dpz+GgkApWh04N3el3hxJcA6E=
modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU=
modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg=
modernc.org/memory v1.8.2 h1:cL9L4bcoAObu4NkxOlKWBWtNHIsnnACGF/TbqQ6sbcI=
modernc.org/memory v1.8.2/go.mod h1:ZbjSvMO5NQ1A2i3bWeDiVMxIorXwdClKE/0SZ+BMotU=
modernc.org/memory v1.9.1 h1:V/Z1solwAVmMW1yttq3nDdZPJqV1rM05Ccq6KMSZ34g=
modernc.org/memory v1.9.1/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw=
modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8=
modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns=
modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w=
modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE=
modernc.org/sqlite v1.36.1 h1:bDa8BJUH4lg6EGkLbahKe/8QqoF8p9gArSc6fTqYhyQ=
modernc.org/sqlite v1.36.1/go.mod h1:7MPwH7Z6bREicF9ZVUR78P1IKuxfZ8mRIDHD0iD+8TU=
modernc.org/sqlite v1.36.2 h1:vjcSazuoFve9Wm0IVNHgmJECoOXLZM1KfMXbcX2axHA=
modernc.org/sqlite v1.36.2/go.mod h1:ADySlx7K4FdY5MaJcEv86hTJ0PjedAloTUuif0YS3ws=
modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0=
modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A=
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=

File diff suppressed because it is too large Load diff

View file

@ -6262,6 +6262,30 @@ message Rpc {
}
}
message Relation {
message Set {
message Request {
string contextId = 1;
string blockId = 2; // id of dataview block to set relation
repeated string relationKeys = 3;
}
message Response {
Error error = 1;
ResponseEvent event = 2;
message Error {
Code code = 1;
string description = 2;
enum Code {
NULL = 0;
UNKNOWN_ERROR = 1;
BAD_INPUT = 2;
}
}
}
}
message Add {
message Request {
string contextId = 1;

View file

@ -257,6 +257,7 @@ service ClientCommands {
rpc BlockDataviewViewSetActive (anytype.Rpc.BlockDataview.View.SetActive.Request) returns (anytype.Rpc.BlockDataview.View.SetActive.Response);
rpc BlockDataviewViewSetPosition (anytype.Rpc.BlockDataview.View.SetPosition.Request) returns (anytype.Rpc.BlockDataview.View.SetPosition.Response);
rpc BlockDataviewSetSource (anytype.Rpc.BlockDataview.SetSource.Request) returns (anytype.Rpc.BlockDataview.SetSource.Response);
rpc BlockDataviewRelationSet (anytype.Rpc.BlockDataview.Relation.Set.Request) returns (anytype.Rpc.BlockDataview.Relation.Set.Response);
rpc BlockDataviewRelationAdd (anytype.Rpc.BlockDataview.Relation.Add.Request) returns (anytype.Rpc.BlockDataview.Relation.Add.Response);
rpc BlockDataviewRelationDelete (anytype.Rpc.BlockDataview.Relation.Delete.Request) returns (anytype.Rpc.BlockDataview.Relation.Delete.Response);
rpc BlockDataviewGroupOrderUpdate (anytype.Rpc.BlockDataview.GroupOrder.Update.Request) returns (anytype.Rpc.BlockDataview.GroupOrder.Update.Response);

View file

@ -1935,6 +1935,55 @@ func (_c *MockClientCommandsServer_BlockDataviewRelationDelete_Call) RunAndRetur
return _c
}
// BlockDataviewRelationSet provides a mock function with given fields: _a0, _a1
func (_m *MockClientCommandsServer) BlockDataviewRelationSet(_a0 context.Context, _a1 *pb.RpcBlockDataviewRelationSetRequest) *pb.RpcBlockDataviewRelationSetResponse {
ret := _m.Called(_a0, _a1)
if len(ret) == 0 {
panic("no return value specified for BlockDataviewRelationSet")
}
var r0 *pb.RpcBlockDataviewRelationSetResponse
if rf, ok := ret.Get(0).(func(context.Context, *pb.RpcBlockDataviewRelationSetRequest) *pb.RpcBlockDataviewRelationSetResponse); ok {
r0 = rf(_a0, _a1)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*pb.RpcBlockDataviewRelationSetResponse)
}
}
return r0
}
// MockClientCommandsServer_BlockDataviewRelationSet_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockDataviewRelationSet'
type MockClientCommandsServer_BlockDataviewRelationSet_Call struct {
*mock.Call
}
// BlockDataviewRelationSet is a helper method to define mock.On call
// - _a0 context.Context
// - _a1 *pb.RpcBlockDataviewRelationSetRequest
func (_e *MockClientCommandsServer_Expecter) BlockDataviewRelationSet(_a0 interface{}, _a1 interface{}) *MockClientCommandsServer_BlockDataviewRelationSet_Call {
return &MockClientCommandsServer_BlockDataviewRelationSet_Call{Call: _e.mock.On("BlockDataviewRelationSet", _a0, _a1)}
}
func (_c *MockClientCommandsServer_BlockDataviewRelationSet_Call) Run(run func(_a0 context.Context, _a1 *pb.RpcBlockDataviewRelationSetRequest)) *MockClientCommandsServer_BlockDataviewRelationSet_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(context.Context), args[1].(*pb.RpcBlockDataviewRelationSetRequest))
})
return _c
}
func (_c *MockClientCommandsServer_BlockDataviewRelationSet_Call) Return(_a0 *pb.RpcBlockDataviewRelationSetResponse) *MockClientCommandsServer_BlockDataviewRelationSet_Call {
_c.Call.Return(_a0)
return _c
}
func (_c *MockClientCommandsServer_BlockDataviewRelationSet_Call) RunAndReturn(run func(context.Context, *pb.RpcBlockDataviewRelationSetRequest) *pb.RpcBlockDataviewRelationSetResponse) *MockClientCommandsServer_BlockDataviewRelationSet_Call {
_c.Call.Return(run)
return _c
}
// BlockDataviewSetSource provides a mock function with given fields: _a0, _a1
func (_m *MockClientCommandsServer) BlockDataviewSetSource(_a0 context.Context, _a1 *pb.RpcBlockDataviewSetSourceRequest) *pb.RpcBlockDataviewSetSourceResponse {
ret := _m.Called(_a0, _a1)

View file

@ -26,365 +26,364 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
func init() { proto.RegisterFile("pb/protos/service/service.proto", fileDescriptor_93a29dc403579097) }
var fileDescriptor_93a29dc403579097 = []byte{
// 5716 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x9d, 0xdf, 0x8f, 0x1c, 0x49,
0x52, 0xf8, 0xb7, 0x5f, 0xbe, 0xfb, 0xa5, 0x8e, 0x5b, 0xa0, 0x17, 0x96, 0xbd, 0xe5, 0xce, 0xf6,
0x7a, 0xed, 0x19, 0xdb, 0xe3, 0xe9, 0xf1, 0xda, 0xfb, 0x8b, 0x3b, 0x24, 0x68, 0xcf, 0xd8, 0xb3,
0x7d, 0x37, 0x33, 0x3b, 0x4c, 0xf7, 0xd8, 0x62, 0x25, 0x24, 0x6a, 0xba, 0x72, 0x7a, 0x8a, 0xa9,
0xae, 0xac, 0xab, 0xca, 0x1e, 0xbb, 0x0f, 0x81, 0x40, 0x20, 0x10, 0x88, 0x13, 0x27, 0x7e, 0x09,
0x9e, 0x90, 0xf8, 0x0b, 0xf8, 0x33, 0x78, 0xbc, 0x47, 0x1e, 0xd1, 0xee, 0xdf, 0x81, 0x84, 0x2a,
0x33, 0x2b, 0x7f, 0x44, 0x45, 0x64, 0xd5, 0x2c, 0x4f, 0xb6, 0x26, 0x3e, 0x11, 0x91, 0x59, 0x19,
0x99, 0x19, 0x99, 0x95, 0x95, 0x1d, 0xdd, 0x2c, 0xce, 0x76, 0x8a, 0x92, 0x0b, 0x5e, 0xed, 0x54,
0xac, 0xbc, 0x4a, 0xe7, 0xac, 0xf9, 0x77, 0x24, 0xff, 0x3c, 0x7c, 0x33, 0xce, 0xd7, 0x62, 0x5d,
0xb0, 0xf7, 0xde, 0xb5, 0xe4, 0x9c, 0x2f, 0x97, 0x71, 0x9e, 0x54, 0x0a, 0x79, 0xef, 0x1d, 0x2b,
0x61, 0x57, 0x2c, 0x17, 0xfa, 0xef, 0x8f, 0x7f, 0xfa, 0x3f, 0x83, 0xe8, 0xad, 0xdd, 0x2c, 0x65,
0xb9, 0xd8, 0xd5, 0x1a, 0xc3, 0x2f, 0xa3, 0x6f, 0x8f, 0x8b, 0x62, 0x9f, 0x89, 0x17, 0xac, 0xac,
0x52, 0x9e, 0x0f, 0x3f, 0x18, 0x69, 0x07, 0xa3, 0x93, 0x62, 0x3e, 0x1a, 0x17, 0xc5, 0xc8, 0x0a,
0x47, 0x27, 0xec, 0xc7, 0x2b, 0x56, 0x89, 0xf7, 0xee, 0x84, 0xa1, 0xaa, 0xe0, 0x79, 0xc5, 0x86,
0xe7, 0xd1, 0xaf, 0x8c, 0x8b, 0x62, 0xca, 0xc4, 0x1e, 0xab, 0x2b, 0x30, 0x15, 0xb1, 0x60, 0xc3,
0xcd, 0x96, 0xaa, 0x0f, 0x18, 0x1f, 0xf7, 0xba, 0x41, 0xed, 0x67, 0x16, 0x7d, 0xab, 0xf6, 0x73,
0xb1, 0x12, 0x09, 0x7f, 0x95, 0x0f, 0xdf, 0x6f, 0x2b, 0x6a, 0x91, 0xb1, 0x7d, 0x3b, 0x84, 0x68,
0xab, 0x2f, 0xa3, 0x5f, 0x7c, 0x19, 0x67, 0x19, 0x13, 0xbb, 0x25, 0xab, 0x0b, 0xee, 0xeb, 0x28,
0xd1, 0x48, 0xc9, 0x8c, 0xdd, 0x0f, 0x82, 0x8c, 0x36, 0xfc, 0x65, 0xf4, 0x6d, 0x25, 0x39, 0x61,
0x73, 0x7e, 0xc5, 0xca, 0x21, 0xaa, 0xa5, 0x85, 0xc4, 0x23, 0x6f, 0x41, 0xd0, 0xf6, 0x2e, 0xcf,
0xaf, 0x58, 0x29, 0x70, 0xdb, 0x5a, 0x18, 0xb6, 0x6d, 0x21, 0x6d, 0xfb, 0xaf, 0x07, 0xd1, 0x77,
0xc7, 0xf3, 0x39, 0x5f, 0xe5, 0xe2, 0x80, 0xcf, 0xe3, 0xec, 0x20, 0xcd, 0x2f, 0x8f, 0xd8, 0xab,
0xdd, 0x8b, 0x9a, 0xcf, 0x17, 0x6c, 0xf8, 0xc4, 0x7f, 0xaa, 0x0a, 0x1d, 0x19, 0x76, 0xe4, 0xc2,
0xc6, 0xf7, 0x47, 0xd7, 0x53, 0xd2, 0x65, 0xf9, 0xbb, 0x41, 0x74, 0x03, 0x96, 0x65, 0xca, 0xb3,
0x2b, 0x66, 0x4b, 0xf3, 0x71, 0x87, 0x61, 0x1f, 0x37, 0xe5, 0xf9, 0xe4, 0xba, 0x6a, 0xba, 0x44,
0x59, 0xf4, 0xb6, 0x1b, 0x2e, 0x53, 0x56, 0xc9, 0xee, 0x74, 0x9f, 0x8e, 0x08, 0x8d, 0x18, 0xcf,
0x0f, 0xfa, 0xa0, 0xda, 0x5b, 0x1a, 0x0d, 0xb5, 0xb7, 0x8c, 0x57, 0xc6, 0xd9, 0x3d, 0xd4, 0x82,
0x43, 0x18, 0x5f, 0xf7, 0x7b, 0x90, 0xda, 0xd5, 0x1f, 0x44, 0xbf, 0xf4, 0x92, 0x97, 0x97, 0x55,
0x11, 0xcf, 0x99, 0xee, 0x0a, 0x77, 0x7d, 0xed, 0x46, 0x0a, 0x7b, 0xc3, 0x46, 0x17, 0xe6, 0x04,
0x6d, 0x23, 0xfc, 0xa2, 0x60, 0x70, 0x0c, 0xb2, 0x8a, 0xb5, 0x90, 0x0a, 0x5a, 0x08, 0x69, 0xdb,
0x97, 0xd1, 0xd0, 0xda, 0x3e, 0xfb, 0x43, 0x36, 0x17, 0xe3, 0x24, 0x81, 0xad, 0x62, 0x75, 0x25,
0x31, 0x1a, 0x27, 0x09, 0xd5, 0x2a, 0x38, 0xaa, 0x9d, 0xbd, 0x8a, 0xde, 0x01, 0xce, 0x0e, 0xd2,
0x4a, 0x3a, 0xdc, 0x0e, 0x5b, 0xd1, 0x98, 0x71, 0x3a, 0xea, 0x8b, 0x6b, 0xc7, 0x7f, 0x3a, 0x88,
0xbe, 0x83, 0x78, 0x3e, 0x61, 0x4b, 0x7e, 0xc5, 0x86, 0x8f, 0xba, 0xad, 0x29, 0xd2, 0xf8, 0xff,
0xf0, 0x1a, 0x1a, 0x48, 0x98, 0x4c, 0x59, 0xc6, 0xe6, 0x82, 0x0c, 0x13, 0x25, 0xee, 0x0c, 0x13,
0x83, 0x39, 0x3d, 0xac, 0x11, 0xee, 0x33, 0xb1, 0xbb, 0x2a, 0x4b, 0x96, 0x0b, 0xb2, 0x2d, 0x2d,
0xd2, 0xd9, 0x96, 0x1e, 0x8a, 0xd4, 0x67, 0x9f, 0x89, 0x71, 0x96, 0x91, 0xf5, 0x51, 0xe2, 0xce,
0xfa, 0x18, 0x4c, 0x7b, 0x98, 0x47, 0xbf, 0xec, 0x3c, 0x31, 0x31, 0xc9, 0xcf, 0xf9, 0x90, 0x7e,
0x16, 0x52, 0x6e, 0x7c, 0x6c, 0x76, 0x72, 0x48, 0x35, 0x9e, 0xbd, 0x2e, 0x78, 0x49, 0x37, 0x8b,
0x12, 0x77, 0x56, 0xc3, 0x60, 0xda, 0xc3, 0xef, 0x47, 0x6f, 0xe9, 0x51, 0xb2, 0x99, 0xcf, 0xee,
0xa0, 0x43, 0x28, 0x9c, 0xd0, 0xee, 0x76, 0x50, 0x2d, 0xf3, 0x87, 0xe9, 0xa2, 0xac, 0x47, 0x1f,
0xdc, 0xbc, 0x96, 0x76, 0x98, 0xb7, 0x94, 0x36, 0xcf, 0xa3, 0x5f, 0xf5, 0xcd, 0xef, 0xc6, 0xf9,
0x9c, 0x65, 0xc3, 0x07, 0x21, 0x75, 0xc5, 0x18, 0x57, 0x5b, 0xbd, 0x58, 0x3b, 0xd8, 0x69, 0x42,
0x0f, 0xa6, 0x1f, 0xa0, 0xda, 0x60, 0x28, 0xbd, 0x13, 0x86, 0x5a, 0xb6, 0xf7, 0x58, 0xc6, 0x48,
0xdb, 0x4a, 0xd8, 0x61, 0xdb, 0x40, 0xda, 0x76, 0x19, 0xfd, 0x9a, 0x69, 0xe6, 0x3a, 0x2f, 0x90,
0xf2, 0x7a, 0xd2, 0xd9, 0x22, 0xda, 0xd1, 0x85, 0x8c, 0xaf, 0x87, 0xfd, 0xe0, 0x56, 0x7d, 0xf4,
0x88, 0x82, 0xd7, 0x07, 0x8c, 0x27, 0x77, 0xc2, 0x90, 0xb6, 0xfd, 0x37, 0x83, 0xe8, 0x7b, 0x5a,
0xf6, 0x2c, 0x8f, 0xcf, 0x32, 0x26, 0xa7, 0xf8, 0x23, 0x26, 0x5e, 0xf1, 0xf2, 0x72, 0xba, 0xce,
0xe7, 0x44, 0x3a, 0x83, 0xc3, 0x1d, 0xe9, 0x0c, 0xa9, 0xa4, 0x0b, 0xf3, 0x47, 0xd1, 0xbb, 0x4d,
0x50, 0x5c, 0xc4, 0xf9, 0x82, 0xfd, 0xb0, 0xe2, 0xf9, 0xb8, 0x48, 0xc7, 0x49, 0x52, 0x0e, 0x47,
0x78, 0xd3, 0x43, 0xce, 0x94, 0x60, 0xa7, 0x37, 0xef, 0xa4, 0xcf, 0xfa, 0x29, 0x0b, 0x5e, 0xc0,
0xf4, 0xb9, 0x79, 0x7c, 0x82, 0x17, 0x54, 0xfa, 0xec, 0x23, 0x2d, 0xab, 0x87, 0xf5, 0x1c, 0x84,
0x5b, 0x3d, 0x74, 0x27, 0x9d, 0xdb, 0x21, 0xc4, 0xce, 0x01, 0xcd, 0x83, 0xe2, 0xf9, 0x79, 0xba,
0x38, 0x2d, 0x92, 0xba, 0x0f, 0xdd, 0xc7, 0xeb, 0xec, 0x20, 0xc4, 0x1c, 0x40, 0xa0, 0xda, 0xdb,
0x4f, 0x6d, 0x96, 0xa9, 0xc7, 0xa5, 0xe7, 0x25, 0x5f, 0x1e, 0xb0, 0x45, 0x3c, 0x5f, 0xeb, 0xc1,
0xf4, 0xa3, 0xd0, 0x28, 0x06, 0x69, 0x53, 0x88, 0x8f, 0xaf, 0xa9, 0xa5, 0xcb, 0xf3, 0x6f, 0x83,
0xe8, 0x8e, 0x17, 0x27, 0x3a, 0x98, 0x54, 0xe9, 0xc7, 0x79, 0x72, 0xc2, 0x2a, 0x11, 0x97, 0x62,
0xf8, 0xfd, 0x40, 0x0c, 0x10, 0x3a, 0xa6, 0x6c, 0x3f, 0xf8, 0x46, 0xba, 0xb6, 0xd5, 0xa7, 0xf5,
0x2c, 0xa1, 0xc7, 0x1f, 0xbf, 0xd5, 0xa5, 0x04, 0x8e, 0x3e, 0xb7, 0x43, 0x88, 0x6d, 0x75, 0x29,
0x98, 0xe4, 0x57, 0xa9, 0x60, 0xfb, 0x2c, 0x67, 0x65, 0xbb, 0xd5, 0x95, 0xaa, 0x8f, 0x10, 0xad,
0x4e, 0xa0, 0x76, 0xa4, 0xf3, 0xbc, 0x99, 0x4c, 0x63, 0x2b, 0x60, 0xa4, 0x95, 0x6b, 0x3c, 0xec,
0x07, 0x13, 0x35, 0x14, 0xfb, 0xb5, 0x91, 0x60, 0x0d, 0x15, 0xd2, 0xab, 0x86, 0x06, 0xb5, 0x0b,
0x73, 0xc7, 0xdb, 0x09, 0xbb, 0xe2, 0x97, 0x70, 0x61, 0xee, 0x1a, 0x50, 0x00, 0xb1, 0x30, 0x47,
0x41, 0x9b, 0x7c, 0x38, 0x7e, 0x5e, 0xa4, 0xec, 0x15, 0x48, 0x3e, 0x5c, 0xe5, 0x5a, 0x4c, 0x24,
0x1f, 0x08, 0xa6, 0x3d, 0x1c, 0x45, 0xbf, 0x20, 0x85, 0x3f, 0xe4, 0x69, 0x3e, 0xbc, 0x89, 0x28,
0xd5, 0x02, 0x63, 0xf5, 0x16, 0x0d, 0x80, 0x12, 0xd7, 0x7f, 0xd5, 0x99, 0xc0, 0x5d, 0x42, 0x09,
0x24, 0x01, 0x1b, 0x5d, 0x98, 0xcd, 0xfa, 0xa4, 0xb0, 0x1e, 0x2d, 0xa7, 0x17, 0x71, 0x99, 0xe6,
0x8b, 0x21, 0xa6, 0xeb, 0xc8, 0x89, 0xac, 0x0f, 0xe3, 0x40, 0x38, 0x69, 0xc5, 0x71, 0x51, 0x94,
0xf5, 0x20, 0x8c, 0x85, 0x93, 0x8f, 0x04, 0xc3, 0xa9, 0x85, 0xe2, 0xde, 0xf6, 0xd8, 0x3c, 0x4b,
0xf3, 0xa0, 0x37, 0x8d, 0xf4, 0xf1, 0x66, 0x51, 0x10, 0xbc, 0x07, 0x2c, 0xbe, 0x62, 0x4d, 0xcd,
0xb0, 0x27, 0xe3, 0x02, 0xc1, 0xe0, 0x05, 0xa0, 0x5d, 0x62, 0x4b, 0xf1, 0x61, 0x7c, 0xc9, 0xea,
0x07, 0xcc, 0xea, 0x29, 0x7c, 0x88, 0xe9, 0x7b, 0x04, 0xb1, 0xc4, 0xc6, 0x49, 0xed, 0x6a, 0x15,
0xbd, 0x23, 0xe5, 0xc7, 0x71, 0x29, 0xd2, 0x79, 0x5a, 0xc4, 0x79, 0xb3, 0x74, 0xc3, 0x46, 0x91,
0x16, 0x65, 0x5c, 0x6e, 0xf7, 0xa4, 0xb5, 0xdb, 0x7f, 0x1e, 0x44, 0xef, 0x43, 0xbf, 0xc7, 0xac,
0x5c, 0xa6, 0x72, 0x07, 0xa0, 0x52, 0x43, 0xfe, 0xf0, 0xd3, 0xb0, 0xd1, 0x96, 0x82, 0x29, 0xcd,
0x67, 0xd7, 0x57, 0xb4, 0x79, 0xdf, 0x54, 0xaf, 0x8a, 0xbe, 0x28, 0x93, 0xd6, 0x0e, 0xd9, 0xb4,
0x59, 0xea, 0x48, 0x21, 0x91, 0xf7, 0xb5, 0x20, 0xd0, 0xc3, 0x4f, 0xf3, 0xaa, 0xb1, 0x8e, 0xf5,
0x70, 0x2b, 0x0e, 0xf6, 0x70, 0x0f, 0xb3, 0x3d, 0xfc, 0x78, 0x75, 0x96, 0xa5, 0xd5, 0x45, 0x9a,
0x2f, 0x74, 0x92, 0xef, 0xeb, 0x5a, 0x31, 0xcc, 0xf3, 0x37, 0x3b, 0x39, 0xcc, 0x89, 0x0e, 0x16,
0xd2, 0x09, 0x08, 0x93, 0xcd, 0x4e, 0xce, 0xae, 0xbd, 0xac, 0xb4, 0x5e, 0xf4, 0x83, 0xb5, 0x97,
0xa3, 0x5a, 0x4b, 0x89, 0xb5, 0x57, 0x9b, 0xb2, 0x6b, 0x2f, 0xb7, 0x0e, 0x15, 0xcf, 0xae, 0xd8,
0x69, 0x99, 0x82, 0xb5, 0x97, 0x57, 0xbe, 0x86, 0x21, 0xd6, 0x5e, 0x14, 0x6b, 0x07, 0x2a, 0x4b,
0xec, 0x33, 0x31, 0x15, 0xb1, 0x58, 0x55, 0x60, 0xa0, 0x72, 0x6c, 0x18, 0x84, 0x18, 0xa8, 0x08,
0x54, 0x7b, 0xfb, 0xdd, 0x28, 0x52, 0xfb, 0x25, 0x72, 0x4f, 0xcb, 0x9f, 0x7b, 0xf4, 0x46, 0x8a,
0xb7, 0xa1, 0xf5, 0x7e, 0x80, 0xb0, 0xe9, 0x95, 0xfa, 0xbb, 0xdc, 0xaa, 0x1b, 0xa2, 0x1a, 0x52,
0x44, 0xa4, 0x57, 0x00, 0x81, 0x05, 0x9d, 0x5e, 0xf0, 0x57, 0x78, 0x41, 0x6b, 0x49, 0xb8, 0xa0,
0x9a, 0xb0, 0x9b, 0xe7, 0xba, 0xa0, 0xd8, 0xe6, 0x79, 0x53, 0x8c, 0xd0, 0xe6, 0x39, 0x64, 0x6c,
0xcc, 0xb8, 0x86, 0x9f, 0x72, 0x7e, 0xb9, 0x8c, 0xcb, 0x4b, 0x10, 0x33, 0x9e, 0x72, 0xc3, 0x10,
0x31, 0x43, 0xb1, 0x36, 0x66, 0x5c, 0x87, 0x75, 0x72, 0x7e, 0x5a, 0x66, 0x20, 0x66, 0x3c, 0x1b,
0x1a, 0x21, 0x62, 0x86, 0x40, 0xed, 0xe8, 0xe4, 0x7a, 0x9b, 0x32, 0xb8, 0x5d, 0xe3, 0xa9, 0x4f,
0x19, 0xb5, 0x5d, 0x83, 0x60, 0x30, 0x84, 0xf6, 0xcb, 0xb8, 0xb8, 0xc0, 0x43, 0x48, 0x8a, 0xc2,
0x21, 0xd4, 0x20, 0xb0, 0xbd, 0xa7, 0x2c, 0x2e, 0xe7, 0x17, 0x78, 0x7b, 0x2b, 0x59, 0xb8, 0xbd,
0x0d, 0x03, 0xdb, 0x5b, 0x09, 0x5e, 0xa6, 0xe2, 0xe2, 0x90, 0x89, 0x18, 0x6f, 0x6f, 0x9f, 0x09,
0xb7, 0x77, 0x8b, 0xb5, 0xd9, 0xbf, 0xeb, 0x70, 0xba, 0x3a, 0xab, 0xe6, 0x65, 0x7a, 0xc6, 0x86,
0x01, 0x2b, 0x06, 0x22, 0xb2, 0x7f, 0x12, 0xd6, 0x3e, 0x7f, 0x36, 0x88, 0x6e, 0x36, 0xcd, 0xce,
0xab, 0x4a, 0xcf, 0x7d, 0xbe, 0xfb, 0x8f, 0xf1, 0xf6, 0x25, 0x70, 0xe2, 0x75, 0x46, 0x0f, 0x35,
0x27, 0x37, 0xc0, 0x8b, 0x74, 0x9a, 0x57, 0xa6, 0x50, 0x9f, 0xf6, 0xb1, 0xee, 0x28, 0x10, 0xb9,
0x41, 0x2f, 0x45, 0x9b, 0x96, 0xe9, 0xf6, 0x69, 0x64, 0x93, 0xa4, 0x02, 0x69, 0x59, 0xf3, 0xbc,
0x1d, 0x82, 0x48, 0xcb, 0x70, 0x12, 0x86, 0xc2, 0x7e, 0xc9, 0x57, 0x45, 0xd5, 0x11, 0x0a, 0x00,
0x0a, 0x87, 0x42, 0x1b, 0xd6, 0x3e, 0x5f, 0x47, 0xbf, 0xee, 0x86, 0x9f, 0xfb, 0xb0, 0xb7, 0xe9,
0x98, 0xc2, 0x1e, 0xf1, 0xa8, 0x2f, 0x6e, 0x33, 0x8a, 0xc6, 0xb3, 0xd8, 0x63, 0x22, 0x4e, 0xb3,
0x6a, 0xb8, 0x81, 0xdb, 0x68, 0xe4, 0x44, 0x46, 0x81, 0x71, 0x70, 0x7c, 0xdb, 0x5b, 0x15, 0x59,
0x3a, 0x6f, 0xbf, 0x4c, 0xd2, 0xba, 0x46, 0x1c, 0x1e, 0xdf, 0x5c, 0x0c, 0x8e, 0xd7, 0x75, 0xea,
0x27, 0xff, 0x33, 0x5b, 0x17, 0x0c, 0x1f, 0xaf, 0x3d, 0x24, 0x3c, 0x5e, 0x43, 0x14, 0xd6, 0x67,
0xca, 0xc4, 0x41, 0xbc, 0xe6, 0x2b, 0x62, 0xbc, 0x36, 0xe2, 0x70, 0x7d, 0x5c, 0xcc, 0xae, 0x0d,
0x8c, 0x87, 0x49, 0x2e, 0x58, 0x99, 0xc7, 0xd9, 0xf3, 0x2c, 0x5e, 0x54, 0x43, 0x62, 0x8c, 0xf1,
0x29, 0x62, 0x6d, 0x40, 0xd3, 0xc8, 0x63, 0x9c, 0x54, 0xcf, 0xe3, 0x2b, 0x5e, 0xa6, 0x82, 0x7e,
0x8c, 0x16, 0xe9, 0x7c, 0x8c, 0x1e, 0x8a, 0x7a, 0x1b, 0x97, 0xf3, 0x8b, 0xf4, 0x8a, 0x25, 0x01,
0x6f, 0x0d, 0xd2, 0xc3, 0x9b, 0x83, 0x22, 0x8d, 0x36, 0xe5, 0xab, 0x72, 0xce, 0xc8, 0x46, 0x53,
0xe2, 0xce, 0x46, 0x33, 0x98, 0xf6, 0xf0, 0x17, 0x83, 0xe8, 0x37, 0x94, 0xd4, 0x7d, 0xc3, 0xb3,
0x17, 0x57, 0x17, 0x67, 0x3c, 0x2e, 0x93, 0xe1, 0x87, 0x98, 0x1d, 0x14, 0x35, 0xae, 0x1f, 0x5f,
0x47, 0x05, 0x3e, 0xd6, 0x3a, 0xef, 0xb6, 0x3d, 0x0e, 0x7d, 0xac, 0x1e, 0x12, 0x7e, 0xac, 0x10,
0x85, 0x03, 0x88, 0x94, 0xab, 0x0d, 0xc0, 0x0d, 0x52, 0xdf, 0xdf, 0x05, 0xdc, 0xec, 0xe4, 0xe0,
0xf8, 0x58, 0x0b, 0xfd, 0x68, 0xd9, 0xa6, 0x6c, 0xe0, 0x11, 0x33, 0xea, 0x8b, 0x93, 0x9e, 0x4d,
0xaf, 0x08, 0x7b, 0x6e, 0xf5, 0x8c, 0x51, 0x5f, 0x9c, 0xf0, 0xec, 0x0c, 0x6b, 0x21, 0xcf, 0xc8,
0xd0, 0x36, 0xea, 0x8b, 0xc3, 0xec, 0x4b, 0x33, 0xcd, 0xbc, 0xf0, 0x20, 0x60, 0x07, 0xce, 0x0d,
0x5b, 0xbd, 0x58, 0xed, 0xf0, 0xaf, 0x06, 0xd1, 0x77, 0xad, 0xc7, 0x43, 0x9e, 0xa4, 0xe7, 0x6b,
0x05, 0xbd, 0x88, 0xb3, 0x15, 0xab, 0x86, 0x8f, 0x29, 0x6b, 0x6d, 0xd6, 0x94, 0xe0, 0xc9, 0xb5,
0x74, 0x60, 0xdf, 0x19, 0x17, 0x45, 0xb6, 0x9e, 0xb1, 0x65, 0x91, 0x91, 0x7d, 0xc7, 0x43, 0xc2,
0x7d, 0x07, 0xa2, 0x30, 0x2b, 0x9f, 0xf1, 0x3a, 0xe7, 0x47, 0xb3, 0x72, 0x29, 0x0a, 0x67, 0xe5,
0x0d, 0x02, 0x73, 0xa5, 0x19, 0xdf, 0xe5, 0x59, 0xc6, 0xe6, 0xa2, 0x7d, 0x4a, 0xc4, 0x68, 0x5a,
0x22, 0x9c, 0x2b, 0x01, 0xd2, 0xee, 0xca, 0x35, 0x6b, 0xc8, 0xb8, 0x64, 0x4f, 0xd7, 0x07, 0x69,
0x7e, 0x39, 0xc4, 0xd3, 0x02, 0x0b, 0x10, 0xbb, 0x72, 0x28, 0x08, 0xd7, 0xaa, 0xa7, 0x79, 0xc2,
0xf1, 0xb5, 0x6a, 0x2d, 0x09, 0xaf, 0x55, 0x35, 0x01, 0x4d, 0x9e, 0x30, 0xca, 0x64, 0x2d, 0x09,
0x9b, 0xd4, 0x04, 0x36, 0x14, 0xea, 0x37, 0x45, 0xe4, 0x50, 0x08, 0xde, 0x0d, 0x6d, 0x76, 0x72,
0x30, 0x42, 0x9b, 0x45, 0xeb, 0x73, 0x26, 0xe6, 0x17, 0x78, 0x84, 0x7a, 0x48, 0x38, 0x42, 0x21,
0x0a, 0xab, 0x34, 0xe3, 0x66, 0xd1, 0xbd, 0x81, 0xc7, 0x47, 0x6b, 0xc1, 0xbd, 0xd9, 0xc9, 0xc1,
0x65, 0xe4, 0x64, 0x29, 0x9f, 0x19, 0x1a, 0xe4, 0x4a, 0x16, 0x5e, 0x46, 0x1a, 0x06, 0x96, 0x5e,
0x09, 0xe4, 0x5e, 0xd6, 0x06, 0xad, 0xe8, 0xed, 0x66, 0x6d, 0x76, 0x72, 0xda, 0xc9, 0x3f, 0x9a,
0x65, 0x9c, 0x92, 0x1e, 0xf1, 0xba, 0x8f, 0xbc, 0x88, 0xb3, 0x34, 0x89, 0x05, 0x9b, 0xf1, 0x4b,
0x96, 0xe3, 0x2b, 0x26, 0x5d, 0x5a, 0xc5, 0x8f, 0x3c, 0x85, 0xf0, 0x8a, 0x29, 0xac, 0x08, 0xe3,
0x44, 0xd1, 0xa7, 0x15, 0xdb, 0x8d, 0x2b, 0x62, 0x24, 0xf3, 0x90, 0x70, 0x9c, 0x40, 0x14, 0xe6,
0xab, 0x4a, 0xfe, 0xec, 0x75, 0xc1, 0xca, 0x94, 0xe5, 0x73, 0x86, 0xe7, 0xab, 0x90, 0x0a, 0xe7,
0xab, 0x08, 0x0d, 0xd7, 0x6a, 0x7b, 0xb1, 0x60, 0x4f, 0xd7, 0xb3, 0x74, 0xc9, 0x2a, 0x11, 0x2f,
0x0b, 0x7c, 0xad, 0x06, 0xa0, 0xf0, 0x5a, 0xad, 0x0d, 0xb7, 0xb6, 0x86, 0xcc, 0x80, 0xd8, 0x3e,
0x5c, 0x06, 0x89, 0xc0, 0xe1, 0x32, 0x02, 0x85, 0x0f, 0xd6, 0x02, 0xe8, 0x4b, 0x82, 0x96, 0x95,
0xe0, 0x4b, 0x02, 0x9a, 0x6e, 0x6d, 0xb8, 0x19, 0x66, 0x5a, 0x77, 0xcd, 0x8e, 0xa2, 0x4f, 0xdd,
0x2e, 0xba, 0xd5, 0x8b, 0xc5, 0x77, 0xf8, 0x4e, 0x58, 0x16, 0xcb, 0x69, 0x2b, 0xb0, 0x8d, 0xd6,
0x30, 0x7d, 0x76, 0xf8, 0x1c, 0x56, 0x3b, 0xfc, 0xb3, 0x41, 0xf4, 0x1e, 0xe6, 0xf1, 0x8b, 0x42,
0xfa, 0x7d, 0xd4, 0x6d, 0x4b, 0x91, 0xc4, 0xe9, 0xb9, 0xb0, 0x86, 0x3d, 0x00, 0xd2, 0x88, 0xec,
0xe1, 0x3a, 0x5d, 0x00, 0x3f, 0x69, 0x33, 0xe5, 0x87, 0x1c, 0x71, 0x00, 0x24, 0xc4, 0xdb, 0xf5,
0x90, 0x5f, 0xae, 0x0a, 0xac, 0x87, 0x8c, 0x0d, 0x2d, 0x26, 0xd6, 0x43, 0x08, 0x66, 0x7b, 0xa7,
0x5b, 0xbd, 0x97, 0xa9, 0xb8, 0x90, 0xf9, 0x16, 0xe8, 0x9d, 0x5e, 0x59, 0x0d, 0x44, 0xf4, 0x4e,
0x12, 0x86, 0x19, 0x49, 0x03, 0xd6, 0x7d, 0x13, 0x1b, 0xcb, 0x8d, 0x21, 0xb7, 0x67, 0xde, 0xeb,
0x06, 0x61, 0xbc, 0x36, 0x62, 0xbd, 0xf4, 0x79, 0x10, 0xb2, 0x00, 0x96, 0x3f, 0x5b, 0xbd, 0x58,
0xed, 0xf0, 0x4f, 0xa2, 0xef, 0xb4, 0x2a, 0xf6, 0x9c, 0xc5, 0x62, 0x55, 0xb2, 0x64, 0xb8, 0xd3,
0x51, 0xee, 0x06, 0x34, 0xae, 0x1f, 0xf5, 0x57, 0x68, 0xe5, 0xe8, 0x0d, 0xa7, 0xc2, 0xca, 0x94,
0xe1, 0x71, 0xc8, 0xa4, 0xcf, 0x06, 0x73, 0x74, 0x5a, 0xa7, 0xb5, 0xcc, 0x76, 0xa3, 0x6b, 0x7c,
0x15, 0xa7, 0x99, 0x7c, 0x59, 0xfb, 0x61, 0xc8, 0xa8, 0x87, 0x06, 0x97, 0xd9, 0xa4, 0x4a, 0x6b,
0x64, 0x96, 0x7d, 0xdc, 0x59, 0x9e, 0x3d, 0xa4, 0x47, 0x02, 0x64, 0x75, 0xb6, 0xdd, 0x93, 0xd6,
0x6e, 0x45, 0x33, 0xe5, 0xd5, 0x7f, 0x76, 0x83, 0x1c, 0xf3, 0xaa, 0x55, 0x91, 0x48, 0xdf, 0xee,
0x49, 0x6b, 0xaf, 0x7f, 0x1c, 0xbd, 0xdb, 0xf6, 0xaa, 0x27, 0xa2, 0x9d, 0x4e, 0x53, 0x60, 0x2e,
0x7a, 0xd4, 0x5f, 0x41, 0xbb, 0xff, 0x17, 0xb3, 0x2f, 0xad, 0xfc, 0xcf, 0xf9, 0x72, 0xc9, 0xf2,
0x84, 0x25, 0x8d, 0x46, 0x55, 0xaf, 0x9f, 0x3e, 0xa3, 0xed, 0x1a, 0x85, 0x91, 0xab, 0x61, 0x4a,
0xf4, 0x9b, 0xdf, 0x40, 0x53, 0x17, 0xed, 0x3f, 0x06, 0xd1, 0x7d, 0xb4, 0x68, 0x4d, 0xe0, 0x7a,
0x45, 0xfc, 0x9d, 0x3e, 0x8e, 0x30, 0x4d, 0x53, 0xd4, 0xf1, 0xff, 0xc1, 0x82, 0x2e, 0xf2, 0xbf,
0x0e, 0xa2, 0xdb, 0x56, 0xb1, 0x0e, 0xef, 0x5d, 0x9e, 0x9f, 0x67, 0xe9, 0x5c, 0xc8, 0x37, 0xb2,
0x5a, 0x85, 0x7e, 0x9c, 0x94, 0x46, 0xf7, 0xe3, 0x0c, 0x68, 0xda, 0xc5, 0xeb, 0xe7, 0x69, 0x25,
0x78, 0xb9, 0x9e, 0x5e, 0xf0, 0x57, 0xcd, 0xe7, 0x49, 0xfe, 0xb8, 0xac, 0x81, 0x91, 0x43, 0x10,
0x8b, 0x57, 0x9c, 0x6c, 0xb9, 0xb2, 0x9f, 0x31, 0x55, 0x84, 0x2b, 0x87, 0xe8, 0x70, 0xe5, 0x93,
0x76, 0x56, 0x6a, 0x6a, 0x65, 0xbf, 0xb9, 0xda, 0xc4, 0x8b, 0xda, 0xfe, 0xee, 0xea, 0x5e, 0x37,
0x68, 0x73, 0x53, 0x2d, 0xde, 0x4b, 0xcf, 0xcf, 0x4d, 0x9d, 0xf0, 0x92, 0xba, 0x08, 0x91, 0x9b,
0x12, 0xa8, 0x5d, 0x5e, 0x3d, 0x4f, 0x33, 0x26, 0xdf, 0xdd, 0x7c, 0x71, 0x7e, 0x9e, 0xf1, 0x38,
0x01, 0xcb, 0xab, 0x5a, 0x3c, 0x72, 0xe5, 0xc4, 0xf2, 0x0a, 0xe3, 0xec, 0xa9, 0x90, 0x5a, 0x5a,
0x47, 0x77, 0x3e, 0x4f, 0x33, 0x78, 0xba, 0x59, 0x6a, 0x1a, 0x21, 0x71, 0x2a, 0xa4, 0x05, 0xd9,
0x14, 0xa8, 0x16, 0xd5, 0x51, 0xd9, 0x94, 0xff, 0x6e, 0x5b, 0xd1, 0x11, 0x13, 0x29, 0x10, 0x82,
0xd9, 0x5d, 0x86, 0x5a, 0x78, 0x5a, 0x48, 0xe3, 0xb7, 0xda, 0x5a, 0x4a, 0x42, 0xec, 0x32, 0xf8,
0x84, 0x5d, 0x2d, 0xd7, 0x7f, 0xdf, 0xe3, 0xaf, 0x72, 0x69, 0xf4, 0x76, 0x5b, 0xa5, 0x91, 0x11,
0xab, 0x65, 0xc8, 0x68, 0xc3, 0x3f, 0x8a, 0xfe, 0xbf, 0x34, 0x5c, 0xf2, 0x62, 0x78, 0x03, 0x51,
0x28, 0x9d, 0xb3, 0xc0, 0x37, 0x49, 0xb9, 0x3d, 0x44, 0x62, 0x62, 0xe3, 0xb4, 0x8a, 0x17, 0xf0,
0x00, 0xbf, 0x6d, 0x71, 0x29, 0x25, 0x0e, 0x91, 0xb4, 0x29, 0x3f, 0x2a, 0x8e, 0x78, 0xa2, 0xad,
0x23, 0x35, 0x34, 0xc2, 0x50, 0x54, 0xb8, 0x90, 0x4d, 0x5b, 0x8f, 0xe2, 0xab, 0x74, 0x61, 0x52,
0x0b, 0x35, 0x80, 0x55, 0x20, 0x6d, 0xb5, 0xcc, 0xc8, 0x81, 0x88, 0xb4, 0x95, 0x84, 0xb5, 0xcf,
0x7f, 0x18, 0x44, 0xb7, 0x2c, 0xb3, 0xdf, 0xec, 0xcb, 0x4e, 0xf2, 0x73, 0x5e, 0x27, 0xb9, 0x07,
0x69, 0x7e, 0x59, 0x0d, 0x3f, 0xa1, 0x4c, 0xe2, 0xbc, 0x29, 0xca, 0xa7, 0xd7, 0xd6, 0xb3, 0xeb,
0x93, 0x66, 0xd3, 0xd2, 0x9e, 0x5c, 0x50, 0x1a, 0x60, 0x7d, 0x62, 0xf6, 0x36, 0x21, 0x47, 0xac,
0x4f, 0x42, 0xbc, 0x6d, 0x62, 0xe3, 0x3c, 0xe3, 0x39, 0x6c, 0x62, 0x6b, 0xa1, 0x16, 0x12, 0x4d,
0xdc, 0x82, 0xec, 0x78, 0xdc, 0x88, 0xd4, 0xfe, 0xda, 0x38, 0xcb, 0xc0, 0x78, 0x6c, 0x54, 0x0d,
0x40, 0x8c, 0xc7, 0x28, 0xa8, 0xfd, 0x9c, 0x44, 0xdf, 0xaa, 0x1f, 0xe9, 0x71, 0xc9, 0xae, 0x52,
0x06, 0x0f, 0xd9, 0x38, 0x12, 0xa2, 0xff, 0xfb, 0x84, 0xed, 0x59, 0xa7, 0x79, 0x55, 0x64, 0x71,
0x75, 0xa1, 0x8f, 0x5d, 0xf8, 0x75, 0x6e, 0x84, 0xf0, 0xe0, 0xc5, 0xdd, 0x0e, 0xca, 0x0e, 0xea,
0x8d, 0xcc, 0x0c, 0x31, 0x1b, 0xb8, 0x6a, 0x6b, 0x98, 0xd9, 0xec, 0xe4, 0xec, 0xbb, 0x8d, 0xfd,
0x38, 0xcb, 0x58, 0xb9, 0x6e, 0x64, 0x87, 0x71, 0x9e, 0x9e, 0xb3, 0x4a, 0x80, 0x77, 0x1b, 0x9a,
0x1a, 0x41, 0x8c, 0x78, 0xb7, 0x11, 0xc0, 0xed, 0xba, 0x0d, 0x78, 0x9e, 0xe4, 0x09, 0x7b, 0x0d,
0xd6, 0x6d, 0xd0, 0x8e, 0x64, 0x88, 0x75, 0x1b, 0xc5, 0xda, 0x3d, 0xfe, 0xa7, 0x19, 0x9f, 0x5f,
0xea, 0x29, 0xc0, 0x6f, 0x60, 0x29, 0x81, 0x73, 0xc0, 0xed, 0x10, 0x62, 0x27, 0x01, 0x29, 0x38,
0x61, 0x45, 0x16, 0xcf, 0xe1, 0x49, 0x2b, 0xa5, 0xa3, 0x65, 0xc4, 0x24, 0x00, 0x19, 0x50, 0x5c,
0x7d, 0x82, 0x0b, 0x2b, 0x2e, 0x38, 0xc0, 0x75, 0x3b, 0x84, 0xd8, 0x69, 0x50, 0x0a, 0xa6, 0x45,
0x96, 0x0a, 0xd0, 0x0d, 0x94, 0x86, 0x94, 0x10, 0xdd, 0xc0, 0x27, 0x80, 0xc9, 0x43, 0x56, 0x2e,
0x18, 0x6a, 0x52, 0x4a, 0x82, 0x26, 0x1b, 0xc2, 0x1e, 0x2b, 0x57, 0x75, 0xe7, 0xc5, 0x1a, 0x1c,
0x2b, 0xd7, 0xd5, 0xe2, 0xc5, 0x9a, 0x38, 0x56, 0xee, 0x01, 0xa0, 0x88, 0xc7, 0x71, 0x25, 0xf0,
0x22, 0x4a, 0x49, 0xb0, 0x88, 0x0d, 0x61, 0xe7, 0x68, 0x55, 0xc4, 0x95, 0x00, 0x73, 0xb4, 0x2e,
0x80, 0x73, 0xd6, 0xe0, 0x26, 0x29, 0xb7, 0x23, 0x89, 0x6a, 0x15, 0x26, 0x9e, 0xa7, 0x2c, 0x4b,
0x2a, 0x30, 0x92, 0xe8, 0xe7, 0xde, 0x48, 0x89, 0x91, 0xa4, 0x4d, 0x81, 0x50, 0xd2, 0x6f, 0x42,
0xb0, 0xda, 0x81, 0x97, 0x20, 0xb7, 0x43, 0x88, 0x1d, 0x9f, 0x9a, 0x42, 0xef, 0xc6, 0x65, 0x99,
0xd6, 0x93, 0xff, 0x06, 0x5e, 0xa0, 0x46, 0x4e, 0x8c, 0x4f, 0x18, 0x07, 0xba, 0x57, 0x33, 0x70,
0x63, 0x05, 0x83, 0x43, 0xf7, 0x07, 0x41, 0xc6, 0x66, 0x9c, 0x52, 0xe2, 0xbc, 0x2c, 0xc7, 0x9e,
0x26, 0xf2, 0xae, 0x7c, 0xa3, 0x0b, 0x73, 0xbe, 0x70, 0x33, 0x2e, 0x0e, 0xf9, 0x15, 0x9b, 0xf1,
0x67, 0xaf, 0xd3, 0xaa, 0x5e, 0x6e, 0xe9, 0x99, 0xfb, 0x09, 0x61, 0x09, 0x83, 0x89, 0x2f, 0xdc,
0x3a, 0x95, 0x6c, 0x02, 0x01, 0xca, 0x72, 0xc4, 0x5e, 0xa1, 0x09, 0x04, 0xb4, 0x68, 0x38, 0x22,
0x81, 0x08, 0xf1, 0x76, 0xc7, 0xcc, 0x38, 0xd7, 0xd7, 0x1a, 0xcc, 0x78, 0x93, 0xcb, 0x51, 0xd6,
0x20, 0x48, 0x6c, 0x5a, 0x04, 0x15, 0xec, 0xfa, 0xd2, 0xf8, 0xb7, 0x5d, 0xec, 0x1e, 0x61, 0xa7,
0xdd, 0xcd, 0xee, 0xf7, 0x20, 0x11, 0x57, 0xf6, 0xc4, 0x07, 0xe5, 0xaa, 0x7d, 0xe0, 0xe3, 0x7e,
0x0f, 0xd2, 0xd9, 0x7d, 0x73, 0xab, 0xf5, 0x34, 0x9e, 0x5f, 0x2e, 0x4a, 0xbe, 0xca, 0x93, 0x5d,
0x9e, 0xf1, 0x12, 0xec, 0xbe, 0x79, 0xa5, 0x06, 0x28, 0xb1, 0xfb, 0xd6, 0xa1, 0x62, 0x33, 0x38,
0xb7, 0x14, 0xe3, 0x2c, 0x5d, 0xc0, 0x15, 0xb5, 0x67, 0x48, 0x02, 0x44, 0x06, 0x87, 0x82, 0x48,
0x10, 0xa9, 0x15, 0xb7, 0x48, 0xe7, 0x71, 0xa6, 0xfc, 0xed, 0xd0, 0x66, 0x3c, 0xb0, 0x33, 0x88,
0x10, 0x05, 0xa4, 0x9e, 0xb3, 0x55, 0x99, 0x4f, 0x72, 0xc1, 0xc9, 0x7a, 0x36, 0x40, 0x67, 0x3d,
0x1d, 0x10, 0x0c, 0xab, 0x33, 0xf6, 0xba, 0x2e, 0x4d, 0xfd, 0x0f, 0x36, 0xac, 0xd6, 0x7f, 0x1f,
0x69, 0x79, 0x68, 0x58, 0x05, 0x1c, 0xa8, 0x8c, 0x76, 0xa2, 0x02, 0x26, 0xa0, 0xed, 0x87, 0xc9,
0xbd, 0x6e, 0x10, 0xf7, 0x33, 0x15, 0xeb, 0x8c, 0x85, 0xfc, 0x48, 0xa0, 0x8f, 0x9f, 0x06, 0xb4,
0xdb, 0x2d, 0x5e, 0x7d, 0x2e, 0xd8, 0xfc, 0xb2, 0x75, 0x80, 0xcd, 0x2f, 0xa8, 0x42, 0x88, 0xed,
0x16, 0x02, 0xc5, 0x9b, 0x68, 0x32, 0xe7, 0x79, 0xa8, 0x89, 0x6a, 0x79, 0x9f, 0x26, 0xd2, 0x9c,
0x5d, 0xfc, 0x1a, 0xa9, 0x8e, 0x4c, 0xd5, 0x4c, 0x5b, 0x84, 0x05, 0x17, 0x22, 0x16, 0xbf, 0x24,
0x6c, 0x73, 0x72, 0xe8, 0xf3, 0xb0, 0x7d, 0xba, 0xbf, 0x65, 0xe5, 0x90, 0x3e, 0xdd, 0x4f, 0xb1,
0x74, 0x25, 0x55, 0x8c, 0x74, 0x58, 0xf1, 0xe3, 0xe4, 0x61, 0x3f, 0xd8, 0x2e, 0x79, 0x3c, 0x9f,
0xbb, 0x19, 0x8b, 0x4b, 0xe5, 0x75, 0x3b, 0x60, 0xc8, 0x62, 0xc4, 0x92, 0x27, 0x80, 0x83, 0x21,
0xcc, 0xf3, 0xbc, 0xcb, 0x73, 0xc1, 0x72, 0x81, 0x0d, 0x61, 0xbe, 0x31, 0x0d, 0x86, 0x86, 0x30,
0x4a, 0x01, 0xc4, 0xad, 0xdc, 0x0f, 0x62, 0xe2, 0x28, 0x5e, 0xa2, 0x19, 0x9b, 0xda, 0xeb, 0x51,
0xf2, 0x50, 0xdc, 0x02, 0xce, 0x79, 0x9d, 0xeb, 0x7a, 0x99, 0xc5, 0xe5, 0xc2, 0xec, 0x6e, 0x24,
0xc3, 0x47, 0xb4, 0x1d, 0x9f, 0x24, 0x5e, 0xe7, 0x86, 0x35, 0xc0, 0xb0, 0x33, 0x59, 0xc6, 0x0b,
0x53, 0x53, 0xa4, 0x06, 0x52, 0xde, 0xaa, 0xea, 0xbd, 0x6e, 0x10, 0xf8, 0x79, 0x91, 0x26, 0x8c,
0x07, 0xfc, 0x48, 0x79, 0x1f, 0x3f, 0x10, 0x04, 0xd9, 0x5b, 0x5d, 0x6f, 0xb5, 0xa2, 0x1b, 0xe7,
0x89, 0x5e, 0xc7, 0x8e, 0x88, 0xc7, 0x03, 0xb8, 0x50, 0xf6, 0x46, 0xf0, 0xa0, 0x8f, 0x36, 0x1b,
0xb4, 0xa1, 0x3e, 0x6a, 0xf6, 0x5f, 0xfb, 0xf4, 0x51, 0x0c, 0xd6, 0x3e, 0x7f, 0xa2, 0xfb, 0xe8,
0x5e, 0x2c, 0xe2, 0x3a, 0x6f, 0x7f, 0x91, 0xb2, 0x57, 0x7a, 0x21, 0x8c, 0xd4, 0xb7, 0xa1, 0x46,
0xf2, 0xe3, 0x64, 0xb0, 0x2a, 0xde, 0xe9, 0xcd, 0x07, 0x7c, 0xeb, 0x15, 0x42, 0xa7, 0x6f, 0xb0,
0x54, 0xd8, 0xe9, 0xcd, 0x07, 0x7c, 0xeb, 0x3b, 0x16, 0x3a, 0x7d, 0x83, 0x8b, 0x16, 0x76, 0x7a,
0xf3, 0xda, 0xf7, 0x9f, 0x37, 0x1d, 0xd7, 0x75, 0x5e, 0xe7, 0x61, 0x73, 0x91, 0x5e, 0x31, 0x2c,
0x9d, 0xf4, 0xed, 0x19, 0x34, 0x94, 0x4e, 0xd2, 0x2a, 0xce, 0x2d, 0x67, 0x58, 0x29, 0x8e, 0x79,
0x95, 0xca, 0xe3, 0x18, 0x4f, 0x7a, 0x18, 0x6d, 0xe0, 0xd0, 0xa2, 0x29, 0xa4, 0x64, 0x5f, 0x2c,
0x7b, 0xa8, 0x3d, 0xaf, 0xfe, 0x30, 0x60, 0xaf, 0x7d, 0x6c, 0x7d, 0xbb, 0x27, 0x6d, 0x5f, 0xf1,
0x7a, 0x8c, 0xfb, 0x6e, 0x39, 0xd4, 0xaa, 0xe8, 0xeb, 0xe5, 0x47, 0xfd, 0x15, 0xb4, 0xfb, 0xbf,
0x6c, 0xd6, 0x15, 0xd0, 0xbf, 0xee, 0x04, 0x8f, 0xfb, 0x58, 0x04, 0x1d, 0xe1, 0xc9, 0xb5, 0x74,
0x74, 0x41, 0xfe, 0xb6, 0x59, 0x40, 0x37, 0xa8, 0xfc, 0x6a, 0x47, 0x7e, 0xed, 0xab, 0xfb, 0x44,
0xa8, 0x59, 0x2d, 0x0c, 0x7b, 0xc6, 0xc7, 0xd7, 0xd4, 0x72, 0xee, 0xbc, 0xf3, 0x60, 0xfd, 0x75,
0xa9, 0x53, 0x9e, 0x90, 0x65, 0x87, 0x86, 0x05, 0xfa, 0xe4, 0xba, 0x6a, 0x54, 0x5f, 0x71, 0x60,
0x79, 0xeb, 0xcb, 0x93, 0x9e, 0x86, 0xbd, 0x7b, 0x60, 0x3e, 0xba, 0x9e, 0x92, 0x2e, 0xcb, 0xbf,
0x0f, 0xa2, 0xbb, 0x1e, 0x6b, 0xdf, 0x27, 0x80, 0x5d, 0x8f, 0x1f, 0x04, 0xec, 0x53, 0x4a, 0xa6,
0x70, 0xbf, 0xf5, 0xcd, 0x94, 0xed, 0x05, 0x71, 0x9e, 0xca, 0xf3, 0x34, 0x13, 0xac, 0x6c, 0x5f,
0x10, 0xe7, 0xdb, 0x55, 0xd4, 0x88, 0xbe, 0x20, 0x2e, 0x80, 0x3b, 0x17, 0xc4, 0x21, 0x9e, 0xd1,
0x0b, 0xe2, 0x50, 0x6b, 0xc1, 0x0b, 0xe2, 0xc2, 0x1a, 0xd4, 0xf0, 0xde, 0x14, 0x41, 0xed, 0x5b,
0xf7, 0xb2, 0xe8, 0x6f, 0x63, 0x3f, 0xbe, 0x8e, 0x0a, 0x31, 0xc1, 0x29, 0x4e, 0x9e, 0x68, 0xec,
0xf1, 0x4c, 0xbd, 0x53, 0x8d, 0x3b, 0xbd, 0x79, 0xed, 0xfb, 0xc7, 0x7a, 0x75, 0x63, 0x86, 0x73,
0x5e, 0xca, 0xcb, 0x01, 0xb7, 0x42, 0xc3, 0x73, 0x6d, 0xc1, 0x6d, 0xf9, 0x87, 0xfd, 0x60, 0xa2,
0xba, 0x35, 0xa1, 0x1b, 0x7d, 0xd4, 0x65, 0x08, 0x34, 0xf9, 0x4e, 0x6f, 0x9e, 0x98, 0x46, 0x94,
0x6f, 0xd5, 0xda, 0x3d, 0x8c, 0xf9, 0x6d, 0xfd, 0xa8, 0xbf, 0x82, 0x76, 0x7f, 0xa5, 0xd3, 0x46,
0xd7, 0xbd, 0x6c, 0xe7, 0xed, 0x2e, 0x53, 0x53, 0xaf, 0x99, 0x47, 0x7d, 0xf1, 0x50, 0x02, 0xe1,
0x4e, 0xa1, 0x5d, 0x09, 0x04, 0x3a, 0x8d, 0x7e, 0x74, 0x3d, 0x25, 0x5d, 0x96, 0xbf, 0x1f, 0x44,
0x37, 0xc9, 0xb2, 0xe8, 0x38, 0xf8, 0xa4, 0xaf, 0x65, 0x10, 0x0f, 0x9f, 0x5e, 0x5b, 0x4f, 0x17,
0xea, 0x9f, 0x06, 0xd1, 0xad, 0x40, 0xa1, 0x54, 0x80, 0x5c, 0xc3, 0xba, 0x1f, 0x28, 0x9f, 0x5d,
0x5f, 0x91, 0x9a, 0xee, 0x5d, 0x7c, 0xda, 0xbe, 0xec, 0x2b, 0x60, 0x7b, 0x4a, 0x5f, 0xf6, 0xd5,
0xad, 0x05, 0x37, 0x79, 0xe2, 0xb3, 0x66, 0xd1, 0x85, 0x6e, 0xf2, 0xc8, 0xb3, 0x88, 0xc1, 0x6b,
0x44, 0x30, 0x0e, 0x73, 0xf2, 0xec, 0x75, 0x11, 0xe7, 0x09, 0xed, 0x44, 0xc9, 0xbb, 0x9d, 0x18,
0x0e, 0x6e, 0x8e, 0xd5, 0xd2, 0x13, 0xde, 0x2c, 0xa4, 0xee, 0x53, 0xfa, 0x06, 0x09, 0x6e, 0x8e,
0xb5, 0x50, 0xc2, 0x9b, 0xce, 0x1a, 0x43, 0xde, 0x40, 0xb2, 0xf8, 0xa0, 0x0f, 0x0a, 0x52, 0x74,
0xe3, 0xcd, 0xec, 0xb9, 0x3f, 0x0c, 0x59, 0x69, 0xed, 0xbb, 0x6f, 0xf7, 0xa4, 0x09, 0xb7, 0x53,
0x26, 0x3e, 0x67, 0x71, 0xc2, 0xca, 0xa0, 0x5b, 0x43, 0xf5, 0x72, 0xeb, 0xd2, 0x98, 0xdb, 0x5d,
0x9e, 0xad, 0x96, 0xb9, 0x6e, 0x4c, 0xd2, 0xad, 0x4b, 0x75, 0xbb, 0x05, 0x34, 0xdc, 0x16, 0xb4,
0x6e, 0x65, 0x7a, 0xf9, 0x20, 0x6c, 0xc6, 0xcb, 0x2a, 0xb7, 0x7a, 0xb1, 0x74, 0x3d, 0x75, 0x18,
0x75, 0xd4, 0x13, 0x44, 0xd2, 0x76, 0x4f, 0x1a, 0xee, 0xcf, 0x39, 0x6e, 0x4d, 0x3c, 0xed, 0x74,
0xd8, 0x6a, 0x85, 0xd4, 0xa3, 0xfe, 0x0a, 0x70, 0x37, 0x54, 0x47, 0xd5, 0x41, 0x5a, 0x89, 0xe7,
0x69, 0x96, 0x0d, 0xb7, 0x02, 0x61, 0xd2, 0x40, 0xc1, 0xdd, 0x50, 0x04, 0x26, 0x22, 0xb9, 0xd9,
0x3d, 0xcc, 0x87, 0x5d, 0x76, 0x24, 0xd5, 0x2b, 0x92, 0x5d, 0x1a, 0xec, 0x68, 0x39, 0x8f, 0xda,
0xd4, 0x76, 0x14, 0x7e, 0x70, 0xad, 0x0a, 0xef, 0xf4, 0xe6, 0xc1, 0xeb, 0x76, 0x49, 0xc9, 0x99,
0xe5, 0x0e, 0x65, 0xc2, 0x9b, 0x49, 0xee, 0x76, 0x50, 0x60, 0x57, 0x50, 0x75, 0xa3, 0x97, 0x69,
0xb2, 0x60, 0x02, 0x7d, 0x53, 0xe4, 0x02, 0xc1, 0x37, 0x45, 0x00, 0x04, 0x4d, 0xa7, 0xfe, 0x6e,
0xb6, 0x43, 0x27, 0x09, 0xd6, 0x74, 0x5a, 0xd9, 0xa1, 0x42, 0x4d, 0x87, 0xd2, 0x60, 0x34, 0x30,
0x6e, 0xf5, 0xc5, 0x0b, 0x0f, 0x42, 0x66, 0xc0, 0xed, 0x0b, 0x5b, 0xbd, 0x58, 0x30, 0xa3, 0x58,
0x87, 0xe9, 0x32, 0x15, 0xd8, 0x8c, 0xe2, 0xd8, 0xa8, 0x91, 0xd0, 0x8c, 0xd2, 0x46, 0xa9, 0xea,
0xd5, 0x39, 0xc2, 0x24, 0x09, 0x57, 0x4f, 0x31, 0xfd, 0xaa, 0x67, 0xd8, 0xd6, 0x8b, 0xcd, 0xdc,
0x84, 0x8c, 0xb8, 0xd0, 0x8b, 0x65, 0x24, 0xb6, 0xe5, 0x07, 0xb9, 0x10, 0x0c, 0x8d, 0x3a, 0x94,
0x02, 0xdc, 0xb0, 0xaf, 0xb9, 0xe6, 0xdd, 0x6b, 0x51, 0xb0, 0xb8, 0x8c, 0xf3, 0x39, 0xba, 0x38,
0x95, 0x06, 0x5b, 0x64, 0x68, 0x71, 0x4a, 0x6a, 0x80, 0xd7, 0xe6, 0xfe, 0xa7, 0xb4, 0x48, 0x57,
0x30, 0xdf, 0xac, 0xfa, 0x5f, 0xd2, 0xde, 0xef, 0x41, 0xc2, 0xd7, 0xe6, 0x0d, 0x60, 0x36, 0xbe,
0x95, 0xd3, 0x0f, 0x03, 0xa6, 0x7c, 0x34, 0xb4, 0x10, 0xa6, 0x55, 0x40, 0x50, 0x9b, 0x04, 0x97,
0x89, 0x1f, 0xb1, 0x35, 0x16, 0xd4, 0x36, 0x3f, 0x95, 0x48, 0x28, 0xa8, 0xdb, 0x28, 0xc8, 0x33,
0xdd, 0x75, 0xd0, 0x46, 0x40, 0xdf, 0x5d, 0xfa, 0x6c, 0x76, 0x72, 0xa0, 0xe7, 0xec, 0xa5, 0x57,
0xde, 0x7b, 0x02, 0xa4, 0xa0, 0x7b, 0xe9, 0x15, 0xfe, 0x9a, 0x60, 0xab, 0x17, 0x0b, 0x5f, 0xc9,
0xc7, 0x82, 0xbd, 0x6e, 0xde, 0x95, 0x23, 0xc5, 0x95, 0xf2, 0xd6, 0xcb, 0xf2, 0x7b, 0xdd, 0xa0,
0x3d, 0x00, 0x7b, 0x5c, 0xf2, 0x39, 0xab, 0x2a, 0x7d, 0x27, 0xa9, 0x7f, 0xc2, 0x48, 0xcb, 0x46,
0xe0, 0x46, 0xd2, 0x3b, 0x61, 0xc8, 0xb9, 0x48, 0x50, 0x89, 0xec, 0xfd, 0x46, 0x1b, 0xa8, 0x66,
0xfb, 0x6a, 0xa3, 0xcd, 0x4e, 0xce, 0x76, 0x2f, 0x2d, 0x75, 0x2f, 0x34, 0xba, 0x87, 0xaa, 0x63,
0x77, 0x19, 0xdd, 0xef, 0x41, 0x6a, 0x57, 0x9f, 0x47, 0x6f, 0x1e, 0xf0, 0xc5, 0x94, 0xe5, 0xc9,
0xf0, 0x7b, 0xfe, 0x11, 0x5a, 0xbe, 0x18, 0xd5, 0x7f, 0x36, 0x46, 0x6f, 0x50, 0x62, 0x7b, 0x08,
0x70, 0x8f, 0x9d, 0xad, 0x16, 0x53, 0x11, 0x0b, 0x70, 0x08, 0x50, 0xfe, 0x7d, 0x54, 0x0b, 0x88,
0x43, 0x80, 0x1e, 0x00, 0xec, 0xcd, 0x4a, 0xc6, 0x50, 0x7b, 0xb5, 0x20, 0x68, 0x4f, 0x03, 0x36,
0x8b, 0x30, 0xf6, 0xea, 0x44, 0x1d, 0x1e, 0xda, 0xb3, 0x3a, 0x52, 0x4a, 0x64, 0x11, 0x6d, 0xca,
0x06, 0xb7, 0xaa, 0xbe, 0xbc, 0x5f, 0x66, 0xb5, 0x5c, 0xc6, 0xe5, 0x1a, 0x04, 0xb7, 0xae, 0xa5,
0x03, 0x10, 0xc1, 0x8d, 0x82, 0xb6, 0xd7, 0x36, 0x8f, 0x79, 0x7e, 0xb9, 0xcf, 0x4b, 0xbe, 0x12,
0x69, 0xce, 0xe0, 0x1d, 0x23, 0xe6, 0x81, 0xba, 0x0c, 0xd1, 0x6b, 0x29, 0xd6, 0x66, 0xb9, 0x92,
0x50, 0xe7, 0x09, 0xe5, 0xa5, 0xec, 0x95, 0xe0, 0x25, 0x7c, 0x9f, 0xa8, 0xac, 0x40, 0x88, 0xc8,
0x72, 0x49, 0x18, 0xb4, 0xfd, 0x71, 0x9a, 0x2f, 0xd0, 0xb6, 0x3f, 0x76, 0xef, 0xf9, 0xbd, 0x45,
0x03, 0xb6, 0x43, 0xa9, 0x87, 0xa6, 0x3a, 0x80, 0xfe, 0x6a, 0x17, 0x7d, 0xe8, 0x2e, 0x41, 0x74,
0x28, 0x9c, 0x04, 0xae, 0xbe, 0x28, 0x58, 0xce, 0x92, 0xe6, 0xd4, 0x1c, 0xe6, 0xca, 0x23, 0x82,
0xae, 0x20, 0x69, 0xc7, 0x22, 0x29, 0x3f, 0x59, 0xe5, 0xc7, 0x25, 0x3f, 0x4f, 0x33, 0x56, 0x82,
0xb1, 0x48, 0xa9, 0x3b, 0x72, 0x62, 0x2c, 0xc2, 0x38, 0x7b, 0xfc, 0x42, 0x4a, 0xbd, 0x5f, 0x16,
0x98, 0x95, 0xf1, 0x1c, 0x1e, 0xbf, 0x50, 0x36, 0xda, 0x18, 0xb1, 0x33, 0x18, 0xc0, 0x9d, 0x44,
0x47, 0xb9, 0xce, 0xd7, 0x32, 0x3e, 0xf4, 0x57, 0xa3, 0xf2, 0xf6, 0xdb, 0x0a, 0x24, 0x3a, 0xda,
0x1c, 0x46, 0x12, 0x89, 0x4e, 0x58, 0xc3, 0x4e, 0x25, 0x92, 0x3b, 0xd2, 0xc7, 0x8a, 0xc0, 0x54,
0xa2, 0x6c, 0x34, 0x42, 0x62, 0x2a, 0x69, 0x41, 0x60, 0x40, 0x6a, 0xba, 0xc1, 0x02, 0x1d, 0x90,
0x8c, 0x34, 0x38, 0x20, 0xb9, 0x94, 0x1d, 0x28, 0x26, 0x79, 0x2a, 0xd2, 0x38, 0x9b, 0x32, 0x71,
0x1c, 0x97, 0xf1, 0x92, 0x09, 0x56, 0xc2, 0x81, 0x42, 0x23, 0x23, 0x8f, 0x21, 0x06, 0x0a, 0x8a,
0xd5, 0x0e, 0x7f, 0x3b, 0x7a, 0xbb, 0x9e, 0xf7, 0x59, 0xae, 0x7f, 0x13, 0xe9, 0x99, 0xfc, 0x31,
0xb5, 0xe1, 0x3b, 0xc6, 0xc6, 0x54, 0x94, 0x2c, 0x5e, 0x36, 0xb6, 0xdf, 0x32, 0x7f, 0x97, 0xe0,
0xa3, 0x41, 0x1d, 0xcf, 0x47, 0x5c, 0xa4, 0xe7, 0xf5, 0x32, 0x5b, 0x7f, 0x41, 0x04, 0xe2, 0xd9,
0x15, 0x8f, 0x02, 0xb7, 0x8e, 0x60, 0x9c, 0x1d, 0xa7, 0x5d, 0xe9, 0x09, 0x2b, 0x32, 0x38, 0x4e,
0x7b, 0xda, 0x12, 0x20, 0xc6, 0x69, 0x14, 0xb4, 0x9d, 0xd3, 0x15, 0xcf, 0x58, 0xb8, 0x32, 0x33,
0xd6, 0xaf, 0x32, 0x33, 0xef, 0xa3, 0x8c, 0x2c, 0x7a, 0xfb, 0x90, 0x2d, 0xcf, 0x58, 0x59, 0x5d,
0xa4, 0x05, 0x75, 0x43, 0xaf, 0x25, 0x3a, 0x6f, 0xe8, 0x25, 0x50, 0x3b, 0x13, 0x58, 0x60, 0x52,
0x1d, 0xc5, 0x4b, 0x26, 0xef, 0x50, 0x01, 0x33, 0x81, 0x63, 0xc4, 0x81, 0x88, 0x99, 0x80, 0x84,
0x9d, 0xef, 0xbb, 0x2c, 0x73, 0xc2, 0x16, 0x75, 0x84, 0x95, 0xc7, 0xf1, 0x7a, 0xc9, 0x72, 0xa1,
0x4d, 0x82, 0x3d, 0x79, 0xc7, 0x24, 0xce, 0x13, 0x7b, 0xf2, 0x7d, 0xf4, 0x9c, 0xa1, 0xc9, 0x7b,
0xf0, 0xc7, 0xbc, 0x14, 0xea, 0x17, 0xcf, 0x4e, 0xcb, 0x0c, 0x0c, 0x4d, 0xfe, 0x43, 0xf5, 0x48,
0x62, 0x68, 0x0a, 0x6b, 0x38, 0xbf, 0x6e, 0xe1, 0x95, 0xe1, 0x05, 0x2b, 0x4d, 0x9c, 0x3c, 0x5b,
0xc6, 0x69, 0xa6, 0xa3, 0xe1, 0xfb, 0x01, 0xdb, 0x84, 0x0e, 0xf1, 0xeb, 0x16, 0x7d, 0x75, 0x9d,
0xdf, 0x03, 0x09, 0x97, 0x10, 0xbc, 0x22, 0xe8, 0xb0, 0x4f, 0xbc, 0x22, 0xe8, 0xd6, 0xb2, 0x2b,
0x77, 0xcb, 0x4a, 0x6e, 0x2d, 0x89, 0x5d, 0x9e, 0xc0, 0xfd, 0x42, 0xc7, 0x26, 0x00, 0x89, 0x95,
0x7b, 0x50, 0xc1, 0xa6, 0x06, 0x16, 0x7b, 0x9e, 0xe6, 0x71, 0x96, 0xfe, 0x04, 0xa6, 0xf5, 0x8e,
0x9d, 0x86, 0x20, 0x52, 0x03, 0x9c, 0xc4, 0x5c, 0xed, 0x33, 0x31, 0x4b, 0xeb, 0xa1, 0xff, 0x5e,
0xe0, 0xb9, 0x49, 0xa2, 0xdb, 0x95, 0x43, 0x3a, 0xb7, 0xf1, 0xc2, 0xc7, 0x3a, 0x2e, 0x8a, 0x69,
0x3d, 0xab, 0x9e, 0xb0, 0x39, 0x4b, 0x0b, 0x31, 0xfc, 0x38, 0xfc, 0xac, 0x00, 0x4e, 0x1c, 0xb4,
0xe8, 0xa1, 0xe6, 0xbc, 0xbe, 0xaf, 0xc7, 0x92, 0xa9, 0xfa, 0x29, 0xd0, 0xd3, 0x8a, 0x95, 0x3a,
0xd1, 0xd8, 0x67, 0x02, 0xf4, 0x4e, 0x87, 0x1b, 0x39, 0x60, 0x5d, 0x51, 0xa2, 0x77, 0x86, 0x35,
0xec, 0x66, 0x9f, 0xc3, 0xe9, 0xdb, 0xd5, 0xe5, 0x79, 0xc3, 0x87, 0xa4, 0x31, 0x87, 0x22, 0x36,
0xfb, 0x68, 0xda, 0x66, 0x6b, 0x6d, 0xb7, 0xe3, 0x7c, 0x3d, 0x81, 0x47, 0x26, 0x10, 0x4b, 0x12,
0x23, 0xb2, 0xb5, 0x00, 0xee, 0x6c, 0x86, 0x97, 0x3c, 0x4e, 0xe6, 0x71, 0x25, 0x8e, 0xe3, 0x75,
0xc6, 0xe3, 0x44, 0xce, 0xeb, 0x70, 0x33, 0xbc, 0x61, 0x46, 0x2e, 0x44, 0x6d, 0x86, 0x53, 0xb0,
0x9b, 0x9d, 0xc9, 0x5f, 0x38, 0xd5, 0x67, 0x39, 0x61, 0x76, 0x26, 0xcb, 0x0b, 0xcf, 0x71, 0xde,
0x09, 0x43, 0xf6, 0x1b, 0x34, 0x25, 0x92, 0x69, 0xc8, 0x2d, 0x4c, 0xc7, 0x4b, 0x40, 0xde, 0x0f,
0x10, 0xf6, 0x06, 0x12, 0xf5, 0xf7, 0xe6, 0x47, 0xad, 0x84, 0xbe, 0xb3, 0xfc, 0x21, 0xa6, 0xeb,
0x42, 0x23, 0xf7, 0x22, 0x8b, 0xed, 0x9e, 0xb4, 0x4d, 0x33, 0x77, 0x2f, 0x62, 0x31, 0x4e, 0x92,
0x43, 0x56, 0x21, 0x1f, 0x94, 0xd7, 0xc2, 0x91, 0x95, 0x12, 0x69, 0x66, 0x9b, 0xb2, 0x81, 0x5e,
0xcb, 0x9e, 0x25, 0xa9, 0xd0, 0xb2, 0xe6, 0x84, 0xf4, 0xc3, 0xb6, 0x81, 0x36, 0x45, 0xd4, 0x8a,
0xa6, 0xed, 0x58, 0x5e, 0x33, 0x33, 0xbe, 0x58, 0x64, 0x4c, 0x43, 0x27, 0x2c, 0x56, 0x57, 0x36,
0xee, 0xb4, 0x6d, 0xa1, 0x20, 0x31, 0x96, 0x07, 0x15, 0x6c, 0x1a, 0x59, 0x63, 0xea, 0x95, 0x54,
0xf3, 0x60, 0x37, 0xdb, 0x66, 0x3c, 0x80, 0x48, 0x23, 0x51, 0xd0, 0x7e, 0xf7, 0x56, 0x8b, 0xf7,
0x59, 0xf3, 0x24, 0xe0, 0x65, 0x53, 0x52, 0xd9, 0x11, 0x13, 0xdf, 0xbd, 0x21, 0x98, 0x5d, 0x27,
0x00, 0x0f, 0x4f, 0xd7, 0x93, 0x04, 0xae, 0x13, 0xa0, 0xbe, 0x64, 0x88, 0x75, 0x02, 0xc5, 0xfa,
0x4d, 0x67, 0xf6, 0xbd, 0x0e, 0xe2, 0xca, 0x56, 0x0e, 0x69, 0x3a, 0x14, 0x0c, 0x35, 0x1d, 0xa5,
0xe0, 0x3f, 0x52, 0x77, 0x6b, 0x0d, 0x79, 0xa4, 0xd8, 0xbe, 0xda, 0x46, 0x17, 0x66, 0x73, 0xff,
0x5a, 0x78, 0xc2, 0xe2, 0xc4, 0x54, 0x0c, 0xd1, 0x75, 0xe5, 0x44, 0xee, 0x8f, 0x71, 0xda, 0xc9,
0xef, 0x45, 0x43, 0x55, 0x8d, 0xd2, 0x75, 0x73, 0x0b, 0x2b, 0x62, 0x4d, 0x10, 0x03, 0x95, 0x4f,
0x38, 0x89, 0x9b, 0xd7, 0x44, 0x33, 0xae, 0x1d, 0xe8, 0xef, 0x32, 0x2b, 0x90, 0xb8, 0xf9, 0x8f,
0xbd, 0x45, 0x13, 0x89, 0x5b, 0xb7, 0x96, 0x73, 0xef, 0x0e, 0x68, 0xb2, 0xe7, 0x25, 0x5f, 0xc2,
0x32, 0x7d, 0x16, 0x6c, 0x1e, 0x44, 0x83, 0xb8, 0x77, 0xa7, 0x9f, 0xa6, 0x9d, 0x83, 0xcc, 0xde,
0x81, 0x3c, 0x9e, 0x86, 0xff, 0x2e, 0x87, 0x12, 0x12, 0x73, 0x50, 0x0b, 0x72, 0x7e, 0xcc, 0x73,
0xf2, 0xb2, 0x4c, 0x45, 0x9a, 0x2f, 0x66, 0x9c, 0x67, 0x70, 0xcb, 0x72, 0x3c, 0x19, 0xb9, 0x52,
0xea, 0xc7, 0x3c, 0x5b, 0x94, 0x9d, 0xe2, 0xc6, 0x93, 0xf1, 0x4a, 0xf0, 0xf3, 0x34, 0xcb, 0x40,
0xe4, 0x8c, 0x27, 0xa3, 0x46, 0x42, 0x44, 0x8e, 0x4f, 0x38, 0x3f, 0x41, 0x39, 0x91, 0xbb, 0xff,
0x7a, 0x07, 0xf4, 0x03, 0xa8, 0xe3, 0x08, 0xa9, 0x9f, 0xa0, 0x84, 0x90, 0xf3, 0x93, 0x9a, 0x13,
0xec, 0xc7, 0x45, 0xb6, 0xa0, 0x3a, 0x02, 0x51, 0x3f, 0xa9, 0x49, 0xc1, 0xce, 0x47, 0xc1, 0xc7,
0xab, 0xea, 0xc2, 0xdf, 0x32, 0x50, 0x8b, 0x43, 0x75, 0x43, 0xe9, 0x13, 0xf0, 0x13, 0x37, 0x3e,
0x3b, 0xf2, 0x60, 0xe2, 0x78, 0x5a, 0xa7, 0x92, 0x2a, 0xcc, 0xd3, 0xf7, 0xff, 0xf3, 0xab, 0x1b,
0x83, 0x9f, 0x7f, 0x75, 0x63, 0xf0, 0xdf, 0x5f, 0xdd, 0x18, 0xfc, 0xec, 0xeb, 0x1b, 0x6f, 0xfc,
0xfc, 0xeb, 0x1b, 0x6f, 0xfc, 0xd7, 0xd7, 0x37, 0xde, 0xf8, 0xf2, 0x4d, 0xfd, 0xa3, 0xf7, 0x67,
0xff, 0x4f, 0xfe, 0x74, 0xfd, 0x93, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x06, 0xe4, 0x0a, 0x54,
0x18, 0x7f, 0x00, 0x00,
// 5705 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x9d, 0x5f, 0x6f, 0x1d, 0x49,
0x56, 0xc0, 0xc7, 0x2f, 0x0c, 0xf4, 0xb2, 0x03, 0xdc, 0x81, 0x61, 0x76, 0xd8, 0x4d, 0x32, 0x99,
0xc4, 0x4e, 0xe2, 0xf8, 0x3a, 0x93, 0xcc, 0x3f, 0x76, 0x91, 0xe0, 0xc6, 0x8e, 0x3d, 0x77, 0xc7,
0x76, 0x8c, 0xef, 0x75, 0x22, 0x46, 0x42, 0xa2, 0x7d, 0xbb, 0x7c, 0xdd, 0xb8, 0x6f, 0x57, 0x6f,
0x77, 0x5d, 0x27, 0x77, 0x11, 0x08, 0x04, 0x02, 0x81, 0x40, 0xac, 0xf8, 0x27, 0x78, 0x42, 0xe2,
0x13, 0xf0, 0x31, 0x78, 0xdc, 0x47, 0x1e, 0xd1, 0xcc, 0xd7, 0x40, 0x02, 0x75, 0x75, 0xfd, 0x3d,
0x7d, 0x4e, 0x75, 0x7b, 0xf6, 0x29, 0x91, 0xcf, 0xef, 0x9c, 0x53, 0xd5, 0x75, 0xaa, 0xea, 0x54,
0x75, 0x75, 0xdd, 0xe8, 0x66, 0x71, 0xb6, 0x5d, 0x94, 0x5c, 0xf0, 0x6a, 0xbb, 0x62, 0xe5, 0x55,
0x3a, 0x63, 0xfa, 0xdf, 0xa1, 0xfc, 0xf3, 0xe0, 0xcd, 0x38, 0x5f, 0x89, 0x55, 0xc1, 0xde, 0x7b,
0xd7, 0x92, 0x33, 0xbe, 0x58, 0xc4, 0x79, 0x52, 0x35, 0xc8, 0x7b, 0xef, 0x58, 0x09, 0xbb, 0x62,
0xb9, 0x50, 0x7f, 0x7f, 0xfc, 0x7f, 0xff, 0xbb, 0x16, 0xbd, 0xb5, 0x93, 0xa5, 0x2c, 0x17, 0x3b,
0x4a, 0x63, 0xf0, 0x65, 0xf4, 0xed, 0x51, 0x51, 0xec, 0x33, 0xf1, 0x82, 0x95, 0x55, 0xca, 0xf3,
0xc1, 0x07, 0x43, 0xe5, 0x60, 0x78, 0x52, 0xcc, 0x86, 0xa3, 0xa2, 0x18, 0x5a, 0xe1, 0xf0, 0x84,
0xfd, 0x68, 0xc9, 0x2a, 0xf1, 0xde, 0x9d, 0x30, 0x54, 0x15, 0x3c, 0xaf, 0xd8, 0xe0, 0x3c, 0xfa,
0x95, 0x51, 0x51, 0x4c, 0x98, 0xd8, 0x65, 0x75, 0x05, 0x26, 0x22, 0x16, 0x6c, 0xb0, 0xd1, 0x52,
0xf5, 0x01, 0xe3, 0xe3, 0x5e, 0x37, 0xa8, 0xfc, 0x4c, 0xa3, 0x6f, 0xd5, 0x7e, 0x2e, 0x96, 0x22,
0xe1, 0xaf, 0xf2, 0xc1, 0xfb, 0x6d, 0x45, 0x25, 0x32, 0xb6, 0x6f, 0x87, 0x10, 0x65, 0xf5, 0x65,
0xf4, 0x8b, 0x2f, 0xe3, 0x2c, 0x63, 0x62, 0xa7, 0x64, 0x75, 0xc1, 0x7d, 0x9d, 0x46, 0x34, 0x6c,
0x64, 0xc6, 0xee, 0x07, 0x41, 0x46, 0x19, 0xfe, 0x32, 0xfa, 0x76, 0x23, 0x39, 0x61, 0x33, 0x7e,
0xc5, 0xca, 0x01, 0xaa, 0xa5, 0x84, 0xc4, 0x23, 0x6f, 0x41, 0xd0, 0xf6, 0x0e, 0xcf, 0xaf, 0x58,
0x29, 0x70, 0xdb, 0x4a, 0x18, 0xb6, 0x6d, 0x21, 0x65, 0xfb, 0xaf, 0xd7, 0xa2, 0xef, 0x8e, 0x66,
0x33, 0xbe, 0xcc, 0xc5, 0x01, 0x9f, 0xc5, 0xd9, 0x41, 0x9a, 0x5f, 0x1e, 0xb1, 0x57, 0x3b, 0x17,
0x35, 0x9f, 0xcf, 0xd9, 0xe0, 0x89, 0xff, 0x54, 0x1b, 0x74, 0x68, 0xd8, 0xa1, 0x0b, 0x1b, 0xdf,
0x1f, 0x5d, 0x4f, 0x49, 0x95, 0xe5, 0xef, 0xd7, 0xa2, 0x1b, 0xb0, 0x2c, 0x13, 0x9e, 0x5d, 0x31,
0x5b, 0x9a, 0x8f, 0x3b, 0x0c, 0xfb, 0xb8, 0x29, 0xcf, 0x27, 0xd7, 0x55, 0x53, 0x25, 0xca, 0xa2,
0xb7, 0xdd, 0x70, 0x99, 0xb0, 0x4a, 0x76, 0xa7, 0xfb, 0x74, 0x44, 0x28, 0xc4, 0x78, 0x7e, 0xd0,
0x07, 0x55, 0xde, 0xd2, 0x68, 0xa0, 0xbc, 0x65, 0xbc, 0x32, 0xce, 0xee, 0xa1, 0x16, 0x1c, 0xc2,
0xf8, 0xba, 0xdf, 0x83, 0x54, 0xae, 0xfe, 0x20, 0xfa, 0xa5, 0x97, 0xbc, 0xbc, 0xac, 0x8a, 0x78,
0xc6, 0x54, 0x57, 0xb8, 0xeb, 0x6b, 0x6b, 0x29, 0xec, 0x0d, 0xeb, 0x5d, 0x98, 0x13, 0xb4, 0x5a,
0xf8, 0xbc, 0x60, 0x70, 0x0c, 0xb2, 0x8a, 0xb5, 0x90, 0x0a, 0x5a, 0x08, 0x29, 0xdb, 0x97, 0xd1,
0xc0, 0xda, 0x3e, 0xfb, 0x43, 0x36, 0x13, 0xa3, 0x24, 0x81, 0xad, 0x62, 0x75, 0x25, 0x31, 0x1c,
0x25, 0x09, 0xd5, 0x2a, 0x38, 0xaa, 0x9c, 0xbd, 0x8a, 0xde, 0x01, 0xce, 0x0e, 0xd2, 0x4a, 0x3a,
0xdc, 0x0a, 0x5b, 0x51, 0x98, 0x71, 0x3a, 0xec, 0x8b, 0x2b, 0xc7, 0x7f, 0xba, 0x16, 0x7d, 0x07,
0xf1, 0x7c, 0xc2, 0x16, 0xfc, 0x8a, 0x0d, 0x1e, 0x75, 0x5b, 0x6b, 0x48, 0xe3, 0xff, 0xc3, 0x6b,
0x68, 0x20, 0x61, 0x32, 0x61, 0x19, 0x9b, 0x09, 0x32, 0x4c, 0x1a, 0x71, 0x67, 0x98, 0x18, 0xcc,
0xe9, 0x61, 0x5a, 0xb8, 0xcf, 0xc4, 0xce, 0xb2, 0x2c, 0x59, 0x2e, 0xc8, 0xb6, 0xb4, 0x48, 0x67,
0x5b, 0x7a, 0x28, 0x52, 0x9f, 0x7d, 0x26, 0x46, 0x59, 0x46, 0xd6, 0xa7, 0x11, 0x77, 0xd6, 0xc7,
0x60, 0xca, 0xc3, 0x2c, 0xfa, 0x65, 0xe7, 0x89, 0x89, 0x71, 0x7e, 0xce, 0x07, 0xf4, 0xb3, 0x90,
0x72, 0xe3, 0x63, 0xa3, 0x93, 0x43, 0xaa, 0xf1, 0xec, 0x75, 0xc1, 0x4b, 0xba, 0x59, 0x1a, 0x71,
0x67, 0x35, 0x0c, 0xa6, 0x3c, 0xfc, 0x7e, 0xf4, 0x96, 0x1a, 0x25, 0xf5, 0x7c, 0x76, 0x07, 0x1d,
0x42, 0xe1, 0x84, 0x76, 0xb7, 0x83, 0x6a, 0x99, 0x3f, 0x4c, 0xe7, 0x65, 0x3d, 0xfa, 0xe0, 0xe6,
0x95, 0xb4, 0xc3, 0xbc, 0xa5, 0x94, 0x79, 0x1e, 0xfd, 0xaa, 0x6f, 0x7e, 0x27, 0xce, 0x67, 0x2c,
0x1b, 0x3c, 0x08, 0xa9, 0x37, 0x8c, 0x71, 0xb5, 0xd9, 0x8b, 0xb5, 0x83, 0x9d, 0x22, 0xd4, 0x60,
0xfa, 0x01, 0xaa, 0x0d, 0x86, 0xd2, 0x3b, 0x61, 0xa8, 0x65, 0x7b, 0x97, 0x65, 0x8c, 0xb4, 0xdd,
0x08, 0x3b, 0x6c, 0x1b, 0x48, 0xd9, 0x2e, 0xa3, 0x5f, 0x33, 0xcd, 0x5c, 0xe7, 0x05, 0x52, 0x5e,
0x4f, 0x3a, 0x9b, 0x44, 0x3b, 0xba, 0x90, 0xf1, 0xf5, 0xb0, 0x1f, 0xdc, 0xaa, 0x8f, 0x1a, 0x51,
0xf0, 0xfa, 0x80, 0xf1, 0xe4, 0x4e, 0x18, 0x52, 0xb6, 0xff, 0x66, 0x2d, 0xfa, 0x9e, 0x92, 0x3d,
0xcb, 0xe3, 0xb3, 0x8c, 0xc9, 0x29, 0xfe, 0x88, 0x89, 0x57, 0xbc, 0xbc, 0x9c, 0xac, 0xf2, 0x19,
0x91, 0xce, 0xe0, 0x70, 0x47, 0x3a, 0x43, 0x2a, 0xa9, 0xc2, 0xfc, 0x51, 0xf4, 0xae, 0x0e, 0x8a,
0x8b, 0x38, 0x9f, 0xb3, 0x1f, 0x56, 0x3c, 0x1f, 0x15, 0xe9, 0x28, 0x49, 0xca, 0xc1, 0x10, 0x6f,
0x7a, 0xc8, 0x99, 0x12, 0x6c, 0xf7, 0xe6, 0x9d, 0xf4, 0x59, 0x3d, 0x65, 0xc1, 0x0b, 0x98, 0x3e,
0xeb, 0xc7, 0x27, 0x78, 0x41, 0xa5, 0xcf, 0x3e, 0xd2, 0xb2, 0x7a, 0x58, 0xcf, 0x41, 0xb8, 0xd5,
0x43, 0x77, 0xd2, 0xb9, 0x1d, 0x42, 0xec, 0x1c, 0xa0, 0x1f, 0x14, 0xcf, 0xcf, 0xd3, 0xf9, 0x69,
0x91, 0xd4, 0x7d, 0xe8, 0x3e, 0x5e, 0x67, 0x07, 0x21, 0xe6, 0x00, 0x02, 0x55, 0xde, 0xfe, 0xce,
0x66, 0x99, 0x6a, 0x5c, 0xda, 0x2b, 0xf9, 0xe2, 0x80, 0xcd, 0xe3, 0xd9, 0x4a, 0x0d, 0xa6, 0x1f,
0x85, 0x46, 0x31, 0x48, 0x9b, 0x42, 0x7c, 0x7c, 0x4d, 0x2d, 0x55, 0x9e, 0x7f, 0x5f, 0x8b, 0xee,
0x78, 0x71, 0xa2, 0x82, 0xa9, 0x29, 0xfd, 0x28, 0x4f, 0x4e, 0x58, 0x25, 0xe2, 0x52, 0x0c, 0xbe,
0x1f, 0x88, 0x01, 0x42, 0xc7, 0x94, 0xed, 0x07, 0xdf, 0x48, 0xd7, 0xb6, 0xfa, 0xa4, 0x9e, 0x25,
0xd4, 0xf8, 0xe3, 0xb7, 0xba, 0x94, 0xc0, 0xd1, 0xe7, 0x76, 0x08, 0xb1, 0xad, 0x2e, 0x05, 0xe3,
0xfc, 0x2a, 0x15, 0x6c, 0x9f, 0xe5, 0xac, 0x6c, 0xb7, 0x7a, 0xa3, 0xea, 0x23, 0x44, 0xab, 0x13,
0xa8, 0x1d, 0xe9, 0x3c, 0x6f, 0x26, 0xd3, 0xd8, 0x0c, 0x18, 0x69, 0xe5, 0x1a, 0x0f, 0xfb, 0xc1,
0x44, 0x0d, 0xc5, 0x7e, 0x6d, 0x24, 0x58, 0xc3, 0x06, 0xe9, 0x55, 0x43, 0x83, 0xda, 0x85, 0xb9,
0xe3, 0xed, 0x84, 0x5d, 0xf1, 0x4b, 0xb8, 0x30, 0x77, 0x0d, 0x34, 0x00, 0xb1, 0x30, 0x47, 0x41,
0x9b, 0x7c, 0x38, 0x7e, 0x5e, 0xa4, 0xec, 0x15, 0x48, 0x3e, 0x5c, 0xe5, 0x5a, 0x4c, 0x24, 0x1f,
0x08, 0xa6, 0x3c, 0x1c, 0x45, 0xbf, 0x20, 0x85, 0x3f, 0xe4, 0x69, 0x3e, 0xb8, 0x89, 0x28, 0xd5,
0x02, 0x63, 0xf5, 0x16, 0x0d, 0x80, 0x12, 0xd7, 0x7f, 0x55, 0x99, 0xc0, 0x5d, 0x42, 0x09, 0x24,
0x01, 0xeb, 0x5d, 0x98, 0xcd, 0xfa, 0xa4, 0xb0, 0x1e, 0x2d, 0x27, 0x17, 0x71, 0x99, 0xe6, 0xf3,
0x01, 0xa6, 0xeb, 0xc8, 0x89, 0xac, 0x0f, 0xe3, 0x40, 0x38, 0x29, 0xc5, 0x51, 0x51, 0x94, 0xf5,
0x20, 0x8c, 0x85, 0x93, 0x8f, 0x04, 0xc3, 0xa9, 0x85, 0xe2, 0xde, 0x76, 0xd9, 0x2c, 0x4b, 0xf3,
0xa0, 0x37, 0x85, 0xf4, 0xf1, 0x66, 0x51, 0x10, 0xbc, 0x07, 0x2c, 0xbe, 0x62, 0xba, 0x66, 0xd8,
0x93, 0x71, 0x81, 0x60, 0xf0, 0x02, 0xd0, 0x2e, 0xb1, 0xa5, 0xf8, 0x30, 0xbe, 0x64, 0xf5, 0x03,
0x66, 0xf5, 0x14, 0x3e, 0xc0, 0xf4, 0x3d, 0x82, 0x58, 0x62, 0xe3, 0xa4, 0x72, 0xb5, 0x8c, 0xde,
0x91, 0xf2, 0xe3, 0xb8, 0x14, 0xe9, 0x2c, 0x2d, 0xe2, 0x5c, 0x2f, 0xdd, 0xb0, 0x51, 0xa4, 0x45,
0x19, 0x97, 0x5b, 0x3d, 0x69, 0xe5, 0xf6, 0x5f, 0xd6, 0xa2, 0xf7, 0xa1, 0xdf, 0x63, 0x56, 0x2e,
0x52, 0xb9, 0x03, 0x50, 0x35, 0x43, 0xfe, 0xe0, 0xd3, 0xb0, 0xd1, 0x96, 0x82, 0x29, 0xcd, 0x67,
0xd7, 0x57, 0xb4, 0x79, 0xdf, 0x44, 0xad, 0x8a, 0x9e, 0x97, 0x49, 0x6b, 0x87, 0x6c, 0xa2, 0x97,
0x3a, 0x52, 0x48, 0xe4, 0x7d, 0x2d, 0x08, 0xf4, 0xf0, 0xd3, 0xbc, 0xd2, 0xd6, 0xb1, 0x1e, 0x6e,
0xc5, 0xc1, 0x1e, 0xee, 0x61, 0xb6, 0x87, 0x1f, 0x2f, 0xcf, 0xb2, 0xb4, 0xba, 0x48, 0xf3, 0xb9,
0x4a, 0xf2, 0x7d, 0x5d, 0x2b, 0x86, 0x79, 0xfe, 0x46, 0x27, 0x87, 0x39, 0x51, 0xc1, 0x42, 0x3a,
0x01, 0x61, 0xb2, 0xd1, 0xc9, 0xd9, 0xb5, 0x97, 0x95, 0xd6, 0x8b, 0x7e, 0xb0, 0xf6, 0x72, 0x54,
0x6b, 0x29, 0xb1, 0xf6, 0x6a, 0x53, 0x76, 0xed, 0xe5, 0xd6, 0xa1, 0xe2, 0xd9, 0x15, 0x3b, 0x2d,
0x53, 0xb0, 0xf6, 0xf2, 0xca, 0xa7, 0x19, 0x62, 0xed, 0x45, 0xb1, 0x76, 0xa0, 0xb2, 0xc4, 0x3e,
0x13, 0x13, 0x11, 0x8b, 0x65, 0x05, 0x06, 0x2a, 0xc7, 0x86, 0x41, 0x88, 0x81, 0x8a, 0x40, 0x95,
0xb7, 0xdf, 0x8d, 0xa2, 0x66, 0xbf, 0x44, 0xee, 0x69, 0xf9, 0x73, 0x8f, 0xda, 0x48, 0xf1, 0x36,
0xb4, 0xde, 0x0f, 0x10, 0x36, 0xbd, 0x6a, 0xfe, 0x2e, 0xb7, 0xea, 0x06, 0xa8, 0x86, 0x14, 0x11,
0xe9, 0x15, 0x40, 0x60, 0x41, 0x27, 0x17, 0xfc, 0x15, 0x5e, 0xd0, 0x5a, 0x12, 0x2e, 0xa8, 0x22,
0xec, 0xe6, 0xb9, 0x2a, 0x28, 0xb6, 0x79, 0xae, 0x8b, 0x11, 0xda, 0x3c, 0x87, 0x8c, 0x8d, 0x19,
0xd7, 0xf0, 0x53, 0xce, 0x2f, 0x17, 0x71, 0x79, 0x09, 0x62, 0xc6, 0x53, 0xd6, 0x0c, 0x11, 0x33,
0x14, 0x6b, 0x63, 0xc6, 0x75, 0x58, 0x27, 0xe7, 0xa7, 0x65, 0x06, 0x62, 0xc6, 0xb3, 0xa1, 0x10,
0x22, 0x66, 0x08, 0xd4, 0x8e, 0x4e, 0xae, 0xb7, 0x09, 0x83, 0xdb, 0x35, 0x9e, 0xfa, 0x84, 0x51,
0xdb, 0x35, 0x08, 0x06, 0x43, 0x68, 0xbf, 0x8c, 0x8b, 0x0b, 0x3c, 0x84, 0xa4, 0x28, 0x1c, 0x42,
0x1a, 0x81, 0xed, 0x3d, 0x61, 0x71, 0x39, 0xbb, 0xc0, 0xdb, 0xbb, 0x91, 0x85, 0xdb, 0xdb, 0x30,
0xb0, 0xbd, 0x1b, 0xc1, 0xcb, 0x54, 0x5c, 0x1c, 0x32, 0x11, 0xe3, 0xed, 0xed, 0x33, 0xe1, 0xf6,
0x6e, 0xb1, 0x36, 0xfb, 0x77, 0x1d, 0x4e, 0x96, 0x67, 0xd5, 0xac, 0x4c, 0xcf, 0xd8, 0x20, 0x60,
0xc5, 0x40, 0x44, 0xf6, 0x4f, 0xc2, 0xca, 0xe7, 0x4f, 0xd6, 0xa2, 0x9b, 0xba, 0xd9, 0x79, 0x55,
0xa9, 0xb9, 0xcf, 0x77, 0xff, 0x31, 0xde, 0xbe, 0x04, 0x4e, 0xbc, 0xce, 0xe8, 0xa1, 0xe6, 0xe4,
0x06, 0x78, 0x91, 0x4e, 0xf3, 0xca, 0x14, 0xea, 0xd3, 0x3e, 0xd6, 0x1d, 0x05, 0x22, 0x37, 0xe8,
0xa5, 0x68, 0xd3, 0x32, 0xd5, 0x3e, 0x5a, 0x36, 0x4e, 0x2a, 0x90, 0x96, 0xe9, 0xe7, 0xed, 0x10,
0x44, 0x5a, 0x86, 0x93, 0x30, 0x14, 0xf6, 0x4b, 0xbe, 0x2c, 0xaa, 0x8e, 0x50, 0x00, 0x50, 0x38,
0x14, 0xda, 0xb0, 0xf2, 0xf9, 0x3a, 0xfa, 0x75, 0x37, 0xfc, 0xdc, 0x87, 0xbd, 0x45, 0xc7, 0x14,
0xf6, 0x88, 0x87, 0x7d, 0x71, 0x9b, 0x51, 0x68, 0xcf, 0x62, 0x97, 0x89, 0x38, 0xcd, 0xaa, 0xc1,
0x3a, 0x6e, 0x43, 0xcb, 0x89, 0x8c, 0x02, 0xe3, 0xe0, 0xf8, 0xb6, 0xbb, 0x2c, 0xb2, 0x74, 0xd6,
0x7e, 0x99, 0xa4, 0x74, 0x8d, 0x38, 0x3c, 0xbe, 0xb9, 0x18, 0x1c, 0xaf, 0xeb, 0xd4, 0x4f, 0xfe,
0x67, 0xba, 0x2a, 0x18, 0x3e, 0x5e, 0x7b, 0x48, 0x78, 0xbc, 0x86, 0x28, 0xac, 0xcf, 0x84, 0x89,
0x83, 0x78, 0xc5, 0x97, 0xc4, 0x78, 0x6d, 0xc4, 0xe1, 0xfa, 0xb8, 0x98, 0x5d, 0x1b, 0x18, 0x0f,
0xe3, 0x5c, 0xb0, 0x32, 0x8f, 0xb3, 0xbd, 0x2c, 0x9e, 0x57, 0x03, 0x62, 0x8c, 0xf1, 0x29, 0x62,
0x6d, 0x40, 0xd3, 0xc8, 0x63, 0x1c, 0x57, 0x7b, 0xf1, 0x15, 0x2f, 0x53, 0x41, 0x3f, 0x46, 0x8b,
0x74, 0x3e, 0x46, 0x0f, 0x45, 0xbd, 0x8d, 0xca, 0xd9, 0x45, 0x7a, 0xc5, 0x92, 0x80, 0x37, 0x8d,
0xf4, 0xf0, 0xe6, 0xa0, 0x48, 0xa3, 0x4d, 0xf8, 0xb2, 0x9c, 0x31, 0xb2, 0xd1, 0x1a, 0x71, 0x67,
0xa3, 0x19, 0x4c, 0x79, 0xf8, 0x8b, 0xb5, 0xe8, 0x37, 0x1a, 0xa9, 0xfb, 0x86, 0x67, 0x37, 0xae,
0x2e, 0xce, 0x78, 0x5c, 0x26, 0x83, 0x0f, 0x31, 0x3b, 0x28, 0x6a, 0x5c, 0x3f, 0xbe, 0x8e, 0x0a,
0x7c, 0xac, 0x75, 0xde, 0x6d, 0x7b, 0x1c, 0xfa, 0x58, 0x3d, 0x24, 0xfc, 0x58, 0x21, 0x0a, 0x07,
0x10, 0x29, 0x6f, 0x36, 0x00, 0xd7, 0x49, 0x7d, 0x7f, 0x17, 0x70, 0xa3, 0x93, 0x83, 0xe3, 0x63,
0x2d, 0xf4, 0xa3, 0x65, 0x8b, 0xb2, 0x81, 0x47, 0xcc, 0xb0, 0x2f, 0x4e, 0x7a, 0x36, 0xbd, 0x22,
0xec, 0xb9, 0xd5, 0x33, 0x86, 0x7d, 0x71, 0xc2, 0xb3, 0x33, 0xac, 0x85, 0x3c, 0x23, 0x43, 0xdb,
0xb0, 0x2f, 0x0e, 0xb3, 0x2f, 0xc5, 0xe8, 0x79, 0xe1, 0x41, 0xc0, 0x0e, 0x9c, 0x1b, 0x36, 0x7b,
0xb1, 0xca, 0xe1, 0x5f, 0xad, 0x45, 0xdf, 0xb5, 0x1e, 0x0f, 0x79, 0x92, 0x9e, 0xaf, 0x1a, 0xe8,
0x45, 0x9c, 0x2d, 0x59, 0x35, 0x78, 0x4c, 0x59, 0x6b, 0xb3, 0xa6, 0x04, 0x4f, 0xae, 0xa5, 0x03,
0xfb, 0xce, 0xa8, 0x28, 0xb2, 0xd5, 0x94, 0x2d, 0x8a, 0x8c, 0xec, 0x3b, 0x1e, 0x12, 0xee, 0x3b,
0x10, 0x85, 0x59, 0xf9, 0x94, 0xd7, 0x39, 0x3f, 0x9a, 0x95, 0x4b, 0x51, 0x38, 0x2b, 0xd7, 0x08,
0xcc, 0x95, 0xa6, 0x7c, 0x87, 0x67, 0x19, 0x9b, 0x89, 0xf6, 0x29, 0x11, 0xa3, 0x69, 0x89, 0x70,
0xae, 0x04, 0x48, 0xbb, 0x2b, 0xa7, 0xd7, 0x90, 0x71, 0xc9, 0x9e, 0xae, 0x0e, 0xd2, 0xfc, 0x72,
0x80, 0xa7, 0x05, 0x16, 0x20, 0x76, 0xe5, 0x50, 0x10, 0xae, 0x55, 0x4f, 0xf3, 0x84, 0xe3, 0x6b,
0xd5, 0x5a, 0x12, 0x5e, 0xab, 0x2a, 0x02, 0x9a, 0x3c, 0x61, 0x94, 0xc9, 0x5a, 0x12, 0x36, 0xa9,
0x08, 0x6c, 0x28, 0x54, 0x6f, 0x8a, 0xc8, 0xa1, 0x10, 0xbc, 0x1b, 0xda, 0xe8, 0xe4, 0x60, 0x84,
0xea, 0x45, 0xeb, 0x1e, 0x13, 0xb3, 0x0b, 0x3c, 0x42, 0x3d, 0x24, 0x1c, 0xa1, 0x10, 0x85, 0x55,
0x9a, 0x72, 0xb3, 0xe8, 0x5e, 0xc7, 0xe3, 0xa3, 0xb5, 0xe0, 0xde, 0xe8, 0xe4, 0xe0, 0x32, 0x72,
0xbc, 0x90, 0xcf, 0x0c, 0x0d, 0xf2, 0x46, 0x16, 0x5e, 0x46, 0x1a, 0x06, 0x96, 0xbe, 0x11, 0xc8,
0xbd, 0xac, 0x75, 0x5a, 0xd1, 0xdb, 0xcd, 0xda, 0xe8, 0xe4, 0x94, 0x93, 0x7f, 0x32, 0xcb, 0xb8,
0x46, 0x7a, 0xc4, 0xeb, 0x3e, 0xf2, 0x22, 0xce, 0xd2, 0x24, 0x16, 0x6c, 0xca, 0x2f, 0x59, 0x8e,
0xaf, 0x98, 0x54, 0x69, 0x1b, 0x7e, 0xe8, 0x29, 0x84, 0x57, 0x4c, 0x61, 0x45, 0x18, 0x27, 0x0d,
0x7d, 0x5a, 0xb1, 0x9d, 0xb8, 0x22, 0x46, 0x32, 0x0f, 0x09, 0xc7, 0x09, 0x44, 0x61, 0xbe, 0xda,
0xc8, 0x9f, 0xbd, 0x2e, 0x58, 0x99, 0xb2, 0x7c, 0xc6, 0xf0, 0x7c, 0x15, 0x52, 0xe1, 0x7c, 0x15,
0xa1, 0xe1, 0x5a, 0x6d, 0x37, 0x16, 0xec, 0xe9, 0x6a, 0x9a, 0x2e, 0x58, 0x25, 0xe2, 0x45, 0x81,
0xaf, 0xd5, 0x00, 0x14, 0x5e, 0xab, 0xb5, 0xe1, 0xd6, 0xd6, 0x90, 0x19, 0x10, 0xdb, 0x87, 0xcb,
0x20, 0x11, 0x38, 0x5c, 0x46, 0xa0, 0xf0, 0xc1, 0x5a, 0x00, 0x7d, 0x49, 0xd0, 0xb2, 0x12, 0x7c,
0x49, 0x40, 0xd3, 0xad, 0x0d, 0x37, 0xc3, 0x4c, 0xea, 0xae, 0xd9, 0x51, 0xf4, 0x89, 0xdb, 0x45,
0x37, 0x7b, 0xb1, 0xf8, 0x0e, 0xdf, 0x09, 0xcb, 0x62, 0x39, 0x6d, 0x05, 0xb6, 0xd1, 0x34, 0xd3,
0x67, 0x87, 0xcf, 0x61, 0x95, 0xc3, 0x3f, 0x5b, 0x8b, 0xde, 0xc3, 0x3c, 0x3e, 0x2f, 0xa4, 0xdf,
0x47, 0xdd, 0xb6, 0x1a, 0x92, 0x38, 0x3d, 0x17, 0xd6, 0xb0, 0x07, 0x40, 0xb4, 0xc8, 0x1e, 0xae,
0x53, 0x05, 0xf0, 0x93, 0x36, 0x53, 0x7e, 0xc8, 0x11, 0x07, 0x40, 0x42, 0xbc, 0x5d, 0x0f, 0xf9,
0xe5, 0xaa, 0xc0, 0x7a, 0xc8, 0xd8, 0x50, 0x62, 0x62, 0x3d, 0x84, 0x60, 0xb6, 0x77, 0xba, 0xd5,
0x7b, 0x99, 0x8a, 0x0b, 0x99, 0x6f, 0x81, 0xde, 0xe9, 0x95, 0xd5, 0x40, 0x44, 0xef, 0x24, 0x61,
0x98, 0x91, 0x68, 0xb0, 0xee, 0x9b, 0xd8, 0x58, 0x6e, 0x0c, 0xb9, 0x3d, 0xf3, 0x5e, 0x37, 0x08,
0xe3, 0x55, 0x8b, 0xd5, 0xd2, 0xe7, 0x41, 0xc8, 0x02, 0x58, 0xfe, 0x6c, 0xf6, 0x62, 0x95, 0xc3,
0x3f, 0x89, 0xbe, 0xd3, 0xaa, 0xd8, 0x1e, 0x8b, 0xc5, 0xb2, 0x64, 0xc9, 0x60, 0xbb, 0xa3, 0xdc,
0x1a, 0x34, 0xae, 0x1f, 0xf5, 0x57, 0x68, 0xe5, 0xe8, 0x9a, 0x6b, 0xc2, 0xca, 0x94, 0xe1, 0x71,
0xc8, 0xa4, 0xcf, 0x06, 0x73, 0x74, 0x5a, 0xa7, 0xb5, 0xcc, 0x76, 0xa3, 0x6b, 0x74, 0x15, 0xa7,
0x99, 0x7c, 0x59, 0xfb, 0x61, 0xc8, 0xa8, 0x87, 0x06, 0x97, 0xd9, 0xa4, 0x4a, 0x6b, 0x64, 0x96,
0x7d, 0xdc, 0x59, 0x9e, 0x3d, 0xa4, 0x47, 0x02, 0x64, 0x75, 0xb6, 0xd5, 0x93, 0x56, 0x6e, 0x85,
0x9e, 0xf2, 0xea, 0x3f, 0xbb, 0x41, 0x8e, 0x79, 0x55, 0xaa, 0x48, 0xa4, 0x6f, 0xf5, 0xa4, 0x95,
0xd7, 0x3f, 0x8e, 0xde, 0x6d, 0x7b, 0x55, 0x13, 0xd1, 0x76, 0xa7, 0x29, 0x30, 0x17, 0x3d, 0xea,
0xaf, 0xa0, 0xdc, 0xff, 0xab, 0xd9, 0x97, 0x6e, 0xfc, 0xcf, 0xf8, 0x62, 0xc1, 0xf2, 0x84, 0x25,
0x5a, 0xa3, 0xaa, 0xd7, 0x4f, 0x9f, 0xd1, 0x76, 0x8d, 0xc2, 0xd0, 0xd5, 0x30, 0x25, 0xfa, 0xcd,
0x6f, 0xa0, 0xa9, 0x8a, 0xf6, 0x9f, 0x6b, 0xd1, 0x7d, 0xb4, 0x68, 0x3a, 0x70, 0xbd, 0x22, 0xfe,
0x4e, 0x1f, 0x47, 0x98, 0xa6, 0x29, 0xea, 0xe8, 0x67, 0xb0, 0xa0, 0x8a, 0xfc, 0x6f, 0x6b, 0xd1,
0x6d, 0xab, 0x58, 0x87, 0xf7, 0x0e, 0xcf, 0xcf, 0xb3, 0x74, 0x26, 0xe4, 0x1b, 0x59, 0xa5, 0x42,
0x3f, 0x4e, 0x4a, 0xa3, 0xfb, 0x71, 0x06, 0x34, 0xed, 0xe2, 0xf5, 0xf3, 0xb4, 0x12, 0xbc, 0x5c,
0x4d, 0x2e, 0xf8, 0x2b, 0xfd, 0x79, 0x92, 0x3f, 0x2e, 0x2b, 0x60, 0xe8, 0x10, 0xc4, 0xe2, 0x15,
0x27, 0x5b, 0xae, 0xec, 0x67, 0x4c, 0x15, 0xe1, 0xca, 0x21, 0x3a, 0x5c, 0xf9, 0xa4, 0x9d, 0x95,
0x74, 0xad, 0xec, 0x37, 0x57, 0x1b, 0x78, 0x51, 0xdb, 0xdf, 0x5d, 0xdd, 0xeb, 0x06, 0x6d, 0x6e,
0xaa, 0xc4, 0xbb, 0xe9, 0xf9, 0xb9, 0xa9, 0x13, 0x5e, 0x52, 0x17, 0x21, 0x72, 0x53, 0x02, 0xb5,
0xcb, 0xab, 0xbd, 0x34, 0x63, 0xf2, 0xdd, 0xcd, 0xf3, 0xf3, 0xf3, 0x8c, 0xc7, 0x09, 0x58, 0x5e,
0xd5, 0xe2, 0xa1, 0x2b, 0x27, 0x96, 0x57, 0x18, 0x67, 0x4f, 0x85, 0xd4, 0xd2, 0x3a, 0xba, 0xf3,
0x59, 0x9a, 0xc1, 0xd3, 0xcd, 0x52, 0xd3, 0x08, 0x89, 0x53, 0x21, 0x2d, 0xc8, 0xa6, 0x40, 0xb5,
0xa8, 0x8e, 0x4a, 0x5d, 0xfe, 0xbb, 0x6d, 0x45, 0x47, 0x4c, 0xa4, 0x40, 0x08, 0x66, 0x77, 0x19,
0x6a, 0xe1, 0x69, 0x21, 0x8d, 0xdf, 0x6a, 0x6b, 0x35, 0x12, 0x62, 0x97, 0xc1, 0x27, 0xec, 0x6a,
0xb9, 0xfe, 0xfb, 0x2e, 0x7f, 0x95, 0x4b, 0xa3, 0xb7, 0xdb, 0x2a, 0x5a, 0x46, 0xac, 0x96, 0x21,
0xa3, 0x0c, 0x7f, 0x11, 0xfd, 0xbc, 0x34, 0x5c, 0xf2, 0x62, 0x70, 0x03, 0x51, 0x28, 0x9d, 0xb3,
0xc0, 0x37, 0x49, 0xb9, 0x3d, 0x44, 0x62, 0x62, 0xe3, 0xb4, 0x8a, 0xe7, 0xf0, 0x00, 0xbf, 0x6d,
0x71, 0x29, 0x25, 0x0e, 0x91, 0xb4, 0x29, 0x3f, 0x2a, 0x8e, 0x78, 0xa2, 0xac, 0x23, 0x35, 0x34,
0xc2, 0x50, 0x54, 0xb8, 0x90, 0x4d, 0x5b, 0x8f, 0xe2, 0xab, 0x74, 0x6e, 0x52, 0x8b, 0x66, 0x00,
0xab, 0x40, 0xda, 0x6a, 0x99, 0xa1, 0x03, 0x11, 0x69, 0x2b, 0x09, 0x2b, 0x9f, 0xff, 0xb8, 0x16,
0xdd, 0xb2, 0xcc, 0xbe, 0xde, 0x97, 0x1d, 0xe7, 0xe7, 0xbc, 0x4e, 0x72, 0x0f, 0xd2, 0xfc, 0xb2,
0x1a, 0x7c, 0x42, 0x99, 0xc4, 0x79, 0x53, 0x94, 0x4f, 0xaf, 0xad, 0x67, 0xd7, 0x27, 0x7a, 0xd3,
0xd2, 0x9e, 0x5c, 0x68, 0x34, 0xc0, 0xfa, 0xc4, 0xec, 0x6d, 0x42, 0x8e, 0x58, 0x9f, 0x84, 0x78,
0xdb, 0xc4, 0xc6, 0x79, 0xc6, 0x73, 0xd8, 0xc4, 0xd6, 0x42, 0x2d, 0x24, 0x9a, 0xb8, 0x05, 0xd9,
0xf1, 0x58, 0x8b, 0x9a, 0xfd, 0xb5, 0x51, 0x96, 0x81, 0xf1, 0xd8, 0xa8, 0x1a, 0x80, 0x18, 0x8f,
0x51, 0x50, 0xf9, 0x39, 0x89, 0xbe, 0x55, 0x3f, 0xd2, 0xe3, 0x92, 0x5d, 0xa5, 0x0c, 0x1e, 0xb2,
0x71, 0x24, 0x44, 0xff, 0xf7, 0x09, 0xdb, 0xb3, 0x4e, 0xf3, 0xaa, 0xc8, 0xe2, 0xea, 0x42, 0x1d,
0xbb, 0xf0, 0xeb, 0xac, 0x85, 0xf0, 0xe0, 0xc5, 0xdd, 0x0e, 0xca, 0x0e, 0xea, 0x5a, 0x66, 0x86,
0x98, 0x75, 0x5c, 0xb5, 0x35, 0xcc, 0x6c, 0x74, 0x72, 0xf6, 0xdd, 0xc6, 0x7e, 0x9c, 0x65, 0xac,
0x5c, 0x69, 0xd9, 0x61, 0x9c, 0xa7, 0xe7, 0xac, 0x12, 0xe0, 0xdd, 0x86, 0xa2, 0x86, 0x10, 0x23,
0xde, 0x6d, 0x04, 0x70, 0xbb, 0x6e, 0x03, 0x9e, 0xc7, 0x79, 0xc2, 0x5e, 0x83, 0x75, 0x1b, 0xb4,
0x23, 0x19, 0x62, 0xdd, 0x46, 0xb1, 0x76, 0x8f, 0xff, 0x69, 0xc6, 0x67, 0x97, 0x6a, 0x0a, 0xf0,
0x1b, 0x58, 0x4a, 0xe0, 0x1c, 0x70, 0x3b, 0x84, 0xd8, 0x49, 0x40, 0x0a, 0x4e, 0x58, 0x91, 0xc5,
0x33, 0x78, 0xd2, 0xaa, 0xd1, 0x51, 0x32, 0x62, 0x12, 0x80, 0x0c, 0x28, 0xae, 0x3a, 0xc1, 0x85,
0x15, 0x17, 0x1c, 0xe0, 0xba, 0x1d, 0x42, 0xec, 0x34, 0x28, 0x05, 0x93, 0x22, 0x4b, 0x05, 0xe8,
0x06, 0x8d, 0x86, 0x94, 0x10, 0xdd, 0xc0, 0x27, 0x80, 0xc9, 0x43, 0x56, 0xce, 0x19, 0x6a, 0x52,
0x4a, 0x82, 0x26, 0x35, 0x61, 0x8f, 0x95, 0x37, 0x75, 0xe7, 0xc5, 0x0a, 0x1c, 0x2b, 0x57, 0xd5,
0xe2, 0xc5, 0x8a, 0x38, 0x56, 0xee, 0x01, 0xa0, 0x88, 0xc7, 0x71, 0x25, 0xf0, 0x22, 0x4a, 0x49,
0xb0, 0x88, 0x9a, 0xb0, 0x73, 0x74, 0x53, 0xc4, 0xa5, 0x00, 0x73, 0xb4, 0x2a, 0x80, 0x73, 0xd6,
0xe0, 0x26, 0x29, 0xb7, 0x23, 0x49, 0xd3, 0x2a, 0x4c, 0xec, 0xa5, 0x2c, 0x4b, 0x2a, 0x30, 0x92,
0xa8, 0xe7, 0xae, 0xa5, 0xc4, 0x48, 0xd2, 0xa6, 0x40, 0x28, 0xa9, 0x37, 0x21, 0x58, 0xed, 0xc0,
0x4b, 0x90, 0xdb, 0x21, 0xc4, 0x8e, 0x4f, 0xba, 0xd0, 0x3b, 0x71, 0x59, 0xa6, 0xf5, 0xe4, 0xbf,
0x8e, 0x17, 0x48, 0xcb, 0x89, 0xf1, 0x09, 0xe3, 0x40, 0xf7, 0xd2, 0x03, 0x37, 0x56, 0x30, 0x38,
0x74, 0x7f, 0x10, 0x64, 0x6c, 0xc6, 0x29, 0x25, 0xce, 0xcb, 0x72, 0xec, 0x69, 0x22, 0xef, 0xca,
0xd7, 0xbb, 0x30, 0xe7, 0x0b, 0x37, 0xe3, 0xe2, 0x90, 0x5f, 0xb1, 0x29, 0x7f, 0xf6, 0x3a, 0xad,
0xea, 0xe5, 0x96, 0x9a, 0xb9, 0x9f, 0x10, 0x96, 0x30, 0x98, 0xf8, 0xc2, 0xad, 0x53, 0xc9, 0x26,
0x10, 0xa0, 0x2c, 0x47, 0xec, 0x15, 0x9a, 0x40, 0x40, 0x8b, 0x86, 0x23, 0x12, 0x88, 0x10, 0x6f,
0x77, 0xcc, 0x8c, 0x73, 0x75, 0xad, 0xc1, 0x94, 0xeb, 0x5c, 0x8e, 0xb2, 0x06, 0x41, 0x62, 0xd3,
0x22, 0xa8, 0x60, 0xd7, 0x97, 0xc6, 0xbf, 0xed, 0x62, 0xf7, 0x08, 0x3b, 0xed, 0x6e, 0x76, 0xbf,
0x07, 0x89, 0xb8, 0xb2, 0x27, 0x3e, 0x28, 0x57, 0xed, 0x03, 0x1f, 0xf7, 0x7b, 0x90, 0xce, 0xee,
0x9b, 0x5b, 0xad, 0xa7, 0xf1, 0xec, 0x72, 0x5e, 0xf2, 0x65, 0x9e, 0xec, 0xf0, 0x8c, 0x97, 0x60,
0xf7, 0xcd, 0x2b, 0x35, 0x40, 0x89, 0xdd, 0xb7, 0x0e, 0x15, 0x9b, 0xc1, 0xb9, 0xa5, 0x18, 0x65,
0xe9, 0x1c, 0xae, 0xa8, 0x3d, 0x43, 0x12, 0x20, 0x32, 0x38, 0x14, 0x44, 0x82, 0xa8, 0x59, 0x71,
0x8b, 0x74, 0x16, 0x67, 0x8d, 0xbf, 0x6d, 0xda, 0x8c, 0x07, 0x76, 0x06, 0x11, 0xa2, 0x80, 0xd4,
0x73, 0xba, 0x2c, 0xf3, 0x71, 0x2e, 0x38, 0x59, 0x4f, 0x0d, 0x74, 0xd6, 0xd3, 0x01, 0xc1, 0xb0,
0x3a, 0x65, 0xaf, 0xeb, 0xd2, 0xd4, 0xff, 0x60, 0xc3, 0x6a, 0xfd, 0xf7, 0xa1, 0x92, 0x87, 0x86,
0x55, 0xc0, 0x81, 0xca, 0x28, 0x27, 0x4d, 0xc0, 0x04, 0xb4, 0xfd, 0x30, 0xb9, 0xd7, 0x0d, 0xe2,
0x7e, 0x26, 0x62, 0x95, 0xb1, 0x90, 0x1f, 0x09, 0xf4, 0xf1, 0xa3, 0x41, 0xbb, 0xdd, 0xe2, 0xd5,
0xe7, 0x82, 0xcd, 0x2e, 0x5b, 0x07, 0xd8, 0xfc, 0x82, 0x36, 0x08, 0xb1, 0xdd, 0x42, 0xa0, 0x78,
0x13, 0x8d, 0x67, 0x3c, 0x0f, 0x35, 0x51, 0x2d, 0xef, 0xd3, 0x44, 0x8a, 0xb3, 0x8b, 0x5f, 0x23,
0x55, 0x91, 0xd9, 0x34, 0xd3, 0x26, 0x61, 0xc1, 0x85, 0x88, 0xc5, 0x2f, 0x09, 0xdb, 0x9c, 0x1c,
0xfa, 0x3c, 0x6c, 0x9f, 0xee, 0x6f, 0x59, 0x39, 0xa4, 0x4f, 0xf7, 0x53, 0x2c, 0x5d, 0xc9, 0x26,
0x46, 0x3a, 0xac, 0xf8, 0x71, 0xf2, 0xb0, 0x1f, 0x6c, 0x97, 0x3c, 0x9e, 0xcf, 0x9d, 0x8c, 0xc5,
0x65, 0xe3, 0x75, 0x2b, 0x60, 0xc8, 0x62, 0xc4, 0x92, 0x27, 0x80, 0x83, 0x21, 0xcc, 0xf3, 0xbc,
0xc3, 0x73, 0xc1, 0x72, 0x81, 0x0d, 0x61, 0xbe, 0x31, 0x05, 0x86, 0x86, 0x30, 0x4a, 0x01, 0xc4,
0xad, 0xdc, 0x0f, 0x62, 0xe2, 0x28, 0x5e, 0xa0, 0x19, 0x5b, 0xb3, 0xd7, 0xd3, 0xc8, 0x43, 0x71,
0x0b, 0x38, 0xe7, 0x75, 0xae, 0xeb, 0x65, 0x1a, 0x97, 0x73, 0xb3, 0xbb, 0x91, 0x0c, 0x1e, 0xd1,
0x76, 0x7c, 0x92, 0x78, 0x9d, 0x1b, 0xd6, 0x00, 0xc3, 0xce, 0x78, 0x11, 0xcf, 0x4d, 0x4d, 0x91,
0x1a, 0x48, 0x79, 0xab, 0xaa, 0xf7, 0xba, 0x41, 0xe0, 0xe7, 0x45, 0x9a, 0x30, 0x1e, 0xf0, 0x23,
0xe5, 0x7d, 0xfc, 0x40, 0x10, 0x64, 0x6f, 0x75, 0xbd, 0x9b, 0x15, 0xdd, 0x28, 0x4f, 0xd4, 0x3a,
0x76, 0x48, 0x3c, 0x1e, 0xc0, 0x85, 0xb2, 0x37, 0x82, 0x07, 0x7d, 0x54, 0x6f, 0xd0, 0x86, 0xfa,
0xa8, 0xd9, 0x7f, 0xed, 0xd3, 0x47, 0x31, 0x58, 0xf9, 0xfc, 0xb1, 0xea, 0xa3, 0xbb, 0xb1, 0x88,
0xeb, 0xbc, 0xfd, 0x45, 0xca, 0x5e, 0xa9, 0x85, 0x30, 0x52, 0x5f, 0x4d, 0x0d, 0xe5, 0xc7, 0xc9,
0x60, 0x55, 0xbc, 0xdd, 0x9b, 0x0f, 0xf8, 0x56, 0x2b, 0x84, 0x4e, 0xdf, 0x60, 0xa9, 0xb0, 0xdd,
0x9b, 0x0f, 0xf8, 0x56, 0x77, 0x2c, 0x74, 0xfa, 0x06, 0x17, 0x2d, 0x6c, 0xf7, 0xe6, 0x95, 0xef,
0x3f, 0xd7, 0x1d, 0xd7, 0x75, 0x5e, 0xe7, 0x61, 0x33, 0x91, 0x5e, 0x31, 0x2c, 0x9d, 0xf4, 0xed,
0x19, 0x34, 0x94, 0x4e, 0xd2, 0x2a, 0xce, 0x2d, 0x67, 0x58, 0x29, 0x8e, 0x79, 0x95, 0xca, 0xe3,
0x18, 0x4f, 0x7a, 0x18, 0xd5, 0x70, 0x68, 0xd1, 0x14, 0x52, 0xb2, 0x2f, 0x96, 0x3d, 0xd4, 0x9e,
0x57, 0x7f, 0x18, 0xb0, 0xd7, 0x3e, 0xb6, 0xbe, 0xd5, 0x93, 0xb6, 0xaf, 0x78, 0x3d, 0x46, 0xbf,
0x9c, 0x9b, 0x30, 0x74, 0x96, 0x30, 0xa6, 0xcc, 0x4b, 0x5b, 0xf7, 0x2d, 0xe5, 0xa3, 0xfe, 0x0a,
0x1d, 0xee, 0x47, 0x49, 0xd2, 0xcf, 0xbd, 0xfb, 0x76, 0xfb, 0x51, 0x7f, 0x05, 0xe5, 0xfe, 0x2f,
0xf5, 0xb2, 0x06, 0xfa, 0x57, 0x7d, 0xf0, 0x71, 0x1f, 0x8b, 0xa0, 0x1f, 0x3e, 0xb9, 0x96, 0x8e,
0x2a, 0xc8, 0xdf, 0xea, 0xf5, 0xbb, 0x46, 0xe5, 0x47, 0x43, 0xf2, 0x63, 0x63, 0xd5, 0x25, 0x43,
0x51, 0x65, 0x61, 0xd8, 0x31, 0x3f, 0xbe, 0xa6, 0x96, 0x73, 0xe5, 0x9e, 0x07, 0xab, 0x8f, 0x5b,
0x9d, 0xf2, 0x84, 0x2c, 0x3b, 0x34, 0x2c, 0xd0, 0x27, 0xd7, 0x55, 0xa3, 0xba, 0xaa, 0x03, 0xcb,
0x4b, 0x67, 0x9e, 0xf4, 0x34, 0xec, 0x5d, 0x43, 0xf3, 0xd1, 0xf5, 0x94, 0x54, 0x59, 0xfe, 0x63,
0x2d, 0xba, 0xeb, 0xb1, 0xf6, 0x75, 0x06, 0xd8, 0x74, 0xf9, 0x41, 0xc0, 0x3e, 0xa5, 0x64, 0x0a,
0xf7, 0x5b, 0xdf, 0x4c, 0xd9, 0xde, 0x4f, 0xe7, 0xa9, 0xec, 0xa5, 0x99, 0x60, 0x65, 0xfb, 0x7e,
0x3a, 0xdf, 0x6e, 0x43, 0x0d, 0xe9, 0xfb, 0xe9, 0x02, 0xb8, 0x73, 0x3f, 0x1d, 0xe2, 0x19, 0xbd,
0x9f, 0x0e, 0xb5, 0x16, 0xbc, 0x9f, 0x2e, 0xac, 0x41, 0xcd, 0x2e, 0xba, 0x08, 0xcd, 0xb6, 0x79,
0x2f, 0x8b, 0xfe, 0x2e, 0xfa, 0xe3, 0xeb, 0xa8, 0x10, 0xf3, 0x6b, 0xc3, 0xc9, 0x03, 0x95, 0x3d,
0x9e, 0xa9, 0x77, 0xa8, 0x72, 0xbb, 0x37, 0xaf, 0x7c, 0xff, 0x48, 0x2d, 0xae, 0xcc, 0x6c, 0xc2,
0x4b, 0x79, 0x37, 0xe1, 0x66, 0x68, 0x76, 0xa8, 0x2d, 0xb8, 0x2d, 0xff, 0xb0, 0x1f, 0x4c, 0x54,
0xb7, 0x26, 0x54, 0xa3, 0x0f, 0xbb, 0x0c, 0x81, 0x26, 0xdf, 0xee, 0xcd, 0x13, 0xd3, 0x48, 0xe3,
0xbb, 0x69, 0xed, 0x1e, 0xc6, 0xfc, 0xb6, 0x7e, 0xd4, 0x5f, 0x41, 0xb9, 0xbf, 0x52, 0x59, 0xab,
0xeb, 0x5e, 0xb6, 0xf3, 0x56, 0x97, 0xa9, 0x89, 0xd7, 0xcc, 0xc3, 0xbe, 0x78, 0x28, 0x7f, 0x71,
0xa7, 0xd0, 0xae, 0xfc, 0x05, 0x9d, 0x46, 0x3f, 0xba, 0x9e, 0x92, 0x2a, 0xcb, 0x3f, 0xac, 0x45,
0x37, 0xc9, 0xb2, 0xa8, 0x38, 0xf8, 0xa4, 0xaf, 0x65, 0x10, 0x0f, 0x9f, 0x5e, 0x5b, 0x4f, 0x15,
0xea, 0x9f, 0xd7, 0xa2, 0x5b, 0x81, 0x42, 0x35, 0x01, 0x72, 0x0d, 0xeb, 0x7e, 0xa0, 0x7c, 0x76,
0x7d, 0x45, 0x6a, 0xba, 0x77, 0xf1, 0x49, 0xfb, 0xae, 0xb1, 0x80, 0xed, 0x09, 0x7d, 0xd7, 0x58,
0xb7, 0x16, 0xdc, 0x63, 0x8a, 0xcf, 0xf4, 0x9a, 0x0f, 0xdd, 0x63, 0x92, 0x47, 0x21, 0x83, 0xb7,
0x98, 0x60, 0x1c, 0xe6, 0xe4, 0xd9, 0xeb, 0x22, 0xce, 0x13, 0xda, 0x49, 0x23, 0xef, 0x76, 0x62,
0x38, 0xb8, 0x37, 0x57, 0x4b, 0x4f, 0xb8, 0x5e, 0xc7, 0xdd, 0xa7, 0xf4, 0x0d, 0x12, 0xdc, 0x9b,
0x6b, 0xa1, 0x84, 0x37, 0x95, 0x35, 0x86, 0xbc, 0x81, 0x64, 0xf1, 0x41, 0x1f, 0x14, 0xac, 0x10,
0x8c, 0x37, 0xb3, 0xe5, 0xff, 0x30, 0x64, 0xa5, 0xb5, 0xed, 0xbf, 0xd5, 0x93, 0x26, 0xdc, 0x4e,
0x98, 0xf8, 0x9c, 0xc5, 0x09, 0x2b, 0x83, 0x6e, 0x0d, 0xd5, 0xcb, 0xad, 0x4b, 0x63, 0x6e, 0x77,
0x78, 0xb6, 0x5c, 0xe4, 0xaa, 0x31, 0x49, 0xb7, 0x2e, 0xd5, 0xed, 0x16, 0xd0, 0x70, 0x57, 0xd2,
0xba, 0x95, 0xe9, 0xe5, 0x83, 0xb0, 0x19, 0x2f, 0xab, 0xdc, 0xec, 0xc5, 0xd2, 0xf5, 0x54, 0x61,
0xd4, 0x51, 0x4f, 0x10, 0x49, 0x5b, 0x3d, 0x69, 0xb8, 0x3d, 0xe8, 0xb8, 0x35, 0xf1, 0xb4, 0xdd,
0x61, 0xab, 0x15, 0x52, 0x8f, 0xfa, 0x2b, 0xc0, 0xcd, 0x58, 0x15, 0x55, 0x07, 0x69, 0x25, 0xf6,
0xd2, 0x2c, 0x1b, 0x6c, 0x06, 0xc2, 0x44, 0x43, 0xc1, 0xcd, 0x58, 0x04, 0x26, 0x22, 0x59, 0x6f,
0x5e, 0xe6, 0x83, 0x2e, 0x3b, 0x92, 0xea, 0x15, 0xc9, 0x2e, 0x0d, 0x36, 0xd4, 0x9c, 0x47, 0x6d,
0x6a, 0x3b, 0x0c, 0x3f, 0xb8, 0x56, 0x85, 0xb7, 0x7b, 0xf3, 0xe0, 0x6d, 0xbf, 0xa4, 0xe4, 0xcc,
0x72, 0x87, 0x32, 0xe1, 0xcd, 0x24, 0x77, 0x3b, 0x28, 0xb0, 0x29, 0xd9, 0x74, 0xa3, 0x97, 0x69,
0x32, 0x67, 0x02, 0x7d, 0x51, 0xe5, 0x02, 0xc1, 0x17, 0x55, 0x00, 0x04, 0x4d, 0xd7, 0xfc, 0xdd,
0xec, 0xc6, 0x8e, 0x13, 0xac, 0xe9, 0x94, 0xb2, 0x43, 0x85, 0x9a, 0x0e, 0xa5, 0xc1, 0x68, 0x60,
0xdc, 0xaa, 0x7b, 0x1f, 0x1e, 0x84, 0xcc, 0x80, 0xcb, 0x1f, 0x36, 0x7b, 0xb1, 0x60, 0x46, 0xb1,
0x0e, 0xd3, 0x45, 0x2a, 0xb0, 0x19, 0xc5, 0xb1, 0x51, 0x23, 0xa1, 0x19, 0xa5, 0x8d, 0x52, 0xd5,
0xab, 0x73, 0x84, 0x71, 0x12, 0xae, 0x5e, 0xc3, 0xf4, 0xab, 0x9e, 0x61, 0x5b, 0xef, 0x55, 0x73,
0x13, 0x32, 0xe2, 0x42, 0x2d, 0x96, 0x91, 0xd8, 0x96, 0xdf, 0x03, 0x43, 0x30, 0x34, 0xea, 0x50,
0x0a, 0xf0, 0x7d, 0x41, 0xcd, 0xe9, 0x57, 0xbf, 0x45, 0xc1, 0xe2, 0x32, 0xce, 0x67, 0xe8, 0xe2,
0x54, 0x1a, 0x6c, 0x91, 0xa1, 0xc5, 0x29, 0xa9, 0x01, 0xde, 0xda, 0xfb, 0x5f, 0xf2, 0x22, 0x5d,
0xc1, 0x7c, 0x32, 0xeb, 0x7f, 0xc8, 0x7b, 0xbf, 0x07, 0x09, 0xdf, 0xda, 0x6b, 0xc0, 0xec, 0xbb,
0x37, 0x4e, 0x3f, 0x0c, 0x98, 0xf2, 0xd1, 0xd0, 0x42, 0x98, 0x56, 0x01, 0x41, 0xed, 0xec, 0x2d,
0x7e, 0xc1, 0x56, 0x58, 0x50, 0xbb, 0x9b, 0x84, 0x5f, 0xb0, 0x55, 0x28, 0xa8, 0xdb, 0x28, 0xc8,
0x33, 0xdd, 0x75, 0xd0, 0x7a, 0x40, 0xdf, 0x5d, 0xfa, 0x6c, 0x74, 0x72, 0xa0, 0xe7, 0xec, 0xa6,
0x57, 0xde, 0x6b, 0x0a, 0xa4, 0xa0, 0xbb, 0xe9, 0x15, 0xfe, 0x96, 0x62, 0xb3, 0x17, 0x0b, 0x4f,
0x04, 0xc4, 0x82, 0xbd, 0xd6, 0xaf, 0xea, 0x91, 0xe2, 0x4a, 0x79, 0xeb, 0x5d, 0xfd, 0xbd, 0x6e,
0xd0, 0x9e, 0xbf, 0x3d, 0x2e, 0xf9, 0x8c, 0x55, 0x95, 0xba, 0x12, 0xd5, 0x3f, 0xe0, 0xa4, 0x64,
0x43, 0x70, 0x21, 0xea, 0x9d, 0x30, 0xe4, 0xdc, 0x63, 0xd8, 0x88, 0xec, 0xf5, 0x4a, 0xeb, 0xa8,
0x66, 0xfb, 0x66, 0xa5, 0x8d, 0x4e, 0xce, 0x76, 0x2f, 0x25, 0x75, 0xef, 0x53, 0xba, 0x87, 0xaa,
0x63, 0x57, 0x29, 0xdd, 0xef, 0x41, 0x2a, 0x57, 0x9f, 0x47, 0x6f, 0x1e, 0xf0, 0xf9, 0x84, 0xe5,
0xc9, 0xe0, 0x7b, 0xfe, 0x09, 0x5e, 0x3e, 0x1f, 0xd6, 0x7f, 0x36, 0x46, 0x6f, 0x50, 0x62, 0x7b,
0x06, 0x71, 0x97, 0x9d, 0x2d, 0xe7, 0x13, 0x11, 0x0b, 0x70, 0x06, 0x51, 0xfe, 0x7d, 0x58, 0x0b,
0x88, 0x33, 0x88, 0x1e, 0x00, 0xec, 0x4d, 0x4b, 0xc6, 0x50, 0x7b, 0xb5, 0x20, 0x68, 0x4f, 0x01,
0x36, 0x8b, 0x30, 0xf6, 0xea, 0x44, 0x1d, 0x9e, 0x19, 0xb4, 0x3a, 0x52, 0x4a, 0x64, 0x11, 0x6d,
0xca, 0x06, 0x77, 0x53, 0x7d, 0x79, 0xbd, 0xcd, 0x72, 0xb1, 0x88, 0xcb, 0x15, 0x08, 0x6e, 0x55,
0x4b, 0x07, 0x20, 0x82, 0x1b, 0x05, 0x6d, 0xaf, 0xd5, 0x8f, 0x79, 0x76, 0xb9, 0xcf, 0x4b, 0xbe,
0x14, 0x69, 0xce, 0xe0, 0x15, 0x27, 0xe6, 0x81, 0xba, 0x0c, 0xd1, 0x6b, 0x29, 0xd6, 0x66, 0xb9,
0x92, 0x68, 0x8e, 0x33, 0xca, 0x3b, 0xe1, 0x2b, 0xc1, 0x4b, 0xf8, 0x3a, 0xb3, 0xb1, 0x02, 0x21,
0x22, 0xcb, 0x25, 0x61, 0xd0, 0xf6, 0xc7, 0x69, 0x3e, 0x47, 0xdb, 0xfe, 0xd8, 0xbd, 0x66, 0xf8,
0x16, 0x0d, 0xd8, 0x0e, 0xd5, 0x3c, 0xb4, 0xa6, 0x03, 0xa8, 0x8f, 0x86, 0xd1, 0x87, 0xee, 0x12,
0x44, 0x87, 0xc2, 0x49, 0xe0, 0xea, 0x79, 0xc1, 0x72, 0x96, 0xe8, 0x43, 0x7b, 0x98, 0x2b, 0x8f,
0x08, 0xba, 0x82, 0xa4, 0x1d, 0x8b, 0xa4, 0xfc, 0x64, 0x99, 0x1f, 0x97, 0xfc, 0x3c, 0xcd, 0x58,
0x09, 0xc6, 0xa2, 0x46, 0xdd, 0x91, 0x13, 0x63, 0x11, 0xc6, 0xd9, 0xd3, 0x1f, 0x52, 0xea, 0xfd,
0xb0, 0xc1, 0xb4, 0x8c, 0x67, 0xf0, 0xf4, 0x47, 0x63, 0xa3, 0x8d, 0x11, 0x3b, 0x83, 0x01, 0xdc,
0x49, 0x74, 0x1a, 0xd7, 0xf9, 0x4a, 0xc6, 0x87, 0xfa, 0x68, 0x55, 0x5e, 0xbe, 0x5b, 0x81, 0x44,
0x47, 0x99, 0xc3, 0x48, 0x22, 0xd1, 0x09, 0x6b, 0xd8, 0xa9, 0x44, 0x72, 0x47, 0xea, 0x54, 0x13,
0x98, 0x4a, 0x1a, 0x1b, 0x5a, 0x48, 0x4c, 0x25, 0x2d, 0x08, 0x0c, 0x48, 0xba, 0x1b, 0xcc, 0xd1,
0x01, 0xc9, 0x48, 0x83, 0x03, 0x92, 0x4b, 0xd9, 0x81, 0x62, 0x9c, 0xa7, 0x22, 0x8d, 0xb3, 0x09,
0x13, 0xc7, 0x71, 0x19, 0x2f, 0x98, 0x60, 0x25, 0x1c, 0x28, 0x14, 0x32, 0xf4, 0x18, 0x62, 0xa0,
0xa0, 0x58, 0xe5, 0xf0, 0xb7, 0xa3, 0xb7, 0xeb, 0x79, 0x9f, 0xe5, 0xea, 0x27, 0x99, 0x9e, 0xc9,
0xdf, 0x72, 0x1b, 0xbc, 0x63, 0x6c, 0x4c, 0x44, 0xc9, 0xe2, 0x85, 0xb6, 0xfd, 0x96, 0xf9, 0xbb,
0x04, 0x1f, 0xad, 0xd5, 0xf1, 0x7c, 0xc4, 0x45, 0x7a, 0x5e, 0x2f, 0xb3, 0xd5, 0x07, 0x4c, 0x20,
0x9e, 0x5d, 0xf1, 0x30, 0x70, 0xe9, 0x09, 0xc6, 0xd9, 0x71, 0xda, 0x95, 0x9e, 0xb0, 0x22, 0x83,
0xe3, 0xb4, 0xa7, 0x2d, 0x01, 0x62, 0x9c, 0x46, 0x41, 0xdb, 0x39, 0x5d, 0xf1, 0x94, 0x85, 0x2b,
0x33, 0x65, 0xfd, 0x2a, 0x33, 0xf5, 0xbe, 0x09, 0xc9, 0xa2, 0xb7, 0x0f, 0xd9, 0xe2, 0x8c, 0x95,
0xd5, 0x45, 0x5a, 0x50, 0x17, 0x04, 0x5b, 0xa2, 0xf3, 0x82, 0x60, 0x02, 0xb5, 0x33, 0x81, 0x05,
0xc6, 0xd5, 0x51, 0xbc, 0x60, 0xf2, 0x0a, 0x17, 0x30, 0x13, 0x38, 0x46, 0x1c, 0x88, 0x98, 0x09,
0x48, 0xd8, 0xf9, 0xbc, 0xcc, 0x32, 0x27, 0x6c, 0x5e, 0x47, 0x58, 0x79, 0x1c, 0xaf, 0x16, 0x2c,
0x17, 0xca, 0x24, 0xd8, 0x93, 0x77, 0x4c, 0xe2, 0x3c, 0xb1, 0x27, 0xdf, 0x47, 0xcf, 0x19, 0x9a,
0xbc, 0x07, 0x7f, 0xcc, 0x4b, 0xd1, 0xfc, 0xe0, 0xda, 0x69, 0x99, 0x81, 0xa1, 0xc9, 0x7f, 0xa8,
0x1e, 0x49, 0x0c, 0x4d, 0x61, 0x0d, 0xe7, 0xc7, 0x35, 0xbc, 0x32, 0xbc, 0x60, 0xa5, 0x89, 0x93,
0x67, 0x8b, 0x38, 0xcd, 0x54, 0x34, 0x7c, 0x3f, 0x60, 0x9b, 0xd0, 0x21, 0x7e, 0x5c, 0xa3, 0xaf,
0xae, 0xf3, 0x73, 0x24, 0xe1, 0x12, 0x82, 0x57, 0x04, 0x1d, 0xf6, 0x89, 0x57, 0x04, 0xdd, 0x5a,
0x76, 0xe5, 0x6e, 0x59, 0xc9, 0xad, 0x24, 0xb1, 0xc3, 0x13, 0xb8, 0x5f, 0xe8, 0xd8, 0x04, 0x20,
0xb1, 0x72, 0x0f, 0x2a, 0xd8, 0xd4, 0xc0, 0x62, 0x7b, 0x69, 0x1e, 0x67, 0xe9, 0x8f, 0x61, 0x5a,
0xef, 0xd8, 0xd1, 0x04, 0x91, 0x1a, 0xe0, 0x24, 0xe6, 0x6a, 0x9f, 0x89, 0x69, 0x5a, 0x0f, 0xfd,
0xf7, 0x02, 0xcf, 0x4d, 0x12, 0xdd, 0xae, 0x1c, 0xd2, 0xb9, 0x0c, 0x18, 0x3e, 0xd6, 0x51, 0x51,
0x4c, 0xea, 0x59, 0xf5, 0x84, 0xcd, 0x58, 0x5a, 0x88, 0xc1, 0xc7, 0xe1, 0x67, 0x05, 0x70, 0xe2,
0xa0, 0x45, 0x0f, 0x35, 0xe7, 0xf5, 0x7d, 0x3d, 0x96, 0x4c, 0x9a, 0x5f, 0x22, 0x3d, 0xad, 0x58,
0xa9, 0x12, 0x8d, 0x7d, 0x26, 0x40, 0xef, 0x74, 0xb8, 0xa1, 0x03, 0xd6, 0x15, 0x25, 0x7a, 0x67,
0x58, 0xc3, 0x6e, 0xf6, 0x39, 0x9c, 0xba, 0xdc, 0x5d, 0x1e, 0x77, 0x7c, 0x48, 0x1a, 0x73, 0x28,
0x62, 0xb3, 0x8f, 0xa6, 0x6d, 0xb6, 0xd6, 0x76, 0x3b, 0xca, 0x57, 0x63, 0x78, 0x64, 0x02, 0xb1,
0x24, 0x31, 0x22, 0x5b, 0x0b, 0xe0, 0xce, 0x66, 0x78, 0xc9, 0xe3, 0x64, 0x16, 0x57, 0xe2, 0x38,
0x5e, 0x65, 0x3c, 0x4e, 0xe4, 0xbc, 0x0e, 0x37, 0xc3, 0x35, 0x33, 0x74, 0x21, 0x6a, 0x33, 0x9c,
0x82, 0xdd, 0xec, 0x4c, 0xfe, 0xc0, 0xaa, 0x3a, 0x4a, 0x0a, 0xb3, 0x33, 0x59, 0x5e, 0x78, 0x8c,
0xf4, 0x4e, 0x18, 0xb2, 0x9f, 0xc0, 0x35, 0x22, 0x99, 0x86, 0xdc, 0xc2, 0x74, 0xbc, 0x04, 0xe4,
0xfd, 0x00, 0x61, 0x2f, 0x40, 0x69, 0xfe, 0xae, 0x7f, 0x53, 0x4b, 0xa8, 0x2b, 0xd3, 0x1f, 0x62,
0xba, 0x2e, 0xe4, 0x9d, 0x50, 0xdb, 0xea, 0x49, 0xdb, 0x34, 0x73, 0xe7, 0x22, 0x16, 0xa3, 0x24,
0x39, 0x64, 0x15, 0xf2, 0x3d, 0x7b, 0x2d, 0x1c, 0x5a, 0x29, 0x91, 0x66, 0xb6, 0x29, 0x1b, 0xe8,
0xb5, 0xec, 0x59, 0x92, 0x0a, 0x25, 0xd3, 0x07, 0xb4, 0x1f, 0xb6, 0x0d, 0xb4, 0x29, 0xa2, 0x56,
0x34, 0x6d, 0xc7, 0xf2, 0x9a, 0x99, 0xf2, 0xf9, 0x3c, 0x63, 0x0a, 0x3a, 0x61, 0x71, 0x73, 0x63,
0xe4, 0x76, 0xdb, 0x16, 0x0a, 0x12, 0x63, 0x79, 0x50, 0xc1, 0xa6, 0x91, 0x35, 0xd6, 0xbc, 0x92,
0xd2, 0x0f, 0x76, 0xa3, 0x6d, 0xc6, 0x03, 0x88, 0x34, 0x12, 0x05, 0xed, 0x67, 0x77, 0xb5, 0x78,
0x9f, 0xe9, 0x27, 0x01, 0xef, 0xba, 0x92, 0xca, 0x8e, 0x98, 0xf8, 0xec, 0x0e, 0xc1, 0xec, 0x3a,
0x01, 0x78, 0x78, 0xba, 0x1a, 0x27, 0x70, 0x9d, 0x00, 0xf5, 0x25, 0x43, 0xac, 0x13, 0x28, 0xd6,
0x6f, 0x3a, 0xb3, 0xef, 0x75, 0x10, 0x57, 0xb6, 0x72, 0x48, 0xd3, 0xa1, 0x60, 0xa8, 0xe9, 0x28,
0x05, 0xff, 0x91, 0xba, 0x5b, 0x6b, 0xc8, 0x23, 0xc5, 0xf6, 0xd5, 0xd6, 0xbb, 0x30, 0x9b, 0xfb,
0xd7, 0xc2, 0x13, 0x16, 0x27, 0xa6, 0x62, 0x88, 0xae, 0x2b, 0x27, 0x72, 0x7f, 0x8c, 0x53, 0x4e,
0x7e, 0x2f, 0x1a, 0x34, 0xd5, 0x28, 0x5d, 0x37, 0xb7, 0xb0, 0x22, 0xd6, 0x04, 0x31, 0x50, 0xf9,
0x84, 0x93, 0xb8, 0x79, 0x4d, 0x34, 0xe5, 0xca, 0x81, 0xfa, 0x2c, 0xb4, 0x02, 0x89, 0x9b, 0xff,
0xd8, 0x5b, 0x34, 0x91, 0xb8, 0x75, 0x6b, 0x39, 0xd7, 0xfe, 0x80, 0x26, 0xdb, 0x2b, 0xf9, 0x02,
0x96, 0xe9, 0xb3, 0x60, 0xf3, 0x20, 0x1a, 0xc4, 0xb5, 0x3f, 0xfd, 0x34, 0xed, 0x1c, 0x64, 0xf6,
0x0e, 0xe4, 0xf1, 0x34, 0xfc, 0x67, 0x41, 0x1a, 0x21, 0x31, 0x07, 0xb5, 0x20, 0xe7, 0xb7, 0x44,
0xc7, 0x2f, 0xcb, 0x54, 0xa4, 0xf9, 0x7c, 0xca, 0x79, 0x06, 0xb7, 0x2c, 0x47, 0xe3, 0xa1, 0x2b,
0xa5, 0x7e, 0x4b, 0xb4, 0x45, 0xd9, 0x29, 0x6e, 0x34, 0x1e, 0x2d, 0x05, 0x3f, 0x4f, 0xb3, 0x0c,
0x44, 0xce, 0x68, 0x3c, 0xd4, 0x12, 0x22, 0x72, 0x7c, 0xc2, 0xf9, 0x05, 0xcc, 0xb1, 0xdc, 0xfd,
0x57, 0x3b, 0xa0, 0x1f, 0x40, 0x1d, 0x47, 0x48, 0xfd, 0x02, 0x26, 0x84, 0x9c, 0x5f, 0xf4, 0x1c,
0x63, 0xbf, 0x6d, 0xb2, 0x09, 0xd5, 0x11, 0x88, 0xfa, 0x45, 0x4f, 0x0a, 0x6e, 0x7c, 0x3e, 0x7d,
0xff, 0xbf, 0xbe, 0xba, 0xb1, 0xf6, 0xd3, 0xaf, 0x6e, 0xac, 0xfd, 0xcf, 0x57, 0x37, 0xd6, 0x7e,
0xf2, 0xf5, 0x8d, 0x37, 0x7e, 0xfa, 0xf5, 0x8d, 0x37, 0xfe, 0xfb, 0xeb, 0x1b, 0x6f, 0x7c, 0xf9,
0xa6, 0xfa, 0x99, 0xfb, 0xb3, 0x9f, 0x93, 0x3f, 0x56, 0xff, 0xe4, 0xff, 0x03, 0x00, 0x00, 0xff,
0xff, 0x90, 0xd5, 0x09, 0x36, 0x0a, 0x7f, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@ -623,6 +622,7 @@ type ClientCommandsClient interface {
BlockDataviewViewSetActive(ctx context.Context, in *pb.RpcBlockDataviewViewSetActiveRequest, opts ...grpc.CallOption) (*pb.RpcBlockDataviewViewSetActiveResponse, error)
BlockDataviewViewSetPosition(ctx context.Context, in *pb.RpcBlockDataviewViewSetPositionRequest, opts ...grpc.CallOption) (*pb.RpcBlockDataviewViewSetPositionResponse, error)
BlockDataviewSetSource(ctx context.Context, in *pb.RpcBlockDataviewSetSourceRequest, opts ...grpc.CallOption) (*pb.RpcBlockDataviewSetSourceResponse, error)
BlockDataviewRelationSet(ctx context.Context, in *pb.RpcBlockDataviewRelationSetRequest, opts ...grpc.CallOption) (*pb.RpcBlockDataviewRelationSetResponse, error)
BlockDataviewRelationAdd(ctx context.Context, in *pb.RpcBlockDataviewRelationAddRequest, opts ...grpc.CallOption) (*pb.RpcBlockDataviewRelationAddResponse, error)
BlockDataviewRelationDelete(ctx context.Context, in *pb.RpcBlockDataviewRelationDeleteRequest, opts ...grpc.CallOption) (*pb.RpcBlockDataviewRelationDeleteResponse, error)
BlockDataviewGroupOrderUpdate(ctx context.Context, in *pb.RpcBlockDataviewGroupOrderUpdateRequest, opts ...grpc.CallOption) (*pb.RpcBlockDataviewGroupOrderUpdateResponse, error)
@ -753,8 +753,6 @@ type ClientCommandsClient interface {
AIAutofill(ctx context.Context, in *pb.RpcAIAutofillRequest, opts ...grpc.CallOption) (*pb.RpcAIAutofillResponse, error)
AIListSummary(ctx context.Context, in *pb.RpcAIListSummaryRequest, opts ...grpc.CallOption) (*pb.RpcAIListSummaryResponse, error)
AIObjectCreateFromUrl(ctx context.Context, in *pb.RpcAIObjectCreateFromUrlRequest, opts ...grpc.CallOption) (*pb.RpcAIObjectCreateFromUrlResponse, error)
// Push
PushNotificationRegisterToken(ctx context.Context, in *pb.RpcPushNotificationRegisterTokenRequest, opts ...grpc.CallOption) (*pb.RpcPushNotificationRegisterTokenResponse, error)
}
type clientCommandsClient struct {
@ -2457,6 +2455,15 @@ func (c *clientCommandsClient) BlockDataviewSetSource(ctx context.Context, in *p
return out, nil
}
func (c *clientCommandsClient) BlockDataviewRelationSet(ctx context.Context, in *pb.RpcBlockDataviewRelationSetRequest, opts ...grpc.CallOption) (*pb.RpcBlockDataviewRelationSetResponse, error) {
out := new(pb.RpcBlockDataviewRelationSetResponse)
err := c.cc.Invoke(ctx, "/anytype.ClientCommands/BlockDataviewRelationSet", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *clientCommandsClient) BlockDataviewRelationAdd(ctx context.Context, in *pb.RpcBlockDataviewRelationAddRequest, opts ...grpc.CallOption) (*pb.RpcBlockDataviewRelationAddResponse, error) {
out := new(pb.RpcBlockDataviewRelationAddResponse)
err := c.cc.Invoke(ctx, "/anytype.ClientCommands/BlockDataviewRelationAdd", in, out, opts...)
@ -3398,15 +3405,6 @@ func (c *clientCommandsClient) AIObjectCreateFromUrl(ctx context.Context, in *pb
return out, nil
}
func (c *clientCommandsClient) PushNotificationRegisterToken(ctx context.Context, in *pb.RpcPushNotificationRegisterTokenRequest, opts ...grpc.CallOption) (*pb.RpcPushNotificationRegisterTokenResponse, error) {
out := new(pb.RpcPushNotificationRegisterTokenResponse)
err := c.cc.Invoke(ctx, "/anytype.ClientCommands/PushNotificationRegisterToken", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// ClientCommandsServer is the server API for ClientCommands service.
type ClientCommandsServer interface {
AppGetVersion(context.Context, *pb.RpcAppGetVersionRequest) *pb.RpcAppGetVersionResponse
@ -3633,6 +3631,7 @@ type ClientCommandsServer interface {
BlockDataviewViewSetActive(context.Context, *pb.RpcBlockDataviewViewSetActiveRequest) *pb.RpcBlockDataviewViewSetActiveResponse
BlockDataviewViewSetPosition(context.Context, *pb.RpcBlockDataviewViewSetPositionRequest) *pb.RpcBlockDataviewViewSetPositionResponse
BlockDataviewSetSource(context.Context, *pb.RpcBlockDataviewSetSourceRequest) *pb.RpcBlockDataviewSetSourceResponse
BlockDataviewRelationSet(context.Context, *pb.RpcBlockDataviewRelationSetRequest) *pb.RpcBlockDataviewRelationSetResponse
BlockDataviewRelationAdd(context.Context, *pb.RpcBlockDataviewRelationAddRequest) *pb.RpcBlockDataviewRelationAddResponse
BlockDataviewRelationDelete(context.Context, *pb.RpcBlockDataviewRelationDeleteRequest) *pb.RpcBlockDataviewRelationDeleteResponse
BlockDataviewGroupOrderUpdate(context.Context, *pb.RpcBlockDataviewGroupOrderUpdateRequest) *pb.RpcBlockDataviewGroupOrderUpdateResponse
@ -3763,8 +3762,6 @@ type ClientCommandsServer interface {
AIAutofill(context.Context, *pb.RpcAIAutofillRequest) *pb.RpcAIAutofillResponse
AIListSummary(context.Context, *pb.RpcAIListSummaryRequest) *pb.RpcAIListSummaryResponse
AIObjectCreateFromUrl(context.Context, *pb.RpcAIObjectCreateFromUrlRequest) *pb.RpcAIObjectCreateFromUrlResponse
// Push
PushNotificationRegisterToken(context.Context, *pb.RpcPushNotificationRegisterTokenRequest) *pb.RpcPushNotificationRegisterTokenResponse
}
// UnimplementedClientCommandsServer can be embedded to have forward compatible implementations.
@ -4335,6 +4332,9 @@ func (*UnimplementedClientCommandsServer) BlockDataviewViewSetPosition(ctx conte
func (*UnimplementedClientCommandsServer) BlockDataviewSetSource(ctx context.Context, req *pb.RpcBlockDataviewSetSourceRequest) *pb.RpcBlockDataviewSetSourceResponse {
return nil
}
func (*UnimplementedClientCommandsServer) BlockDataviewRelationSet(ctx context.Context, req *pb.RpcBlockDataviewRelationSetRequest) *pb.RpcBlockDataviewRelationSetResponse {
return nil
}
func (*UnimplementedClientCommandsServer) BlockDataviewRelationAdd(ctx context.Context, req *pb.RpcBlockDataviewRelationAddRequest) *pb.RpcBlockDataviewRelationAddResponse {
return nil
}
@ -4641,9 +4641,6 @@ func (*UnimplementedClientCommandsServer) AIListSummary(ctx context.Context, req
func (*UnimplementedClientCommandsServer) AIObjectCreateFromUrl(ctx context.Context, req *pb.RpcAIObjectCreateFromUrlRequest) *pb.RpcAIObjectCreateFromUrlResponse {
return nil
}
func (*UnimplementedClientCommandsServer) PushNotificationRegisterToken(ctx context.Context, req *pb.RpcPushNotificationRegisterTokenRequest) *pb.RpcPushNotificationRegisterTokenResponse {
return nil
}
func RegisterClientCommandsServer(s *grpc.Server, srv ClientCommandsServer) {
s.RegisterService(&_ClientCommands_serviceDesc, srv)
@ -8033,6 +8030,24 @@ func _ClientCommands_BlockDataviewSetSource_Handler(srv interface{}, ctx context
return interceptor(ctx, in, info, handler)
}
func _ClientCommands_BlockDataviewRelationSet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(pb.RpcBlockDataviewRelationSetRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(ClientCommandsServer).BlockDataviewRelationSet(ctx, in), nil
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/anytype.ClientCommands/BlockDataviewRelationSet",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ClientCommandsServer).BlockDataviewRelationSet(ctx, req.(*pb.RpcBlockDataviewRelationSetRequest)), nil
}
return interceptor(ctx, in, info, handler)
}
func _ClientCommands_BlockDataviewRelationAdd_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(pb.RpcBlockDataviewRelationAddRequest)
if err := dec(in); err != nil {
@ -9873,24 +9888,6 @@ func _ClientCommands_AIObjectCreateFromUrl_Handler(srv interface{}, ctx context.
return interceptor(ctx, in, info, handler)
}
func _ClientCommands_PushNotificationRegisterToken_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(pb.RpcPushNotificationRegisterTokenRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(ClientCommandsServer).PushNotificationRegisterToken(ctx, in), nil
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/anytype.ClientCommands/PushNotificationRegisterToken",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ClientCommandsServer).PushNotificationRegisterToken(ctx, req.(*pb.RpcPushNotificationRegisterTokenRequest)), nil
}
return interceptor(ctx, in, info, handler)
}
var _ClientCommands_serviceDesc = grpc.ServiceDesc{
ServiceName: "anytype.ClientCommands",
HandlerType: (*ClientCommandsServer)(nil),
@ -10647,6 +10644,10 @@ var _ClientCommands_serviceDesc = grpc.ServiceDesc{
MethodName: "BlockDataviewSetSource",
Handler: _ClientCommands_BlockDataviewSetSource_Handler,
},
{
MethodName: "BlockDataviewRelationSet",
Handler: _ClientCommands_BlockDataviewRelationSet_Handler,
},
{
MethodName: "BlockDataviewRelationAdd",
Handler: _ClientCommands_BlockDataviewRelationAdd_Handler,
@ -11051,10 +11052,6 @@ var _ClientCommands_serviceDesc = grpc.ServiceDesc{
MethodName: "AIObjectCreateFromUrl",
Handler: _ClientCommands_AIObjectCreateFromUrl_Handler,
},
{
MethodName: "PushNotificationRegisterToken",
Handler: _ClientCommands_PushNotificationRegisterToken_Handler,
},
},
Streams: []grpc.StreamDesc{
{

View file

@ -11,6 +11,7 @@ const (
SubObjectCollectionIdSeparator = "-"
RelationKeyToIdPrefix = "rel-" //
ObjectTypeKeyToIdPrefix = "ot-" //
ObjectTypeAllViewId = "all"
BundledRelationURLPrefix = "_br"

View file

@ -39,7 +39,7 @@ const (
CName = "fts"
ftsDir = "fts"
ftsDir2 = "fts_tantivy"
ftsVer = "12"
ftsVer = "13"
docLimit = 10000
fieldTitle = "Title"

View file

@ -46,7 +46,7 @@ func (s *dsObjectStore) BatchProcessFullTextQueue(
spaceIds func() []string,
limit uint,
processIds func(objectIds []domain.FullID,
) ([]string, error)) error {
) (succeedIds []string, err error)) error {
for {
ids, err := s.ListIdsFromFullTextQueue(spaceIds(), limit)
if err != nil {
@ -55,11 +55,16 @@ func (s *dsObjectStore) BatchProcessFullTextQueue(
if len(ids) == 0 {
return nil
}
toRemove, err := processIds(ids)
succeedIds, err := processIds(ids)
if err != nil {
// if all failed it will return an error and we will exit here
return fmt.Errorf("process ids: %w", err)
}
err = s.RemoveIdsFromFullTextQueue(toRemove)
if len(succeedIds) == 0 {
// special case to prevent infinite loop
return fmt.Errorf("all ids failed to process")
}
err = s.RemoveIdsFromFullTextQueue(succeedIds)
if err != nil {
return fmt.Errorf("remove ids from fulltext queue: %w", err)
}

View file

@ -40,7 +40,7 @@ type CrossSpace interface {
ListIdsCrossSpace() ([]string, error)
EnqueueAllForFulltextIndexing(ctx context.Context) error
BatchProcessFullTextQueue(ctx context.Context, spaceIds func() []string, limit uint, processIds func(objectIds []domain.FullID) ([]string, error)) error
BatchProcessFullTextQueue(ctx context.Context, spaceIds func() []string, limit uint, processIds func(objectIds []domain.FullID) (succeedIds []string, err error)) error
AccountStore
VirtualSpacesStore

View file

@ -23,6 +23,11 @@ import (
text2 "github.com/anyproto/anytype-heart/util/text"
)
var pluralNameId = domain.ObjectPath{
ObjectId: "",
RelationKey: bundle.RelationKeyPluralName.String(),
}.String()
const (
// minFulltextScore trim fulltext results with score lower than this value in case there are no highlight ranges available
minFulltextScore = 0.02
@ -45,7 +50,7 @@ func (s *dsObjectStore) getObjectsWithObjectInRelation(relationKey domain.Relati
func (s *dsObjectStore) getInjectedResults(details *domain.Details, score float64, path domain.ObjectPath, maxLength int, params database.Filters) []database.Record {
var injectedResults []database.Record
id := details.GetString(bundle.RelationKeyId)
if path.RelationKey != bundle.RelationKeyName.String() {
if path.RelationKey != bundle.RelationKeyName.String() && path.RelationKey != bundle.RelationKeyPluralName.String() {
// inject only in case we match the name
return nil
}
@ -211,7 +216,10 @@ func (s *dsObjectStore) QueryFromFulltext(results []database.FulltextResult, par
if params.FilterObj == nil || params.FilterObj.FilterObject(rec.Details) {
rec.Meta = res.Model()
if rec.Meta.Highlight == "" {
title := details.GetString(bundle.RelationKeyName)
title := details.GetString(bundle.RelationKeyPluralName)
if title == "" {
title = details.GetString(bundle.RelationKeyName)
}
index := strings.Index(strings.ToLower(title), strings.ToLower(ftsSearch))
titleArr := []byte(title)
if index != -1 {
@ -339,7 +347,7 @@ func (s *dsObjectStore) performFulltextSearch(search func() (results []*ftsearch
if len(objectPerBlockResults) == 0 {
continue
}
objectResults = append(objectResults, objectPerBlockResults[0])
objectResults = append(objectResults, preferPluralNameRelation(objectPerBlockResults))
}
sort.Slice(objectResults, func(i, j int) bool {
@ -379,6 +387,16 @@ func (s *dsObjectStore) performFulltextSearch(search func() (results []*ftsearch
return results, nil
}
func preferPluralNameRelation(objectPerBlockResults []*ftsearch.DocumentMatch) *ftsearch.DocumentMatch {
doc, found := lo.Find(objectPerBlockResults, func(item *ftsearch.DocumentMatch) bool {
return strings.HasSuffix(item.ID, pluralNameId)
})
if !found {
doc = objectPerBlockResults[0]
}
return doc
}
func convertToHighlightRanges(ranges [][]int, highlight string) []*model.Range {
var highlightRanges []*model.Range

View file

@ -180,6 +180,12 @@ func TestQuery(t *testing.T) {
})
require.NoError(t, err)
err = s.fts.Index(ftsearch.SearchDoc{
Id: "id1/r/pluralName",
Title: "mynames",
})
require.NoError(t, err)
err = s.fts.Index(ftsearch.SearchDoc{
Id: "id2/b/321",
Title: "some important note",
@ -218,6 +224,19 @@ func TestQuery(t *testing.T) {
}, recs)
})
t.Run("fulltext by plural name relation", func(t *testing.T) {
recs, err := s.Query(database.Query{
TextQuery: "mynames",
})
require.NoError(t, err)
assert.Equal(t, "pluralName", recs[0].Meta.RelationKey)
// Full-text engine has its own ordering, so just don't rely on it here and check only the content.
assertRecordsMatch(t, []TestObject{
obj1,
}, recs)
})
t.Run("full-text and filter", func(t *testing.T) {
recs, err := s.Query(database.Query{
TextQuery: "important",

View file

@ -128,7 +128,9 @@ func (a *aclObjectManager) Run(ctx context.Context) (err error) {
}
func (a *aclObjectManager) Close(ctx context.Context) (err error) {
a.spaceLoaderListener.OnSpaceUnload(a.sp.Id())
if a.sp != nil {
a.spaceLoaderListener.OnSpaceUnload(a.sp.Id())
}
if !a.started {
return
}

View file

@ -10,7 +10,6 @@ import (
"net/http"
"os"
"path/filepath"
"slices"
"strconv"
"sync"
"time"
@ -20,7 +19,6 @@ import (
"github.com/anyproto/anytype-heart/core/block/cache"
"github.com/anyproto/anytype-heart/core/block/detailservice"
"github.com/anyproto/anytype-heart/core/block/editor"
"github.com/anyproto/anytype-heart/core/block/editor/state"
"github.com/anyproto/anytype-heart/core/block/editor/widget"
importer "github.com/anyproto/anytype-heart/core/block/import"
@ -35,6 +33,7 @@ import (
"github.com/anyproto/anytype-heart/pkg/lib/bundle"
"github.com/anyproto/anytype-heart/pkg/lib/core"
"github.com/anyproto/anytype-heart/pkg/lib/database"
"github.com/anyproto/anytype-heart/pkg/lib/localstore/addr"
"github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore"
"github.com/anyproto/anytype-heart/pkg/lib/logging"
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
@ -359,6 +358,21 @@ func (b *builtinObjects) setHomePageIdToWorkspace(spc clientspace.Space, id stri
}
}
func (b *builtinObjects) typeHasObjects(spaceId, typeId string) (bool, error) {
records, err := b.store.SpaceIndex(spaceId).QueryRaw(&database.Filters{FilterObj: database.FiltersAnd{
database.FilterEq{
Key: bundle.RelationKeyType,
Cond: model.BlockContentDataviewFilter_Equal,
Value: domain.String(typeId),
},
}}, 1, 0)
if err != nil {
return false, err
}
return len(records) > 0, nil
}
func (b *builtinObjects) createWidgets(ctx session.Context, spaceId string, useCase pb.RpcObjectImportUseCaseRequestUseCase) {
spc, err := b.spaceService.Get(context.Background(), spaceId)
if err != nil {
@ -367,40 +381,33 @@ func (b *builtinObjects) createWidgets(ctx session.Context, spaceId string, useC
}
widgetObjectID := spc.DerivedIDs().Widgets
typeId, err := spc.GetTypeIdByKey(context.Background(), bundle.TypeKeyPage)
var widgetTargetsToCreate []string
pageTypeId, err := spc.GetTypeIdByKey(context.Background(), bundle.TypeKeyPage)
if err != nil {
log.Errorf("failed to get type id: %w", err)
return
}
taskTypeId, err := spc.GetTypeIdByKey(context.Background(), bundle.TypeKeyTask)
if err != nil {
log.Errorf("failed to get type id: %w", err)
return
}
for _, typeId := range []string{pageTypeId, taskTypeId} {
if has, err := b.typeHasObjects(spaceId, typeId); err != nil {
log.Warnf("failed to check if type '%s' has objects: %v", pageTypeId, err)
} else if has {
widgetTargetsToCreate = append(widgetTargetsToCreate, typeId)
}
}
// todo: rewrite to use CreateTypeWidgetIfMissing in block.Service
if len(widgetTargetsToCreate) == 0 {
return
}
if err = cache.DoStateCtx(b.objectGetter, ctx, widgetObjectID, func(s *state.State, w widget.Widget) error {
targets := s.Details().Get(bundle.RelationKeyAutoWidgetTargets).StringList()
if slices.Contains(targets, typeId) {
return nil
}
targets = append(targets, typeId)
s.Details().Set(bundle.RelationKeyAutoWidgetTargets, domain.StringList(targets))
request := &pb.RpcBlockCreateWidgetRequest{
ContextId: widgetObjectID,
Position: model.Block_Bottom,
WidgetLayout: model.BlockContentWidget_View,
ViewId: editor.ObjectTypeAllViewId,
Block: &model.Block{
Content: &model.BlockContentOfLink{
Link: &model.BlockContentLink{
TargetBlockId: typeId,
Style: model.BlockContentLink_Page,
IconSize: model.BlockContentLink_SizeNone,
CardStyle: model.BlockContentLink_Inline,
Description: model.BlockContentLink_None,
},
},
},
}
if _, createErr := w.CreateBlock(s, request); createErr != nil {
return fmt.Errorf("failed to make Widget block: %v", createErr)
for _, targetId := range widgetTargetsToCreate {
if err := w.AddAutoWidget(s, targetId, "", addr.ObjectTypeAllViewId, model.BlockContentWidget_View); err != nil {
log.Errorf("failed to create widget block for type '%s': %v", targetId, err)
}
}
return nil
}); err != nil {