From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46975) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aG25c-0002Lg-7k for qemu-devel@nongnu.org; Mon, 04 Jan 2016 05:10:14 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aG25Z-0008UY-SH for qemu-devel@nongnu.org; Mon, 04 Jan 2016 05:10:12 -0500 Received: from mail-wm0-x22a.google.com ([2a00:1450:400c:c09::22a]:37504) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aG25Z-0008US-Fr for qemu-devel@nongnu.org; Mon, 04 Jan 2016 05:10:09 -0500 Received: by mail-wm0-x22a.google.com with SMTP id f206so205657324wmf.0 for ; Mon, 04 Jan 2016 02:10:09 -0800 (PST) MIME-Version: 1.0 In-Reply-To: <1450102686-23855-1-git-send-email-kraxel@redhat.com> References: <1450102686-23855-1-git-send-email-kraxel@redhat.com> Date: Mon, 4 Jan 2016 10:10:08 +0000 Message-ID: From: Jonathan Scruggs Content-Type: multipart/alternative; boundary=047d7bacb09466222905287f5315 Subject: Re: [Qemu-devel] [vfio-users] [PATCH v2 1/3] input: add qemu_input_qcode_to_linux + qemu_input_linux_to_qcode List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Gerd Hoffmann Cc: qemu-devel@nongnu.org, vfio-users --047d7bacb09466222905287f5315 Content-Type: text/plain; charset=UTF-8 Hi, I tried these patches with qemu 2.5.0 on Gentoo and libvirt. I get the following error: Error starting domain: internal error: early end of file from monitor: possible problem: 2015-12-22T21:51:20.659520Z qemu-system-x86_64: -input-linux /dev/input/by-path/pci-0000:00:14.0-usb-0:12:1.0-event-kbd,grab-all=on: Could not open '/dev/input/by-path/pci-0000:00:14.0-usb-0:12:1.0-event-kbd' I also tried setting /dev/input/event9 to permissions of 666 to see if it was a permission error, but the same thing happened. Any help would be appreciated. The way I pass it is with this: Is there a way around this error? Thanks, Jon On 14 December 2015 at 14:18, Gerd Hoffmann wrote: > Signed-off-by: Gerd Hoffmann > --- > include/ui/input.h | 3 ++ > ui/input-keymap.c | 145 > +++++++++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 148 insertions(+) > > diff --git a/include/ui/input.h b/include/ui/input.h > index d06a12d..d7afd80 100644 > --- a/include/ui/input.h > +++ b/include/ui/input.h > @@ -48,6 +48,9 @@ int qemu_input_key_value_to_qcode(const KeyValue *value); > int qemu_input_key_value_to_scancode(const KeyValue *value, bool down, > int *codes); > > +int qemu_input_qcode_to_linux(unsigned int qcode); > +int qemu_input_linux_to_qcode(unsigned int lnx); > + > InputEvent *qemu_input_event_new_btn(InputButton btn, bool down); > void qemu_input_queue_btn(QemuConsole *src, InputButton btn, bool down); > void qemu_input_update_buttons(QemuConsole *src, uint32_t *button_map, > diff --git a/ui/input-keymap.c b/ui/input-keymap.c > index d36be4b..31f4daa 100644 > --- a/ui/input-keymap.c > +++ b/ui/input-keymap.c > @@ -2,6 +2,126 @@ > #include "ui/keymaps.h" > #include "ui/input.h" > > +#include "standard-headers/linux/input.h" > + > +/* FIXME: duplicate, see hw/input/virtio-input-hid.c */ > +static const unsigned int qcode_to_linux[Q_KEY_CODE_MAX] = { > + [Q_KEY_CODE_ESC] = KEY_ESC, > + [Q_KEY_CODE_1] = KEY_1, > + [Q_KEY_CODE_2] = KEY_2, > + [Q_KEY_CODE_3] = KEY_3, > + [Q_KEY_CODE_4] = KEY_4, > + [Q_KEY_CODE_5] = KEY_5, > + [Q_KEY_CODE_6] = KEY_6, > + [Q_KEY_CODE_7] = KEY_7, > + [Q_KEY_CODE_8] = KEY_8, > + [Q_KEY_CODE_9] = KEY_9, > + [Q_KEY_CODE_0] = KEY_0, > + [Q_KEY_CODE_MINUS] = KEY_MINUS, > + [Q_KEY_CODE_EQUAL] = KEY_EQUAL, > + [Q_KEY_CODE_BACKSPACE] = KEY_BACKSPACE, > + > + [Q_KEY_CODE_TAB] = KEY_TAB, > + [Q_KEY_CODE_Q] = KEY_Q, > + [Q_KEY_CODE_W] = KEY_W, > + [Q_KEY_CODE_E] = KEY_E, > + [Q_KEY_CODE_R] = KEY_R, > + [Q_KEY_CODE_T] = KEY_T, > + [Q_KEY_CODE_Y] = KEY_Y, > + [Q_KEY_CODE_U] = KEY_U, > + [Q_KEY_CODE_I] = KEY_I, > + [Q_KEY_CODE_O] = KEY_O, > + [Q_KEY_CODE_P] = KEY_P, > + [Q_KEY_CODE_BRACKET_LEFT] = KEY_LEFTBRACE, > + [Q_KEY_CODE_BRACKET_RIGHT] = KEY_RIGHTBRACE, > + [Q_KEY_CODE_RET] = KEY_ENTER, > + > + [Q_KEY_CODE_CTRL] = KEY_LEFTCTRL, > + [Q_KEY_CODE_A] = KEY_A, > + [Q_KEY_CODE_S] = KEY_S, > + [Q_KEY_CODE_D] = KEY_D, > + [Q_KEY_CODE_F] = KEY_F, > + [Q_KEY_CODE_G] = KEY_G, > + [Q_KEY_CODE_H] = KEY_H, > + [Q_KEY_CODE_J] = KEY_J, > + [Q_KEY_CODE_K] = KEY_K, > + [Q_KEY_CODE_L] = KEY_L, > + [Q_KEY_CODE_SEMICOLON] = KEY_SEMICOLON, > + [Q_KEY_CODE_APOSTROPHE] = KEY_APOSTROPHE, > + [Q_KEY_CODE_GRAVE_ACCENT] = KEY_GRAVE, > + > + [Q_KEY_CODE_SHIFT] = KEY_LEFTSHIFT, > + [Q_KEY_CODE_BACKSLASH] = KEY_BACKSLASH, > + [Q_KEY_CODE_LESS] = KEY_102ND, > + [Q_KEY_CODE_Z] = KEY_Z, > + [Q_KEY_CODE_X] = KEY_X, > + [Q_KEY_CODE_C] = KEY_C, > + [Q_KEY_CODE_V] = KEY_V, > + [Q_KEY_CODE_B] = KEY_B, > + [Q_KEY_CODE_N] = KEY_N, > + [Q_KEY_CODE_M] = KEY_M, > + [Q_KEY_CODE_COMMA] = KEY_COMMA, > + [Q_KEY_CODE_DOT] = KEY_DOT, > + [Q_KEY_CODE_SLASH] = KEY_SLASH, > + [Q_KEY_CODE_SHIFT_R] = KEY_RIGHTSHIFT, > + > + [Q_KEY_CODE_ALT] = KEY_LEFTALT, > + [Q_KEY_CODE_SPC] = KEY_SPACE, > + [Q_KEY_CODE_CAPS_LOCK] = KEY_CAPSLOCK, > + > + [Q_KEY_CODE_F1] = KEY_F1, > + [Q_KEY_CODE_F2] = KEY_F2, > + [Q_KEY_CODE_F3] = KEY_F3, > + [Q_KEY_CODE_F4] = KEY_F4, > + [Q_KEY_CODE_F5] = KEY_F5, > + [Q_KEY_CODE_F6] = KEY_F6, > + [Q_KEY_CODE_F7] = KEY_F7, > + [Q_KEY_CODE_F8] = KEY_F8, > + [Q_KEY_CODE_F9] = KEY_F9, > + [Q_KEY_CODE_F10] = KEY_F10, > + [Q_KEY_CODE_NUM_LOCK] = KEY_NUMLOCK, > + [Q_KEY_CODE_SCROLL_LOCK] = KEY_SCROLLLOCK, > + > + [Q_KEY_CODE_KP_0] = KEY_KP0, > + [Q_KEY_CODE_KP_1] = KEY_KP1, > + [Q_KEY_CODE_KP_2] = KEY_KP2, > + [Q_KEY_CODE_KP_3] = KEY_KP3, > + [Q_KEY_CODE_KP_4] = KEY_KP4, > + [Q_KEY_CODE_KP_5] = KEY_KP5, > + [Q_KEY_CODE_KP_6] = KEY_KP6, > + [Q_KEY_CODE_KP_7] = KEY_KP7, > + [Q_KEY_CODE_KP_8] = KEY_KP8, > + [Q_KEY_CODE_KP_9] = KEY_KP9, > + [Q_KEY_CODE_KP_SUBTRACT] = KEY_KPMINUS, > + [Q_KEY_CODE_KP_ADD] = KEY_KPPLUS, > + [Q_KEY_CODE_KP_DECIMAL] = KEY_KPDOT, > + [Q_KEY_CODE_KP_ENTER] = KEY_KPENTER, > + [Q_KEY_CODE_KP_DIVIDE] = KEY_KPSLASH, > + [Q_KEY_CODE_KP_MULTIPLY] = KEY_KPASTERISK, > + > + [Q_KEY_CODE_F11] = KEY_F11, > + [Q_KEY_CODE_F12] = KEY_F12, > + > + [Q_KEY_CODE_CTRL_R] = KEY_RIGHTCTRL, > + [Q_KEY_CODE_SYSRQ] = KEY_SYSRQ, > + [Q_KEY_CODE_ALT_R] = KEY_RIGHTALT, > + > + [Q_KEY_CODE_HOME] = KEY_HOME, > + [Q_KEY_CODE_UP] = KEY_UP, > + [Q_KEY_CODE_PGUP] = KEY_PAGEUP, > + [Q_KEY_CODE_LEFT] = KEY_LEFT, > + [Q_KEY_CODE_RIGHT] = KEY_RIGHT, > + [Q_KEY_CODE_END] = KEY_END, > + [Q_KEY_CODE_DOWN] = KEY_DOWN, > + [Q_KEY_CODE_PGDN] = KEY_PAGEDOWN, > + [Q_KEY_CODE_INSERT] = KEY_INSERT, > + [Q_KEY_CODE_DELETE] = KEY_DELETE, > + > + [Q_KEY_CODE_META_L] = KEY_LEFTMETA, > + [Q_KEY_CODE_META_R] = KEY_RIGHTMETA, > + [Q_KEY_CODE_MENU] = KEY_MENU, > +}; > + > static const int qcode_to_number[] = { > [Q_KEY_CODE_SHIFT] = 0x2a, > [Q_KEY_CODE_SHIFT_R] = 0x36, > @@ -136,6 +256,7 @@ static const int qcode_to_number[] = { > }; > > static int number_to_qcode[0x100]; > +static int linux_to_qcode[KEY_CNT]; > > int qemu_input_key_value_to_number(const KeyValue *value) > { > @@ -200,3 +321,27 @@ int qemu_input_key_value_to_scancode(const KeyValue > *value, bool down, > > return count; > } > + > +int qemu_input_qcode_to_linux(unsigned int qcode) > +{ > + assert(qcode < Q_KEY_CODE_MAX); > + return qcode_to_linux[qcode]; > +} > + > +int qemu_input_linux_to_qcode(unsigned int lnx) > +{ > + static int first = true; > + > + if (first) { > + int qcode, number; > + first = false; > + for (qcode = 0; qcode < Q_KEY_CODE_MAX; qcode++) { > + number = qcode_to_linux[qcode]; > + assert(number < KEY_CNT); > + linux_to_qcode[number] = qcode; > + } > + } > + > + assert(lnx < KEY_CNT); > + return linux_to_qcode[lnx]; > +} > -- > 1.8.3.1 > > _______________________________________________ > vfio-users mailing list > vfio-users@redhat.com > https://www.redhat.com/mailman/listinfo/vfio-users > --047d7bacb09466222905287f5315 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+PGRpdj5IaSw8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PkkgdHJpZWQg dGhlc2UgcGF0Y2hlcyB3aXRoIHFlbXUgMi41LjAgb24gR2VudG9vIGFuZCBsaWJ2aXJ0LiBJIGdl dCB0aGUgZm9sbG93aW5nIGVycm9yOjwvZGl2PjxkaXY+RXJyb3Igc3RhcnRpbmcgZG9tYWluOiBp bnRlcm5hbCBlcnJvcjogZWFybHkgZW5kIG9mIGZpbGUgZnJvbSBtb25pdG9yOiBwb3NzaWJsZSBw cm9ibGVtOjwvZGl2PjxkaXY+MjAxNS0xMi0yMlQyMTo1MToyMC42NTk1MjBaIHFlbXUtc3lzdGVt LXg4Nl82NDogLWlucHV0LWxpbnV4IC9kZXYvaW5wdXQvYnktcGF0aC9wY2ktMDAwMDowMDoxNC4w LXVzYi0wOjEyOjEuMC1ldmVudC1rYmQsZ3JhYi1hbGw9b246IENvdWxkIG5vdCBvcGVuICYjMzk7 L2Rldi9pbnB1dC9ieS1wYXRoL3BjaS0wMDAwOjAwOjE0LjAtdXNiLTA6MTI6MS4wLWV2ZW50LWti ZCYjMzk7PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5JIGFsc28gdHJpZWQgc2V0dGluZyAvZGV2 L2lucHV0L2V2ZW50OSB0byBwZXJtaXNzaW9ucyBvZiA2NjYgdG8gc2VlIGlmIGl0IHdhcyBhIHBl cm1pc3Npb24gZXJyb3IsIGJ1dCB0aGUgc2FtZSB0aGluZyBoYXBwZW5lZC4gQW55IGhlbHAgd291 bGQgYmUgYXBwcmVjaWF0ZWQuPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRp dj5UaGUgd2F5IEkgcGFzcyBpdCBpcyB3aXRoIHRoaXM6PC9kaXY+PGRpdj7CoCAmbHQ7cWVtdTpj b21tYW5kbGluZSZndDs8L2Rpdj48ZGl2PsKgIMKgICZsdDtxZW11OmFyZyB2YWx1ZT0mIzM5Oy1p bnB1dC1saW51eCYjMzk7LyZndDs8L2Rpdj48ZGl2PsKgIMKgICZsdDtxZW11OmFyZyB2YWx1ZT0m IzM5Oy9kZXYvaW5wdXQvYnktcGF0aC9wY2ktMDAwMDowMDoxNC4wLXVzYi0wOjEyOjEuMC1ldmVu dC1rYmQsZ3JhYi1hbGw9b24mIzM5Oy8mZ3Q7PC9kaXY+PGRpdj7CoCDCoCAmbHQ7cWVtdTphcmcg dmFsdWU9JiMzOTstaW5wdXQtbGludXgmIzM5Oy8mZ3Q7PC9kaXY+PGRpdj7CoCDCoCAmbHQ7cWVt dTphcmcgdmFsdWU9JiMzOTsvZGV2L2lucHV0L2J5LXBhdGgvcGNpLTAwMDA6MDA6MTQuMC11c2It MDoxMjoxLjEtZXZlbnQtbW91c2UmIzM5Oy8mZ3Q7PC9kaXY+PGRpdj7CoCDCoCAmbHQ7cWVtdTph cmcgdmFsdWU9JiMzOTstaW5wdXQtbGludXgmIzM5Oy8mZ3Q7PC9kaXY+PGRpdj7CoCDCoCAmbHQ7 cWVtdTphcmcgdmFsdWU9JiMzOTsvZGV2L2lucHV0L2J5LXBhdGgvcGNpLTAwMDA6MDA6MTQuMC11 c2ItMDoxMjoxLjItZXZlbnQtam95c3RpY2smIzM5Oy8mZ3Q7PC9kaXY+PGRpdj7CoCAmbHQ7L3Fl bXU6Y29tbWFuZGxpbmUmZ3Q7PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5JcyB0aGVyZSBhIHdh eSBhcm91bmQgdGhpcyBlcnJvcj88L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PlRoYW5rcyw8L2Rp dj48ZGl2PkpvbjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJhIj48YnI+PGRpdiBj bGFzcz0iZ21haWxfcXVvdGUiPk9uIDE0IERlY2VtYmVyIDIwMTUgYXQgMTQ6MTgsIEdlcmQgSG9m Zm1hbm4gPHNwYW4gZGlyPSJsdHIiPiZsdDs8YSBocmVmPSJtYWlsdG86a3JheGVsQHJlZGhhdC5j b20iIHRhcmdldD0iX2JsYW5rIj5rcmF4ZWxAcmVkaGF0LmNvbTwvYT4mZ3Q7PC9zcGFuPiB3cm90 ZTo8YnI+PGJsb2NrcXVvdGUgY2xhc3M9ImdtYWlsX3F1b3RlIiBzdHlsZT0ibWFyZ2luOjAgMCAw IC44ZXg7Ym9yZGVyLWxlZnQ6MXB4ICNjY2Mgc29saWQ7cGFkZGluZy1sZWZ0OjFleCI+U2lnbmVk LW9mZi1ieTogR2VyZCBIb2ZmbWFubiAmbHQ7PGEgaHJlZj0ibWFpbHRvOmtyYXhlbEByZWRoYXQu Y29tIj5rcmF4ZWxAcmVkaGF0LmNvbTwvYT4mZ3Q7PGJyPg0KLS0tPGJyPg0KwqBpbmNsdWRlL3Vp L2lucHV0LmggfMKgIMKgMyArKzxicj4NCsKgdWkvaW5wdXQta2V5bWFwLmPCoCB8IDE0NSArKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKzxicj4NCsKg MiBmaWxlcyBjaGFuZ2VkLCAxNDggaW5zZXJ0aW9ucygrKTxicj4NCjxicj4NCmRpZmYgLS1naXQg YS9pbmNsdWRlL3VpL2lucHV0LmggYi9pbmNsdWRlL3VpL2lucHV0Lmg8YnI+DQppbmRleCBkMDZh MTJkLi5kN2FmZDgwIDEwMDY0NDxicj4NCi0tLSBhL2luY2x1ZGUvdWkvaW5wdXQuaDxicj4NCisr KyBiL2luY2x1ZGUvdWkvaW5wdXQuaDxicj4NCkBAIC00OCw2ICs0OCw5IEBAIGludCBxZW11X2lu cHV0X2tleV92YWx1ZV90b19xY29kZShjb25zdCBLZXlWYWx1ZSAqdmFsdWUpOzxicj4NCsKgaW50 IHFlbXVfaW5wdXRfa2V5X3ZhbHVlX3RvX3NjYW5jb2RlKGNvbnN0IEtleVZhbHVlICp2YWx1ZSwg Ym9vbCBkb3duLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIGludCAqY29kZXMpOzxicj4NCjxicj4NCitpbnQgcWVtdV9pbnB1dF9x Y29kZV90b19saW51eCh1bnNpZ25lZCBpbnQgcWNvZGUpOzxicj4NCitpbnQgcWVtdV9pbnB1dF9s aW51eF90b19xY29kZSh1bnNpZ25lZCBpbnQgbG54KTs8YnI+DQorPGJyPg0KwqBJbnB1dEV2ZW50 ICpxZW11X2lucHV0X2V2ZW50X25ld19idG4oSW5wdXRCdXR0b24gYnRuLCBib29sIGRvd24pOzxi cj4NCsKgdm9pZCBxZW11X2lucHV0X3F1ZXVlX2J0bihRZW11Q29uc29sZSAqc3JjLCBJbnB1dEJ1 dHRvbiBidG4sIGJvb2wgZG93bik7PGJyPg0KwqB2b2lkIHFlbXVfaW5wdXRfdXBkYXRlX2J1dHRv bnMoUWVtdUNvbnNvbGUgKnNyYywgdWludDMyX3QgKmJ1dHRvbl9tYXAsPGJyPg0KZGlmZiAtLWdp dCBhL3VpL2lucHV0LWtleW1hcC5jIGIvdWkvaW5wdXQta2V5bWFwLmM8YnI+DQppbmRleCBkMzZi ZTRiLi4zMWY0ZGFhIDEwMDY0NDxicj4NCi0tLSBhL3VpL2lucHV0LWtleW1hcC5jPGJyPg0KKysr IGIvdWkvaW5wdXQta2V5bWFwLmM8YnI+DQpAQCAtMiw2ICsyLDEyNiBAQDxicj4NCsKgI2luY2x1 ZGUgJnF1b3Q7dWkva2V5bWFwcy5oJnF1b3Q7PGJyPg0KwqAjaW5jbHVkZSAmcXVvdDt1aS9pbnB1 dC5oJnF1b3Q7PGJyPg0KPGJyPg0KKyNpbmNsdWRlICZxdW90O3N0YW5kYXJkLWhlYWRlcnMvbGlu dXgvaW5wdXQuaCZxdW90Ozxicj4NCis8YnI+DQorLyogRklYTUU6IGR1cGxpY2F0ZSwgc2VlIGh3 L2lucHV0L3ZpcnRpby1pbnB1dC1oaWQuYyAqLzxicj4NCitzdGF0aWMgY29uc3QgdW5zaWduZWQg aW50IHFjb2RlX3RvX2xpbnV4W1FfS0VZX0NPREVfTUFYXSA9IHs8YnI+DQorwqAgwqAgW1FfS0VZ X0NPREVfRVNDXcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgPSBLRVlfRVNDLDxicj4NCivCoCDC oCBbUV9LRVlfQ09ERV8xXcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgPSBLRVlfMSw8YnI+ DQorwqAgwqAgW1FfS0VZX0NPREVfMl3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoD0gS0VZ XzIsPGJyPg0KK8KgIMKgIFtRX0tFWV9DT0RFXzNdwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqA9IEtFWV8zLDxicj4NCivCoCDCoCBbUV9LRVlfQ09ERV80XcKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgPSBLRVlfNCw8YnI+DQorwqAgwqAgW1FfS0VZX0NPREVfNV3CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoD0gS0VZXzUsPGJyPg0KK8KgIMKgIFtRX0tFWV9DT0RFXzZdwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA9IEtFWV82LDxicj4NCivCoCDCoCBbUV9LRVlfQ09ERV83 XcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgPSBLRVlfNyw8YnI+DQorwqAgwqAgW1FfS0VZ X0NPREVfOF3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoD0gS0VZXzgsPGJyPg0KK8KgIMKg IFtRX0tFWV9DT0RFXzldwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA9IEtFWV85LDxicj4N CivCoCDCoCBbUV9LRVlfQ09ERV8wXcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgPSBLRVlf MCw8YnI+DQorwqAgwqAgW1FfS0VZX0NPREVfTUlOVVNdwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA9 IEtFWV9NSU5VUyw8YnI+DQorwqAgwqAgW1FfS0VZX0NPREVfRVFVQUxdwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqA9IEtFWV9FUVVBTCw8YnI+DQorwqAgwqAgW1FfS0VZX0NPREVfQkFDS1NQQUNFXcKg IMKgIMKgIMKgIMKgIMKgPSBLRVlfQkFDS1NQQUNFLDxicj4NCis8YnI+DQorwqAgwqAgW1FfS0VZ X0NPREVfVEFCXcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgPSBLRVlfVEFCLDxicj4NCivCoCDC oCBbUV9LRVlfQ09ERV9RXcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgPSBLRVlfUSw8YnI+ DQorwqAgwqAgW1FfS0VZX0NPREVfV13CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoD0gS0VZ X1csPGJyPg0KK8KgIMKgIFtRX0tFWV9DT0RFX0VdwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqA9IEtFWV9FLDxicj4NCivCoCDCoCBbUV9LRVlfQ09ERV9SXcKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgPSBLRVlfUiw8YnI+DQorwqAgwqAgW1FfS0VZX0NPREVfVF3CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoD0gS0VZX1QsPGJyPg0KK8KgIMKgIFtRX0tFWV9DT0RFX1ldwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA9IEtFWV9ZLDxicj4NCivCoCDCoCBbUV9LRVlfQ09ERV9V XcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgPSBLRVlfVSw8YnI+DQorwqAgwqAgW1FfS0VZ X0NPREVfSV3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoD0gS0VZX0ksPGJyPg0KK8KgIMKg IFtRX0tFWV9DT0RFX09dwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA9IEtFWV9PLDxicj4N CivCoCDCoCBbUV9LRVlfQ09ERV9QXcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgPSBLRVlf UCw8YnI+DQorwqAgwqAgW1FfS0VZX0NPREVfQlJBQ0tFVF9MRUZUXcKgIMKgIMKgIMKgID0gS0VZ X0xFRlRCUkFDRSw8YnI+DQorwqAgwqAgW1FfS0VZX0NPREVfQlJBQ0tFVF9SSUdIVF3CoCDCoCDC oCDCoD0gS0VZX1JJR0hUQlJBQ0UsPGJyPg0KK8KgIMKgIFtRX0tFWV9DT0RFX1JFVF3CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoD0gS0VZX0VOVEVSLDxicj4NCis8YnI+DQorwqAgwqAgW1FfS0VZ X0NPREVfQ1RSTF3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA9IEtFWV9MRUZUQ1RSTCw8YnI+DQor wqAgwqAgW1FfS0VZX0NPREVfQV3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoD0gS0VZX0Es PGJyPg0KK8KgIMKgIFtRX0tFWV9DT0RFX1NdwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA9 IEtFWV9TLDxicj4NCivCoCDCoCBbUV9LRVlfQ09ERV9EXcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgPSBLRVlfRCw8YnI+DQorwqAgwqAgW1FfS0VZX0NPREVfRl3CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoD0gS0VZX0YsPGJyPg0KK8KgIMKgIFtRX0tFWV9DT0RFX0ddwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqA9IEtFWV9HLDxicj4NCivCoCDCoCBbUV9LRVlfQ09ERV9IXcKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgPSBLRVlfSCw8YnI+DQorwqAgwqAgW1FfS0VZX0NP REVfSl3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoD0gS0VZX0osPGJyPg0KK8KgIMKgIFtR X0tFWV9DT0RFX0tdwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA9IEtFWV9LLDxicj4NCivC oCDCoCBbUV9LRVlfQ09ERV9MXcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgPSBLRVlfTCw8 YnI+DQorwqAgwqAgW1FfS0VZX0NPREVfU0VNSUNPTE9OXcKgIMKgIMKgIMKgIMKgIMKgPSBLRVlf U0VNSUNPTE9OLDxicj4NCivCoCDCoCBbUV9LRVlfQ09ERV9BUE9TVFJPUEhFXcKgIMKgIMKgIMKg IMKgID0gS0VZX0FQT1NUUk9QSEUsPGJyPg0KK8KgIMKgIFtRX0tFWV9DT0RFX0dSQVZFX0FDQ0VO VF3CoCDCoCDCoCDCoCA9IEtFWV9HUkFWRSw8YnI+DQorPGJyPg0KK8KgIMKgIFtRX0tFWV9DT0RF X1NISUZUXcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgPSBLRVlfTEVGVFNISUZULDxicj4NCivCoCDC oCBbUV9LRVlfQ09ERV9CQUNLU0xBU0hdwqAgwqAgwqAgwqAgwqAgwqA9IEtFWV9CQUNLU0xBU0gs PGJyPg0KK8KgIMKgIFtRX0tFWV9DT0RFX0xFU1NdwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgPSBL RVlfMTAyTkQsPGJyPg0KK8KgIMKgIFtRX0tFWV9DT0RFX1pdwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqA9IEtFWV9aLDxicj4NCivCoCDCoCBbUV9LRVlfQ09ERV9YXcKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgPSBLRVlfWCw8YnI+DQorwqAgwqAgW1FfS0VZX0NPREVfQ13CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoD0gS0VZX0MsPGJyPg0KK8KgIMKgIFtRX0tFWV9DT0RFX1Zd wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA9IEtFWV9WLDxicj4NCivCoCDCoCBbUV9LRVlf Q09ERV9CXcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgPSBLRVlfQiw8YnI+DQorwqAgwqAg W1FfS0VZX0NPREVfTl3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoD0gS0VZX04sPGJyPg0K K8KgIMKgIFtRX0tFWV9DT0RFX01dwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA9IEtFWV9N LDxicj4NCivCoCDCoCBbUV9LRVlfQ09ERV9DT01NQV3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoD0g S0VZX0NPTU1BLDxicj4NCivCoCDCoCBbUV9LRVlfQ09ERV9ET1RdwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqA9IEtFWV9ET1QsPGJyPg0KK8KgIMKgIFtRX0tFWV9DT0RFX1NMQVNIXcKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgPSBLRVlfU0xBU0gsPGJyPg0KK8KgIMKgIFtRX0tFWV9DT0RFX1NISUZU X1JdwqAgwqAgwqAgwqAgwqAgwqAgwqA9IEtFWV9SSUdIVFNISUZULDxicj4NCis8YnI+DQorwqAg wqAgW1FfS0VZX0NPREVfQUxUXcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgPSBLRVlfTEVGVEFM VCw8YnI+DQorwqAgwqAgW1FfS0VZX0NPREVfU1BDXcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg PSBLRVlfU1BBQ0UsPGJyPg0KK8KgIMKgIFtRX0tFWV9DT0RFX0NBUFNfTE9DS13CoCDCoCDCoCDC oCDCoCDCoD0gS0VZX0NBUFNMT0NLLDxicj4NCis8YnI+DQorwqAgwqAgW1FfS0VZX0NPREVfRjFd wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgPSBLRVlfRjEsPGJyPg0KK8KgIMKgIFtRX0tFWV9D T0RFX0YyXcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgID0gS0VZX0YyLDxicj4NCivCoCDCoCBb UV9LRVlfQ09ERV9GM13CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA9IEtFWV9GMyw8YnI+DQor wqAgwqAgW1FfS0VZX0NPREVfRjRdwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgPSBLRVlfRjQs PGJyPg0KK8KgIMKgIFtRX0tFWV9DT0RFX0Y1XcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgID0g S0VZX0Y1LDxicj4NCivCoCDCoCBbUV9LRVlfQ09ERV9GNl3CoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCA9IEtFWV9GNiw8YnI+DQorwqAgwqAgW1FfS0VZX0NPREVfRjddwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgPSBLRVlfRjcsPGJyPg0KK8KgIMKgIFtRX0tFWV9DT0RFX0Y4XcKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgID0gS0VZX0Y4LDxicj4NCivCoCDCoCBbUV9LRVlfQ09ERV9GOV3C oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA9IEtFWV9GOSw8YnI+DQorwqAgwqAgW1FfS0VZX0NP REVfRjEwXcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgPSBLRVlfRjEwLDxicj4NCivCoCDCoCBb UV9LRVlfQ09ERV9OVU1fTE9DS13CoCDCoCDCoCDCoCDCoCDCoCA9IEtFWV9OVU1MT0NLLDxicj4N CivCoCDCoCBbUV9LRVlfQ09ERV9TQ1JPTExfTE9DS13CoCDCoCDCoCDCoCDCoD0gS0VZX1NDUk9M TExPQ0ssPGJyPg0KKzxicj4NCivCoCDCoCBbUV9LRVlfQ09ERV9LUF8wXcKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgID0gS0VZX0tQMCw8YnI+DQorwqAgwqAgW1FfS0VZX0NPREVfS1BfMV3CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCA9IEtFWV9LUDEsPGJyPg0KK8KgIMKgIFtRX0tFWV9DT0RFX0tQXzJd wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgPSBLRVlfS1AyLDxicj4NCivCoCDCoCBbUV9LRVlfQ09E RV9LUF8zXcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgID0gS0VZX0tQMyw8YnI+DQorwqAgwqAgW1Ff S0VZX0NPREVfS1BfNF3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA9IEtFWV9LUDQsPGJyPg0KK8Kg IMKgIFtRX0tFWV9DT0RFX0tQXzVdwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgPSBLRVlfS1A1LDxi cj4NCivCoCDCoCBbUV9LRVlfQ09ERV9LUF82XcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgID0gS0VZ X0tQNiw8YnI+DQorwqAgwqAgW1FfS0VZX0NPREVfS1BfN13CoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCA9IEtFWV9LUDcsPGJyPg0KK8KgIMKgIFtRX0tFWV9DT0RFX0tQXzhdwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgPSBLRVlfS1A4LDxicj4NCivCoCDCoCBbUV9LRVlfQ09ERV9LUF85XcKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgID0gS0VZX0tQOSw8YnI+DQorwqAgwqAgW1FfS0VZX0NPREVfS1BfU1VC VFJBQ1RdwqAgwqAgwqAgwqAgwqA9IEtFWV9LUE1JTlVTLDxicj4NCivCoCDCoCBbUV9LRVlfQ09E RV9LUF9BRERdwqAgwqAgwqAgwqAgwqAgwqAgwqAgPSBLRVlfS1BQTFVTLDxicj4NCivCoCDCoCBb UV9LRVlfQ09ERV9LUF9ERUNJTUFMXcKgIMKgIMKgIMKgIMKgID0gS0VZX0tQRE9ULDxicj4NCivC oCDCoCBbUV9LRVlfQ09ERV9LUF9FTlRFUl3CoCDCoCDCoCDCoCDCoCDCoCA9IEtFWV9LUEVOVEVS LDxicj4NCivCoCDCoCBbUV9LRVlfQ09ERV9LUF9ESVZJREVdwqAgwqAgwqAgwqAgwqAgwqA9IEtF WV9LUFNMQVNILDxicj4NCivCoCDCoCBbUV9LRVlfQ09ERV9LUF9NVUxUSVBMWV3CoCDCoCDCoCDC oCDCoD0gS0VZX0tQQVNURVJJU0ssPGJyPg0KKzxicj4NCivCoCDCoCBbUV9LRVlfQ09ERV9GMTFd wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA9IEtFWV9GMTEsPGJyPg0KK8KgIMKgIFtRX0tFWV9D T0RFX0YxMl3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoD0gS0VZX0YxMiw8YnI+DQorPGJyPg0K K8KgIMKgIFtRX0tFWV9DT0RFX0NUUkxfUl3CoCDCoCDCoCDCoCDCoCDCoCDCoCA9IEtFWV9SSUdI VENUUkwsPGJyPg0KK8KgIMKgIFtRX0tFWV9DT0RFX1NZU1JRXcKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgPSBLRVlfU1lTUlEsPGJyPg0KK8KgIMKgIFtRX0tFWV9DT0RFX0FMVF9SXcKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgPSBLRVlfUklHSFRBTFQsPGJyPg0KKzxicj4NCivCoCDCoCBbUV9LRVlfQ09E RV9IT01FXcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgID0gS0VZX0hPTUUsPGJyPg0KK8KgIMKgIFtR X0tFWV9DT0RFX1VQXcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgID0gS0VZX1VQLDxicj4NCivC oCDCoCBbUV9LRVlfQ09ERV9QR1VQXcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgID0gS0VZX1BBR0VV UCw8YnI+DQorwqAgwqAgW1FfS0VZX0NPREVfTEVGVF3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA9 IEtFWV9MRUZULDxicj4NCivCoCDCoCBbUV9LRVlfQ09ERV9SSUdIVF3CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoD0gS0VZX1JJR0hULDxicj4NCivCoCDCoCBbUV9LRVlfQ09ERV9FTkRdwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqA9IEtFWV9FTkQsPGJyPg0KK8KgIMKgIFtRX0tFWV9DT0RFX0RPV05d wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgPSBLRVlfRE9XTiw8YnI+DQorwqAgwqAgW1FfS0VZX0NP REVfUEdETl3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA9IEtFWV9QQUdFRE9XTiw8YnI+DQorwqAg wqAgW1FfS0VZX0NPREVfSU5TRVJUXcKgIMKgIMKgIMKgIMKgIMKgIMKgID0gS0VZX0lOU0VSVCw8 YnI+DQorwqAgwqAgW1FfS0VZX0NPREVfREVMRVRFXcKgIMKgIMKgIMKgIMKgIMKgIMKgID0gS0VZ X0RFTEVURSw8YnI+DQorPGJyPg0KK8KgIMKgIFtRX0tFWV9DT0RFX01FVEFfTF3CoCDCoCDCoCDC oCDCoCDCoCDCoCA9IEtFWV9MRUZUTUVUQSw8YnI+DQorwqAgwqAgW1FfS0VZX0NPREVfTUVUQV9S XcKgIMKgIMKgIMKgIMKgIMKgIMKgID0gS0VZX1JJR0hUTUVUQSw8YnI+DQorwqAgwqAgW1FfS0VZ X0NPREVfTUVOVV3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA9IEtFWV9NRU5VLDxicj4NCit9Ozxi cj4NCis8YnI+DQrCoHN0YXRpYyBjb25zdCBpbnQgcWNvZGVfdG9fbnVtYmVyW10gPSB7PGJyPg0K wqAgwqAgwqBbUV9LRVlfQ09ERV9TSElGVF0gPSAweDJhLDxicj4NCsKgIMKgIMKgW1FfS0VZX0NP REVfU0hJRlRfUl0gPSAweDM2LDxicj4NCkBAIC0xMzYsNiArMjU2LDcgQEAgc3RhdGljIGNvbnN0 IGludCBxY29kZV90b19udW1iZXJbXSA9IHs8YnI+DQrCoH07PGJyPg0KPGJyPg0KwqBzdGF0aWMg aW50IG51bWJlcl90b19xY29kZVsweDEwMF07PGJyPg0KK3N0YXRpYyBpbnQgbGludXhfdG9fcWNv ZGVbS0VZX0NOVF07PGJyPg0KPGJyPg0KwqBpbnQgcWVtdV9pbnB1dF9rZXlfdmFsdWVfdG9fbnVt YmVyKGNvbnN0IEtleVZhbHVlICp2YWx1ZSk8YnI+DQrCoHs8YnI+DQpAQCAtMjAwLDMgKzMyMSwy NyBAQCBpbnQgcWVtdV9pbnB1dF9rZXlfdmFsdWVfdG9fc2NhbmNvZGUoY29uc3QgS2V5VmFsdWUg KnZhbHVlLCBib29sIGRvd24sPGJyPg0KPGJyPg0KwqAgwqAgwqByZXR1cm4gY291bnQ7PGJyPg0K wqB9PGJyPg0KKzxicj4NCitpbnQgcWVtdV9pbnB1dF9xY29kZV90b19saW51eCh1bnNpZ25lZCBp bnQgcWNvZGUpPGJyPg0KK3s8YnI+DQorwqAgwqAgYXNzZXJ0KHFjb2RlICZsdDsgUV9LRVlfQ09E RV9NQVgpOzxicj4NCivCoCDCoCByZXR1cm4gcWNvZGVfdG9fbGludXhbcWNvZGVdOzxicj4NCit9 PGJyPg0KKzxicj4NCitpbnQgcWVtdV9pbnB1dF9saW51eF90b19xY29kZSh1bnNpZ25lZCBpbnQg bG54KTxicj4NCit7PGJyPg0KK8KgIMKgIHN0YXRpYyBpbnQgZmlyc3QgPSB0cnVlOzxicj4NCis8 YnI+DQorwqAgwqAgaWYgKGZpcnN0KSB7PGJyPg0KK8KgIMKgIMKgIMKgIGludCBxY29kZSwgbnVt YmVyOzxicj4NCivCoCDCoCDCoCDCoCBmaXJzdCA9IGZhbHNlOzxicj4NCivCoCDCoCDCoCDCoCBm b3IgKHFjb2RlID0gMDsgcWNvZGUgJmx0OyBRX0tFWV9DT0RFX01BWDsgcWNvZGUrKykgezxicj4N CivCoCDCoCDCoCDCoCDCoCDCoCBudW1iZXIgPSBxY29kZV90b19saW51eFtxY29kZV07PGJyPg0K K8KgIMKgIMKgIMKgIMKgIMKgIGFzc2VydChudW1iZXIgJmx0OyBLRVlfQ05UKTs8YnI+DQorwqAg wqAgwqAgwqAgwqAgwqAgbGludXhfdG9fcWNvZGVbbnVtYmVyXSA9IHFjb2RlOzxicj4NCivCoCDC oCDCoCDCoCB9PGJyPg0KK8KgIMKgIH08YnI+DQorPGJyPg0KK8KgIMKgIGFzc2VydChsbnggJmx0 OyBLRVlfQ05UKTs8YnI+DQorwqAgwqAgcmV0dXJuIGxpbnV4X3RvX3Fjb2RlW2xueF07PGJyPg0K K308YnI+DQo8c3BhbiBjbGFzcz0iSE9FblpiIj48Zm9udCBjb2xvcj0iIzg4ODg4OCI+LS08YnI+ DQoxLjguMy4xPGJyPg0KPGJyPg0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX188YnI+DQp2ZmlvLXVzZXJzIG1haWxpbmcgbGlzdDxicj4NCjxhIGhyZWY9Im1h aWx0bzp2ZmlvLXVzZXJzQHJlZGhhdC5jb20iPnZmaW8tdXNlcnNAcmVkaGF0LmNvbTwvYT48YnI+ DQo8YSBocmVmPSJodHRwczovL3d3dy5yZWRoYXQuY29tL21haWxtYW4vbGlzdGluZm8vdmZpby11 c2VycyIgcmVsPSJub3JlZmVycmVyIiB0YXJnZXQ9Il9ibGFuayI+aHR0cHM6Ly93d3cucmVkaGF0 LmNvbS9tYWlsbWFuL2xpc3RpbmZvL3ZmaW8tdXNlcnM8L2E+PGJyPg0KPC9mb250Pjwvc3Bhbj48 L2Jsb2NrcXVvdGU+PC9kaXY+PGJyPjwvZGl2Pg0K --047d7bacb09466222905287f5315--