def menu(height):
import pygame
import pygame.freetype
# Initialize Pygame
pygame.init()
Chest =0
Left_shoulder=0
Right_shoulder=0
leg=0
Left_weapon=0
Right_weapon=0
# Screen dimensions
width = int((4/3)*height)#800
screen = pygame.display.set_mode((width, height))
font = pygame.freetype.Font("OpenSans-ExtraBold.ttf", 2/60*height)
# Button properties
button_color = (100, 100, 100) # Grey
button_x = int(width/2)-int((5/60)*width)
button_y = int((height/2)-int((1/8)*height))
button_width = int((1/8) * width)
button_height = int((1/6) * height)
Chest_menu = pygame.Rect(0, 0, int(width/3),height)
left_shoulder_menu = pygame.Rect(0, 0, int(width/3),height)
right_shoulder_menu = pygame.Rect(0, 0, int(width/3),height)
left_leg_menu = pygame.Rect(0, 0, int(width/3),height)
right_leg_menu = pygame.Rect(0, 0, int(width/3),height)
left_gun_menu = pygame.Rect(0, 0, int(width/3),height)
right_gun_menu = pygame.Rect(0, 0, int(width/3),height)
battle_menu = pygame.Rect(width-(2*button_width), 0, 2*button_width, button_height)
button_rect = pygame.Rect(button_x, button_y, button_width, button_height)
button_rect1 = pygame.Rect(int(button_x-((7/80)*width)), int(button_y), int(button_width/1.5), int(button_height/1.5))
button_rect2 = pygame.Rect(int(button_x+((105/800)*width)), int(button_y), int(button_width/1.5), int(button_height/1.5))
button_rect3 = pygame.Rect(int(button_x), int(button_y+((105/600)*height)), int(button_width/2.2), int(button_height*1.5))
button_rect4 = pygame.Rect(int(button_x+((55/800)*width)), int(button_y+((105/600)*height)), int(button_width/2.2), int(button_height*1.5))
button_rect5 = pygame.Rect(int(button_x-((122.5/800)*width)), int(button_y), int(button_width/2), int(button_height/2))
button_rect6 = pygame.Rect(int(button_x+((175/800)*width)), int(button_y), int(button_width/2), int(button_height/2))
button1= pygame.Rect(int(35/800*width),int(50/600*height),int(2*button_width),int(button_height/1.5))
button2= pygame.Rect(int(35/800*width),int(150/600*height),int(2*button_width),int(button_height/1.5))
button3= pygame.Rect(int(35/800*width),int(250/600*height),int(2*button_width),int(button_height/1.5))
button4= pygame.Rect(int(35/800*width),int(350/600*height),int(2*button_width),int(button_height/1.5))
button5= pygame.Rect(int(35/800*width),int(450/600*height),int(2*button_width),int(button_height/1.5))
# Font for button text
text_color = (255, 255, 255) # White
clicked=0
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.MOUSEBUTTONDOWN:
#Chest
if Chest==1 and button1.collidepoint(event.pos):
chest_choice = 1
if Chest==1 and button2.collidepoint(event.pos):
chest_choice = 2
if Chest==1 and button3.collidepoint(event.pos):
chest_choice = 3
if Chest==1 and button4.collidepoint(event.pos):
chest_choice = 4
if Chest==1 and button5.collidepoint(event.pos):
chest_choice = 5
#left shoulder
if Left_shoulder==1 and button1.collidepoint(event.pos):
Left_shoulder_choice = 1
if Left_shoulder==1 and button2.collidepoint(event.pos):
Left_shoulder_choice = 2
if Left_shoulder==1 and button3.collidepoint(event.pos):
Left_shoulder_choice = 3
if Left_shoulder==1 and button4.collidepoint(event.pos):
Left_shoulder_choice = 4
if Left_shoulder==1 and button5.collidepoint(event.pos):
Left_shoulder_choice = 5
#right shoulder
if Right_shoulder==1 and button1.collidepoint(event.pos):
Right_shoulder_choice = 1
if Right_shoulder==1 and button2.collidepoint(event.pos):
Right_shoulder_choice = 2
if Right_shoulder==1 and button3.collidepoint(event.pos):
Right_shoulder_choice = 3
if Right_shoulder==1 and button4.collidepoint(event.pos):
Right_shoulder_choice = 4
if Right_shoulder==1 and button5.collidepoint(event.pos):
Right_shoulder_choice = 5
#legs
if leg==1 and button1.collidepoint(event.pos):
leg_choice = 1
if leg==1 and button2.collidepoint(event.pos):
leg_choice = 2
if leg==1 and button3.collidepoint(event.pos):
leg_choice = 3
if leg==1 and button4.collidepoint(event.pos):
leg_choice = 4
if leg==1 and button5.collidepoint(event.pos):
leg_choice = 5
#left weapon
if Left_weapon==1 and button1.collidepoint(event.pos):
Left_weapon_choice = 1
if Left_weapon==1 and button2.collidepoint(event.pos):
Left_weapon_choice = 2
if Left_weapon==1 and button3.collidepoint(event.pos):
Left_weapon_choice = 3
if Left_weapon==1 and button4.collidepoint(event.pos):
Left_weapon_choice = 4
if Left_weapon==1 and button5.collidepoint(event.pos):
Left_weapon_choice = 5
#right weapon
if Right_weapon==1 and button1.collidepoint(event.pos):
Right_weapon_choice = 1
if Right_weapon==1 and button2.collidepoint(event.pos):
Right_weapon_choice = 2
if Right_weapon==1 and button3.collidepoint(event.pos):
Right_weapon_choice = 3
if Right_weapon==1 and button4.collidepoint(event.pos):
Right_weapon_choice = 4
if Right_weapon==1 and button5.collidepoint(event.pos):
Right_weapon_choice = 5
if button_rect.collidepoint(event.pos):
Chest = 1
else:
Chest=0
if button_rect1.collidepoint(event.pos):
Left_shoulder=1
else:
Left_shoulder=0
if button_rect2.collidepoint(event.pos):
Right_shoulder=1
else:
Right_shoulder=0
if button_rect3.collidepoint(event.pos):
leg=1
elif button_rect4.collidepoint(event.pos):
leg=1
else:
leg=0
if button_rect5.collidepoint(event.pos):
Left_weapon=1
else:
Left_weapon=0
if button_rect6.collidepoint(event.pos):
Right_weapon=1
else:
Right_weapon=0
if battle_menu.collidepoint(event.pos):
return ("1",chest_choice,Left_shoulder_choice,Right_shoulder_choice,leg_choice,Left_weapon_choice,Right_weapon_choice)
# Add your button's action here
# Drawing
font.fgcolor = (255, 0, 0)
screen.fill((0, 0, 0)) # Black background\
pygame.draw.rect(screen, button_color, battle_menu)
font = pygame.freetype.Font("OpenSans-ExtraBold.ttf", 40/600*height)
font.fgcolor = (255,255,255)
font.render_to(screen, (int(width-(2*button_width)+10/800*width),button_height/4), "To Battle")
pygame.draw.rect(screen, button_color, button_rect)
font = pygame.freetype.Font("OpenSans-ExtraBold.ttf", 15/60*height)
font.fgcolor = (255,255,255)
font.render_to(screen, (int(button_x+((8/800)*width)),int(button_y+((15/600)*height))), "+")
font = pygame.freetype.Font("OpenSans-ExtraBold.ttf", 10/60*height)
font.fgcolor = (255,255,255)
pygame.draw.rect(screen, button_color, button_rect1)
font.render_to(screen, (int(button_x-((65/800)*width)),int(button_y+((10/600)*height))), "+")
font = pygame.freetype.Font("OpenSans-ExtraBold.ttf", 10/60*height)
font.fgcolor = (255,255,255)
pygame.draw.rect(screen, button_color, button_rect2)
font.render_to(screen, (int(button_x+((110/800)*width)),int(button_y+((10/600)*height))), "+")
font = pygame.freetype.Font("OpenSans-ExtraBold.ttf", 80/600*height)
font.fgcolor = (255,255,255)
pygame.draw.rect(screen, button_color, button_rect3)
font.render_to(screen, (int(button_x),int(button_y+((165/600)*height))), "+")
font = pygame.freetype.Font("OpenSans-ExtraBold.ttf", 80/600*height)
font.fgcolor = (255,255,255)
pygame.draw.rect(screen, button_color, button_rect4)
font.render_to(screen, (int(button_x+((55/800)*width)),int(button_y+((165/600)*height))), "+")
font = pygame.freetype.Font("OpenSans-ExtraBold.ttf", 90/600*height)
font.fgcolor = (255,255,255)
pygame.draw.rect(screen, button_color, button_rect5)
font.render_to(screen, (int(button_x-((122.5/800)*width)),int(button_y+((3/600)*height))), "+")
font = pygame.freetype.Font("OpenSans-ExtraBold.ttf", 90/600*height)
font.fgcolor = (255,255,255)
pygame.draw.rect(screen, button_color, button_rect6)
font.render_to(screen, (int(button_x+((175/800)*width)),int(button_y+((3/600)*height))), "+")
grey=(50,50,50)
if Chest==1:
font = pygame.freetype.Font("OpenSans-ExtraBold.ttf", 20/600*height)
font.fgcolor = (100,0,0)
pygame.draw.rect(screen, grey, Chest_menu)
pygame.draw.rect(screen, button_color,button1)
font.render_to(screen, (6/80*width, 75/600*height), "Garrison Chest")
pygame.draw.rect(screen, button_color,button2)
font.render_to(screen, (7/80*width, 175/600*height), "Turtle Chest")
pygame.draw.rect(screen, button_color,button3)
font.render_to(screen, (7.5/80*width, 275/600*height), "Viper Chest")
pygame.draw.rect(screen, button_color,button4)
font.render_to(screen, (7/80*width, 375/600*height), "Mantis Chest")
pygame.draw.rect(screen, button_color,button5)
font.render_to(screen, (7/80*width, 0), "Chest Menu")
elif Left_shoulder==1:
font = pygame.freetype.Font("OpenSans-ExtraBold.ttf", 20/600*height)
font.fgcolor = (100,0,0)
pygame.draw.rect(screen, grey, left_shoulder_menu)
pygame.draw.rect(screen, button_color,button1)
font.render_to(screen, (4/80*width, 75/600*height), "Garrison Shoulder")
pygame.draw.rect(screen, button_color,button2)
font.render_to(screen, (5/80*width, 175/600*height), "Turtle Shoulder")
pygame.draw.rect(screen, button_color,button3)
font.render_to(screen, (5.5/80*width, 275/600*height), "Viper Shoulder")
pygame.draw.rect(screen, button_color,button4)
font.render_to(screen, (5/80*width, 375/600*height), "Mantis Shoulder")
pygame.draw.rect(screen, button_color,button5)
font.render_to(screen, (3/80*width, 0), "Left Shoulder Menu")
elif Right_shoulder==1:
font = pygame.freetype.Font("OpenSans-ExtraBold.ttf", 20/600*height)
font.fgcolor = (100,0,0)
pygame.draw.rect(screen, grey, right_shoulder_menu)
pygame.draw.rect(screen, button_color,button1)
font.render_to(screen, (4/80*width, 75/600*height), "Garrison Shoulder")
pygame.draw.rect(screen, button_color,button2)
font.render_to(screen, (5/80*width, 175/600*height), "Turtle Shoulder")
pygame.draw.rect(screen, button_color,button3)
font.render_to(screen, (5.5/80*width, 275/600*height), "Viper Shoulder")
pygame.draw.rect(screen, button_color,button4)
font.render_to(screen, (5/80*width, 375/600*height), "Mantis Shoulder")
pygame.draw.rect(screen, button_color,button5)
font.render_to(screen, (25/800*width, 0), "Right Shoulder Menu")
elif leg==1:
font = pygame.freetype.Font("OpenSans-ExtraBold.ttf", 20/600*height)
font.fgcolor = (100,0,0)
pygame.draw.rect(screen, grey, left_leg_menu)
pygame.draw.rect(screen, button_color,button1)
font.render_to(screen, (7/80*width, 75/600*height), "Garrison Legs")
pygame.draw.rect(screen, button_color,button2)
font.render_to(screen, (8/80*width, 175/600*height), "Turtle Legs")
pygame.draw.rect(screen, button_color,button3)
font.render_to(screen, (8.5/80*width, 275/600*height), "Viper Legs")
pygame.draw.rect(screen, button_color,button4)
font.render_to(screen, (8/80*width, 375/600*height), "Mantis Legs")
pygame.draw.rect(screen, button_color,button5)
font.render_to(screen, (8/80*width, 0), "Leg Menu")
elif Left_weapon==1:
font = pygame.freetype.Font("OpenSans-ExtraBold.ttf", 20/600*height)
font.fgcolor = (100,0,0)
pygame.draw.rect(screen, grey, left_gun_menu)
pygame.draw.rect(screen, button_color,button1)
font.render_to(screen, (4.5/80*width, 75/600*height), "Garrison Weapon")
pygame.draw.rect(screen, button_color,button2)
font.render_to(screen, (5.5/80*width, 175/600*height), "Turtle Weapon")
pygame.draw.rect(screen, button_color,button3)
font.render_to(screen, (6/80*width, 275/600*height), "Viper Weapon")
pygame.draw.rect(screen, button_color,button4)
font.render_to(screen, (5.5/80*width, 375/600*height), "Mantis Weapon")
pygame.draw.rect(screen, button_color,button5)
font.render_to(screen, (3.5/80*width, 0), "Left Weapon Menu")
elif Right_weapon==1:
font = pygame.freetype.Font("OpenSans-ExtraBold.ttf", 20/600*height)
font.fgcolor = (100,0,0)
pygame.draw.rect(screen, grey, right_gun_menu)
pygame.draw.rect(screen, button_color,button1)
font.render_to(screen, (4.5/80*width, 75/600*height), "Garrison Weapon")
pygame.draw.rect(screen, button_color,button2)
font.render_to(screen, (5.5/80*width, 175/600*height), "Turtle Weapon")
pygame.draw.rect(screen, button_color,button3)
font.render_to(screen, (6/80*width, 275/600*height), "Viper Weapon")
pygame.draw.rect(screen, button_color,button4)
font.render_to(screen, (5.5/80*width, 375/600*height), "Mantis Weapon")
pygame.draw.rect(screen, button_color,button5)
font.render_to(screen, (3/80*width, 0), "Right Weapon Menu")
pygame.display.flip()
ZGVmIG1lbnUoaGVpZ2h0KToKICAgIAogICAgaW1wb3J0IHB5Z2FtZQogICAgaW1wb3J0IHB5Z2FtZS5mcmVldHlwZQojIEluaXRpYWxpemUgUHlnYW1lCiAgICBweWdhbWUuaW5pdCgpCiAgICBDaGVzdCA9MAogICAgTGVmdF9zaG91bGRlcj0wCiAgICBSaWdodF9zaG91bGRlcj0wCiAgICBsZWc9MAogICAgTGVmdF93ZWFwb249MAogICAgUmlnaHRfd2VhcG9uPTAKIyBTY3JlZW4gZGltZW5zaW9ucwogICAgd2lkdGggPSBpbnQoKDQvMykqaGVpZ2h0KSM4MDAKICAgIHNjcmVlbiA9IHB5Z2FtZS5kaXNwbGF5LnNldF9tb2RlKCh3aWR0aCwgaGVpZ2h0KSkKICAgIGZvbnQgPSBweWdhbWUuZnJlZXR5cGUuRm9udCgiT3BlblNhbnMtRXh0cmFCb2xkLnR0ZiIsIDIvNjAqaGVpZ2h0KQojIEJ1dHRvbiBwcm9wZXJ0aWVzCiAgICBidXR0b25fY29sb3IgPSAoMTAwLCAxMDAsIDEwMCkgICMgR3JleQogICAgYnV0dG9uX3ggPSBpbnQod2lkdGgvMiktaW50KCg1LzYwKSp3aWR0aCkKICAgIGJ1dHRvbl95ID0gaW50KChoZWlnaHQvMiktaW50KCgxLzgpKmhlaWdodCkpCiAgICBidXR0b25fd2lkdGggPSBpbnQoKDEvOCkgKiB3aWR0aCkKICAgIGJ1dHRvbl9oZWlnaHQgPSBpbnQoKDEvNikgKiBoZWlnaHQpCiAgICBDaGVzdF9tZW51ID0gcHlnYW1lLlJlY3QoMCwgMCwgaW50KHdpZHRoLzMpLGhlaWdodCkKICAgIGxlZnRfc2hvdWxkZXJfbWVudSA9IHB5Z2FtZS5SZWN0KDAsIDAsIGludCh3aWR0aC8zKSxoZWlnaHQpCiAgICByaWdodF9zaG91bGRlcl9tZW51ID0gcHlnYW1lLlJlY3QoMCwgMCwgaW50KHdpZHRoLzMpLGhlaWdodCkKICAgIGxlZnRfbGVnX21lbnUgPSBweWdhbWUuUmVjdCgwLCAwLCBpbnQod2lkdGgvMyksaGVpZ2h0KQogICAgcmlnaHRfbGVnX21lbnUgPSBweWdhbWUuUmVjdCgwLCAwLCBpbnQod2lkdGgvMyksaGVpZ2h0KQogICAgbGVmdF9ndW5fbWVudSA9IHB5Z2FtZS5SZWN0KDAsIDAsIGludCh3aWR0aC8zKSxoZWlnaHQpCiAgICByaWdodF9ndW5fbWVudSA9IHB5Z2FtZS5SZWN0KDAsIDAsIGludCh3aWR0aC8zKSxoZWlnaHQpCgogICAgYmF0dGxlX21lbnUgPSBweWdhbWUuUmVjdCh3aWR0aC0oMipidXR0b25fd2lkdGgpLCAwLCAyKmJ1dHRvbl93aWR0aCwgYnV0dG9uX2hlaWdodCkKICAgIGJ1dHRvbl9yZWN0ID0gcHlnYW1lLlJlY3QoYnV0dG9uX3gsIGJ1dHRvbl95LCBidXR0b25fd2lkdGgsIGJ1dHRvbl9oZWlnaHQpCiAgICBidXR0b25fcmVjdDEgPSBweWdhbWUuUmVjdChpbnQoYnV0dG9uX3gtKCg3LzgwKSp3aWR0aCkpLCBpbnQoYnV0dG9uX3kpLCBpbnQoYnV0dG9uX3dpZHRoLzEuNSksIGludChidXR0b25faGVpZ2h0LzEuNSkpCiAgICBidXR0b25fcmVjdDIgPSBweWdhbWUuUmVjdChpbnQoYnV0dG9uX3grKCgxMDUvODAwKSp3aWR0aCkpLCBpbnQoYnV0dG9uX3kpLCBpbnQoYnV0dG9uX3dpZHRoLzEuNSksIGludChidXR0b25faGVpZ2h0LzEuNSkpCiAgICBidXR0b25fcmVjdDMgPSBweWdhbWUuUmVjdChpbnQoYnV0dG9uX3gpLCBpbnQoYnV0dG9uX3krKCgxMDUvNjAwKSpoZWlnaHQpKSwgaW50KGJ1dHRvbl93aWR0aC8yLjIpLCBpbnQoYnV0dG9uX2hlaWdodCoxLjUpKQogICAgYnV0dG9uX3JlY3Q0ID0gcHlnYW1lLlJlY3QoaW50KGJ1dHRvbl94KygoNTUvODAwKSp3aWR0aCkpLCBpbnQoYnV0dG9uX3krKCgxMDUvNjAwKSpoZWlnaHQpKSwgaW50KGJ1dHRvbl93aWR0aC8yLjIpLCBpbnQoYnV0dG9uX2hlaWdodCoxLjUpKQogICAgYnV0dG9uX3JlY3Q1ID0gcHlnYW1lLlJlY3QoaW50KGJ1dHRvbl94LSgoMTIyLjUvODAwKSp3aWR0aCkpLCBpbnQoYnV0dG9uX3kpLCBpbnQoYnV0dG9uX3dpZHRoLzIpLCBpbnQoYnV0dG9uX2hlaWdodC8yKSkKICAgIGJ1dHRvbl9yZWN0NiA9IHB5Z2FtZS5SZWN0KGludChidXR0b25feCsoKDE3NS84MDApKndpZHRoKSksIGludChidXR0b25feSksIGludChidXR0b25fd2lkdGgvMiksIGludChidXR0b25faGVpZ2h0LzIpKQogICAgYnV0dG9uMT0gcHlnYW1lLlJlY3QoaW50KDM1LzgwMCp3aWR0aCksaW50KDUwLzYwMCpoZWlnaHQpLGludCgyKmJ1dHRvbl93aWR0aCksaW50KGJ1dHRvbl9oZWlnaHQvMS41KSkKICAgIGJ1dHRvbjI9IHB5Z2FtZS5SZWN0KGludCgzNS84MDAqd2lkdGgpLGludCgxNTAvNjAwKmhlaWdodCksaW50KDIqYnV0dG9uX3dpZHRoKSxpbnQoYnV0dG9uX2hlaWdodC8xLjUpKQogICAgYnV0dG9uMz0gcHlnYW1lLlJlY3QoaW50KDM1LzgwMCp3aWR0aCksaW50KDI1MC82MDAqaGVpZ2h0KSxpbnQoMipidXR0b25fd2lkdGgpLGludChidXR0b25faGVpZ2h0LzEuNSkpCiAgICBidXR0b240PSBweWdhbWUuUmVjdChpbnQoMzUvODAwKndpZHRoKSxpbnQoMzUwLzYwMCpoZWlnaHQpLGludCgyKmJ1dHRvbl93aWR0aCksaW50KGJ1dHRvbl9oZWlnaHQvMS41KSkKICAgIGJ1dHRvbjU9IHB5Z2FtZS5SZWN0KGludCgzNS84MDAqd2lkdGgpLGludCg0NTAvNjAwKmhlaWdodCksaW50KDIqYnV0dG9uX3dpZHRoKSxpbnQoYnV0dG9uX2hlaWdodC8xLjUpKQoKIyBGb250IGZvciBidXR0b24gdGV4dAogICAgdGV4dF9jb2xvciA9ICgyNTUsIDI1NSwgMjU1KSAgIyBXaGl0ZQogICAgY2xpY2tlZD0wCiAgICBydW5uaW5nID0gVHJ1ZQogICAgd2hpbGUgcnVubmluZzoKICAgICAgICBmb3IgZXZlbnQgaW4gcHlnYW1lLmV2ZW50LmdldCgpOgogICAgICAgICAgICBpZiBldmVudC50eXBlID09IHB5Z2FtZS5RVUlUOgogICAgICAgICAgICAgICAgcnVubmluZyA9IEZhbHNlCiAgICAgICAgICAgIGlmIGV2ZW50LnR5cGUgPT0gcHlnYW1lLk1PVVNFQlVUVE9ORE9XTjoKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgI0NoZXN0CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmIENoZXN0PT0xIGFuZCBidXR0b24xLmNvbGxpZGVwb2ludChldmVudC5wb3MpOgogICAgICAgICAgICAgICAgICAgIGNoZXN0X2Nob2ljZSA9IDEKICAgICAgICAgICAgICAgIGlmIENoZXN0PT0xIGFuZCBidXR0b24yLmNvbGxpZGVwb2ludChldmVudC5wb3MpOgogICAgICAgICAgICAgICAgICAgIGNoZXN0X2Nob2ljZSA9IDIKICAgICAgICAgICAgICAgIGlmIENoZXN0PT0xIGFuZCBidXR0b24zLmNvbGxpZGVwb2ludChldmVudC5wb3MpOgogICAgICAgICAgICAgICAgICAgIGNoZXN0X2Nob2ljZSA9IDMKICAgICAgICAgICAgICAgIGlmIENoZXN0PT0xIGFuZCBidXR0b240LmNvbGxpZGVwb2ludChldmVudC5wb3MpOgogICAgICAgICAgICAgICAgICAgIGNoZXN0X2Nob2ljZSA9IDQKICAgICAgICAgICAgICAgIGlmIENoZXN0PT0xIGFuZCBidXR0b241LmNvbGxpZGVwb2ludChldmVudC5wb3MpOgogICAgICAgICAgICAgICAgICAgIGNoZXN0X2Nob2ljZSA9IDUKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgI2xlZnQgc2hvdWxkZXIKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgTGVmdF9zaG91bGRlcj09MSBhbmQgYnV0dG9uMS5jb2xsaWRlcG9pbnQoZXZlbnQucG9zKToKICAgICAgICAgICAgICAgICAgICBMZWZ0X3Nob3VsZGVyX2Nob2ljZSA9IDEKICAgICAgICAgICAgICAgIGlmIExlZnRfc2hvdWxkZXI9PTEgYW5kIGJ1dHRvbjIuY29sbGlkZXBvaW50KGV2ZW50LnBvcyk6CiAgICAgICAgICAgICAgICAgICAgTGVmdF9zaG91bGRlcl9jaG9pY2UgPSAyCiAgICAgICAgICAgICAgICBpZiBMZWZ0X3Nob3VsZGVyPT0xIGFuZCBidXR0b24zLmNvbGxpZGVwb2ludChldmVudC5wb3MpOgogICAgICAgICAgICAgICAgICAgIExlZnRfc2hvdWxkZXJfY2hvaWNlID0gMwogICAgICAgICAgICAgICAgaWYgTGVmdF9zaG91bGRlcj09MSBhbmQgYnV0dG9uNC5jb2xsaWRlcG9pbnQoZXZlbnQucG9zKToKICAgICAgICAgICAgICAgICAgICBMZWZ0X3Nob3VsZGVyX2Nob2ljZSA9IDQKICAgICAgICAgICAgICAgIGlmIExlZnRfc2hvdWxkZXI9PTEgYW5kIGJ1dHRvbjUuY29sbGlkZXBvaW50KGV2ZW50LnBvcyk6CiAgICAgICAgICAgICAgICAgICAgTGVmdF9zaG91bGRlcl9jaG9pY2UgPSA1CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICNyaWdodCBzaG91bGRlcgogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiBSaWdodF9zaG91bGRlcj09MSBhbmQgYnV0dG9uMS5jb2xsaWRlcG9pbnQoZXZlbnQucG9zKToKICAgICAgICAgICAgICAgICAgICBSaWdodF9zaG91bGRlcl9jaG9pY2UgPSAxCiAgICAgICAgICAgICAgICBpZiBSaWdodF9zaG91bGRlcj09MSBhbmQgYnV0dG9uMi5jb2xsaWRlcG9pbnQoZXZlbnQucG9zKToKICAgICAgICAgICAgICAgICAgICBSaWdodF9zaG91bGRlcl9jaG9pY2UgPSAyCiAgICAgICAgICAgICAgICBpZiBSaWdodF9zaG91bGRlcj09MSBhbmQgYnV0dG9uMy5jb2xsaWRlcG9pbnQoZXZlbnQucG9zKToKICAgICAgICAgICAgICAgICAgICBSaWdodF9zaG91bGRlcl9jaG9pY2UgPSAzCiAgICAgICAgICAgICAgICBpZiBSaWdodF9zaG91bGRlcj09MSBhbmQgYnV0dG9uNC5jb2xsaWRlcG9pbnQoZXZlbnQucG9zKToKICAgICAgICAgICAgICAgICAgICBSaWdodF9zaG91bGRlcl9jaG9pY2UgPSA0CiAgICAgICAgICAgICAgICBpZiBSaWdodF9zaG91bGRlcj09MSBhbmQgYnV0dG9uNS5jb2xsaWRlcG9pbnQoZXZlbnQucG9zKToKICAgICAgICAgICAgICAgICAgICBSaWdodF9zaG91bGRlcl9jaG9pY2UgPSA1CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICNsZWdzCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmIGxlZz09MSBhbmQgYnV0dG9uMS5jb2xsaWRlcG9pbnQoZXZlbnQucG9zKToKICAgICAgICAgICAgICAgICAgICBsZWdfY2hvaWNlID0gMQogICAgICAgICAgICAgICAgaWYgbGVnPT0xIGFuZCBidXR0b24yLmNvbGxpZGVwb2ludChldmVudC5wb3MpOgogICAgICAgICAgICAgICAgICAgIGxlZ19jaG9pY2UgPSAyCiAgICAgICAgICAgICAgICBpZiBsZWc9PTEgYW5kIGJ1dHRvbjMuY29sbGlkZXBvaW50KGV2ZW50LnBvcyk6CiAgICAgICAgICAgICAgICAgICAgbGVnX2Nob2ljZSA9IDMKICAgICAgICAgICAgICAgIGlmIGxlZz09MSBhbmQgYnV0dG9uNC5jb2xsaWRlcG9pbnQoZXZlbnQucG9zKToKICAgICAgICAgICAgICAgICAgICBsZWdfY2hvaWNlID0gNAogICAgICAgICAgICAgICAgaWYgbGVnPT0xIGFuZCBidXR0b241LmNvbGxpZGVwb2ludChldmVudC5wb3MpOgogICAgICAgICAgICAgICAgICAgIGxlZ19jaG9pY2UgPSA1CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICNsZWZ0IHdlYXBvbgogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiBMZWZ0X3dlYXBvbj09MSBhbmQgYnV0dG9uMS5jb2xsaWRlcG9pbnQoZXZlbnQucG9zKToKICAgICAgICAgICAgICAgICAgICBMZWZ0X3dlYXBvbl9jaG9pY2UgPSAxCiAgICAgICAgICAgICAgICBpZiBMZWZ0X3dlYXBvbj09MSBhbmQgYnV0dG9uMi5jb2xsaWRlcG9pbnQoZXZlbnQucG9zKToKICAgICAgICAgICAgICAgICAgICBMZWZ0X3dlYXBvbl9jaG9pY2UgPSAyCiAgICAgICAgICAgICAgICBpZiBMZWZ0X3dlYXBvbj09MSBhbmQgYnV0dG9uMy5jb2xsaWRlcG9pbnQoZXZlbnQucG9zKToKICAgICAgICAgICAgICAgICAgICBMZWZ0X3dlYXBvbl9jaG9pY2UgPSAzCiAgICAgICAgICAgICAgICBpZiBMZWZ0X3dlYXBvbj09MSBhbmQgYnV0dG9uNC5jb2xsaWRlcG9pbnQoZXZlbnQucG9zKToKICAgICAgICAgICAgICAgICAgICBMZWZ0X3dlYXBvbl9jaG9pY2UgPSA0CiAgICAgICAgICAgICAgICBpZiBMZWZ0X3dlYXBvbj09MSBhbmQgYnV0dG9uNS5jb2xsaWRlcG9pbnQoZXZlbnQucG9zKToKICAgICAgICAgICAgICAgICAgICBMZWZ0X3dlYXBvbl9jaG9pY2UgPSA1CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICNyaWdodCB3ZWFwb24KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgUmlnaHRfd2VhcG9uPT0xIGFuZCBidXR0b24xLmNvbGxpZGVwb2ludChldmVudC5wb3MpOgogICAgICAgICAgICAgICAgICAgIFJpZ2h0X3dlYXBvbl9jaG9pY2UgPSAxCiAgICAgICAgICAgICAgICBpZiBSaWdodF93ZWFwb249PTEgYW5kIGJ1dHRvbjIuY29sbGlkZXBvaW50KGV2ZW50LnBvcyk6CiAgICAgICAgICAgICAgICAgICAgUmlnaHRfd2VhcG9uX2Nob2ljZSA9IDIKICAgICAgICAgICAgICAgIGlmIFJpZ2h0X3dlYXBvbj09MSBhbmQgYnV0dG9uMy5jb2xsaWRlcG9pbnQoZXZlbnQucG9zKToKICAgICAgICAgICAgICAgICAgICBSaWdodF93ZWFwb25fY2hvaWNlID0gMwogICAgICAgICAgICAgICAgaWYgUmlnaHRfd2VhcG9uPT0xIGFuZCBidXR0b240LmNvbGxpZGVwb2ludChldmVudC5wb3MpOgogICAgICAgICAgICAgICAgICAgIFJpZ2h0X3dlYXBvbl9jaG9pY2UgPSA0CiAgICAgICAgICAgICAgICBpZiBSaWdodF93ZWFwb249PTEgYW5kIGJ1dHRvbjUuY29sbGlkZXBvaW50KGV2ZW50LnBvcyk6CiAgICAgICAgICAgICAgICAgICAgUmlnaHRfd2VhcG9uX2Nob2ljZSA9IDUKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgYnV0dG9uX3JlY3QuY29sbGlkZXBvaW50KGV2ZW50LnBvcyk6CiAgICAgICAgICAgICAgICAgICAgQ2hlc3QgPSAxCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIENoZXN0PTAKICAgICAgICAgICAgICAgIGlmIGJ1dHRvbl9yZWN0MS5jb2xsaWRlcG9pbnQoZXZlbnQucG9zKToKICAgICAgICAgICAgICAgICAgICBMZWZ0X3Nob3VsZGVyPTEKICAgICAgICAgICAgICAgIGVsc2U6ICAKICAgICAgICAgICAgICAgICAgICBMZWZ0X3Nob3VsZGVyPTAKICAgICAgICAgICAgICAgIGlmIGJ1dHRvbl9yZWN0Mi5jb2xsaWRlcG9pbnQoZXZlbnQucG9zKToKICAgICAgICAgICAgICAgICAgICBSaWdodF9zaG91bGRlcj0xCiAgICAgICAgICAgICAgICBlbHNlOiAgCiAgICAgICAgICAgICAgICAgICAgUmlnaHRfc2hvdWxkZXI9MAogICAgICAgICAgICAgICAgaWYgYnV0dG9uX3JlY3QzLmNvbGxpZGVwb2ludChldmVudC5wb3MpOgogICAgICAgICAgICAgICAgICAgIGxlZz0xCiAgICAgICAgICAgICAgICBlbGlmIGJ1dHRvbl9yZWN0NC5jb2xsaWRlcG9pbnQoZXZlbnQucG9zKToKICAgICAgICAgICAgICAgICAgICBsZWc9MQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBsZWc9MAogICAgICAgICAgICAgICAgaWYgYnV0dG9uX3JlY3Q1LmNvbGxpZGVwb2ludChldmVudC5wb3MpOgogICAgICAgICAgICAgICAgICAgIExlZnRfd2VhcG9uPTEKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgTGVmdF93ZWFwb249MAogICAgICAgICAgICAgICAgaWYgYnV0dG9uX3JlY3Q2LmNvbGxpZGVwb2ludChldmVudC5wb3MpOgogICAgICAgICAgICAgICAgICAgIFJpZ2h0X3dlYXBvbj0xCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIFJpZ2h0X3dlYXBvbj0wCiAgICAgICAgICAgICAgICBpZiBiYXR0bGVfbWVudS5jb2xsaWRlcG9pbnQoZXZlbnQucG9zKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCIxIixjaGVzdF9jaG9pY2UsTGVmdF9zaG91bGRlcl9jaG9pY2UsUmlnaHRfc2hvdWxkZXJfY2hvaWNlLGxlZ19jaG9pY2UsTGVmdF93ZWFwb25fY2hvaWNlLFJpZ2h0X3dlYXBvbl9jaG9pY2UpCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICMgQWRkIHlvdXIgYnV0dG9uJ3MgYWN0aW9uIGhlcmUKCiAgICAjIERyYXdpbmcKICAKICAgICAgICBmb250LmZnY29sb3IgPSAoMjU1LCAwLCAwKQogICAgCiAgICAgICAgc2NyZWVuLmZpbGwoKDAsIDAsIDApKSAgIyBCbGFjayBiYWNrZ3JvdW5kXAogICAgCiAgICAgICAgcHlnYW1lLmRyYXcucmVjdChzY3JlZW4sIGJ1dHRvbl9jb2xvciwgYmF0dGxlX21lbnUpICAgICAgICAKICAgICAgICBmb250ID0gcHlnYW1lLmZyZWV0eXBlLkZvbnQoIk9wZW5TYW5zLUV4dHJhQm9sZC50dGYiLCA0MC82MDAqaGVpZ2h0KQogICAgICAgIGZvbnQuZmdjb2xvciA9ICgyNTUsMjU1LDI1NSkKICAgICAgICBmb250LnJlbmRlcl90byhzY3JlZW4sIChpbnQod2lkdGgtKDIqYnV0dG9uX3dpZHRoKSsxMC84MDAqd2lkdGgpLGJ1dHRvbl9oZWlnaHQvNCksICJUbyBCYXR0bGUiKQogICAgCiAgICAgICAgcHlnYW1lLmRyYXcucmVjdChzY3JlZW4sIGJ1dHRvbl9jb2xvciwgYnV0dG9uX3JlY3QpICAgICAgICAKICAgICAgICBmb250ID0gcHlnYW1lLmZyZWV0eXBlLkZvbnQoIk9wZW5TYW5zLUV4dHJhQm9sZC50dGYiLCAxNS82MCpoZWlnaHQpCiAgICAgICAgZm9udC5mZ2NvbG9yID0gKDI1NSwyNTUsMjU1KQogICAgICAgIGZvbnQucmVuZGVyX3RvKHNjcmVlbiwgKGludChidXR0b25feCsoKDgvODAwKSp3aWR0aCkpLGludChidXR0b25feSsoKDE1LzYwMCkqaGVpZ2h0KSkpLCAiKyIpCiAgICAKICAgICAgICAgICAgICAgICAgIAogICAgICAgIGZvbnQgPSBweWdhbWUuZnJlZXR5cGUuRm9udCgiT3BlblNhbnMtRXh0cmFCb2xkLnR0ZiIsIDEwLzYwKmhlaWdodCkKICAgICAgICBmb250LmZnY29sb3IgPSAoMjU1LDI1NSwyNTUpCiAgICAgICAgcHlnYW1lLmRyYXcucmVjdChzY3JlZW4sIGJ1dHRvbl9jb2xvciwgYnV0dG9uX3JlY3QxKQogICAgICAgIGZvbnQucmVuZGVyX3RvKHNjcmVlbiwgKGludChidXR0b25feC0oKDY1LzgwMCkqd2lkdGgpKSxpbnQoYnV0dG9uX3krKCgxMC82MDApKmhlaWdodCkpKSwgIisiKQoKICAgIAogICAgICAgIGZvbnQgPSBweWdhbWUuZnJlZXR5cGUuRm9udCgiT3BlblNhbnMtRXh0cmFCb2xkLnR0ZiIsIDEwLzYwKmhlaWdodCkKICAgICAgICBmb250LmZnY29sb3IgPSAoMjU1LDI1NSwyNTUpCiAgICAgICAgcHlnYW1lLmRyYXcucmVjdChzY3JlZW4sIGJ1dHRvbl9jb2xvciwgYnV0dG9uX3JlY3QyKQogICAgICAgIGZvbnQucmVuZGVyX3RvKHNjcmVlbiwgKGludChidXR0b25feCsoKDExMC84MDApKndpZHRoKSksaW50KGJ1dHRvbl95KygoMTAvNjAwKSpoZWlnaHQpKSksICIrIikKICAgIAogICAgCiAgICAgICAgZm9udCA9IHB5Z2FtZS5mcmVldHlwZS5Gb250KCJPcGVuU2Fucy1FeHRyYUJvbGQudHRmIiwgODAvNjAwKmhlaWdodCkKICAgICAgICBmb250LmZnY29sb3IgPSAoMjU1LDI1NSwyNTUpCiAgICAgICAgcHlnYW1lLmRyYXcucmVjdChzY3JlZW4sIGJ1dHRvbl9jb2xvciwgYnV0dG9uX3JlY3QzKQogICAgICAgIGZvbnQucmVuZGVyX3RvKHNjcmVlbiwgKGludChidXR0b25feCksaW50KGJ1dHRvbl95KygoMTY1LzYwMCkqaGVpZ2h0KSkpLCAiKyIpCgoKICAgICAgICBmb250ID0gcHlnYW1lLmZyZWV0eXBlLkZvbnQoIk9wZW5TYW5zLUV4dHJhQm9sZC50dGYiLCA4MC82MDAqaGVpZ2h0KQogICAgICAgIGZvbnQuZmdjb2xvciA9ICgyNTUsMjU1LDI1NSkKICAgICAgICBweWdhbWUuZHJhdy5yZWN0KHNjcmVlbiwgYnV0dG9uX2NvbG9yLCBidXR0b25fcmVjdDQpCiAgICAgICAgZm9udC5yZW5kZXJfdG8oc2NyZWVuLCAoaW50KGJ1dHRvbl94KygoNTUvODAwKSp3aWR0aCkpLGludChidXR0b25feSsoKDE2NS82MDApKmhlaWdodCkpKSwgIisiKQogICAgCiAgICAgICAgZm9udCA9IHB5Z2FtZS5mcmVldHlwZS5Gb250KCJPcGVuU2Fucy1FeHRyYUJvbGQudHRmIiwgOTAvNjAwKmhlaWdodCkKICAgICAgICBmb250LmZnY29sb3IgPSAoMjU1LDI1NSwyNTUpCiAgICAgICAgcHlnYW1lLmRyYXcucmVjdChzY3JlZW4sIGJ1dHRvbl9jb2xvciwgYnV0dG9uX3JlY3Q1KQogICAgICAgIGZvbnQucmVuZGVyX3RvKHNjcmVlbiwgKGludChidXR0b25feC0oKDEyMi41LzgwMCkqd2lkdGgpKSxpbnQoYnV0dG9uX3krKCgzLzYwMCkqaGVpZ2h0KSkpLCAiKyIpCiAgICAKICAgICAgICBmb250ID0gcHlnYW1lLmZyZWV0eXBlLkZvbnQoIk9wZW5TYW5zLUV4dHJhQm9sZC50dGYiLCA5MC82MDAqaGVpZ2h0KQogICAgICAgIGZvbnQuZmdjb2xvciA9ICgyNTUsMjU1LDI1NSkKICAgICAgICBweWdhbWUuZHJhdy5yZWN0KHNjcmVlbiwgYnV0dG9uX2NvbG9yLCBidXR0b25fcmVjdDYpCiAgICAgICAgZm9udC5yZW5kZXJfdG8oc2NyZWVuLCAoaW50KGJ1dHRvbl94KygoMTc1LzgwMCkqd2lkdGgpKSxpbnQoYnV0dG9uX3krKCgzLzYwMCkqaGVpZ2h0KSkpLCAiKyIpCiAgICAgICAgZ3JleT0oNTAsNTAsNTApCgogICAgICAgIGlmIENoZXN0PT0xOgogICAgICAgICAgICBmb250ID0gcHlnYW1lLmZyZWV0eXBlLkZvbnQoIk9wZW5TYW5zLUV4dHJhQm9sZC50dGYiLCAyMC82MDAqaGVpZ2h0KQogICAgICAgICAgICBmb250LmZnY29sb3IgPSAoMTAwLDAsMCkKICAgICAgICAgICAgcHlnYW1lLmRyYXcucmVjdChzY3JlZW4sIGdyZXksIENoZXN0X21lbnUpCiAgICAgICAgICAgIHB5Z2FtZS5kcmF3LnJlY3Qoc2NyZWVuLCBidXR0b25fY29sb3IsYnV0dG9uMSkKICAgICAgICAgICAgZm9udC5yZW5kZXJfdG8oc2NyZWVuLCAoNi84MCp3aWR0aCwgNzUvNjAwKmhlaWdodCksICJHYXJyaXNvbiBDaGVzdCIpCiAgICAgICAgICAgIHB5Z2FtZS5kcmF3LnJlY3Qoc2NyZWVuLCBidXR0b25fY29sb3IsYnV0dG9uMikKICAgICAgICAgICAgZm9udC5yZW5kZXJfdG8oc2NyZWVuLCAoNy84MCp3aWR0aCwgMTc1LzYwMCpoZWlnaHQpLCAiVHVydGxlIENoZXN0IikKICAgICAgICAgICAgcHlnYW1lLmRyYXcucmVjdChzY3JlZW4sIGJ1dHRvbl9jb2xvcixidXR0b24zKQogICAgICAgICAgICBmb250LnJlbmRlcl90byhzY3JlZW4sICg3LjUvODAqd2lkdGgsIDI3NS82MDAqaGVpZ2h0KSwgIlZpcGVyIENoZXN0IikKICAgICAgICAgICAgcHlnYW1lLmRyYXcucmVjdChzY3JlZW4sIGJ1dHRvbl9jb2xvcixidXR0b240KQogICAgICAgICAgICBmb250LnJlbmRlcl90byhzY3JlZW4sICg3LzgwKndpZHRoLCAzNzUvNjAwKmhlaWdodCksICJNYW50aXMgQ2hlc3QiKQogICAgICAgICAgICBweWdhbWUuZHJhdy5yZWN0KHNjcmVlbiwgYnV0dG9uX2NvbG9yLGJ1dHRvbjUpCiAgICAgICAgICAgIGZvbnQucmVuZGVyX3RvKHNjcmVlbiwgKDcvODAqd2lkdGgsIDApLCAiQ2hlc3QgTWVudSIpCiAgICAgICAgZWxpZiBMZWZ0X3Nob3VsZGVyPT0xOgogICAgICAgICAgICBmb250ID0gcHlnYW1lLmZyZWV0eXBlLkZvbnQoIk9wZW5TYW5zLUV4dHJhQm9sZC50dGYiLCAyMC82MDAqaGVpZ2h0KQogICAgICAgICAgICBmb250LmZnY29sb3IgPSAoMTAwLDAsMCkKICAgICAgICAgICAgcHlnYW1lLmRyYXcucmVjdChzY3JlZW4sIGdyZXksIGxlZnRfc2hvdWxkZXJfbWVudSkKICAgICAgICAgICAgcHlnYW1lLmRyYXcucmVjdChzY3JlZW4sIGJ1dHRvbl9jb2xvcixidXR0b24xKQogICAgICAgICAgICBmb250LnJlbmRlcl90byhzY3JlZW4sICg0LzgwKndpZHRoLCA3NS82MDAqaGVpZ2h0KSwgIkdhcnJpc29uIFNob3VsZGVyIikKICAgICAgICAgICAgcHlnYW1lLmRyYXcucmVjdChzY3JlZW4sIGJ1dHRvbl9jb2xvcixidXR0b24yKQogICAgICAgICAgICBmb250LnJlbmRlcl90byhzY3JlZW4sICg1LzgwKndpZHRoLCAxNzUvNjAwKmhlaWdodCksICJUdXJ0bGUgU2hvdWxkZXIiKQogICAgICAgICAgICBweWdhbWUuZHJhdy5yZWN0KHNjcmVlbiwgYnV0dG9uX2NvbG9yLGJ1dHRvbjMpCiAgICAgICAgICAgIGZvbnQucmVuZGVyX3RvKHNjcmVlbiwgKDUuNS84MCp3aWR0aCwgMjc1LzYwMCpoZWlnaHQpLCAiVmlwZXIgU2hvdWxkZXIiKQogICAgICAgICAgICBweWdhbWUuZHJhdy5yZWN0KHNjcmVlbiwgYnV0dG9uX2NvbG9yLGJ1dHRvbjQpCiAgICAgICAgICAgIGZvbnQucmVuZGVyX3RvKHNjcmVlbiwgKDUvODAqd2lkdGgsIDM3NS82MDAqaGVpZ2h0KSwgIk1hbnRpcyBTaG91bGRlciIpCiAgICAgICAgICAgIHB5Z2FtZS5kcmF3LnJlY3Qoc2NyZWVuLCBidXR0b25fY29sb3IsYnV0dG9uNSkKICAgICAgICAgICAgZm9udC5yZW5kZXJfdG8oc2NyZWVuLCAoMy84MCp3aWR0aCwgMCksICJMZWZ0IFNob3VsZGVyIE1lbnUiKQogICAgICAgIGVsaWYgUmlnaHRfc2hvdWxkZXI9PTE6CiAgICAgICAgICAgIGZvbnQgPSBweWdhbWUuZnJlZXR5cGUuRm9udCgiT3BlblNhbnMtRXh0cmFCb2xkLnR0ZiIsIDIwLzYwMCpoZWlnaHQpCiAgICAgICAgICAgIGZvbnQuZmdjb2xvciA9ICgxMDAsMCwwKQogICAgICAgICAgICBweWdhbWUuZHJhdy5yZWN0KHNjcmVlbiwgZ3JleSwgcmlnaHRfc2hvdWxkZXJfbWVudSkKICAgICAgICAgICAgcHlnYW1lLmRyYXcucmVjdChzY3JlZW4sIGJ1dHRvbl9jb2xvcixidXR0b24xKQogICAgICAgICAgICBmb250LnJlbmRlcl90byhzY3JlZW4sICg0LzgwKndpZHRoLCA3NS82MDAqaGVpZ2h0KSwgIkdhcnJpc29uIFNob3VsZGVyIikKICAgICAgICAgICAgcHlnYW1lLmRyYXcucmVjdChzY3JlZW4sIGJ1dHRvbl9jb2xvcixidXR0b24yKQogICAgICAgICAgICBmb250LnJlbmRlcl90byhzY3JlZW4sICg1LzgwKndpZHRoLCAxNzUvNjAwKmhlaWdodCksICJUdXJ0bGUgU2hvdWxkZXIiKQogICAgICAgICAgICBweWdhbWUuZHJhdy5yZWN0KHNjcmVlbiwgYnV0dG9uX2NvbG9yLGJ1dHRvbjMpCiAgICAgICAgICAgIGZvbnQucmVuZGVyX3RvKHNjcmVlbiwgKDUuNS84MCp3aWR0aCwgMjc1LzYwMCpoZWlnaHQpLCAiVmlwZXIgU2hvdWxkZXIiKQogICAgICAgICAgICBweWdhbWUuZHJhdy5yZWN0KHNjcmVlbiwgYnV0dG9uX2NvbG9yLGJ1dHRvbjQpCiAgICAgICAgICAgIGZvbnQucmVuZGVyX3RvKHNjcmVlbiwgKDUvODAqd2lkdGgsIDM3NS82MDAqaGVpZ2h0KSwgIk1hbnRpcyBTaG91bGRlciIpCiAgICAgICAgICAgIHB5Z2FtZS5kcmF3LnJlY3Qoc2NyZWVuLCBidXR0b25fY29sb3IsYnV0dG9uNSkKICAgICAgICAgICAgZm9udC5yZW5kZXJfdG8oc2NyZWVuLCAoMjUvODAwKndpZHRoLCAwKSwgIlJpZ2h0IFNob3VsZGVyIE1lbnUiKQogICAgICAgIGVsaWYgbGVnPT0xOgogICAgICAgICAgICBmb250ID0gcHlnYW1lLmZyZWV0eXBlLkZvbnQoIk9wZW5TYW5zLUV4dHJhQm9sZC50dGYiLCAyMC82MDAqaGVpZ2h0KQogICAgICAgICAgICBmb250LmZnY29sb3IgPSAoMTAwLDAsMCkKICAgICAgICAgICAgcHlnYW1lLmRyYXcucmVjdChzY3JlZW4sIGdyZXksIGxlZnRfbGVnX21lbnUpCiAgICAgICAgICAgIHB5Z2FtZS5kcmF3LnJlY3Qoc2NyZWVuLCBidXR0b25fY29sb3IsYnV0dG9uMSkKICAgICAgICAgICAgZm9udC5yZW5kZXJfdG8oc2NyZWVuLCAoNy84MCp3aWR0aCwgNzUvNjAwKmhlaWdodCksICJHYXJyaXNvbiBMZWdzIikKICAgICAgICAgICAgcHlnYW1lLmRyYXcucmVjdChzY3JlZW4sIGJ1dHRvbl9jb2xvcixidXR0b24yKQogICAgICAgICAgICBmb250LnJlbmRlcl90byhzY3JlZW4sICg4LzgwKndpZHRoLCAxNzUvNjAwKmhlaWdodCksICJUdXJ0bGUgTGVncyIpCiAgICAgICAgICAgIHB5Z2FtZS5kcmF3LnJlY3Qoc2NyZWVuLCBidXR0b25fY29sb3IsYnV0dG9uMykKICAgICAgICAgICAgZm9udC5yZW5kZXJfdG8oc2NyZWVuLCAoOC41LzgwKndpZHRoLCAyNzUvNjAwKmhlaWdodCksICJWaXBlciBMZWdzIikKICAgICAgICAgICAgcHlnYW1lLmRyYXcucmVjdChzY3JlZW4sIGJ1dHRvbl9jb2xvcixidXR0b240KQogICAgICAgICAgICBmb250LnJlbmRlcl90byhzY3JlZW4sICg4LzgwKndpZHRoLCAzNzUvNjAwKmhlaWdodCksICJNYW50aXMgTGVncyIpCiAgICAgICAgICAgIHB5Z2FtZS5kcmF3LnJlY3Qoc2NyZWVuLCBidXR0b25fY29sb3IsYnV0dG9uNSkKICAgICAgICAgICAgZm9udC5yZW5kZXJfdG8oc2NyZWVuLCAoOC84MCp3aWR0aCwgMCksICJMZWcgTWVudSIpCiAgICAgICAgZWxpZiBMZWZ0X3dlYXBvbj09MToKICAgICAgICAgICAgZm9udCA9IHB5Z2FtZS5mcmVldHlwZS5Gb250KCJPcGVuU2Fucy1FeHRyYUJvbGQudHRmIiwgMjAvNjAwKmhlaWdodCkKICAgICAgICAgICAgZm9udC5mZ2NvbG9yID0gKDEwMCwwLDApCiAgICAgICAgICAgIHB5Z2FtZS5kcmF3LnJlY3Qoc2NyZWVuLCBncmV5LCBsZWZ0X2d1bl9tZW51KQogICAgICAgICAgICBweWdhbWUuZHJhdy5yZWN0KHNjcmVlbiwgYnV0dG9uX2NvbG9yLGJ1dHRvbjEpCiAgICAgICAgICAgIGZvbnQucmVuZGVyX3RvKHNjcmVlbiwgKDQuNS84MCp3aWR0aCwgNzUvNjAwKmhlaWdodCksICJHYXJyaXNvbiBXZWFwb24iKQogICAgICAgICAgICBweWdhbWUuZHJhdy5yZWN0KHNjcmVlbiwgYnV0dG9uX2NvbG9yLGJ1dHRvbjIpCiAgICAgICAgICAgIGZvbnQucmVuZGVyX3RvKHNjcmVlbiwgKDUuNS84MCp3aWR0aCwgMTc1LzYwMCpoZWlnaHQpLCAiVHVydGxlIFdlYXBvbiIpCiAgICAgICAgICAgIHB5Z2FtZS5kcmF3LnJlY3Qoc2NyZWVuLCBidXR0b25fY29sb3IsYnV0dG9uMykKICAgICAgICAgICAgZm9udC5yZW5kZXJfdG8oc2NyZWVuLCAoNi84MCp3aWR0aCwgMjc1LzYwMCpoZWlnaHQpLCAiVmlwZXIgV2VhcG9uIikKICAgICAgICAgICAgcHlnYW1lLmRyYXcucmVjdChzY3JlZW4sIGJ1dHRvbl9jb2xvcixidXR0b240KQogICAgICAgICAgICBmb250LnJlbmRlcl90byhzY3JlZW4sICg1LjUvODAqd2lkdGgsIDM3NS82MDAqaGVpZ2h0KSwgIk1hbnRpcyBXZWFwb24iKQogICAgICAgICAgICBweWdhbWUuZHJhdy5yZWN0KHNjcmVlbiwgYnV0dG9uX2NvbG9yLGJ1dHRvbjUpCiAgICAgICAgICAgIGZvbnQucmVuZGVyX3RvKHNjcmVlbiwgKDMuNS84MCp3aWR0aCwgMCksICJMZWZ0IFdlYXBvbiBNZW51IikKICAgICAgICBlbGlmIFJpZ2h0X3dlYXBvbj09MToKICAgICAgICAgICAgZm9udCA9IHB5Z2FtZS5mcmVldHlwZS5Gb250KCJPcGVuU2Fucy1FeHRyYUJvbGQudHRmIiwgMjAvNjAwKmhlaWdodCkKICAgICAgICAgICAgZm9udC5mZ2NvbG9yID0gKDEwMCwwLDApCiAgICAgICAgICAgIHB5Z2FtZS5kcmF3LnJlY3Qoc2NyZWVuLCBncmV5LCByaWdodF9ndW5fbWVudSkKICAgICAgICAgICAgcHlnYW1lLmRyYXcucmVjdChzY3JlZW4sIGJ1dHRvbl9jb2xvcixidXR0b24xKQogICAgICAgICAgICBmb250LnJlbmRlcl90byhzY3JlZW4sICg0LjUvODAqd2lkdGgsIDc1LzYwMCpoZWlnaHQpLCAiR2Fycmlzb24gV2VhcG9uIikKICAgICAgICAgICAgcHlnYW1lLmRyYXcucmVjdChzY3JlZW4sIGJ1dHRvbl9jb2xvcixidXR0b24yKQogICAgICAgICAgICBmb250LnJlbmRlcl90byhzY3JlZW4sICg1LjUvODAqd2lkdGgsIDE3NS82MDAqaGVpZ2h0KSwgIlR1cnRsZSBXZWFwb24iKQogICAgICAgICAgICBweWdhbWUuZHJhdy5yZWN0KHNjcmVlbiwgYnV0dG9uX2NvbG9yLGJ1dHRvbjMpCiAgICAgICAgICAgIGZvbnQucmVuZGVyX3RvKHNjcmVlbiwgKDYvODAqd2lkdGgsIDI3NS82MDAqaGVpZ2h0KSwgIlZpcGVyIFdlYXBvbiIpCiAgICAgICAgICAgIHB5Z2FtZS5kcmF3LnJlY3Qoc2NyZWVuLCBidXR0b25fY29sb3IsYnV0dG9uNCkKICAgICAgICAgICAgZm9udC5yZW5kZXJfdG8oc2NyZWVuLCAoNS41LzgwKndpZHRoLCAzNzUvNjAwKmhlaWdodCksICJNYW50aXMgV2VhcG9uIikKICAgICAgICAgICAgcHlnYW1lLmRyYXcucmVjdChzY3JlZW4sIGJ1dHRvbl9jb2xvcixidXR0b241KQogICAgICAgICAgICBmb250LnJlbmRlcl90byhzY3JlZW4sICgzLzgwKndpZHRoLCAwKSwgIlJpZ2h0IFdlYXBvbiBNZW51IikKICAgICAgICAKICAgICAgICBweWdhbWUuZGlzcGxheS5mbGlwKCk=