Files
GacUI/Import/VlppWorkflowCompiler.cpp
2017-04-11 08:08:42 -07:00

34070 lines
1.7 MiB

/***********************************************************************
THIS FILE IS AUTOMATICALLY GENERATED. DO NOT MODIFY
DEVELOPER: Zihan Chen(vczh)
***********************************************************************/
#include "VlppWorkflowCompiler.h"
/***********************************************************************
ANALYZER\WFANALYZER.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace analyzer
{
using namespace collections;
using namespace reflection::description;
/***********************************************************************
WfLexicalSymbol
***********************************************************************/
WfLexicalSymbol::WfLexicalSymbol(WfLexicalScope* _ownerScope)
:ownerScope(_ownerScope)
{
}
WfLexicalSymbol::~WfLexicalSymbol()
{
}
WString WfLexicalSymbol::GetFriendlyName()
{
return ownerScope->GetFriendlyName() + L"::" + name;
}
/***********************************************************************
WfLexicalScope
***********************************************************************/
WfLexicalScope::WfLexicalScope(WfLexicalScopeManager* _ownerManager)
:ownerManager(_ownerManager)
{
}
WfLexicalScope::WfLexicalScope(Ptr<WfLexicalScope> _parentScope)
:ownerManager(0)
, parentScope(_parentScope)
{
}
WfLexicalScope::~WfLexicalScope()
{
}
WfLexicalScopeManager* WfLexicalScope::FindManager()
{
WfLexicalScope* scope = this;
while (scope)
{
if (scope->ownerManager)
{
return scope->ownerManager;
}
scope = scope->parentScope.Obj();
}
return 0;
}
Ptr<WfModule> WfLexicalScope::FindModule()
{
WfLexicalScope* scope = this;
while (scope)
{
if (auto module = scope->ownerNode.Cast<WfModule>())
{
return module;
}
scope = scope->parentScope.Obj();
}
return 0;
}
WfLexicalScope* WfLexicalScope::FindFunctionScope()
{
auto scope = this;
while (scope)
{
if (scope->functionConfig)
{
return scope;
}
scope = scope->parentScope.Obj();
}
return nullptr;
}
WString WfLexicalScope::GetFriendlyName()
{
if (auto module = ownerNode.Cast<WfModule>())
{
return L"<" + module->name.value + L">";
}
else if (auto decl = ownerNode.Cast<WfDeclaration>())
{
auto name = decl->name.value;
if (name == L"")
{
name = L"<anonymous>";
}
return parentScope->GetFriendlyName() + L"::" + name;
}
else if (!parentScope)
{
return L"";
}
else
{
return parentScope->GetFriendlyName() + L"::<>";
}
}
Ptr<WfClassMember> WfLexicalScope::GetOwnerClassMember()
{
if (auto decl = ownerNode.Cast<WfDeclaration>())
{
return decl->classMember;
}
return nullptr;
}
/***********************************************************************
WfLexicalScopeName
***********************************************************************/
WfLexicalScopeName::WfLexicalScopeName(bool _imported)
:imported(_imported)
{
}
WfLexicalScopeName::~WfLexicalScopeName()
{
}
Ptr<WfLexicalScopeName> WfLexicalScopeName::AccessChild(const WString& name, bool imported)
{
vint index = children.Keys().IndexOf(name);
if (index == -1)
{
Ptr<WfLexicalScopeName> newName = new WfLexicalScopeName(imported);
newName->name = name;
newName->parent = this;
children.Add(name, newName);
return newName;
}
else
{
return children.Values()[index];
}
}
void WfLexicalScopeName::RemoveNonTypeDescriptorNames(WfLexicalScopeManager* manager)
{
FOREACH(Ptr<WfLexicalScopeName>, name, children.Values())
{
name->RemoveNonTypeDescriptorNames(manager);
}
for (vint i = children.Count() - 1; i >= 0; i--)
{
auto subScopeName = children.Values()[i];
if (!subScopeName->imported)
{
children.Remove(children.Keys()[i]);
if (subScopeName->typeDescriptor)
{
manager->typeNames.Remove(subScopeName->typeDescriptor);
}
}
}
declarations.Clear();
}
WString WfLexicalScopeName::GetFriendlyName()
{
if (parent)
{
WString parentName = parent->GetFriendlyName();
if (parentName == L"")
{
return name;
}
else
{
return parentName + L"::" + name;
}
}
else
{
return L"";
}
}
/***********************************************************************
ResolveExpressionResult
***********************************************************************/
WString ResolveExpressionResult::GetFriendlyName(bool upperCase)const
{
WString typeName, result;
if (type)
{
typeName= + L" of type \"" + type->GetTypeFriendlyName() + L"\"";
}
if (scopeName)
{
result = scopeName->GetFriendlyName();
}
else if (symbol)
{
result = symbol->GetFriendlyName() + typeName;
}
else if (propertyInfo)
{
result = L"property \"" + propertyInfo->GetName() + L"\" in \"" + propertyInfo->GetOwnerTypeDescriptor()->GetTypeName() + L"\"" + typeName;
}
else if (methodInfo)
{
if (methodInfo->GetName() == L"")
{
result = L"constructor in \"" + methodInfo->GetOwnerTypeDescriptor()->GetTypeName() + L"\"" + typeName;
}
else
{
result = L"method \"" + methodInfo->GetName() + L"\" in \"" + methodInfo->GetOwnerTypeDescriptor()->GetTypeName() + L"\"" + typeName;
}
}
else if (eventInfo)
{
result = L"event \"" + eventInfo->GetName() + L"\" in \"" + eventInfo->GetOwnerTypeDescriptor()->GetTypeName() + L"\"";
}
else if (type)
{
result = L"expression" + typeName;
}
else
{
result = L"<unknown>";
}
if (result.Length() > 0 && upperCase)
{
result = INVLOC.ToUpper(result.Left(1)) + result.Right(result.Length() - 1);
}
return result;
}
ResolveExpressionResult ResolveExpressionResult::ScopeName(Ptr<WfLexicalScopeName> _scopeName)
{
ResolveExpressionResult result;
result.scopeName = _scopeName;
return result;
}
ResolveExpressionResult ResolveExpressionResult::ReadonlySymbol(Ptr<WfLexicalSymbol> _symbol)
{
ResolveExpressionResult result;
result.symbol = _symbol;
result.type = _symbol->typeInfo;
return result;
}
ResolveExpressionResult ResolveExpressionResult::Symbol(Ptr<WfLexicalSymbol> _symbol)
{
ResolveExpressionResult result;
result.symbol = _symbol;
result.type = _symbol->typeInfo;
if (_symbol->creatorNode.Cast<WfVariableDeclaration>())
{
result.writableType = _symbol->typeInfo;
}
return result;
}
ResolveExpressionResult ResolveExpressionResult::ReadonlyType(Ptr<reflection::description::ITypeInfo> _type)
{
ResolveExpressionResult result;
result.type = _type;
return result;
}
ResolveExpressionResult ResolveExpressionResult::WritableType(Ptr<reflection::description::ITypeInfo> _type)
{
ResolveExpressionResult result;
result.type = _type;
result.writableType = _type;
return result;
}
ResolveExpressionResult ResolveExpressionResult::Property(reflection::description::IPropertyInfo* _propertyInfo)
{
Ptr<ITypeInfo> getterType = CopyTypeInfo(_propertyInfo->GetReturn());
Ptr<ITypeInfo> setterType;
if (IMethodInfo* setter = _propertyInfo->GetSetter())
{
setterType = getterType;
if (setter->GetParameterCount() == 1 && !IsSameType(getterType.Obj(), setter->GetParameter(0)->GetType()))
{
setterType = CopyTypeInfo(setter->GetParameter(0)->GetType());
}
}
else if (_propertyInfo->IsWritable())
{
auto td = _propertyInfo->GetOwnerTypeDescriptor();
if ((td->GetTypeDescriptorFlags() & TypeDescriptorFlags::ReferenceType) != TypeDescriptorFlags::Undefined)
{
setterType = CopyTypeInfo(_propertyInfo->GetReturn());
}
}
ResolveExpressionResult result;
result.propertyInfo = _propertyInfo;
result.type = getterType;
result.writableType = setterType;
return result;
}
ResolveExpressionResult ResolveExpressionResult::Method(reflection::description::IMethodInfo* _methodInfo)
{
ResolveExpressionResult result;
result.methodInfo = _methodInfo;
result.type = CreateTypeInfoFromMethodInfo(_methodInfo);
return result;
}
ResolveExpressionResult ResolveExpressionResult::Constructor(reflection::description::IMethodInfo* _constructorInfo)
{
ResolveExpressionResult result;
result.constructorInfo = _constructorInfo;
result.type = CopyTypeInfo(_constructorInfo->GetReturn());
return result;
}
ResolveExpressionResult ResolveExpressionResult::Event(reflection::description::IEventInfo* _eventInfo)
{
ResolveExpressionResult result;
result.eventInfo = _eventInfo;
return result;
}
bool IsSameTypeOrNull(ITypeInfo* fromType, ITypeInfo* toType)
{
if (fromType == toType) return true;
if ((fromType == nullptr) ^ (toType == nullptr)) return false;
return IsSameType(fromType, toType);
}
bool ResolveExpressionResult::operator==(const ResolveExpressionResult& result) const
{
if (scopeName != result.scopeName) return false;
if (symbol != result.symbol) return false;
if (propertyInfo != result.propertyInfo) return false;
if (methodInfo != result.methodInfo) return false;
if (constructorInfo != result.constructorInfo) return false;
if (eventInfo != result.eventInfo) return false;
if (!IsSameTypeOrNull(type.Obj(), result.type.Obj())) return false;
if (!IsSameTypeOrNull(writableType.Obj(), result.writableType.Obj())) return false;
if (!IsSameTypeOrNull(expectedType.Obj(), result.expectedType.Obj())) return false;
return true;
}
bool ResolveExpressionResult::operator!=(const ResolveExpressionResult& result) const
{
return !(*this == result);
}
/***********************************************************************
WfLexicalScopeManager
***********************************************************************/
WfLexicalScopeManager::WfLexicalScopeManager(Ptr<parsing::tabling::ParsingTable> _parsingTable)
:parsingTable(_parsingTable)
{
attributes.Add({ L"cpp", L"File" }, TypeInfoRetriver<WString>::CreateTypeInfo());
attributes.Add({ L"cpp", L"UserImpl" }, TypeInfoRetriver<void>::CreateTypeInfo());
attributes.Add({ L"cpp", L"Private" }, TypeInfoRetriver<void>::CreateTypeInfo());
attributes.Add({ L"cpp", L"Protected" }, TypeInfoRetriver<void>::CreateTypeInfo());
attributes.Add({ L"cpp", L"Friend" }, TypeInfoRetriver<ITypeDescriptor*>::CreateTypeInfo());
}
WfLexicalScopeManager::~WfLexicalScopeManager()
{
}
vint WfLexicalScopeManager::AddModule(const WString& moduleCode)
{
if (auto module = WfParseModule(moduleCode, parsingTable, errors, usedCodeIndex))
{
modules.Add(module);
moduleCodes.Add(moduleCode);
}
return usedCodeIndex++;
}
vint WfLexicalScopeManager::AddModule(Ptr<WfModule> module)
{
module->codeRange.codeIndex = usedCodeIndex;
modules.Add(module);
moduleCodes.Add(L"");
return usedCodeIndex++;
}
WfLexicalScopeManager::ModuleList& WfLexicalScopeManager::GetModules()
{
return modules;
}
WfLexicalScopeManager::ModuleCodeList& WfLexicalScopeManager::GetModuleCodes()
{
return moduleCodes;
}
void WfLexicalScopeManager::Clear(bool keepTypeDescriptorNames, bool deleteModules)
{
if (globalName)
{
if (keepTypeDescriptorNames)
{
globalName->RemoveNonTypeDescriptorNames(this);
}
else
{
globalName = 0;
typeNames.Clear();
}
}
if (deleteModules)
{
modules.Clear();
moduleCodes.Clear();
usedCodeIndex = 0;
usedTempVars = 0;
}
errors.Clear();
namespaceNames.Clear();
nodeScopes.Clear();
expressionResolvings.Clear();
lambdaCaptures.Clear();
interfaceMethodImpls.Clear();
declarationTypes.Clear();
declarationMemberInfos.Clear();
baseConstructorCallResolvings.Clear();
}
void WfLexicalScopeManager::Rebuild(bool keepTypeDescriptorNames)
{
Clear(keepTypeDescriptorNames, false);
if (!globalName)
{
globalName = new WfLexicalScopeName(true);
BuildGlobalNameFromTypeDescriptors(this);
}
vint errorCount = errors.Count();
#define EXIT_IF_ERRORS_EXIST\
do\
{\
if (errors.Count() != errorCount) return;\
}while (0)
EXIT_IF_ERRORS_EXIST;
FOREACH(Ptr<WfModule>, module, modules)
{
ContextFreeModuleDesugar(this, module);
ValidateModuleStructure(this, module);
}
EXIT_IF_ERRORS_EXIST;
BuildGlobalNameFromModules(this);
FOREACH(Ptr<WfModule>, module, modules)
{
BuildScopeForModule(this, module);
}
ValidateScopeName(this, globalName);
CheckScopes_DuplicatedSymbol(this);
EXIT_IF_ERRORS_EXIST;
FOREACH(Ptr<WfModule>, module, modules)
{
CompleteScopeForModule(this, module);
}
CheckScopes_BaseType(this);
CheckScopes_SymbolType(this);
EXIT_IF_ERRORS_EXIST;
FOREACH(Ptr<WfModule>, module, modules)
{
ValidateModuleSemantic(this, module);
}
#undef EXIT_IF_ERRORS_EXIST
}
bool WfLexicalScopeManager::ResolveMember(ITypeDescriptor* typeDescriptor, const WString& name, bool preferStatic, collections::SortedList<ITypeDescriptor*>& searchedTypes, collections::List<ResolveExpressionResult>& results)
{
if (searchedTypes.Contains(typeDescriptor))
{
return true;
}
searchedTypes.Add(typeDescriptor);
bool found = false;
bool foundStaticMember = false;
if ((typeDescriptor->GetTypeDescriptorFlags() & TypeDescriptorFlags::EnumType) != TypeDescriptorFlags::Undefined)
{
if (preferStatic)
{
auto enumType = typeDescriptor->GetEnumType();
vint index = enumType->IndexOfItem(name);
if (index != -1)
{
results.Add(ResolveExpressionResult::ReadonlyType(MakePtr<TypeDescriptorTypeInfo>(typeDescriptor, TypeInfoHint::Normal)));
return true;
}
}
return false;
}
{
auto scopeName = typeNames[typeDescriptor];
vint index = scopeName->children.Keys().IndexOf(name);
if (index != -1)
{
auto subScopeName = scopeName->children.Values()[index];
found = true;
foundStaticMember = true;
results.Add(ResolveExpressionResult::ScopeName(subScopeName));
}
}
if (auto group = typeDescriptor->GetMethodGroupByName(name, false))
{
for (vint i = 0; i < group->GetMethodCount(); i++)
{
auto info = group->GetMethod(i);
if (info->IsStatic())
{
found = true;
foundStaticMember = true;
results.Add(ResolveExpressionResult::Method(info));
}
}
}
if (foundStaticMember && preferStatic)
{
return true;
}
if (auto group = typeDescriptor->GetMethodGroupByName(name, false))
{
for (vint i = 0; i < group->GetMethodCount(); i++)
{
auto info = group->GetMethod(i);
if (!info->IsStatic())
{
found = true;
results.Add(ResolveExpressionResult::Method(info));
}
}
}
if (auto info = typeDescriptor->GetPropertyByName(name, false))
{
found = true;
results.Add(ResolveExpressionResult::Property(info));
}
if (auto info = typeDescriptor->GetEventByName(name, false))
{
found = true;
results.Add(ResolveExpressionResult::Event(info));
}
if (!found)
{
vint count = typeDescriptor->GetBaseTypeDescriptorCount();
for (vint i = 0; i < count; i++)
{
if (ResolveMember(typeDescriptor->GetBaseTypeDescriptor(i), name, preferStatic, searchedTypes, results))
{
found = true;
}
}
}
return found;
}
class UsingPathToNameVisitor :public Object, public WfModuleUsingFragment::IVisitor
{
public:
WString name;
WString result;
UsingPathToNameVisitor(const WString& _name)
:name(_name)
{
}
void Visit(WfModuleUsingNameFragment* node)
{
result = node->name.value;
}
void Visit(WfModuleUsingWildCardFragment* node)
{
result = name;
}
static WString Execute(Ptr<WfModuleUsingFragment> fragment, const WString& name)
{
UsingPathToNameVisitor visitor(name);
fragment->Accept(&visitor);
return visitor.result;
}
};
bool WfLexicalScopeManager::ResolveName(WfLexicalScope* scope, const WString& name, collections::List<ResolveExpressionResult>& results)
{
vint oldResultCount = results.Count();
bool visibleToNonStatic = false;
WfLexicalScope* firstConfigScope = nullptr;
while (scope)
{
if (scope->ownerNode.Cast<WfModule>() || scope->ownerNode.Cast<WfNamespaceDeclaration>())
{
break;
}
if (scope->functionConfig)
{
visibleToNonStatic = scope->functionConfig->thisAccessable || scope->functionConfig->parentThisAccessable;
if (!firstConfigScope)
{
firstConfigScope = scope;
}
}
vint index = scope->symbols.Keys().IndexOf(name);
if (index != -1)
{
if (scope->typeOfThisExpr)
{
if (scope->ownerNode.Cast<WfNewInterfaceExpression>())
{
FOREACH(Ptr<WfLexicalSymbol>, symbol, scope->symbols.GetByIndex(index))
{
if (symbol->creatorNode.Cast<WfVariableDeclaration>())
{
auto result = ResolveExpressionResult::Symbol(symbol);
if (!results.Contains(result))
{
results.Add(result);
}
}
else if (symbol->creatorNode.Cast<WfDeclaration>()->classMember->kind == WfClassMemberKind::Normal)
{
if (firstConfigScope->parentScope == scope)
{
auto result = ResolveExpressionResult::Symbol(symbol);
if (!results.Contains(result))
{
results.Add(result);
}
}
}
}
}
}
else
{
FOREACH(Ptr<WfLexicalSymbol>, symbol, scope->symbols.GetByIndex(index))
{
auto result = ResolveExpressionResult::Symbol(symbol);
if (!results.Contains(result))
{
results.Add(result);
}
}
}
}
if (scope->typeOfThisExpr)
{
SortedList<ITypeDescriptor*> searchedTypes;
ResolveMember(scope->typeOfThisExpr, name, !visibleToNonStatic, searchedTypes, results);
}
scope = scope->parentScope.Obj();
}
while (scope)
{
if (auto nsDecl = scope->ownerNode.Cast<WfNamespaceDeclaration>())
{
auto scopeName = namespaceNames[nsDecl.Obj()];
vint index = scopeName->children.Keys().IndexOf(name);
if (index != -1)
{
auto subScopeName = scopeName->children.Values()[index];
auto result = ResolveExpressionResult::ScopeName(subScopeName);
if (!results.Contains(result))
{
results.Add(result);
}
}
scope = scope->parentScope.Obj();
}
else
{
break;
}
}
vint index = globalName->children.Keys().IndexOf(name);
if (index != -1)
{
auto subScopeName = globalName->children.Values()[index];
auto result = ResolveExpressionResult::ScopeName(subScopeName);
if (!results.Contains(result))
{
results.Add(result);
}
}
if (auto module = scope->ownerNode.Cast<WfModule>())
{
FOREACH(Ptr<WfModuleUsingPath>, path, module->paths)
{
auto scopeName = globalName;
FOREACH(Ptr<WfModuleUsingItem>, item, path->items)
{
WString fragmentName;
FOREACH(Ptr<WfModuleUsingFragment>, fragment, item->fragments)
{
fragmentName += UsingPathToNameVisitor::Execute(fragment, name);
}
vint index = scopeName->children.Keys().IndexOf(fragmentName);
if (index == -1) goto USING_PATH_MATCHING_FAILED;
scopeName = scopeName->children.Values()[index];
}
{
auto result = ResolveExpressionResult::ScopeName(scopeName);
if (!results.Contains(result))
{
results.Add(result);
}
}
USING_PATH_MATCHING_FAILED:;
}
}
return results.Count() > oldResultCount;
}
Ptr<WfLexicalSymbol> WfLexicalScopeManager::GetDeclarationSymbol(WfLexicalScope* scope, WfDeclaration* node)
{
auto symbol = From(scope->parentScope->symbols[node->name.value])
.Where([=](Ptr<WfLexicalSymbol> symbol)
{
return symbol->creatorNode == node;
})
.First();
return symbol;
}
void WfLexicalScopeManager::CreateLambdaCapture(parsing::ParsingTreeCustomBase* node, Ptr<WfLexicalCapture> capture)
{
if (!capture)
{
capture = MakePtr<WfLexicalCapture>();
}
lambdaCaptures.Add(node, capture);
}
}
}
}
/***********************************************************************
ANALYZER\WFANALYZER_BUILDGLOBALNAME.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace analyzer
{
using namespace collections;
using namespace reflection::description;
using namespace typeimpl;
/***********************************************************************
BuildGlobalNameFromTypeDescriptors
***********************************************************************/
void BuildGlobalNameFromTypeDescriptors(WfLexicalScopeManager* manager)
{
for (vint i = 0; i < GetGlobalTypeManager()->GetTypeDescriptorCount(); i++)
{
ITypeDescriptor* typeDescriptor = GetGlobalTypeManager()->GetTypeDescriptor(i);
WString name = typeDescriptor->GetTypeName();
const wchar_t* reading = name.Buffer();
Ptr<WfLexicalScopeName> currentName = manager->globalName;
while (true)
{
WString fragment;
const wchar_t* delimiter = wcsstr(reading, L"::");
if (delimiter)
{
fragment = WString(reading, vint(delimiter - reading));
reading = delimiter + 2;
}
else
{
fragment = reading;
reading = 0;
}
currentName = currentName->AccessChild(fragment, true);
if (!reading)
{
currentName->typeDescriptor = typeDescriptor;
manager->typeNames.Add(typeDescriptor, currentName);
break;
}
}
}
}
/***********************************************************************
BuildGlobalNameFromModules
***********************************************************************/
class BuildClassMemberVisitor : public Object, public WfDeclaration::IVisitor
{
public:
WfLexicalScopeManager* manager;
Ptr<WfLexicalScopeName> scopeName;
Ptr<WfClassDeclaration> classDecl;
Ptr<WfCustomType> td;
BuildClassMemberVisitor(WfLexicalScopeManager* _manager, Ptr<WfLexicalScopeName> _scopeName, Ptr<WfClassDeclaration> _classDecl, Ptr<WfCustomType> _td)
:manager(_manager)
, scopeName(_scopeName)
, classDecl(_classDecl)
, td(_td)
{
}
static WString GetTypeName(WfLexicalScopeManager* manager, Ptr<WfLexicalScopeName> scopeName)
{
WString typeName = scopeName->name;
{
WfLexicalScopeName* name = scopeName->parent;
while (name && name != manager->globalName.Obj())
{
typeName = name->name + L"::" + typeName;
name = name->parent;
}
}
return typeName;
}
static void AddCustomType(WfLexicalScopeManager* manager, Ptr<WfLexicalScopeName> scopeName, Ptr<WfDeclaration> declaration, Ptr<ITypeDescriptor> td)
{
manager->declarationTypes.Add(declaration, td);
if (!scopeName->typeDescriptor)
{
scopeName->typeDescriptor = td.Obj();
manager->typeNames.Add(td.Obj(), scopeName);
}
}
static void BuildClass(WfLexicalScopeManager* manager, Ptr<WfLexicalScopeName> scopeName, Ptr<WfClassDeclaration> declaration)
{
WString typeName = GetTypeName(manager, scopeName);
Ptr<WfCustomType> td;
switch (declaration->kind)
{
case WfClassKind::Class:
td = MakePtr<WfClass>(typeName);
break;
case WfClassKind::Interface:
td = MakePtr<WfInterface>(typeName);
break;
}
AddCustomType(manager, scopeName, declaration, td);
FOREACH(Ptr<WfDeclaration>, memberDecl, declaration->declarations)
{
BuildClassMemberVisitor visitor(manager, scopeName, declaration, td);
memberDecl->Accept(&visitor);
}
}
void Visit(WfNamespaceDeclaration* node)override
{
}
void Visit(WfFunctionDeclaration* node)override
{
if (node->classMember->kind == WfClassMemberKind::Static)
{
auto info = MakePtr<WfStaticMethod>();
td->AddMember(node->name.value, info);
manager->declarationMemberInfos.Add(node, info);
}
else
{
switch (classDecl->kind)
{
case WfClassKind::Class:
{
auto info = MakePtr<WfClassMethod>();
td->AddMember(node->name.value, info);
manager->declarationMemberInfos.Add(node, info);
}
break;
case WfClassKind::Interface:
{
auto info = MakePtr<WfInterfaceMethod>();
td->AddMember(node->name.value, info);
manager->declarationMemberInfos.Add(node, info);
}
break;
}
}
}
void Visit(WfVariableDeclaration* node)override
{
auto info = MakePtr<WfField>(td.Obj(), node->name.value);
td->AddMember(info);
manager->declarationMemberInfos.Add(node, info);
}
void Visit(WfEventDeclaration* node)override
{
auto info = MakePtr<WfEvent>(td.Obj(), node->name.value);
td->AddMember(info);
manager->declarationMemberInfos.Add(node, info);
}
void Visit(WfPropertyDeclaration* node)override
{
auto info = MakePtr<WfProperty>(td.Obj(), node->name.value);
td->AddMember(info);
manager->declarationMemberInfos.Add(node, info);
}
void Visit(WfConstructorDeclaration* node)override
{
Ptr<ITypeInfo> typeInfo;
{
auto elementType = MakePtr<TypeDescriptorTypeInfo>(td.Obj(), TypeInfoHint::Normal);
if (node->constructorType == WfConstructorType::RawPtr)
{
typeInfo = MakePtr<RawPtrTypeInfo>(elementType);
}
else
{
typeInfo = MakePtr<SharedPtrTypeInfo>(elementType);
}
}
auto info = MakePtr<WfClassConstructor>(typeInfo);
td->AddMember(info);
manager->declarationMemberInfos.Add(node, info);
}
void Visit(WfDestructorDeclaration* node)override
{
}
void Visit(WfClassDeclaration* node)override
{
auto newScopeName = scopeName->AccessChild(node->name.value, false);
newScopeName->declarations.Add(node);
BuildClass(manager, newScopeName, node);
}
void Visit(WfEnumDeclaration* node)override
{
BuildNameForDeclaration(manager, scopeName, node);
}
void Visit(WfStructDeclaration* node)override
{
BuildNameForDeclaration(manager, scopeName, node);
}
void Visit(WfVirtualDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, decl, node->expandedDeclarations)
{
decl->Accept(this);
}
}
};
class BuildNameDeclarationVisitor
: public empty_visitor::DeclarationVisitor
{
public:
WfLexicalScopeManager* manager;
Ptr<WfLexicalScopeName> scopeName;
BuildNameDeclarationVisitor(WfLexicalScopeManager* _manager, Ptr<WfLexicalScopeName> _scopeName)
:manager(_manager)
, scopeName(_scopeName)
{
}
void Dispatch(WfVirtualDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, decl, node->expandedDeclarations)
{
decl->Accept(this);
}
}
void Visit(WfNamespaceDeclaration* node)override
{
manager->namespaceNames.Add(node, scopeName);
FOREACH(Ptr<WfDeclaration>, subDecl, node->declarations)
{
BuildNameForDeclaration(manager, scopeName, subDecl.Obj());
}
}
void Visit(WfClassDeclaration* node)override
{
BuildClassMemberVisitor::BuildClass(manager, scopeName, node);
}
void Visit(WfEnumDeclaration* node)override
{
auto td = MakePtr<WfEnum>(node->kind == WfEnumKind::Flag, BuildClassMemberVisitor::GetTypeName(manager, scopeName));
BuildClassMemberVisitor::AddCustomType(manager, scopeName, node, td);
}
void Visit(WfStructDeclaration* node)override
{
auto td = MakePtr<WfStruct>(BuildClassMemberVisitor::GetTypeName(manager, scopeName));
BuildClassMemberVisitor::AddCustomType(manager, scopeName, node, td);
}
};
void BuildNameForDeclaration(WfLexicalScopeManager* manager, Ptr<WfLexicalScopeName> name, WfDeclaration* decl)
{
auto scopeName = name->AccessChild(decl->name.value, false);
scopeName->declarations.Add(decl);
BuildNameDeclarationVisitor visitor(manager, scopeName);
decl->Accept(&visitor);
}
void BuildGlobalNameFromModules(WfLexicalScopeManager* manager)
{
FOREACH(Ptr<WfModule>, module, manager->GetModules())
{
FOREACH(Ptr<WfDeclaration>, decl, module->declarations)
{
BuildNameForDeclaration(manager, manager->globalName, decl.Obj());
}
}
}
/***********************************************************************
ValidateScopeName
***********************************************************************/
class ValidateScopeNameDeclarationVisitor
: public Object
, public WfDeclaration::IVisitor
{
public:
enum Category
{
None,
Type,
Variable,
Function,
Event,
Property,
Namespace,
};
WfLexicalScopeManager* manager;
Ptr<WfLexicalScopeName> name;
Category category;
ValidateScopeNameDeclarationVisitor(WfLexicalScopeManager* _manager, Ptr<WfLexicalScopeName> _name)
:manager(_manager)
, name(_name)
, category(name->typeDescriptor && name->imported ? Type : None)
{
}
void AddError(WfDeclaration* node)
{
WString categoryName;
switch (category)
{
case Type:
categoryName = L"type";
break;
case Variable:
categoryName = L"variable";
break;
case Function:
categoryName = L"function";
break;
case Event:
categoryName = L"event";
break;
case Property:
categoryName = L"property";
break;
case Namespace:
categoryName = L"namespace";
break;
default:
CHECK_FAIL(L"ValidateScopeNameDeclarationVisitor::AddError(WfDeclaration*)#Internal error.");
}
manager->errors.Add(WfErrors::DuplicatedDeclaration(node, categoryName));
}
void Visit(WfNamespaceDeclaration* node)override
{
if (category == None)
{
category = Namespace;
}
else if (category != Namespace)
{
AddError(node);
}
}
void Visit(WfFunctionDeclaration* node)override
{
if (category == None)
{
category = Function;
}
else if (category != Function)
{
AddError(node);
}
}
void Visit(WfVariableDeclaration* node)override
{
if (category == None)
{
category = Variable;
}
else
{
AddError(node);
}
}
void Visit(WfEventDeclaration* node)override
{
if (category == None)
{
category = Event;
}
else
{
AddError(node);
}
}
void Visit(WfPropertyDeclaration* node)override
{
if (category == None)
{
category = Property;
}
else
{
AddError(node);
}
}
void Visit(WfConstructorDeclaration* node)override
{
}
void Visit(WfDestructorDeclaration* node)override
{
}
void Visit(WfClassDeclaration* node)override
{
if (category == None)
{
category = Type;
}
else
{
AddError(node);
}
}
void Visit(WfEnumDeclaration* node)override
{
if (category == None)
{
category = Type;
}
else
{
AddError(node);
}
}
void Visit(WfStructDeclaration* node)override
{
if (category == None)
{
category = Type;
}
else
{
AddError(node);
}
}
void Visit(WfVirtualDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, decl, node->expandedDeclarations)
{
decl->Accept(this);
}
}
};
void ValidateScopeName(WfLexicalScopeManager* manager, Ptr<WfLexicalScopeName> name)
{
ValidateScopeNameDeclarationVisitor visitor(manager, name);
FOREACH(Ptr<WfDeclaration>, declaration, name->declarations)
{
declaration->Accept(&visitor);
}
FOREACH(Ptr<WfLexicalScopeName>, child, name->children.Values())
{
ValidateScopeName(manager, child);
}
}
}
}
}
/***********************************************************************
ANALYZER\WFANALYZER_BUILDSCOPE.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace analyzer
{
using namespace collections;
using namespace parsing;
using namespace reflection;
using namespace reflection::description;
using namespace typeimpl;
/***********************************************************************
BuildScopeForDeclaration
***********************************************************************/
class BuildScopeForDeclarationVisitor : public Object, public WfDeclaration::IVisitor
{
public:
WfLexicalScopeManager* manager;
ParsingTreeCustomBase* source;
Ptr<WfLexicalScope> parentScope;
Ptr<WfLexicalScope> resultScope;
BuildScopeForDeclarationVisitor(WfLexicalScopeManager* _manager, Ptr<WfLexicalScope> _parentScope, ParsingTreeCustomBase* _source)
:manager(_manager)
, source(_source)
, parentScope(_parentScope)
{
}
void Visit(Ptr<WfLexicalScope> scope, List<Ptr<WfAttribute>>& attributes)
{
FOREACH(Ptr<WfAttribute>, attribute, attributes)
{
if (attribute->value)
{
BuildScopeForExpression(manager, scope, attribute->value);
}
}
}
void Visit(WfNamespaceDeclaration* node)override
{
Ptr<WfLexicalSymbol> symbol = new WfLexicalSymbol(parentScope.Obj());
symbol->name = node->name.value;
symbol->creatorNode = node;
parentScope->symbols.Add(symbol->name, symbol);
resultScope = new WfLexicalScope(parentScope);
FOREACH(Ptr<WfDeclaration>, declaration, node->declarations)
{
BuildScopeForDeclaration(manager, resultScope, declaration, node);
}
}
void Visit(WfFunctionDeclaration* node)override
{
resultScope = new WfLexicalScope(parentScope);
auto config = MakePtr<WfLexicalFunctionConfig>();
resultScope->functionConfig = config;
resultScope->ownerNodeSource = source;
if (source)
{
if (dynamic_cast<WfFunctionExpression*>(source))
{
config->lambda = true;
config->thisAccessable = false;
config->parentThisAccessable = true;
}
else if (dynamic_cast<WfNewInterfaceExpression*>(source))
{
config->lambda = true;
config->thisAccessable = true;
config->parentThisAccessable = true;
}
else if (dynamic_cast<WfClassDeclaration*>(source))
{
config->lambda = false;
config->thisAccessable = node->classMember->kind != WfClassMemberKind::Static;
config->parentThisAccessable = false;
}
}
if (node->anonymity == WfFunctionAnonymity::Named)
{
Ptr<WfLexicalScope> functionNameScope = parentScope;
if (source && dynamic_cast<WfFunctionExpression*>(source))
{
functionNameScope = resultScope;
}
Ptr<WfLexicalSymbol> symbol = new WfLexicalSymbol(functionNameScope.Obj());
symbol->name = node->name.value;
symbol->creatorNode = node;
{
Ptr<WfFunctionType> type = new WfFunctionType;
type->result = node->returnType;
FOREACH(Ptr<WfFunctionArgument>, argument, node->arguments)
{
type->arguments.Add(argument->type);
}
symbol->type = type;
}
functionNameScope->symbols.Add(symbol->name, symbol);
}
if (node->statement)
{
FOREACH(Ptr<WfFunctionArgument>, argument, node->arguments)
{
Ptr<WfLexicalSymbol> argumentSymbol = new WfLexicalSymbol(resultScope.Obj());
argumentSymbol->name = argument->name.value;
argumentSymbol->type = argument->type;
argumentSymbol->creatorNode = argument;
resultScope->symbols.Add(argumentSymbol->name, argumentSymbol);
Visit(parentScope, argument->attributes);
}
BuildScopeForStatement(manager, resultScope, node->statement);
}
}
void Visit(WfVariableDeclaration* node)override
{
Ptr<WfLexicalSymbol> symbol = new WfLexicalSymbol(parentScope.Obj());
symbol->name = node->name.value;
symbol->creatorNode = node;
symbol->type = node->type;
parentScope->symbols.Add(symbol->name, symbol);
BuildScopeForExpression(manager, parentScope, node->expression);
}
void Visit(WfEventDeclaration* node)override
{
Ptr<WfLexicalSymbol> symbol = new WfLexicalSymbol(parentScope.Obj());
symbol->name = node->name.value;
symbol->creatorNode = node;
parentScope->symbols.Add(symbol->name, symbol);
}
void Visit(WfPropertyDeclaration* node)override
{
Ptr<WfLexicalSymbol> symbol = new WfLexicalSymbol(parentScope.Obj());
symbol->name = node->name.value;
symbol->creatorNode = node;
symbol->type = node->type;
parentScope->symbols.Add(symbol->name, symbol);
}
void Visit(WfConstructorDeclaration* node)override
{
resultScope = new WfLexicalScope(parentScope);
FOREACH(Ptr<WfFunctionArgument>, argument, node->arguments)
{
Ptr<WfLexicalSymbol> argumentSymbol = new WfLexicalSymbol(resultScope.Obj());
argumentSymbol->name = argument->name.value;
argumentSymbol->type = argument->type;
argumentSymbol->creatorNode = argument;
resultScope->symbols.Add(argumentSymbol->name, argumentSymbol);
}
FOREACH(Ptr<WfBaseConstructorCall>, call, node->baseConstructorCalls)
{
FOREACH(Ptr<WfExpression>, argument, call->arguments)
{
BuildScopeForExpression(manager, resultScope, argument);
}
}
auto bodyScope = MakePtr<WfLexicalScope>(resultScope);
{
auto config = MakePtr<WfLexicalFunctionConfig>();
bodyScope->functionConfig = config;
config->lambda = false;
config->thisAccessable = true;
config->parentThisAccessable = false;
}
BuildScopeForStatement(manager, bodyScope, node->statement);
}
void Visit(WfDestructorDeclaration* node)override
{
resultScope = new WfLexicalScope(parentScope);
{
auto config = MakePtr<WfLexicalFunctionConfig>();
resultScope->functionConfig = config;
config->lambda = false;
config->thisAccessable = true;
config->parentThisAccessable = false;
}
BuildScopeForStatement(manager, resultScope, node->statement);
}
void Visit(WfClassDeclaration* node)override
{
Ptr<WfLexicalSymbol> symbol = new WfLexicalSymbol(parentScope.Obj());
symbol->name = node->name.value;
symbol->creatorNode = node;
parentScope->symbols.Add(symbol->name, symbol);
auto td = manager->declarationTypes[node];
resultScope = new WfLexicalScope(parentScope);
resultScope->typeOfThisExpr = td.Obj();
FOREACH(Ptr<WfDeclaration>, memberDecl, node->declarations)
{
BuildScopeForDeclaration(manager, resultScope, memberDecl, node);
}
}
void Visit(WfEnumDeclaration* node)override
{
Ptr<WfLexicalSymbol> symbol = new WfLexicalSymbol(parentScope.Obj());
symbol->name = node->name.value;
symbol->creatorNode = node;
parentScope->symbols.Add(symbol->name, symbol);
FOREACH(Ptr<WfEnumItem>, item, node->items)
{
Visit(parentScope, item->attributes);
}
}
void Visit(WfStructDeclaration* node)override
{
Ptr<WfLexicalSymbol> symbol = new WfLexicalSymbol(parentScope.Obj());
symbol->name = node->name.value;
symbol->creatorNode = node;
parentScope->symbols.Add(symbol->name, symbol);
FOREACH(Ptr<WfStructMember>, member, node->members)
{
Visit(parentScope, member->attributes);
}
}
void Visit(WfVirtualDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, decl, node->expandedDeclarations)
{
Execute(manager, parentScope, source, decl);
}
}
static Ptr<WfLexicalScope> Execute(WfLexicalScopeManager* manager, Ptr<WfLexicalScope> parentScope, ParsingTreeCustomBase* source, Ptr<WfDeclaration> declaration)
{
BuildScopeForDeclarationVisitor visitor(manager, parentScope, source);
declaration->Accept(&visitor);
visitor.Visit(parentScope, declaration->attributes);
if (visitor.resultScope)
{
manager->nodeScopes.Add(declaration.Obj(), visitor.resultScope);
visitor.resultScope->ownerNode = declaration;
}
else
{
manager->nodeScopes.Add(declaration.Obj(), parentScope);
}
return visitor.resultScope;
}
};
/***********************************************************************
BuildScopeForStatement
***********************************************************************/
class BuildScopeForStatementVisitor
: public Object
, public WfStatement::IVisitor
, public WfVirtualStatement::IVisitor
, public WfCoroutineStatement::IVisitor
{
public:
WfLexicalScopeManager* manager;
Ptr<WfLexicalScope> parentScope;
Ptr<WfLexicalScope> resultScope;
BuildScopeForStatementVisitor(WfLexicalScopeManager* _manager, Ptr<WfLexicalScope> _parentScope)
:manager(_manager)
, parentScope(_parentScope)
{
}
void Visit(WfBreakStatement* node)override
{
}
void Visit(WfContinueStatement* node)override
{
}
void Visit(WfReturnStatement* node)override
{
if (node->expression)
{
BuildScopeForExpression(manager, parentScope, node->expression);
}
}
void Visit(WfDeleteStatement* node)override
{
BuildScopeForExpression(manager, parentScope, node->expression);
}
void Visit(WfRaiseExceptionStatement* node)override
{
if (node->expression)
{
BuildScopeForExpression(manager, parentScope, node->expression);
}
}
void Visit(WfIfStatement* node)override
{
resultScope = new WfLexicalScope(parentScope);
if (node->type)
{
Ptr<WfLexicalSymbol> symbol = new WfLexicalSymbol(resultScope.Obj());
symbol->name = node->name.value;
symbol->type = node->type;
symbol->creatorNode = node;
resultScope->symbols.Add(symbol->name, symbol);
}
BuildScopeForExpression(manager, resultScope, node->expression);
BuildScopeForStatement(manager, resultScope, node->trueBranch);
if (node->falseBranch)
{
BuildScopeForStatement(manager, resultScope, node->falseBranch);
}
}
void Visit(WfWhileStatement* node)override
{
BuildScopeForExpression(manager, parentScope, node->condition);
BuildScopeForStatement(manager, parentScope, node->statement);
}
void Visit(WfTryStatement* node)override
{
BuildScopeForStatement(manager, parentScope, node->protectedStatement);
if (node->catchStatement)
{
resultScope = new WfLexicalScope(parentScope);
Ptr<WfLexicalSymbol> symbol = new WfLexicalSymbol(resultScope.Obj());
symbol->name = node->name.value;
symbol->creatorNode = node;
{
auto system = MakePtr<WfTopQualifiedType>();
system->name.value = L"system";
auto exception = MakePtr<WfChildType>();
exception->parent = system;
exception->name.value = L"Exception";
auto sharedPtr = MakePtr<WfSharedPointerType>();
sharedPtr->element = exception;
symbol->type = sharedPtr;
}
resultScope->symbols.Add(symbol->name, symbol);
BuildScopeForStatement(manager, resultScope, node->catchStatement);
}
if (node->finallyStatement)
{
BuildScopeForStatement(manager, parentScope, node->finallyStatement);
}
}
void Visit(WfBlockStatement* node)override
{
resultScope = new WfLexicalScope(parentScope);
FOREACH(Ptr<WfStatement>, statement, node->statements)
{
BuildScopeForStatement(manager, resultScope, statement);
}
}
void Visit(WfExpressionStatement* node)override
{
BuildScopeForExpression(manager, parentScope, node->expression);
}
void Visit(WfVariableStatement* node)override
{
BuildScopeForDeclaration(manager, parentScope, node->variable, node);
}
void Visit(WfVirtualStatement* node)override
{
node->Accept((WfVirtualStatement::IVisitor*)this);
if (node->expandedStatement)
{
BuildScopeForStatement(manager, parentScope, node->expandedStatement);
}
}
void Visit(WfSwitchStatement* node)override
{
BuildScopeForExpression(manager, parentScope, node->expression);
FOREACH(Ptr<WfSwitchCase>, switchCase, node->caseBranches)
{
BuildScopeForExpression(manager, parentScope, switchCase->expression);
BuildScopeForStatement(manager, parentScope, switchCase->statement);
}
if (node->defaultBranch)
{
BuildScopeForStatement(manager, parentScope, node->defaultBranch);
}
}
void Visit(WfForEachStatement* node)override
{
resultScope = new WfLexicalScope(parentScope);
Ptr<WfLexicalSymbol> symbol = new WfLexicalSymbol(resultScope.Obj());
symbol->name = node->name.value;
symbol->creatorNode = node;
resultScope->symbols.Add(symbol->name, symbol);
BuildScopeForExpression(manager, parentScope, node->collection);
BuildScopeForStatement(manager, resultScope, node->statement);
}
void Visit(WfCoProviderStatement* node)override
{
resultScope = new WfLexicalScope(parentScope);
{
Ptr<WfLexicalSymbol> symbol = new WfLexicalSymbol(resultScope.Obj());
symbol->name = L"$PROVIDER";
symbol->creatorNode = node;
resultScope->symbols.Add(symbol->name, symbol);
}
{
Ptr<WfLexicalSymbol> symbol = new WfLexicalSymbol(resultScope.Obj());
symbol->name = L"$IMPL";
symbol->creatorNode = node;
resultScope->symbols.Add(symbol->name, symbol);
}
BuildScopeForStatement(manager, resultScope, node->statement);
}
void Visit(WfCoroutineStatement* node)override
{
node->Accept((WfCoroutineStatement::IVisitor*)this);
}
void Visit(WfCoPauseStatement* node)override
{
if (node->statement)
{
BuildScopeForStatement(manager, parentScope, node->statement);
}
}
void Visit(WfCoOperatorStatement* node)override
{
if (node->varName.value != L"")
{
Ptr<WfLexicalSymbol> symbol = new WfLexicalSymbol(parentScope.Obj());
symbol->name = node->varName.value;
symbol->creatorNode = node;
parentScope->symbols.Add(symbol->name, symbol);
}
FOREACH(Ptr<WfExpression>, argument, node->arguments)
{
BuildScopeForExpression(manager, parentScope, argument);
}
}
static Ptr<WfLexicalScope> Execute(WfLexicalScopeManager* manager, Ptr<WfLexicalScope> parentScope, Ptr<WfStatement> statement)
{
BuildScopeForStatementVisitor visitor(manager, parentScope);
statement->Accept(&visitor);
if (visitor.resultScope)
{
manager->nodeScopes.Add(statement.Obj(), visitor.resultScope);
visitor.resultScope->ownerNode = statement;
}
else
{
manager->nodeScopes.Add(statement.Obj(), parentScope);
}
return visitor.resultScope;
}
};
/***********************************************************************
BuildScopeForExpression
***********************************************************************/
class BuildScopeForExpressionVisitor
: public Object
, public WfExpression::IVisitor
, public WfVirtualExpression::IVisitor
{
public:
WfLexicalScopeManager* manager;
Ptr<WfLexicalScope> parentScope;
Ptr<WfLexicalScope> resultScope;
BuildScopeForExpressionVisitor(WfLexicalScopeManager* _manager, Ptr<WfLexicalScope> _parentScope)
:manager(_manager)
, parentScope(_parentScope)
{
}
void Visit(WfThisExpression* node)override
{
}
void Visit(WfTopQualifiedExpression* node)override
{
}
void Visit(WfReferenceExpression* node)override
{
}
void Visit(WfOrderedNameExpression* node)override
{
}
void Visit(WfOrderedLambdaExpression* node)override
{
manager->CreateLambdaCapture(node);
SortedList<vint> names;
SearchOrderedName(parentScope.Obj(), node->body, names);
resultScope = new WfLexicalScope(parentScope);
auto config = MakePtr<WfLexicalFunctionConfig>();
resultScope->functionConfig = config;
config->lambda = true;
config->thisAccessable = false;
config->parentThisAccessable = true;
FOREACH(vint, name, names)
{
Ptr<WfLexicalSymbol> symbol = new WfLexicalSymbol(resultScope.Obj());
symbol->name = L"$" + itow(name);
symbol->creatorNode = node;
resultScope->symbols.Add(symbol->name, symbol);
}
BuildScopeForExpression(manager, resultScope, node->body);
}
void Visit(WfMemberExpression* node)override
{
BuildScopeForExpression(manager, parentScope, node->parent);
}
void Visit(WfChildExpression* node)override
{
BuildScopeForExpression(manager, parentScope, node->parent);
}
void Visit(WfLiteralExpression* node)override
{
}
void Visit(WfFloatingExpression* node)override
{
}
void Visit(WfIntegerExpression* node)override
{
}
void Visit(WfStringExpression* node)override
{
}
void Visit(WfUnaryExpression* node)override
{
BuildScopeForExpression(manager, parentScope, node->operand);
}
void Visit(WfBinaryExpression* node)override
{
BuildScopeForExpression(manager, parentScope, node->first);
BuildScopeForExpression(manager, parentScope, node->second);
}
void Visit(WfLetExpression* node)override
{
resultScope = new WfLexicalScope(parentScope);
FOREACH(Ptr<WfLetVariable>, variable, node->variables)
{
Ptr<WfLexicalSymbol> symbol = new WfLexicalSymbol(resultScope.Obj());
symbol->name = variable->name.value;
symbol->creatorNode = node;
resultScope->symbols.Add(symbol->name, symbol);
BuildScopeForExpression(manager, resultScope, variable->value);
}
BuildScopeForExpression(manager, resultScope, node->expression);
}
void Visit(WfIfExpression* node)override
{
BuildScopeForExpression(manager, parentScope, node->condition);
BuildScopeForExpression(manager, parentScope, node->trueBranch);
BuildScopeForExpression(manager, parentScope, node->falseBranch);
}
void Visit(WfRangeExpression* node)override
{
BuildScopeForExpression(manager, parentScope, node->begin);
BuildScopeForExpression(manager, parentScope, node->end);
}
void Visit(WfSetTestingExpression* node)override
{
BuildScopeForExpression(manager, parentScope, node->element);
BuildScopeForExpression(manager, parentScope, node->collection);
}
void Visit(WfConstructorExpression* node)override
{
FOREACH(Ptr<WfConstructorArgument>, argument, node->arguments)
{
BuildScopeForExpression(manager, parentScope, argument->key);
if (argument->value)
{
BuildScopeForExpression(manager, parentScope, argument->value);
}
}
}
void Visit(WfInferExpression* node)override
{
BuildScopeForExpression(manager, parentScope, node->expression);
}
void Visit(WfTypeCastingExpression* node)override
{
BuildScopeForExpression(manager, parentScope, node->expression);
}
void Visit(WfTypeTestingExpression* node)override
{
if (node->expression)
{
BuildScopeForExpression(manager, parentScope, node->expression);
}
}
void Visit(WfTypeOfTypeExpression* node)override
{
}
void Visit(WfTypeOfExpressionExpression* node)override
{
BuildScopeForExpression(manager, parentScope, node->expression);
}
void Visit(WfAttachEventExpression* node)override
{
BuildScopeForExpression(manager, parentScope, node->event);
BuildScopeForExpression(manager, parentScope, node->function);
}
void Visit(WfDetachEventExpression* node)override
{
BuildScopeForExpression(manager, parentScope, node->event);
BuildScopeForExpression(manager, parentScope, node->handler);
}
void Visit(WfObserveExpression* node)override
{
BuildScopeForExpression(manager, parentScope, node->parent);
if (node->observeType == WfObserveType::SimpleObserve)
{
BuildScopeForExpression(manager, parentScope, node->expression);
FOREACH(Ptr<WfExpression>, event, node->events)
{
BuildScopeForExpression(manager, parentScope, event);
}
}
else
{
resultScope = new WfLexicalScope(parentScope);
{
Ptr<WfLexicalSymbol> symbol = new WfLexicalSymbol(resultScope.Obj());
symbol->name = node->name.value;
symbol->creatorNode = node;
resultScope->symbols.Add(symbol->name, symbol);
}
BuildScopeForExpression(manager, resultScope, node->expression);
FOREACH(Ptr<WfExpression>, event, node->events)
{
BuildScopeForExpression(manager, resultScope, event);
}
}
}
void Visit(WfCallExpression* node)override
{
BuildScopeForExpression(manager, parentScope, node->function);
FOREACH(Ptr<WfExpression>, argument, node->arguments)
{
BuildScopeForExpression(manager, parentScope, argument);
}
}
void Visit(WfFunctionExpression* node)override
{
manager->CreateLambdaCapture(node->function.Obj());
BuildScopeForDeclaration(manager, parentScope, node->function, node);
}
void Visit(WfNewClassExpression* node)override
{
FOREACH(Ptr<WfExpression>, argument, node->arguments)
{
BuildScopeForExpression(manager, parentScope, argument);
}
}
class CreateLambdaCaptureVisitor
: public empty_visitor::DeclarationVisitor
{
public:
WfLexicalScopeManager* manager;
Ptr<WfLexicalCapture> capture;
CreateLambdaCaptureVisitor(WfLexicalScopeManager* _manager, Ptr<WfLexicalCapture> _capture)
:manager(_manager)
, capture(_capture)
{
}
void Dispatch(WfVirtualDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, decl, node->expandedDeclarations)
{
decl->Accept(this);
}
}
void Visit(WfFunctionDeclaration* node)override
{
manager->CreateLambdaCapture(node, capture);
}
};
void Visit(WfNewInterfaceExpression* node)override
{
resultScope = new WfLexicalScope(parentScope);
auto capture = MakePtr<WfLexicalCapture>();
manager->CreateLambdaCapture(node, capture);
CreateLambdaCaptureVisitor visitor(manager, capture);
FOREACH(Ptr<WfDeclaration>, memberDecl, node->declarations)
{
memberDecl->Accept(&visitor);
BuildScopeForDeclaration(manager, resultScope, memberDecl, node);
}
}
void Visit(WfVirtualExpression* node)override
{
node->Accept((WfVirtualExpression::IVisitor*)this);
if (node->expandedExpression)
{
BuildScopeForExpression(manager, parentScope, node->expandedExpression);
}
}
void Visit(WfBindExpression* node)override
{
BuildScopeForExpression(manager, parentScope, node->expression);
}
void Visit(WfFormatExpression* node)override
{
}
void Visit(WfNewCoroutineExpression* node)override
{
manager->CreateLambdaCapture(node);
resultScope = new WfLexicalScope(parentScope);
auto config = MakePtr<WfLexicalFunctionConfig>();
resultScope->functionConfig = config;
if (node->name.value != L"")
{
Ptr<WfLexicalSymbol> symbol = new WfLexicalSymbol(resultScope.Obj());
symbol->name = node->name.value;
symbol->creatorNode = node;
symbol->typeInfo = TypeInfoRetriver<Ptr<CoroutineResult>>::CreateTypeInfo();
symbol->type = GetTypeFromTypeInfo(symbol->typeInfo.Obj());
resultScope->symbols.Add(symbol->name, symbol);
}
config->lambda = true;
config->thisAccessable = false;
config->parentThisAccessable = true;
BuildScopeForStatement(manager, resultScope, node->statement);
}
void Visit(WfMixinCastExpression* node)override
{
BuildScopeForExpression(manager, parentScope, node->expression);
}
static Ptr<WfLexicalScope> Execute(WfLexicalScopeManager* manager, Ptr<WfLexicalScope> parentScope, Ptr<WfExpression> expression)
{
BuildScopeForExpressionVisitor visitor(manager, parentScope);
expression->Accept(&visitor);
if (visitor.resultScope)
{
manager->nodeScopes.Add(expression.Obj(), visitor.resultScope);
visitor.resultScope->ownerNode = expression;
}
else
{
manager->nodeScopes.Add(expression.Obj(), parentScope);
}
return visitor.resultScope;
}
};
/***********************************************************************
BuildScope
***********************************************************************/
void BuildScopeForModule(WfLexicalScopeManager* manager, Ptr<WfModule> module)
{
Ptr<WfLexicalScope> scope = new WfLexicalScope(manager);
scope->ownerNode = module;
manager->nodeScopes.Add(module.Obj(), scope);
FOREACH(Ptr<WfDeclaration>, declaration, module->declarations)
{
BuildScopeForDeclaration(manager, scope, declaration, module.Obj());
}
}
void BuildScopeForDeclaration(WfLexicalScopeManager* manager, Ptr<WfLexicalScope> parentScope, Ptr<WfDeclaration> declaration, parsing::ParsingTreeCustomBase* source)
{
BuildScopeForDeclarationVisitor::Execute(manager, parentScope, source, declaration);
}
void BuildScopeForStatement(WfLexicalScopeManager* manager, Ptr<WfLexicalScope> parentScope, Ptr<WfStatement> statement)
{
BuildScopeForStatementVisitor::Execute(manager, parentScope, statement);
}
void BuildScopeForExpression(WfLexicalScopeManager* manager, Ptr<WfLexicalScope> parentScope, Ptr<WfExpression> expression)
{
BuildScopeForExpressionVisitor::Execute(manager, parentScope, expression);
}
/***********************************************************************
CheckScopes_DuplicatedSymbol
***********************************************************************/
bool CheckScopes_DuplicatedSymbol(WfLexicalScopeManager* manager)
{
SortedList<WfLexicalScope*> analyzedScopes;
vint errorCount = manager->errors.Count();
FOREACH(Ptr<WfLexicalScope>, scope, manager->nodeScopes.Values())
{
if (!analyzedScopes.Contains(scope.Obj()))
{
analyzedScopes.Add(scope.Obj());
for (vint i = 0; i < scope->symbols.Count(); i++)
{
const auto& symbols = scope->symbols.GetByIndex(i);
if (symbols.Count() > 1)
{
if (!scope->ownerNode.Cast<WfModule>() && !scope->ownerNode.Cast<WfNamespaceDeclaration>())
{
if (symbols.Count() > 1)
{
FOREACH(Ptr<WfLexicalSymbol>, symbol, From(symbols))
{
if (auto decl = symbol->creatorNode.Cast<WfDeclaration>())
{
if (!decl.Cast<WfFunctionDeclaration>())
{
manager->errors.Add(WfErrors::DuplicatedSymbol(decl.Obj(), symbol));
}
}
else if (auto arg = symbol->creatorNode.Cast<WfFunctionArgument>())
{
manager->errors.Add(WfErrors::DuplicatedSymbol(arg.Obj(), symbol));
}
else if (auto stat = symbol->creatorNode.Cast<WfStatement>())
{
manager->errors.Add(WfErrors::DuplicatedSymbol(stat.Obj(), symbol));
}
else if (auto expr = symbol->creatorNode.Cast<WfExpression>())
{
manager->errors.Add(WfErrors::DuplicatedSymbol(expr.Obj(), symbol));
}
}
}
}
}
}
}
}
return errorCount == manager->errors.Count();
}
}
}
}
/***********************************************************************
ANALYZER\WFANALYZER_COMPLETESCOPE.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace analyzer
{
using namespace collections;
using namespace parsing;
using namespace reflection;
using namespace reflection::description;
using namespace typeimpl;
/***********************************************************************
CompleteScopeForClassMember
***********************************************************************/
class CompleteScopeForClassMemberVisitor : public Object, public WfDeclaration::IVisitor
{
public:
WfLexicalScopeManager* manager;
Ptr<WfCustomType> td;
Ptr<WfClassDeclaration> classDecl;
CompleteScopeForClassMemberVisitor(WfLexicalScopeManager* _manager, Ptr<WfCustomType> _td, Ptr<WfClassDeclaration> _classDecl)
:manager(_manager)
, td(_td)
{
}
void Visit(WfNamespaceDeclaration* node)override
{
}
void Visit(WfFunctionDeclaration* node)override
{
auto scope = manager->nodeScopes[node];
auto info = manager->declarationMemberInfos[node].Cast<WfMethodBase>();
FOREACH(Ptr<WfFunctionArgument>, argument, node->arguments)
{
if (auto typeInfo = CreateTypeInfoFromType(scope.Obj(), argument->type))
{
auto paramInfo = MakePtr<ParameterInfoImpl>(info.Obj(), argument->name.value, typeInfo);
info->AddParameter(paramInfo);
}
}
if (auto typeInfo = CreateTypeInfoFromType(scope.Obj(), node->returnType))
{
info->SetReturn(typeInfo);
}
}
void Visit(WfVariableDeclaration* node)override
{
auto scope = manager->nodeScopes[node];
if (auto typeInfo = CreateTypeInfoFromType(scope.Obj(), node->type))
{
auto info = manager->declarationMemberInfos[node].Cast<WfField>();
info->SetReturn(typeInfo);
}
}
void Visit(WfEventDeclaration* node)override
{
auto scope = manager->nodeScopes[node];
auto type = MakePtr<WfFunctionType>();
{
auto voidType = MakePtr<WfPredefinedType>();
voidType->name = WfPredefinedTypeName::Void;
type->result = voidType;
}
FOREACH(Ptr<WfType>, argument, node->arguments)
{
type->arguments.Add(argument);
}
if (auto typeInfo = CreateTypeInfoFromType(scope.Obj(), type))
{
auto info = manager->declarationMemberInfos[node].Cast<WfEvent>();
info->SetHandlerType(typeInfo);
}
}
void Visit(WfPropertyDeclaration* node)override
{
auto scope = manager->nodeScopes[node];
auto info = manager->declarationMemberInfos[node].Cast<WfProperty>();
if (node->getter.value != L"")
{
info->SetGetter(dynamic_cast<MethodInfoImpl*>(td->GetMethodGroupByName(node->getter.value, false)->GetMethod(0)));
}
if (node->setter.value != L"")
{
info->SetSetter(dynamic_cast<MethodInfoImpl*>(td->GetMethodGroupByName(node->setter.value, false)->GetMethod(0)));
}
if (node->valueChangedEvent.value != L"")
{
info->SetValueChangedEvent(dynamic_cast<EventInfoImpl*>(td->GetEventByName(node->valueChangedEvent.value, false)));
}
}
void Visit(WfConstructorDeclaration* node)override
{
auto scope = manager->nodeScopes[node];
auto info = manager->declarationMemberInfos[node].Cast<WfClassConstructor>();
FOREACH(Ptr<WfFunctionArgument>, argument, node->arguments)
{
if (auto typeInfo = CreateTypeInfoFromType(scope.Obj(), argument->type))
{
auto paramInfo = MakePtr<ParameterInfoImpl>(info.Obj(), argument->name.value, typeInfo);
info->AddParameter(paramInfo);
}
}
}
void Visit(WfDestructorDeclaration* node)override
{
}
void Visit(WfClassDeclaration* node)override
{
CompleteScopeForDeclaration(manager, node);
}
void Visit(WfEnumDeclaration* node)override
{
CompleteScopeForDeclaration(manager, node);
}
void Visit(WfStructDeclaration* node)override
{
CompleteScopeForDeclaration(manager, node);
}
void Visit(WfVirtualDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, decl, node->expandedDeclarations)
{
decl->Accept(this);
}
}
static void Execute(WfLexicalScopeManager* manager, Ptr<WfCustomType> td, Ptr<WfClassDeclaration> classDecl, Ptr<WfDeclaration> memberDecl)
{
CompleteScopeForClassMemberVisitor visitor(manager, td, classDecl);
memberDecl->Accept(&visitor);
}
};
/***********************************************************************
CompleteScopeForDeclaration
***********************************************************************/
class CompleteScopeForDeclarationVisitor : public Object, public WfDeclaration::IVisitor
{
public:
WfLexicalScopeManager* manager;
Ptr<WfDeclaration> declaration;
CompleteScopeForDeclarationVisitor(WfLexicalScopeManager* _manager, Ptr<WfDeclaration> _declaration)
:manager(_manager)
, declaration(_declaration)
{
}
void Visit(WfNamespaceDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, decl, node->declarations)
{
CompleteScopeForDeclaration(manager, decl);
}
}
void Visit(WfFunctionDeclaration* node)override
{
}
void Visit(WfVariableDeclaration* node)override
{
}
void Visit(WfEventDeclaration* node)override
{
}
void Visit(WfPropertyDeclaration* node)override
{
}
void Visit(WfConstructorDeclaration* node)override
{
}
void Visit(WfDestructorDeclaration* node)override
{
}
void Visit(WfClassDeclaration* node)override
{
auto scope = manager->nodeScopes[node];
auto td = manager->declarationTypes[node].Cast<WfCustomType>();
if (node->baseTypes.Count() > 0)
{
FOREACH(Ptr<WfType>, baseType, node->baseTypes)
{
if (auto scopeName = GetScopeNameFromReferenceType(scope->parentScope.Obj(), baseType))
{
if (scopeName->typeDescriptor)
{
td->AddBaseType(scopeName->typeDescriptor);
}
}
}
}
else if (node->kind == WfClassKind::Class)
{
td->AddBaseType(description::GetTypeDescriptor<DescriptableObject>());
}
else if (node->kind == WfClassKind::Interface)
{
td->AddBaseType(description::GetTypeDescriptor<IDescriptable>());
}
if (node->kind == WfClassKind::Interface)
{
switch (node->constructorType)
{
case WfConstructorType::SharedPtr:
{
auto elementType = MakePtr<TypeDescriptorTypeInfo>(td.Obj(), TypeInfoHint::Normal);
auto pointerType = MakePtr<SharedPtrTypeInfo>(elementType);
auto ctor = MakePtr<WfInterfaceConstructor>(pointerType);
td->AddMember(ctor);
}
break;
case WfConstructorType::RawPtr:
{
auto elementType = MakePtr<TypeDescriptorTypeInfo>(td.Obj(), TypeInfoHint::Normal);
auto pointerType = MakePtr<RawPtrTypeInfo>(elementType);
auto ctor = MakePtr<WfInterfaceConstructor>(pointerType);
td->AddMember(ctor);
}
break;
default:;
}
}
FOREACH(Ptr<WfDeclaration>, memberDecl, node->declarations)
{
CompleteScopeForClassMember(manager, td, node, memberDecl);
}
}
void Visit(WfEnumDeclaration* node)override
{
auto td = manager->declarationTypes[node].Cast<WfEnum>();
Dictionary<WString, vuint64_t> items;
FOREACH(Ptr<WfEnumItem>, item, node->items)
{
vuint64_t value = 0;
switch (item->kind)
{
case WfEnumItemKind::Constant:
TypedValueSerializerProvider<vuint64_t>::Deserialize(item->number.value, value);
break;
case WfEnumItemKind::Intersection:
FOREACH(Ptr<WfEnumItemIntersection>, itemInt, item->intersections)
{
value |= items[itemInt->name.value];
}
break;
}
td->AddEnumItem(item->name.value, value);
items.Add(item->name.value, value);
}
}
void Visit(WfStructDeclaration* node)override
{
auto scope = manager->nodeScopes[node];
auto td = manager->declarationTypes[node].Cast<WfStruct>();
FOREACH(Ptr<WfStructMember>, member, node->members)
{
if (auto typeInfo = CreateTypeInfoFromType(scope.Obj(), member->type))
{
auto field = MakePtr<WfStructField>(td.Obj(), member->name.value);
field->SetReturn(typeInfo);
td->AddMember(field);
}
}
}
void Visit(WfVirtualDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, decl, node->expandedDeclarations)
{
decl->Accept(this);
}
}
static void Execute(WfLexicalScopeManager* manager, Ptr<WfDeclaration> declaration)
{
CompleteScopeForDeclarationVisitor visitor(manager, declaration);
declaration->Accept(&visitor);
}
};
/***********************************************************************
CheckBaseClass
***********************************************************************/
class CheckBaseClassDeclarationVisitor : public empty_visitor::DeclarationVisitor
{
public:
WfLexicalScopeManager* manager;
SortedList<ITypeDescriptor*> checkedInterfaces;
SortedList<ITypeDescriptor*> traversedInterfaces;
CheckBaseClassDeclarationVisitor(WfLexicalScopeManager* _manager)
:manager(_manager)
{
}
void Dispatch(WfVirtualDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, decl, node->expandedDeclarations)
{
decl->Accept(this);
}
}
void Visit(WfNamespaceDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, decl, node->declarations)
{
decl->Accept(this);
}
}
void CheckDuplicatedBaseClass(WfClassDeclaration* node, ITypeDescriptor* td)
{
List<ITypeDescriptor*> baseTypes;
SortedList<ITypeDescriptor*> duplicatedTypes;
baseTypes.Add(td);
for (vint i = 0; i < baseTypes.Count(); i++)
{
auto currentTd = baseTypes[i];
vint count = currentTd->GetBaseTypeDescriptorCount();
for (vint j = 0; j < count; j++)
{
auto baseTd = currentTd->GetBaseTypeDescriptor(j);
if (baseTd->GetTypeDescriptorFlags() == TypeDescriptorFlags::Class && baseTd != description::GetTypeDescriptor<DescriptableObject>())
{
if (baseTypes.Contains(baseTd))
{
if (!duplicatedTypes.Contains(baseTd))
{
duplicatedTypes.Add(baseTd);
manager->errors.Add(WfErrors::DuplicatedBaseClass(node, baseTd));
}
}
else
{
baseTypes.Add(baseTd);
}
}
}
}
}
void CheckDuplicatedBaseInterface(WfClassDeclaration* node, ITypeDescriptor* td)
{
if (traversedInterfaces.Contains(td))
{
manager->errors.Add(WfErrors::DuplicatedBaseInterface(node, td));
}
else
{
if (checkedInterfaces.Contains(td))
{
return;
}
checkedInterfaces.Add(td);
vint index = traversedInterfaces.Add(td);
vint count = td->GetBaseTypeDescriptorCount();
for (vint i = 0; i < count; i++)
{
CheckDuplicatedBaseInterface(node, td->GetBaseTypeDescriptor(i));
}
traversedInterfaces.RemoveAt(index);
}
}
void Visit(WfClassDeclaration* node)override
{
auto scope = manager->nodeScopes[node];
auto td = manager->declarationTypes[node].Obj();
FOREACH(Ptr<WfType>, baseType, node->baseTypes)
{
if (auto scopeName = GetScopeNameFromReferenceType(scope->parentScope.Obj(), baseType))
{
if (auto baseTd = scopeName->typeDescriptor)
{
bool isClass = baseTd->GetTypeDescriptorFlags() == TypeDescriptorFlags::Class;
bool isInterface = baseTd->GetTypeDescriptorFlags() == TypeDescriptorFlags::Interface;
switch (node->kind)
{
case WfClassKind::Class:
{
if (!isClass || !baseTd->IsAggregatable())
{
if (!dynamic_cast<WfClass*>(baseTd))
{
manager->errors.Add(WfErrors::WrongBaseTypeOfClass(node, baseTd));
}
}
}
break;
case WfClassKind::Interface:
{
if (!isInterface)
{
manager->errors.Add(WfErrors::WrongBaseTypeOfInterface(node, baseTd));
}
}
break;
}
}
}
}
if (node->kind == WfClassKind::Class)
{
CheckDuplicatedBaseClass(node, td);
}
else
{
CheckDuplicatedBaseInterface(node, td);
}
FOREACH(Ptr<WfDeclaration>, memberDecl, node->declarations)
{
memberDecl->Accept(this);
}
}
void Visit(WfEnumDeclaration* node)override
{
}
void Visit(WfStructDeclaration* node)override
{
}
static void Execute(WfLexicalScopeManager* manager, Ptr<WfDeclaration> declaration)
{
CompleteScopeForDeclarationVisitor visitor(manager, declaration);
declaration->Accept(&visitor);
}
};
/***********************************************************************
CompleteScope
***********************************************************************/
void CompleteScopeForClassMember(WfLexicalScopeManager* manager, Ptr<WfCustomType> td, Ptr<WfClassDeclaration> classDecl, Ptr<WfDeclaration> memberDecl)
{
CompleteScopeForClassMemberVisitor::Execute(manager, td, classDecl, memberDecl);
}
void CompleteScopeForDeclaration(WfLexicalScopeManager* manager, Ptr<WfDeclaration> declaration)
{
CompleteScopeForDeclarationVisitor::Execute(manager, declaration);
}
void CompleteScopeForModule(WfLexicalScopeManager* manager, Ptr<WfModule> module)
{
FOREACH(Ptr<WfDeclaration>, declaration, module->declarations)
{
CompleteScopeForDeclaration(manager, declaration);
}
}
/***********************************************************************
CheckScopes_SymbolType
***********************************************************************/
bool CheckScopes_SymbolType(WfLexicalScopeManager* manager)
{
SortedList<WfLexicalScope*> analyzedScopes;
vint errorCount = manager->errors.Count();
FOREACH(Ptr<WfLexicalScope>, scope, manager->nodeScopes.Values())
{
if (!analyzedScopes.Contains(scope.Obj()))
{
analyzedScopes.Add(scope.Obj());
for (vint i = 0; i < scope->symbols.Count(); i++)
{
FOREACH(Ptr<WfLexicalSymbol>, symbol, scope->symbols.GetByIndex(i))
{
if (symbol->type)
{
symbol->typeInfo = CreateTypeInfoFromType(scope.Obj(), symbol->type);
}
}
}
}
}
return errorCount == manager->errors.Count();
}
/***********************************************************************
CheckScopes_BaseType
***********************************************************************/
bool CheckScopes_BaseType(WfLexicalScopeManager* manager)
{
vint errorCount = manager->errors.Count();
CheckBaseClassDeclarationVisitor visitor(manager);
FOREACH(Ptr<WfModule>, module, manager->GetModules())
{
FOREACH(Ptr<WfDeclaration>, declaration, module->declarations)
{
declaration->Accept(&visitor);
}
}
return errorCount == manager->errors.Count();
}
}
}
}
/***********************************************************************
ANALYZER\WFANALYZER_CONTEXTFREEDESUGAR.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace analyzer
{
using namespace collections;
using namespace parsing;
using namespace reflection::description;
/***********************************************************************
SetCodeRange
***********************************************************************/
class SetCodeRangeVisitor : public traverse_visitor::ModuleVisitor
{
public:
ParsingTextRange range;
SetCodeRangeVisitor(ParsingTextRange _range)
:range(_range)
{
}
void Traverse(ParsingTreeCustomBase* node)override
{
if (node->codeRange == ParsingTextRange())
{
node->codeRange = range;
}
}
void Traverse(ParsingToken& token)override
{
if (token.codeRange == ParsingTextRange())
{
token.codeRange = range;
}
}
};
void SetCodeRange(Ptr<WfType> node, parsing::ParsingTextRange codeRange)
{
SetCodeRangeVisitor(codeRange).VisitField(node.Obj());
}
void SetCodeRange(Ptr<WfExpression> node, parsing::ParsingTextRange codeRange)
{
SetCodeRangeVisitor(codeRange).VisitField(node.Obj());
}
void SetCodeRange(Ptr<WfStatement> node, parsing::ParsingTextRange codeRange)
{
SetCodeRangeVisitor(codeRange).VisitField(node.Obj());
}
void SetCodeRange(Ptr<WfDeclaration> node, parsing::ParsingTextRange codeRange)
{
SetCodeRangeVisitor(codeRange).VisitField(node.Obj());
}
void SetCodeRange(Ptr<WfModule> node, parsing::ParsingTextRange codeRange)
{
SetCodeRangeVisitor(codeRange).VisitField(node.Obj());
}
/***********************************************************************
ContextFreeModuleDesugar
***********************************************************************/
class ContextFreeDesugarVisitor : public traverse_visitor::ModuleVisitor
{
public:
WfLexicalScopeManager* manager;
WfClassDeclaration* surroundingClassDecl = nullptr;
WfNewInterfaceExpression* surroundingLambda = nullptr;
ContextFreeDesugarVisitor(WfLexicalScopeManager* _manager)
:manager(_manager)
{
}
void Traverse(WfFormatExpression* node)override
{
if (node->expandedExpression)
{
return;
}
List<Ptr<WfExpression>> expressions;
const wchar_t* reading = node->value.value.Buffer();
while (*reading)
{
const wchar_t* begin = wcsstr(reading, L"$(");
if (begin)
{
Ptr<WfStringExpression> expression = new WfStringExpression;
expression->codeRange = node->codeRange;
expression->value.value = WString(reading, vint(begin - reading));
expressions.Add(expression);
}
else
{
break;
}
const wchar_t* end = begin + 2;
vint counter = 1;
while (wchar_t c = *end++)
{
switch (c)
{
case L'(':
counter++;
break;
case L')':
counter--;
break;
}
if (counter == 0)
{
break;
}
}
if (counter != 0)
{
auto error = WfErrors::WrongFormatStringSyntax(node);
error->errorMessage += L" (Does not find matched close bracket.)";
manager->errors.Add(error);
return;
}
else
{
WString input(begin + 2, vint(end - begin - 3));
List<Ptr<ParsingError>> errors;
if (auto expression = WfParseExpression(input, manager->parsingTable, errors))
{
expressions.Add(expression);
}
FOREACH(Ptr<ParsingError>, originalError, errors)
{
auto error = WfErrors::WrongFormatStringSyntax(node);
error->errorMessage += L" (" + originalError->errorMessage + L")";
manager->errors.Add(error);
}
reading = end;
}
}
if (*reading || expressions.Count() == 0)
{
Ptr<WfStringExpression> expression = new WfStringExpression;
expression->codeRange = node->codeRange;
expression->value.value = reading;
expressions.Add(expression);
}
if (expressions.Count() > 0)
{
Ptr<WfExpression> current = expressions[0];
FOREACH(Ptr<WfExpression>, expression, From(expressions).Skip(1))
{
Ptr<WfBinaryExpression> binary = new WfBinaryExpression;
binary->codeRange = node->codeRange;
binary->first = current;
binary->second = expression;
binary->op = WfBinaryOperator::Union;
current = binary;
}
node->expandedExpression = current;
SetCodeRange(node->expandedExpression, node->codeRange);
}
}
void Traverse(WfAutoPropertyDeclaration* node)override
{
if (node->expandedDeclarations.Count() > 0)
{
return;
}
bool needVariable = false;
bool needVirtual = false;
bool needEvent = false;
bool needProperty = false;
if (surroundingClassDecl)
{
switch (surroundingClassDecl->kind)
{
case WfClassKind::Class:
{
needVariable = true;
needVirtual = false;
needEvent = node->configObserve == WfAPObserve::Observable;
needProperty = true;
}
break;
case WfClassKind::Interface:
{
needVariable = false;
needVirtual = true;
needEvent = node->configObserve == WfAPObserve::Observable;
needProperty = true;
}
break;
}
}
else if (surroundingLambda)
{
needVariable = true;
needVirtual = false;
needEvent = false;
needProperty = false;
}
auto varName = L"<prop>" + node->name.value;
auto getterName = L"Get" + node->name.value;
auto setterName = L"Set" + node->name.value;
auto eventName = node->name.value + L"Changed";
if (needVariable && node->expression)
{
auto decl = MakePtr<WfVariableDeclaration>();
node->expandedDeclarations.Add(decl);
decl->name.value = varName;
decl->type = CopyType(node->type);
decl->expression = CopyExpression(node->expression);
auto att = MakePtr<WfAttribute>();
att->category.value = L"cpp";
att->name.value = L"Private";
decl->attributes.Add(att);
}
{
auto decl = MakePtr<WfFunctionDeclaration>();
node->expandedDeclarations.Add(decl);
decl->anonymity = WfFunctionAnonymity::Named;
decl->name.value = getterName;
decl->returnType = CopyType(node->type);
if (!needVirtual)
{
auto refExpr = MakePtr<WfReferenceExpression>();
refExpr->name.value = varName;
auto returnStat = MakePtr<WfReturnStatement>();
returnStat->expression = refExpr;
auto block = MakePtr<WfBlockStatement>();
block->statements.Add(returnStat);
decl->statement = block;
}
}
if (!needVirtual || node->configConst == WfAPConst::Writable)
{
auto decl = MakePtr<WfFunctionDeclaration>();
node->expandedDeclarations.Add(decl);
decl->anonymity = WfFunctionAnonymity::Named;
decl->name.value = setterName;
if (node->configConst == WfAPConst::Readonly)
{
auto att = MakePtr<WfAttribute>();
att->category.value = L"cpp";
att->name.value = L"Protected";
decl->attributes.Add(att);
}
{
auto argument = MakePtr<WfFunctionArgument>();
argument->name.value = L"<value>";
argument->type = CopyType(node->type);
decl->arguments.Add(argument);
}
{
auto voidType = MakePtr<WfPredefinedType>();
voidType->name = WfPredefinedTypeName::Void;
decl->returnType = voidType;
}
if (!needVirtual)
{
auto block = MakePtr<WfBlockStatement>();
decl->statement = block;
auto createBinaryExpr = [&](WfBinaryOperator op)
{
auto refArgument = MakePtr<WfReferenceExpression>();
refArgument->name.value = L"<value>";
auto refVar = MakePtr<WfReferenceExpression>();
refVar->name.value = varName;
auto binaryExpr = MakePtr<WfBinaryExpression>();
binaryExpr->first = refVar;
binaryExpr->second = refArgument;
binaryExpr->op = op;
return binaryExpr;
};
if (node->configObserve == WfAPObserve::Observable)
{
auto ifStat = MakePtr<WfIfStatement>();
ifStat->expression = createBinaryExpr(WfBinaryOperator::NE);
auto trueBlock = MakePtr<WfBlockStatement>();
ifStat->trueBranch = trueBlock;
{
auto stat = MakePtr<WfExpressionStatement>();
stat->expression = createBinaryExpr(WfBinaryOperator::Assign);
trueBlock->statements.Add(stat);
}
{
auto refEvent = MakePtr<WfReferenceExpression>();
refEvent->name.value = eventName;
auto callExpr = MakePtr<WfCallExpression>();
callExpr->function = refEvent;
auto stat = MakePtr<WfExpressionStatement>();
stat->expression = callExpr;
trueBlock->statements.Add(stat);
}
block->statements.Add(ifStat);
}
else
{
auto stat = MakePtr<WfExpressionStatement>();
stat->expression = createBinaryExpr(WfBinaryOperator::Assign);
block->statements.Add(stat);
}
}
}
if (needEvent)
{
auto decl = MakePtr<WfEventDeclaration>();
node->expandedDeclarations.Add(decl);
decl->name.value = eventName;
}
if (needProperty)
{
auto decl = MakePtr<WfPropertyDeclaration>();
node->expandedDeclarations.Add(decl);
decl->type = CopyType(node->type);
decl->name.value = node->name.value;
decl->getter.value = getterName;
if (node->configConst == WfAPConst::Writable)
{
decl->setter.value = setterName;
}
if (node->configObserve == WfAPObserve::Observable)
{
decl->valueChangedEvent.value = eventName;
}
}
FOREACH(Ptr<WfDeclaration>, decl, node->expandedDeclarations)
{
auto classMember = MakePtr<WfClassMember>();
decl->classMember = classMember;
classMember->kind = WfClassMemberKind::Normal;
if (surroundingLambda)
{
if (decl->name.value == getterName)
{
classMember->kind = WfClassMemberKind::Override;
}
else if (decl->name.value == setterName)
{
if (node->configConst == WfAPConst::Writable)
{
classMember->kind = WfClassMemberKind::Override;
}
}
}
SetCodeRange(decl, node->codeRange);
}
}
void Traverse(WfCastResultInterfaceDeclaration* node)override
{
if (node->expandedDeclarations.Count() > 0)
{
return;
}
auto decl = MakePtr<WfClassDeclaration>();
node->expandedDeclarations.Add(decl);
decl->kind = WfClassKind::Interface;
decl->constructorType = WfConstructorType::SharedPtr;
decl->name.value = node->name.value;
decl->baseTypes.Add(CopyType(node->baseType));
auto funcDecl = MakePtr<WfFunctionDeclaration>();
decl->declarations.Add(funcDecl);
{
funcDecl->classMember = MakePtr<WfClassMember>();
funcDecl->classMember->kind = WfClassMemberKind::Static;
}
funcDecl->anonymity = WfFunctionAnonymity::Named;
funcDecl->name.value = L"CastResult";
funcDecl->returnType = CopyType(node->elementType);
{
auto argument = MakePtr<WfFunctionArgument>();
funcDecl->arguments.Add(argument);
argument->name.value = L"value";
argument->type = GetTypeFromTypeInfo(TypeInfoRetriver<Value>::CreateTypeInfo().Obj());
}
{
auto block = MakePtr<WfBlockStatement>();
funcDecl->statement = block;
auto refValue = MakePtr<WfReferenceExpression>();
refValue->name.value = L"value";
auto castExpr = MakePtr<WfTypeCastingExpression>();
castExpr->strategy = WfTypeCastingStrategy::Strong;
castExpr->type = CopyType(node->elementType);
castExpr->expression = refValue;
auto stat = MakePtr<WfReturnStatement>();
stat->expression = castExpr;
block->statements.Add(stat);
}
SetCodeRange(Ptr<WfDeclaration>(decl), node->codeRange);
}
#define PUSH_SURROUNDING\
auto o1 = surroundingClassDecl;\
auto o2 = surroundingLambda;\
surroundingClassDecl = nullptr;\
surroundingLambda = nullptr;\
#define POP_SURROUNDING\
surroundingClassDecl = o1;\
surroundingLambda = o2;\
void Visit(WfClassDeclaration* node)override
{
PUSH_SURROUNDING
surroundingClassDecl = node;
traverse_visitor::DeclarationVisitor::Visit(node);
POP_SURROUNDING
}
void Visit(WfNewInterfaceExpression* node)override
{
PUSH_SURROUNDING
surroundingLambda = node;
traverse_visitor::ExpressionVisitor::Visit(node);
POP_SURROUNDING
}
#undef PUSH_SURROUNDING
#undef POP_SURROUNDING
};
void ContextFreeModuleDesugar(WfLexicalScopeManager* manager, Ptr<WfModule> module)
{
ContextFreeDesugarVisitor(manager).VisitField(module.Obj());
}
void ContextFreeDeclarationDesugar(WfLexicalScopeManager* manager, Ptr<WfDeclaration> declaration)
{
ContextFreeDesugarVisitor(manager).VisitField(declaration.Obj());
}
void ContextFreeStatementDesugar(WfLexicalScopeManager* manager, Ptr<WfStatement> statement)
{
ContextFreeDesugarVisitor(manager).VisitField(statement.Obj());
}
void ContextFreeExpressionDesugar(WfLexicalScopeManager* manager, Ptr<WfExpression> expression)
{
ContextFreeDesugarVisitor(manager).VisitField(expression.Obj());
}
}
}
}
/***********************************************************************
ANALYZER\WFANALYZER_ERRORS.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace analyzer
{
using namespace collections;
using namespace parsing;
using namespace reflection;
using namespace reflection::description;
/***********************************************************************
WfErrors
***********************************************************************/
Ptr<parsing::ParsingError> WfErrors::WrongFormatStringSyntax(WfExpression* node)
{
return new ParsingError(node, L"A0: Wrong format string syntax.");
}
Ptr<parsing::ParsingError> WfErrors::WrongSimpleObserveExpression(WfExpression* node)
{
return new ParsingError(node, L"A1: Simple observe expression should observe a property under the observed object.");
}
Ptr<parsing::ParsingError> WfErrors::WrongSimpleObserveEvent(WfExpression* node)
{
return new ParsingError(node, L"A2: Simple observe expression should react to an event under the observed object.");
}
Ptr<parsing::ParsingError> WfErrors::EmptyObserveEvent(WfExpression* node)
{
return new ParsingError(node, L"A2: Observe expression should react to at least one event.");
}
Ptr<parsing::ParsingError> WfErrors::ObserveNotInBind(WfExpression* node)
{
return new ParsingError(node, L"A3: Observe expression should appear in a bind expression.");
}
Ptr<parsing::ParsingError> WfErrors::ObserveInObserveEvent(WfExpression* node)
{
return new ParsingError(node, L"A4: Observe expression should not appear in the event expression in another observe expression.");
}
Ptr<parsing::ParsingError> WfErrors::BindInBind(WfExpression* node)
{
return new ParsingError(node, L"A4: Bind expression should not appear in another bind expression.");
}
Ptr<parsing::ParsingError> WfErrors::AttachInBind(WfExpression* node)
{
return new ParsingError(node, L"A4: Attach expression should not appear in another bind expression.");
}
Ptr<parsing::ParsingError> WfErrors::DetachInBind(WfExpression* node)
{
return new ParsingError(node, L"A4: Detach expression should not appear in another bind expression.");
}
Ptr<parsing::ParsingError> WfErrors::ConstructorMixMapAndList(WfExpression* node)
{
return new ParsingError(node, L"A5: Key-value pairs are not allowed in list constructor expression.");
}
Ptr<parsing::ParsingError> WfErrors::ConstructorMixStructAndList(WfExpression* node)
{
return new ParsingError(node, L"A5: Field-value pairs are expected in struct constructor expression.");
}
Ptr<parsing::ParsingError> WfErrors::DuplicatedConstructorField(WfReferenceExpression* node)
{
return new ParsingError(node, L"A5: The same field cannot be assigned more than once in struct constructor expression.");
}
Ptr<parsing::ParsingError> WfErrors::ConstructorMixClassAndInterface(WfNewClassExpression* node)
{
return new ParsingError(node, L"A6: Arguments are not allowed in new interface expression.");
}
Ptr<parsing::ParsingError> WfErrors::ConstructorMixClassAndInterface(WfNewInterfaceExpression* node)
{
return new ParsingError(node, L"A6: Members are not allowed in new class expression.");
}
Ptr<parsing::ParsingError> WfErrors::ScopeNameIsNotExpression(WfExpression* node, Ptr<WfLexicalScopeName> scopeName)
{
return new ParsingError(node, L"A7: Symbol \"" + scopeName->GetFriendlyName() + L"\" cannot be used as an expression.");
}
Ptr<parsing::ParsingError> WfErrors::EventIsNotExpression(WfExpression* node, reflection::description::IEventInfo* eventInfo)
{
return new ParsingError(node, L"A7: Event \"" + eventInfo->GetName() + L"\" of type \"" + eventInfo->GetOwnerTypeDescriptor()->GetTypeName() + L"\" cannot be used as an expression.");
}
Ptr<parsing::ParsingError> WfErrors::ExpressionIsNotScopeName(WfExpression* node)
{
return new ParsingError(node, L"A8: Expression does not reference to a declaration.");
}
Ptr<parsing::ParsingError> WfErrors::ExpressionIsNotEvent(WfExpression* node)
{
return new ParsingError(node, L"A8: Expression does not reference to an event.");
}
Ptr<parsing::ParsingError> WfErrors::ExpressionCannotResolveType(WfExpression* node, Ptr<WfLexicalSymbol> symbol)
{
return new ParsingError(node, L"A9: Expression referencing to symbol \"" + symbol->name + L"\" failed to resolve its type.");
}
Ptr<parsing::ParsingError> WfErrors::NullCannotResolveType(WfExpression* node)
{
return new ParsingError(node, L"A9: Expression \"null\" failed to resolve its type.");
}
Ptr<parsing::ParsingError> WfErrors::ConstructorCannotResolveType(WfExpression* node)
{
return new ParsingError(node, L"A9: Expression \"{}\" failed to resolve its type.");
}
Ptr<parsing::ParsingError> WfErrors::OrderedLambdaCannotResolveType(WfExpression* node)
{
return new ParsingError(node, L"A9: Ordered lambda expression failed to resolve its type.");
}
Ptr<parsing::ParsingError> WfErrors::NullCannotImplicitlyConvertToType(WfExpression* node, reflection::description::ITypeInfo* toType)
{
return new ParsingError(node, L"A10: Expression \"null\" cannot implicitly convert to \"" + toType->GetTypeFriendlyName() + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::ConstructorCannotImplicitlyConvertToType(WfExpression* node, reflection::description::ITypeInfo* toType)
{
return new ParsingError(node, L"A10: Expression \"{}\" cannot implicitly convert to \"" + toType->GetTypeFriendlyName() + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::OrderedLambdaCannotImplicitlyConvertToType(WfExpression* node, reflection::description::ITypeInfo* toType)
{
return new ParsingError(node, L"A10: Ordered lambda expression cannot implicitly convert to \"" + toType->GetTypeFriendlyName() + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::ExpressionCannotImplicitlyConvertToType(WfExpression* node, reflection::description::ITypeInfo* fromType, reflection::description::ITypeInfo* toType)
{
return new ParsingError(node, L"A10: Expression of type \"" + fromType->GetTypeFriendlyName() + L"\" cannot implicitly convert to \"" + toType->GetTypeFriendlyName() + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::ExpressionCannotExplicitlyConvertToType(WfExpression* node, reflection::description::ITypeInfo* fromType, reflection::description::ITypeInfo* toType)
{
return new ParsingError(node, L"A11: Expression of type \"" + fromType->GetTypeFriendlyName() + L"\" cannot explicitly convert to \"" + toType->GetTypeFriendlyName() + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::CannotWeakCastToType(WfExpression* node, reflection::description::ITypeInfo* toType)
{
return new ParsingError(node, L"A12: Expression cannot weakly cast to \"" + toType->GetTypeFriendlyName() + L"\" because it cannot be \"null\".");
}
Ptr<parsing::ParsingError> WfErrors::IntegerLiteralOutOfRange(WfIntegerExpression* node)
{
return new ParsingError(node, L"A13: Integer literal \"" + node->value.value + L"\" out of range.");
}
Ptr<parsing::ParsingError> WfErrors::CannotMergeTwoType(WfExpression* node, reflection::description::ITypeInfo* firstType, reflection::description::ITypeInfo* secondType)
{
return new ParsingError(node, L"A14: Failed to merge type \"" + firstType->GetTypeFriendlyName() + L"\" with type \"" + secondType->GetTypeFriendlyName() + L"\" together to calculate the result type.");
}
Ptr<parsing::ParsingError> WfErrors::RangeShouldBeInteger(WfExpression* node, reflection::description::ITypeInfo* type)
{
return new ParsingError(node, L"A15: Elements in a range expression should be integer, not \"" + type->GetTypeFriendlyName() + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::UnaryOperatorOnWrongType(WfUnaryExpression* node, reflection::description::ITypeInfo* type)
{
return new ParsingError(node, L"A16: Unary operator cannot apply on expression of type \"" + type->GetTypeFriendlyName() + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::BinaryOperatorOnWrongType(WfBinaryExpression* node, reflection::description::ITypeInfo* type)
{
return new ParsingError(node, L"A16: Binary operator cannot apply on expression of type \"" + type->GetTypeFriendlyName() + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::IndexOperatorOnWrongType(WfBinaryExpression* node, reflection::description::ITypeInfo* containerType)
{
return new ParsingError(node, L"A17: Container of type \"" + containerType->GetTypeFriendlyName() + L"\" cannot be accessed using index.");
}
Ptr<parsing::ParsingError> WfErrors::ExpressionIsNotCollection(WfExpression* node, reflection::description::ITypeInfo* type)
{
return new ParsingError(node, L"A18: Expression of type \"" + type->GetTypeFriendlyName() + L"\" is not an enumerable type.");
}
Ptr<parsing::ParsingError> WfErrors::ExpressionIsNotFunction(WfExpression* node, reflection::description::ITypeInfo* type)
{
return new ParsingError(node, L"A19: Expression of type \"" + type->GetTypeFriendlyName() + L"\" is not an invokable function type.");
}
Ptr<parsing::ParsingError> WfErrors::FunctionArgumentCountMismatched(parsing::ParsingTreeCustomBase* node, vint expectedCount, const ResolveExpressionResult& function)
{
return new ParsingError(node, L"A20: Function " + function.GetFriendlyName() + L"\" is not allowed to call with " + itow(expectedCount) + L" arguments.");
}
Ptr<parsing::ParsingError> WfErrors::FunctionArgumentTypeMismatched(parsing::ParsingTreeCustomBase* node, const ResolveExpressionResult& function, vint index, reflection::description::ITypeInfo* fromType, reflection::description::ITypeInfo* toType)
{
return new ParsingError(node, L"A21: The " + itow(index) + L"-th argument of function " + function.GetFriendlyName() + L" cannot implicitly convert from \"" + fromType->GetTypeFriendlyName() + L"\" to \"" + toType->GetTypeFriendlyName() + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::CannotPickOverloadedFunctions(parsing::ParsingTreeCustomBase* node, collections::List<ResolveExpressionResult>& results)
{
WString description;
FOREACH_INDEXER(ResolveExpressionResult, result, index, results)
{
description += L"\r\n\t";
description += result.GetFriendlyName();
}
return new ParsingError(node, L"A22: Cannot decide which function to call in multiple targets: " + description + L".");
}
Ptr<parsing::ParsingError> WfErrors::ClassContainsNoConstructor(WfExpression* node, reflection::description::ITypeInfo* type)
{
return new ParsingError(node, L"A23: Class \"" + type->GetTypeFriendlyName() + L"\" does not contain any constructor.");
}
Ptr<parsing::ParsingError> WfErrors::InterfaceContainsNoConstructor(WfExpression* node, reflection::description::ITypeInfo* type)
{
Ptr<ITypeInfo> proxy = TypeInfoRetriver<Ptr<IValueInterfaceProxy>>::CreateTypeInfo();
return new ParsingError(node, L"A23: Interface \"" + type->GetTypeFriendlyName() + L"\" does not contain any constructor receiving an \"" + proxy->GetTypeFriendlyName() + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::ConstructorReturnTypeMismatched(WfExpression* node, const ResolveExpressionResult& function, reflection::description::ITypeInfo* fromType, reflection::description::ITypeInfo* toType)
{
return new ParsingError(node, L"A24: The return type of " + function.GetFriendlyName() + L" cannot implicitly convert from \"" + fromType->GetTypeFriendlyName() + L"\" to \"" + toType->GetTypeFriendlyName() + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::ExpressionIsNotLeftValue(WfExpression* node, const ResolveExpressionResult& result)
{
return new ParsingError(node, L"A25: " + result.GetFriendlyName(true) + L" is not assignable.");
}
Ptr<parsing::ParsingError> WfErrors::CannotCallMemberOutsideOfClass(WfExpression* node, const ResolveExpressionResult& result)
{
return new ParsingError(node, L"A26: " + result.GetFriendlyName(true) + L" cannot be called as a static member.");
}
Ptr<parsing::ParsingError> WfErrors::CannotCallMemberInStaticFunction(WfExpression* node, const ResolveExpressionResult& result)
{
return new ParsingError(node, L"A27: " + result.GetFriendlyName(true) + L" cannot be called in static functions of its class or interface.");
}
Ptr<parsing::ParsingError> WfErrors::FieldCannotInitializeUsingEachOther(WfExpression* node, const ResolveExpressionResult& result)
{
return new ParsingError(node, L"A28: " + result.GetFriendlyName(true) + L" cannot be used to initialize other fields in the same type or new interface expression.");
}
Ptr<parsing::ParsingError> WfErrors::WrongThisExpression(WfExpression* node)
{
return new ParsingError(node, L"A29: The \"this\" expression can only be used in class methods or functions in new interface expressions");
}
Ptr<parsing::ParsingError> WfErrors::IncorrectTypeForUnion(WfExpression* node, reflection::description::ITypeInfo* type)
{
return new ParsingError(node, L"A30: Expression of type \"" + type->GetTypeFriendlyName() + L"\" cannot be used in union (&) expression because it is not string or flag enum.");
}
Ptr<parsing::ParsingError> WfErrors::IncorrectTypeForIntersect(WfExpression* node, reflection::description::ITypeInfo* type)
{
return new ParsingError(node, L"A30: Expression of type \"" + type->GetTypeFriendlyName() + L"\" cannot be used in intersect (|) expression because it is not flag enum.");
}
Ptr<parsing::ParsingError> WfErrors::ExpressionIsNotConstant(WfExpression* node)
{
return new ParsingError(node, L"A31: Expression is not constant. A constant expression consists of:\r\n"
L"\tconstant primitive values\r\n"
L"\tenum items\r\n"
L"\tconstant unary (+, -, not) expressions\r\n"
L"\tconstant binary (|) expressions\r\n"
L"\tconstant range expressions\r\n"
L"\tconstant constructor expressions (to create values of structs, lists or dictionarys)\r\n"
L"\ttype() or typeof() expressions.");
}
Ptr<parsing::ParsingError> WfErrors::WrongMixinTargetType(WfExpression* node, reflection::description::ITypeInfo* fromType, reflection::description::ITypeInfo* toType)
{
return new ParsingError(node, L"A32: Mixin cast cannot implicitly convert from \"" + fromType->GetTypeFriendlyName() + L"\" to \"" + toType->GetTypeFriendlyName() + L"\". It is only for converting from an interface to a derived interface.");
}
Ptr<parsing::ParsingError> WfErrors::WrongVoidType(WfType* node)
{
return new ParsingError(node, L"B0: Void is not a type for a value.");
}
Ptr<parsing::ParsingError> WfErrors::WrongInterfaceType(WfType* node)
{
return new ParsingError(node, L"B1: Interface is not a type for a value.");
}
Ptr<parsing::ParsingError> WfErrors::RawPointerToNonReferenceType(WfType* node, reflection::description::ITypeInfo* typeInfo)
{
return new ParsingError(node, L"B2: A raw pointer" + (typeInfo ? L" \"" + typeInfo->GetTypeFriendlyName() + L"\"" : L"") + L" should point to a class or interface.");
}
Ptr<parsing::ParsingError> WfErrors::SharedPointerToNonReferenceType(WfType* node, reflection::description::ITypeInfo* typeInfo)
{
return new ParsingError(node, L"B3: A shared pointer" + (typeInfo ? L" \"" + typeInfo->GetTypeFriendlyName() + L"\"" : L"") + L" should point to a class or interface.");
}
Ptr<parsing::ParsingError> WfErrors::NullableToNonReferenceType(WfType* node, reflection::description::ITypeInfo* typeInfo)
{
return new ParsingError(node, L"B4: A nullable value" + (typeInfo ? L" \"" + typeInfo->GetTypeFriendlyName() + L"\"" : L"") + L" should point to a struct.");
}
Ptr<parsing::ParsingError> WfErrors::ChildOfNonReferenceType(WfType* node)
{
return new ParsingError(node, L"B5: Only a reference type have child types.");
}
Ptr<parsing::ParsingError> WfErrors::TypeNotExists(WfType* node, Ptr<WfLexicalScopeName> scopeName)
{
return new ParsingError(node, L"B6: \"" + scopeName->GetFriendlyName() + L"\" is not a type.");
}
Ptr<parsing::ParsingError> WfErrors::TypeNotExists(WfType* node, Ptr<WfLexicalSymbol> symbol)
{
return new ParsingError(node, L"B6: \"" + symbol->name + L"\" is not a type.");
}
Ptr<parsing::ParsingError> WfErrors::TypeNotForValue(WfType* node, reflection::description::ITypeInfo* typeInfo)
{
return new ParsingError(node, L"B7: Type \"" + typeInfo->GetTypeFriendlyName() + L"\" is not a type for a value.");
}
Ptr<parsing::ParsingError> WfErrors::BreakNotInLoop(WfStatement* node)
{
return new ParsingError(node, L"C0: Break statement should appear in a loop.");
}
Ptr<parsing::ParsingError> WfErrors::ContinueNotInLoop(WfStatement* node)
{
return new ParsingError(node, L"C1: Continue statement should appear in a loop.");
}
Ptr<parsing::ParsingError> WfErrors::RethrowNotInCatch(WfStatement* node)
{
return new ParsingError(node, L"C2: Re-raise exception statement should appear in catch.");
}
Ptr<parsing::ParsingError> WfErrors::TryMissCatchAndFinally(WfStatement* node)
{
return new ParsingError(node, L"C3: Try statement should not appear without both catch and finally.");
}
Ptr<parsing::ParsingError> WfErrors::ReturnMissExpression(WfStatement* node, reflection::description::ITypeInfo* type)
{
return new ParsingError(node, L"C4: Return statement requires an expression of type \"" + type->GetTypeFriendlyName() + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::DeleteNonRawPointer(WfStatement* node, reflection::description::ITypeInfo* type)
{
return new ParsingError(node, L"C5: Delete statement cannot apply on an expression of type \"" + type->GetTypeFriendlyName() + L"\", which is expected to be a raw pointer.");
}
Ptr<parsing::ParsingError> WfErrors::CannotReturnExpression(WfStatement* node)
{
return new ParsingError(node, L"C6: Return statement cannot have a value inside void functions, constructors, destructors or $coroutine expressions.");
}
Ptr<parsing::ParsingError> WfErrors::WrongCoPause(WfStatement* node)
{
return new ParsingError(node, L"C7: $pause statement should appear inside a $coroutine expression, and it cannot be nested.");
}
Ptr<parsing::ParsingError> WfErrors::WrongCoOperator(WfStatement* node)
{
return new ParsingError(node, L"C8: $Operator statement should appear inside a coroutine function (which has a functiona body like ${} or $Provider{}).");
}
Ptr<parsing::ParsingError> WfErrors::CoProviderNotExists(WfCoProviderStatement* node, collections::List<WString>& candidates)
{
WString description;
FOREACH(WString, candidate, candidates)
{
description += L"\r\n\t";
description += candidate;
}
if (node->name.value == L"")
{
return new ParsingError(node, L"C9: Cannot find a coroutine provider based on the function return type, all of the following types do not exist: " + description + L".");
}
else
{
return new ParsingError(node, L"C9: Cannot find a coroutine provider based on the provider name \"" + node->name.value.Right(node->name.value.Length() - 1) + L"\", all of the following types do not exist: " + description + L".");
}
}
Ptr<parsing::ParsingError> WfErrors::CoOperatorNotExists(WfReturnStatement* node, reflection::description::ITypeInfo* type)
{
return new ParsingError(node, L"C10: Static function \"ReturnAndExit\" does not exist in coroutine provider \"" + type->GetTypeFriendlyName() + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::CoOperatorNotExists(WfCoOperatorStatement* node, reflection::description::ITypeInfo* type)
{
auto operatorName = node->opName.value.Right(node->opName.value.Length() - 1);
if (node->varName.value == L"")
{
return new ParsingError(node, L"C10: Static functions \"" + operatorName + L"AndPause\" and \"" + operatorName + L"AndRead\" do not exist in coroutine provider \"" + type->GetTypeFriendlyName() + L"\".");
}
else
{
return new ParsingError(node, L"C10: Static function \"" + operatorName + L"AndRead\" does not exist in coroutine provider \"" + type->GetTypeFriendlyName() + L"\".");
}
}
Ptr<parsing::ParsingError> WfErrors::CoOperatorCannotResolveResultType(WfCoOperatorStatement* node, collections::List<reflection::description::ITypeInfo*>& types)
{
auto operatorName = node->opName.value.Right(node->opName.value.Length() - 1);
if (node->arguments.Count() == 0)
{
return new ParsingError(node, L"C11: Failed to resolve the result type of coroutine operator \"" + operatorName + L"\", since there is no argument.");
}
else
{
WString description;
FOREACH(ITypeInfo*, type, types)
{
description += L"\r\n\t";
description += type->GetTypeFriendlyName();
}
return new ParsingError(node, L"C11: Failed to resolve the result type of coroutine operator \"" + operatorName + L"\", no appropriate static function \"CastResult\" is found in the following types. It requires exactly one argument of type \"object\" with a return type which is not \"void\": " + description + L".");
}
}
Ptr<parsing::ParsingError> WfErrors::CoProviderCreateNotExists(WfCoProviderStatement* node, reflection::description::ITypeInfo* type)
{
return new ParsingError(node, L"C12: The required static function \"Create\" does not exist in coroutine provider \"" + type->GetTypeFriendlyName() + L"\". It is required to have exactly one argument of a function type, which consumes a pointer type and returns system::Coroutine^");
}
Ptr<parsing::ParsingError> WfErrors::CoProviderCreateAndRunNotExists(WfCoProviderStatement* node, reflection::description::ITypeInfo* type)
{
return new ParsingError(node, L"C12: The required static function \"CreateAndRun\" does not exist in coroutine provider \"" + type->GetTypeFriendlyName() + L"\". It is required to have exactly one argument of a function type, which consumes a pointer type and returns system::Coroutine^");
}
Ptr<parsing::ParsingError> WfErrors::FunctionShouldHaveName(WfDeclaration* node)
{
return new ParsingError(node, L"D0: Function should have a name.");
}
Ptr<parsing::ParsingError> WfErrors::FunctionShouldHaveImplementation(WfDeclaration* node)
{
return new ParsingError(node, L"D0: Function should be implemented.");
}
Ptr<parsing::ParsingError> WfErrors::InterfaceMethodShouldNotHaveImplementation(WfDeclaration* node)
{
return new ParsingError(node, L"D0: Interface method should not be implemented.");
}
Ptr<parsing::ParsingError> WfErrors::DuplicatedDeclaration(WfDeclaration* node, const WString& firstDeclarationCategory)
{
return new ParsingError(node, L"D1: Duplicated declaration \"" + node->name.value + L"\", it has already beed defined as a " + firstDeclarationCategory + L".");
}
Ptr<parsing::ParsingError> WfErrors::DuplicatedSymbol(WfDeclaration* node, Ptr<WfLexicalSymbol> symbol)
{
return new ParsingError(node, L"D2: Duplicated symbol \"" + symbol->name + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::DuplicatedSymbol(WfFunctionArgument* node, Ptr<WfLexicalSymbol> symbol)
{
return new ParsingError(node, L"D2: Duplicated symbol \"" + symbol->name + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::DuplicatedSymbol(WfStatement* node, Ptr<WfLexicalSymbol> symbol)
{
return new ParsingError(node, L"D2: Duplicated symbol \"" + symbol->name + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::DuplicatedSymbol(WfExpression* node, Ptr<WfLexicalSymbol> symbol)
{
return new ParsingError(node, L"D2: Duplicated symbol \"" + symbol->name + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::InterfaceMethodNotImplemented(WfNewInterfaceExpression* node, reflection::description::IMethodInfo* method)
{
auto result = ResolveExpressionResult::Method(method);
return new ParsingError(node, L"D3: Interface method not implemented: " + result.GetFriendlyName() + L".");
}
Ptr<parsing::ParsingError> WfErrors::InterfaceMethodNotFound(WfFunctionDeclaration* node, reflection::description::ITypeInfo* interfaceType, reflection::description::ITypeInfo* methodType)
{
return new ParsingError(node, L"D4: Interface \"" + interfaceType->GetTypeFriendlyName() + L"\" does not contain method \"" + node->name.value + L"\" which is in type \"" + methodType->GetTypeFriendlyName() + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::CannotPickOverloadedInterfaceMethods(WfExpression* node, collections::List<ResolveExpressionResult>& results)
{
WString description;
FOREACH_INDEXER(ResolveExpressionResult, result, index, results)
{
description += L"\r\n\t";
description += result.GetFriendlyName();
}
return new ParsingError(node, L"D5: Cannot decide which function to implement in multiple targets: " + description + L".");
}
Ptr<parsing::ParsingError> WfErrors::CannotPickOverloadedImplementMethods(WfFunctionDeclaration* node, reflection::description::ITypeInfo* type)
{
return new ParsingError(node, L"D6: There are some other methods named \"" + node->name.value + L"\" whose types are also \"" + type->GetTypeFriendlyName() + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::WrongDeclaration(WfEventDeclaration* node)
{
return new ParsingError(node, L"D7: Event \"" + node->name.value + L"\" cannot be defined outside of classes or interfaces.");
}
Ptr<parsing::ParsingError> WfErrors::WrongDeclaration(WfPropertyDeclaration* node)
{
return new ParsingError(node, L"D7: Property \"" + node->name.value + L"\" cannot be defined outside of classes or interfaces.");
}
Ptr<parsing::ParsingError> WfErrors::WrongDeclaration(WfConstructorDeclaration* node)
{
return new ParsingError(node, L"D7: Constructor cannot be defined outside of classes.");
}
Ptr<parsing::ParsingError> WfErrors::WrongDeclaration(WfDestructorDeclaration* node)
{
return new ParsingError(node, L"D7: Destructor cannot be defined outside of classes.");
}
Ptr<parsing::ParsingError> WfErrors::WrongDeclaration(WfAutoPropertyDeclaration* node)
{
return new ParsingError(node, L"D7: Auto-property cannot be defined outside of classes.");
}
Ptr<parsing::ParsingError> WfErrors::WrongDeclarationInInterfaceConstructor(WfDeclaration* node)
{
return new ParsingError(node, L"D8: \"" + node->name.value + L"\" cannot be defined in an new interface expression, only functions, variables and auto-properties are allowed.");
}
Ptr<parsing::ParsingError> WfErrors::EnumValuesNotConsecutiveFromZero(WfEnumDeclaration* node)
{
return new ParsingError(node, L"D9: Item values in enum \"" + node->name.value + L"\" should be consecutive and starts from zero, like 0, 1, 2, 3, 4, ...");
}
Ptr<parsing::ParsingError> WfErrors::FlagValuesNotConsecutiveFromZero(WfEnumDeclaration* node)
{
return new ParsingError(node, L"D9: Item values in flag enum \"" + node->name.value + L"\" should be consecutive powers of 2 and starts from zero, like 0, 1, 2, 4, 8, ...");
}
Ptr<parsing::ParsingError> WfErrors::FlagValueNotExists(WfEnumItemIntersection* node, WfEnumDeclaration* owner)
{
return new ParsingError(node, L"D10: Item \"" + node->name.value + L" does not exists in the current flag enum \"" + owner->name.value + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::DuplicatedEnumValue(WfEnumItem* node, WfEnumDeclaration* owner)
{
return new ParsingError(node, L"D11: Item \"" + node->name.value + L" already exists in the current enum \"" + owner->name.value + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::StructContainsNonValueType(WfStructMember* node, WfStructDeclaration* owner)
{
return new ParsingError(node, L"D12: Type of member \"" + node->name.value + L"\" of struct \"" + owner->name.value + L"\" is not value type.");
}
Ptr<parsing::ParsingError> WfErrors::StructRecursivelyIncludeItself(WfStructDeclaration* node, const WString& path)
{
return new ParsingError(node, L"D13: Struct \"" + node->name.value + L"\" recursively include itself via \"" + path + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::DuplicatedStructMember(WfStructMember* node, WfStructDeclaration* owner)
{
return new ParsingError(node, L"D14: Member \"" + node->name.value + L"\" already exists in struct \"" + owner->name.value + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::AttributeNotExists(WfAttribute* node)
{
return new ParsingError(node, L"D15: Attribute \"" + node->category.value + L":" + node->name.value + L"\" does not exist.");
}
Ptr<parsing::ParsingError> WfErrors::AttributeMissValue(WfAttribute* node)
{
return new ParsingError(node, L"D15: Value of attribute \"" + node->category.value + L":" + node->name.value + L"\" is missing.");
}
Ptr<parsing::ParsingError> WfErrors::WrongUsingPathWildCard(WfModuleUsingPath* node)
{
return new ParsingError(node, L"E0: Wild card \"*\" should only appear in the last item of the using path and should appear once.");
}
Ptr<parsing::ParsingError> WfErrors::TopQualifiedSymbolNotExists(parsing::ParsingTreeCustomBase* node, const WString& name)
{
return new ParsingError(node, L"F0: Top qualified symbol \"" + name + L"\" does not exist.");
}
Ptr<parsing::ParsingError> WfErrors::ChildSymbolNotExists(parsing::ParsingTreeCustomBase* node, Ptr<WfLexicalScopeName> scopeName, const WString& name)
{
return new ParsingError(node, L"F1: Symbol \"" + name + L"\" does not exist in \"" + scopeName->GetFriendlyName() + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::MemberNotExists(parsing::ParsingTreeCustomBase* node, reflection::description::ITypeDescriptor* typeDescriptor, const WString& name)
{
return new ParsingError(node, L"F1: Member \"" + name + L"\" does not exist in \"" + typeDescriptor->GetTypeName() + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::ReferenceNotExists(parsing::ParsingTreeCustomBase* node, const WString& name)
{
return new ParsingError(node, L"F2: Symbol \"" + name + L"\" does not exist in the current scope.");
}
Ptr<parsing::ParsingError> WfErrors::TooManyTargets(parsing::ParsingTreeCustomBase* node, collections::List<ResolveExpressionResult>& results, const WString& name)
{
WString description;
FOREACH_INDEXER(ResolveExpressionResult, result, index, results)
{
description += L"\r\n\t";
description += result.GetFriendlyName();
}
return new ParsingError(node, L"F3: Symbol \"" + name + L"\" references to too many targets: " + description + L".");
}
Ptr<parsing::ParsingError> WfErrors::EnumItemNotExists(parsing::ParsingTreeCustomBase* node, reflection::description::ITypeDescriptor* typeDescriptor, const WString& name)
{
return new ParsingError(node, L"F2: Enum item \"" + name + L"\" does not exist in enum type \"" + typeDescriptor->GetTypeName() + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::WrongClassMemberConfig(WfDeclaration* node)
{
return new ParsingError(node, L"G1: Class member \"" + node->name.value + L"\" cannot be static or override because it is not a function or a auto-property.");
}
Ptr<parsing::ParsingError> WfErrors::FunctionInNewTypeExpressionCannotBeStatic(WfDeclaration* node)
{
return new ParsingError(node, L"G1: Class member \"" + node->name.value + L"\" cannot be static because it is in a new interface expression.");
}
Ptr<parsing::ParsingError> WfErrors::AutoPropertyCannotBeNormalOutsideOfClass(WfDeclaration* node)
{
return new ParsingError(node, L"G1: Auto property \"" + node->name.value + L"\" cannot be normal outside of classes or interfaces.");
}
Ptr<parsing::ParsingError> WfErrors::AutoPropertyCannotBeStatic(WfDeclaration* node)
{
return new ParsingError(node, L"G1: Auto property \"" + node->name.value + L"\" cannot be static .");
}
Ptr<parsing::ParsingError> WfErrors::WrongClassMember(WfNamespaceDeclaration* node)
{
return new ParsingError(node, L"G2: Namespace \"" + node->name.value + L"\" cannot be a class member.");
}
Ptr<parsing::ParsingError> WfErrors::PropertyGetterNotFound(WfPropertyDeclaration* node, WfClassDeclaration* classDecl)
{
return new ParsingError(node, L"G3: Cannot find the getter \"" + node->getter.value + L"\" of property \"" + node->name.value + L"\" in type \"" + classDecl->name.value + L"\". A property getter should be a non-static method in the same type.");
}
Ptr<parsing::ParsingError> WfErrors::PropertySetterNotFound(WfPropertyDeclaration* node, WfClassDeclaration* classDecl)
{
return new ParsingError(node, L"G3: Cannot find the setter \"" + node->setter.value + L"\" of property \"" + node->name.value + L"\" in type \"" + classDecl->name.value + L"\". A property setter should be a non-static method in the same type.");
}
Ptr<parsing::ParsingError> WfErrors::PropertyEventNotFound(WfPropertyDeclaration* node, WfClassDeclaration* classDecl)
{
return new ParsingError(node, L"G3: Cannot find the event \"" + node->valueChangedEvent.value + L"\" of property \"" + node->name.value + L"\" in type \"" + classDecl->name.value + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::TooManyPropertyGetter(WfPropertyDeclaration* node, WfClassDeclaration* classDecl)
{
return new ParsingError(node, L"G4: Too many symbols found for the getter \"" + node->getter.value + L"\" of property \"" + node->name.value + L"\" in type \"" + classDecl->name.value + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::TooManyPropertySetter(WfPropertyDeclaration* node, WfClassDeclaration* classDecl)
{
return new ParsingError(node, L"G4: Too many symbols found for the setter \"" + node->setter.value + L"\" of property \"" + node->name.value + L"\" in type \"" + classDecl->name.value + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::TooManyPropertyEvent(WfPropertyDeclaration* node, WfClassDeclaration* classDecl)
{
return new ParsingError(node, L"G4: Too many symbols found for the event \"" + node->valueChangedEvent.value + L"\" of property \"" + node->name.value + L"\" in type \"" + classDecl->name.value + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::PropertyGetterTypeMismatched(WfPropertyDeclaration* node, WfClassDeclaration* classDecl)
{
return new ParsingError(node, L"G5: Cannot match the getter \"" + node->getter.value + L"\" of property \"" + node->name.value + L"\" in type \"" + classDecl->name.value + L"\". A property getter should have no argument, and its return type should be identical to the property type.");
}
Ptr<parsing::ParsingError> WfErrors::PropertySetterTypeMismatched(WfPropertyDeclaration* node, WfClassDeclaration* classDecl)
{
return new ParsingError(node, L"G5: Cannot match the setter \"" + node->getter.value + L"\" of property \"" + node->name.value + L"\" in type \"" + classDecl->name.value + L"\". A property setter should have no return value and have only one argument, and the argument type should be identical to the property type.");
}
Ptr<parsing::ParsingError> WfErrors::WrongBaseType(WfClassDeclaration* node, WfType* type)
{
return new ParsingError(node, L"G6: A base type of the type \"" + node->name.value + L"\" should be another custom type, it cannot be any predefined type, pointer type, shared pointer type, nullable type, collection type, or function type");
}
Ptr<parsing::ParsingError> WfErrors::WrongBaseTypeOfClass(WfClassDeclaration* node, reflection::description::ITypeDescriptor* type)
{
return new ParsingError(node, L"G6: Base type \"" + type->GetTypeName() + L"\" of class \"" + node->name.value + L"\" is not a class, or it is a class but it is not aggregatable.");
}
Ptr<parsing::ParsingError> WfErrors::WrongBaseTypeOfInterface(WfClassDeclaration* node, reflection::description::ITypeDescriptor* type)
{
return new ParsingError(node, L"G6: Base type \"" + type->GetTypeName() + L"\" of interface \"" + node->name.value + L"\" is not an interface.");
}
Ptr<parsing::ParsingError> WfErrors::WrongInterfaceBaseType(WfClassDeclaration* node, reflection::description::ITypeDescriptor* type)
{
Ptr<ITypeInfo> proxy = TypeInfoRetriver<Ptr<IValueInterfaceProxy>>::CreateTypeInfo();
return new ParsingError(node, L"G6: Interface \"" + type->GetTypeName() + L"\" should contain a constructor receiving an \"" + proxy->GetTypeFriendlyName() + L"\" to be the base type of \"" + node->name.value + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::ClassWithInterfaceConstructor(WfClassDeclaration* node)
{
return new ParsingError(node, L"G7: Cannot use interface constructor type on class \"" + node->name.value + L"\".");
}
Ptr<parsing::ParsingError> WfErrors::OverrideShouldImplementInterfaceMethod(WfFunctionDeclaration* node)
{
return new ParsingError(node, L"G8: Function \"" + node->name.value + L"\" cannot be override because it doesn't implement any interface methods.");
}
Ptr<parsing::ParsingError> WfErrors::OverrideShouldImplementInterfaceMethod(WfAutoPropertyDeclaration* node)
{
return new ParsingError(node, L"G8: Auto-property \"" + node->name.value + L"\" cannot be override because it doesn't implement any interface methods.");
}
Ptr<parsing::ParsingError> WfErrors::MissingFieldType(WfVariableDeclaration* node)
{
return new ParsingError(node, L"G9: Type of field \"" + node->name.value + L"\" is missing.");
}
Ptr<parsing::ParsingError> WfErrors::DuplicatedBaseClass(WfClassDeclaration* node, reflection::description::ITypeDescriptor* type)
{
return new ParsingError(node, L"G10: Class \"" + node->name.value + L"\" inherits from another class \"" + type->GetTypeName() + L"\" for multiple times.");
}
Ptr<parsing::ParsingError> WfErrors::DuplicatedBaseInterface(WfClassDeclaration* node, reflection::description::ITypeDescriptor* type)
{
return new ParsingError(node, L"G10: Interface \"" + type->GetTypeName() + L"\" directly or indirectly inherits from itself.");
}
Ptr<parsing::ParsingError> WfErrors::WrongBaseConstructorCall(WfBaseConstructorCall* node, reflection::description::ITypeDescriptor* type)
{
return new ParsingError(node, L"G11: Type \"" + type->GetTypeName() + L"\" is not a base type of this class.");
}
Ptr<parsing::ParsingError> WfErrors::DuplicatedBaseConstructorCall(WfBaseConstructorCall* node, reflection::description::ITypeDescriptor* type)
{
return new ParsingError(node, L"G12: Base type \"" + type->GetTypeName() + L"\" has already been initialized.");
}
Ptr<parsing::ParsingError> WfErrors::TooManyDestructor(WfDestructorDeclaration* node, WfClassDeclaration* classDecl)
{
return new ParsingError(node, L"G13: Class \"" + classDecl->name.value + L"\" has too many destructors.");
}
Ptr<parsing::ParsingError> WfErrors::AutoPropertyShouldBeInitialized(WfAutoPropertyDeclaration* node)
{
return new ParsingError(node, L"G13: Auto property \"" + node->name.value + L"\" should be initialized.");
}
Ptr<parsing::ParsingError> WfErrors::AutoPropertyCannotBeInitializedInInterface(WfAutoPropertyDeclaration* node, WfClassDeclaration* classDecl)
{
return new ParsingError(node, L"G13: Auto property \"" + node->name.value + L"\" cannot be initialized in interface \"" + classDecl->name.value + L"\".");
}
}
}
}
/***********************************************************************
ANALYZER\WFANALYZER_EXPANDBINDEXPRESSION.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace analyzer
{
using namespace collections;
using namespace reflection;
using namespace reflection::description;
/***********************************************************************
WfObservingDependency
***********************************************************************/
WfObservingDependency::WfObservingDependency(WfObservingDependency& dependency)
:dependencies(dependency.dependencies)
{
CopyFrom(inputObserves, dependency.inputObserves);
}
WfObservingDependency::WfObservingDependency(DependencyGroup& _dependencies)
:dependencies(_dependencies)
{
}
WfObservingDependency::WfObservingDependency(DependencyGroup& _dependencies, ObserveList& _inputObserves)
:dependencies(_dependencies)
{
CopyFrom(inputObserves, _inputObserves);
}
void WfObservingDependency::AddInternal(WfExpression* observe, WfExpression* dependedObserve)
{
auto index = dependencies.Keys().IndexOf(dependedObserve);
if (index == -1)
{
dependencies.Add(dependedObserve, observe);
}
else if (!dependencies.GetByIndex(index).Contains(observe))
{
dependencies.Add(dependedObserve, observe);
}
}
void WfObservingDependency::Prepare(WfExpression* observe)
{
AddInternal(0, observe);
if (!outputObserves.Contains(observe))
{
outputObserves.Add(observe);
}
}
void WfObservingDependency::Add(WfExpression* observe)
{
Add(observe, *this);
}
void WfObservingDependency::Add(WfExpression* observe, WfObservingDependency& dependency)
{
Prepare(observe);
FOREACH(WfExpression*, dependedObserve, dependency.inputObserves)
{
AddInternal(observe, dependedObserve);
}
}
void WfObservingDependency::TurnToInput()
{
if (outputObserves.Count() > 0)
{
CopyFrom(inputObserves, outputObserves);
outputObserves.Clear();
}
}
void WfObservingDependency::Cleanup()
{
SortedList<WfExpression*> all;
CopyFrom(all, From(dependencies.Keys()).Distinct());
vint count = dependencies.Keys().Count();
for (vint i = 0; i < count; i++)
{
const auto& values = dependencies.GetByIndex(i);
if (values.Contains(0) && values.Count()>1)
{
dependencies.Remove(dependencies.Keys()[i], 0);
}
FOREACH(WfExpression*, value, values)
{
all.Remove(value);
}
}
FOREACH(WfExpression*, observe, all)
{
dependencies.Add(0, observe);
}
}
/***********************************************************************
GetObservingDependency
***********************************************************************/
class GetObservingDependencyVisitor
: public traverse_visitor::ExpressionVisitor
, public traverse_visitor::VirtualExpressionVisitor
{
public:
WfLexicalScopeManager* manager;
WfObservingDependency& dependency;
GetObservingDependencyVisitor(WfLexicalScopeManager* _manager, WfObservingDependency& _dependency)
:manager(_manager)
, dependency(_dependency)
{
}
void VisitField(WfExpression* node)override
{
node->Accept(this);
}
void VisitField(WfType* node)override
{
// No need to traverse inside a type
}
void VisitField(WfStatement* node)override
{
// No need to traverse inside a statement
}
void VisitField(WfDeclaration* node)override
{
// No need to traverse inside a declaration
}
void Dispatch(WfVirtualExpression* node)override
{
node->Accept(static_cast<traverse_visitor::VirtualExpressionVisitor*>(this));
}
void Visit(WfMemberExpression* node)override
{
WfObservingDependency parent(dependency);
GetObservingDependency(manager, node->parent, parent);
parent.TurnToInput();
if (dependency.inputObserves.Count() == 0)
{
auto memberResult = manager->expressionResolvings[node];
if (memberResult.propertyInfo)
{
auto td = memberResult.propertyInfo->GetOwnerTypeDescriptor();
auto ev = memberResult.propertyInfo->GetValueChangedEvent();
if (!ev)
{
ev = td->GetEventByName(memberResult.propertyInfo->GetName() + L"Changed", true);
}
if (ev)
{
dependency.Add(node, parent);
}
}
}
}
void Visit(WfObserveExpression* node)override
{
WfObservingDependency parent(dependency);
GetObservingDependency(manager, node->parent, parent);
parent.TurnToInput();
dependency.Add(node, parent);
dependency.TurnToInput();
GetObservingDependency(manager, node->expression, dependency);
}
};
void GetObservingDependency(WfLexicalScopeManager* manager, Ptr<WfExpression> expression, WfObservingDependency& dependency)
{
GetObservingDependencyVisitor visitor(manager, dependency);
expression->Accept(&visitor);
}
/***********************************************************************
Copy(Type|Expression|Statement|Declaration)
***********************************************************************/
Ptr<WfType> CopyType(Ptr<WfType> type)
{
return copy_visitor::ModuleVisitor().CreateField(type);
}
Ptr<WfExpression> CopyExpression(Ptr<WfExpression> expression)
{
return copy_visitor::ModuleVisitor().CreateField(expression);
}
Ptr<WfStatement> CopyStatement(Ptr<WfStatement> statement)
{
return copy_visitor::ModuleVisitor().CreateField(statement);
}
Ptr<WfDeclaration> CopyDeclaration(Ptr<WfDeclaration> declaration)
{
return copy_visitor::ModuleVisitor().CreateField(declaration);
}
/***********************************************************************
ExpandObserveExpression
***********************************************************************/
Ptr<WfExpression> CreateReference(const WString& name)
{
auto ref = MakePtr<WfReferenceExpression>();
ref->name.value = name;
return ref;
}
class ExpandObserveExpressionVisitor
: public copy_visitor::ExpressionVisitor
, public copy_visitor::VirtualExpressionVisitor
{
public:
Dictionary<WfExpression*, WString>& cacheNames;
Dictionary<WString, WString>& referenceReplacement;
ExpandObserveExpressionVisitor(Dictionary<WfExpression*, WString>& _cacheNames, collections::Dictionary<WString, WString>& _referenceReplacement)
:cacheNames(_cacheNames)
, referenceReplacement(_referenceReplacement)
{
}
vl::Ptr<WfExpression> CreateField(vl::Ptr<WfExpression> from)override
{
return ExpandObserveExpression(from.Obj(), cacheNames, referenceReplacement);
}
vl::Ptr<WfType> CreateField(vl::Ptr<WfType> from)override
{
return CopyType(from);
}
vl::Ptr<WfStatement> CreateField(vl::Ptr<WfStatement> from)override
{
return CopyStatement(from);
}
vl::Ptr<WfDeclaration> CreateField(vl::Ptr<WfDeclaration> from)override
{
return CopyDeclaration(from);
}
vl::Ptr<vl::parsing::ParsingTreeCustomBase> Dispatch(WfVirtualExpression* node)override
{
node->Accept((WfVirtualExpression::IVisitor*)this);
return result;
}
void Visit(WfReferenceExpression* node)override
{
vint index = referenceReplacement.Keys().IndexOf(node->name.value);
if (index == -1)
{
result = CopyExpression(node);
}
else
{
result = CreateReference(referenceReplacement.Values()[index]);
}
}
void Visit(WfOrderedLambdaExpression* node)override
{
result = CopyExpression(node);
}
void Visit(WfLetExpression* node)override
{
Dictionary<WString, WString> overrided;
auto expr = MakePtr<WfLetExpression>();
FOREACH(Ptr<WfLetVariable>, var, node->variables)
{
auto key = var->name.value;
vint index = referenceReplacement.Keys().IndexOf(key);
if (index != -1)
{
auto value = referenceReplacement.Values()[index];
referenceReplacement.Remove(key);
overrided.Add(key, value);
}
auto newVar = MakePtr<WfLetVariable>();
newVar->name.value = key;
newVar->value = CreateField(var->value);
expr->variables.Add(newVar);
}
expr->expression = CreateField(node->expression);
CopyFrom(referenceReplacement, overrided, true);
result = expr;
}
void Visit(WfObserveExpression* node)override
{
if (cacheNames.Count() == 0)
{
result = CopyExpression(node);
}
else if (node->observeType == WfObserveType::SimpleObserve)
{
auto expr = MakePtr<WfMemberExpression>();
expr->parent = CreateField(node->parent);
expr->name.value = node->expression.Cast<WfReferenceExpression>()->name.value;
result = expr;
}
else
{
auto var = MakePtr<WfLetVariable>();
var->name.value = node->name.value;
var->value = CreateField(node->parent);
auto expr = MakePtr<WfLetExpression>();
expr->variables.Add(var);
expr->expression = CreateField(node->expression);
result = expr;
}
}
void Visit(WfBindExpression* node)override
{
result = CopyExpression(node);
}
};
Ptr<WfExpression> ExpandObserveExpression(WfExpression* expression, collections::Dictionary<WfExpression*, WString>& cacheNames, collections::Dictionary<WString, WString>& referenceReplacement, bool useCache)
{
if (!expression)
{
return nullptr;
}
if (useCache)
{
vint index = cacheNames.Keys().IndexOf(expression);
if (index != -1)
{
return CreateReference(cacheNames.Values()[index]);
}
}
ExpandObserveExpressionVisitor visitor(cacheNames, referenceReplacement);
expression->Accept(&visitor);
return visitor.result.Cast<WfExpression>();
}
/***********************************************************************
DecodeObserveExpression
***********************************************************************/
void DecodeObserveExpression(WfLexicalScopeManager* manager, WfExpression* observe, List<IEventInfo*>& events, WfExpression*& parent)
{
if (auto observeExpr = dynamic_cast<WfObserveExpression*>(observe))
{
parent = observeExpr->parent.Obj();
FOREACH(Ptr<WfExpression>, eventExpr, observeExpr->events)
{
auto result = manager->expressionResolvings[eventExpr.Obj()];
events.Add(result.eventInfo);
}
}
else if (auto memberExpr = dynamic_cast<WfMemberExpression*>(observe))
{
parent = memberExpr->parent.Obj();
auto result = manager->expressionResolvings[memberExpr];
auto td = result.propertyInfo->GetOwnerTypeDescriptor();
auto ev = result.propertyInfo->GetValueChangedEvent();
if (!ev)
{
ev = td->GetEventByName(result.propertyInfo->GetName() + L"Changed", true);
}
events.Add(ev);
}
}
/***********************************************************************
CreateDefaultValue
***********************************************************************/
Ptr<WfExpression> CreateDefaultValue(ITypeInfo* elementType)
{
auto valueType = elementType->GetTypeDescriptor()->GetValueType();
if (elementType->GetDecorator()==ITypeInfo::TypeDescriptor && valueType != nullptr)
{
auto value = valueType->CreateDefault();
switch (GetTypeFlag(elementType))
{
case TypeFlag::Enum:
{
auto intExpr = MakePtr<WfIntegerExpression>();
intExpr->value.value = u64tow(elementType->GetTypeDescriptor()->GetEnumType()->FromEnum(value));
auto inferExpr = MakePtr<WfInferExpression>();
inferExpr->expression = inferExpr;
inferExpr->type = GetTypeFromTypeInfo(CreateTypeInfoFromTypeFlag(TypeFlag::U8).Obj());
auto castExpr = MakePtr<WfTypeCastingExpression>();
castExpr->strategy = WfTypeCastingStrategy::Strong;
castExpr->expression = inferExpr;
castExpr->type = GetTypeFromTypeInfo(elementType);
return castExpr;
}
case TypeFlag::String:
{
auto stringExpr = MakePtr<WfStringExpression>();
elementType->GetTypeDescriptor()->GetSerializableType()->Serialize(value, stringExpr->value.value);
return stringExpr;
}
break;
case TypeFlag::Struct:
if (elementType->GetTypeDescriptor()->GetSerializableType() == nullptr)
{
auto ctorExpr = MakePtr<WfConstructorExpression>();
auto castExpr = MakePtr<WfTypeCastingExpression>();
castExpr->strategy = WfTypeCastingStrategy::Strong;
castExpr->expression = ctorExpr;
castExpr->type = GetTypeFromTypeInfo(elementType);
return castExpr;
}
default:
{
auto td = elementType->GetTypeDescriptor();
if (td == description::GetTypeDescriptor<bool>())
{
auto expr = MakePtr<WfLiteralExpression>();
expr->value = WfLiteralValue::False;
return expr;
}
else if (td == description::GetTypeDescriptor<float>()
|| td == description::GetTypeDescriptor<double>())
{
auto valueExpr = MakePtr<WfFloatingExpression>();
valueExpr->value.value = L"0";
auto inferExpr = MakePtr<WfInferExpression>();
inferExpr->expression = valueExpr;
inferExpr->type = GetTypeFromTypeInfo(elementType);
return inferExpr;
}
else if (td == description::GetTypeDescriptor<vint8_t>()
|| td == description::GetTypeDescriptor<vint16_t>()
|| td == description::GetTypeDescriptor<vint32_t>()
|| td == description::GetTypeDescriptor<vint64_t>()
|| td == description::GetTypeDescriptor<vuint8_t>()
|| td == description::GetTypeDescriptor<vuint16_t>()
|| td == description::GetTypeDescriptor<vuint32_t>()
|| td == description::GetTypeDescriptor<vuint64_t>())
{
auto valueExpr = MakePtr<WfIntegerExpression>();
valueExpr->value.value = L"0";
auto inferExpr = MakePtr<WfInferExpression>();
inferExpr->expression = valueExpr;
inferExpr->type = GetTypeFromTypeInfo(elementType);
return inferExpr;
}
else
{
auto stringExpr = MakePtr<WfStringExpression>();
elementType->GetTypeDescriptor()->GetSerializableType()->Serialize(value, stringExpr->value.value);
auto castExpr = MakePtr<WfTypeCastingExpression>();
castExpr->strategy = WfTypeCastingStrategy::Strong;
castExpr->expression = stringExpr;
castExpr->type = GetTypeFromTypeInfo(elementType);
return castExpr;
}
}
}
}
else
{
auto nullExpr = MakePtr<WfLiteralExpression>();
nullExpr->value = WfLiteralValue::Null;
auto inferExpr = MakePtr<WfInferExpression>();
inferExpr->expression = nullExpr;
inferExpr->type = GetTypeFromTypeInfo(elementType);
return inferExpr;
}
}
/***********************************************************************
CreateBindWritableVariable
***********************************************************************/
Ptr<WfVariableDeclaration> CreateWritableVariable(const WString& name, ITypeInfo* type, Ptr<WfExpression> value = nullptr)
{
auto decl = MakePtr<WfVariableDeclaration>();
decl->name.value = name;
decl->type = GetTypeFromTypeInfo(type);
decl->expression = value ? value : CreateDefaultValue(type);
return decl;
}
Ptr<WfVariableStatement> CreateWritableVariableStatement(const WString& name, ITypeInfo* type, Ptr<WfExpression> value = nullptr)
{
auto stat = MakePtr<WfVariableStatement>();
stat->variable = CreateWritableVariable(name, type, value);
return stat;
}
/***********************************************************************
IValueListener::GetSubscription
***********************************************************************/
Ptr<WfFunctionDeclaration> CreateListenerGetSubscriptionFunction()
{
auto func = MakePtr<WfFunctionDeclaration>();
func->name.value = L"GetSubscription";
func->anonymity = WfFunctionAnonymity::Named;
{
auto typeInfo = TypeInfoRetriver<IValueSubscription*>::CreateTypeInfo();
func->returnType = GetTypeFromTypeInfo(typeInfo.Obj());
}
auto block = MakePtr<WfBlockStatement>();
func->statement = block;
{
auto returnStat = MakePtr<WfReturnStatement>();
returnStat->expression = CreateReference(L"<subscription>");
block->statements.Add(returnStat);
}
return func;
}
/***********************************************************************
IValueListener::GetStopped
***********************************************************************/
Ptr<WfFunctionDeclaration> CreateListenerGetStoppedFunction()
{
auto func = MakePtr<WfFunctionDeclaration>();
func->name.value = L"GetStopped";
func->anonymity = WfFunctionAnonymity::Named;
{
auto typeInfo = TypeInfoRetriver<bool>::CreateTypeInfo();
func->returnType = GetTypeFromTypeInfo(typeInfo.Obj());
}
auto block = MakePtr<WfBlockStatement>();
func->statement = block;
{
auto listenersRef = CreateReference(L"<bind-listeners>");
auto keysExpr = MakePtr<WfMemberExpression>();
keysExpr->parent = listenersRef;
keysExpr->name.value = L"Keys";
auto containsExpr = MakePtr<WfMemberExpression>();
containsExpr->parent = keysExpr;
containsExpr->name.value = L"Contains";
auto callExpr = MakePtr<WfCallExpression>();
callExpr->function = containsExpr;
callExpr->arguments.Add(MakePtr<WfThisExpression>());
auto notExpr = MakePtr<WfUnaryExpression>();
notExpr->op = WfUnaryOperator::Not;
notExpr->operand = callExpr;
auto returnStat = MakePtr<WfReturnStatement>();
returnStat->expression = notExpr;
block->statements.Add(returnStat);
}
return func;
}
/***********************************************************************
IValueListener::StopListening
***********************************************************************/
Ptr<WfFunctionDeclaration> CreateListenerStopListeningFunction()
{
auto func = MakePtr<WfFunctionDeclaration>();
func->name.value = L"StopListening";
func->anonymity = WfFunctionAnonymity::Named;
{
auto typeInfo = TypeInfoRetriver<bool>::CreateTypeInfo();
func->returnType = GetTypeFromTypeInfo(typeInfo.Obj());
}
auto block = MakePtr<WfBlockStatement>();
func->statement = block;
{
auto ifStat = MakePtr<WfIfStatement>();
block->statements.Add(ifStat);
{
auto listenersRef = CreateReference(L"<bind-listeners>");
auto keysExpr = MakePtr<WfMemberExpression>();
keysExpr->parent = listenersRef;
keysExpr->name.value = L"Keys";
auto containsExpr = MakePtr<WfMemberExpression>();
containsExpr->parent = keysExpr;
containsExpr->name.value = L"Contains";
auto callExpr = MakePtr<WfCallExpression>();
callExpr->function = containsExpr;
callExpr->arguments.Add(MakePtr<WfThisExpression>());
ifStat->expression = callExpr;
}
auto ifBlock = MakePtr<WfBlockStatement>();
ifStat->trueBranch = ifBlock;
{
auto listenersRef = CreateReference(L"<bind-listeners>");
auto removeExpr = MakePtr<WfMemberExpression>();
removeExpr->parent = listenersRef;
removeExpr->name.value = L"Remove";
auto callExpr = MakePtr<WfCallExpression>();
callExpr->function = removeExpr;
callExpr->arguments.Add(MakePtr<WfThisExpression>());
auto stat = MakePtr<WfExpressionStatement>();
stat->expression = callExpr;
ifBlock->statements.Add(stat);
}
{
auto literal = MakePtr<WfLiteralExpression>();
literal->value = WfLiteralValue::True;
auto returnStat = MakePtr<WfReturnStatement>();
returnStat->expression = literal;
ifBlock->statements.Add(returnStat);
}
}
{
auto literal = MakePtr<WfLiteralExpression>();
literal->value = WfLiteralValue::False;
auto returnStat = MakePtr<WfReturnStatement>();
returnStat->expression = literal;
block->statements.Add(returnStat);
}
return func;
}
/***********************************************************************
IValueSubscription::Subscribe
***********************************************************************/
Ptr<WfDeclaration> AssignNormalMember(Ptr<WfDeclaration> decl)
{
decl->classMember = MakePtr<WfClassMember>();
decl->classMember->kind = WfClassMemberKind::Normal;
return decl;
}
Ptr<WfDeclaration> AssignOverrideMember(Ptr<WfDeclaration> decl)
{
decl->classMember = MakePtr<WfClassMember>();
decl->classMember->kind = WfClassMemberKind::Override;
return decl;
}
Ptr<WfFunctionDeclaration> CreateBindSubscribeFunction()
{
auto func = MakePtr<WfFunctionDeclaration>();
func->name.value = L"Subscribe";
func->anonymity = WfFunctionAnonymity::Named;
{
auto typeInfo = TypeInfoRetriver<Ptr<IValueListener>>::CreateTypeInfo();
func->returnType = GetTypeFromTypeInfo(typeInfo.Obj());
}
{
auto typeInfo = TypeInfoRetriver<Func<void(Value)>>::CreateTypeInfo();
auto argument = MakePtr<WfFunctionArgument>();
argument->name.value = L"<bind-callback>";
argument->type = GetTypeFromTypeInfo(typeInfo.Obj());
func->arguments.Add(argument);
}
auto block = MakePtr<WfBlockStatement>();
func->statement = block;
{
auto notOpenedRef = MakePtr<WfUnaryExpression>();
notOpenedRef->op = WfUnaryOperator::Not;
notOpenedRef->operand = CreateReference(L"<bind-opened>");
auto ifStat = MakePtr<WfIfStatement>();
block->statements.Add(ifStat);
ifStat->expression = notOpenedRef;
auto block = MakePtr<WfBlockStatement>();
ifStat->trueBranch = block;
{
auto assignExpr = MakePtr<WfBinaryExpression>();
assignExpr->op = WfBinaryOperator::Assign;
assignExpr->first = CreateReference(L"<bind-opened>");
auto trueValue = MakePtr<WfLiteralExpression>();
trueValue->value = WfLiteralValue::True;
assignExpr->second = trueValue;
auto stat = MakePtr<WfExpressionStatement>();
stat->expression = assignExpr;
block->statements.Add(stat);
}
{
auto callExpr = MakePtr<WfCallExpression>();
callExpr->function = CreateReference(L"<bind-initialize>");
auto stat = MakePtr<WfExpressionStatement>();
stat->expression = callExpr;
block->statements.Add(stat);
}
}
{
auto thisExpr = MakePtr<WfThisExpression>();
block->statements.Add(CreateWritableVariableStatement(L"<subscription>", TypeInfoRetriver<IValueSubscription*>::CreateTypeInfo().Obj(), thisExpr));
}
{
auto newListener = MakePtr<WfNewInterfaceExpression>();
{
auto typeInfo = TypeInfoRetriver<Ptr<IValueListener>>::CreateTypeInfo();
newListener->type = GetTypeFromTypeInfo(typeInfo.Obj());
}
newListener->declarations.Add(AssignOverrideMember(CreateListenerGetSubscriptionFunction()));
newListener->declarations.Add(AssignOverrideMember(CreateListenerGetStoppedFunction()));
newListener->declarations.Add(AssignOverrideMember(CreateListenerStopListeningFunction()));
auto variable = MakePtr<WfVariableDeclaration>();
variable->name.value = L"<listener-shared>";
variable->expression = newListener;
auto variableStat = MakePtr<WfVariableStatement>();
variableStat->variable = variable;
block->statements.Add(variableStat);
}
{
auto callbackRef = CreateReference(L"<bind-callback>");
auto mapRef = CreateReference(L"<bind-listeners>");
auto func = MakePtr<WfMemberExpression>();
func->parent = mapRef;
func->name.value = L"Set";
auto call = MakePtr<WfCallExpression>();
call->function = func;
call->arguments.Add(CreateReference(L"<listener-shared>"));
call->arguments.Add(callbackRef);
auto stat = MakePtr<WfExpressionStatement>();
stat->expression = call;
block->statements.Add(stat);
}
{
auto listenerRef = CreateReference(L"<listener-shared>");
auto returnStat = MakePtr<WfReturnStatement>();
returnStat->expression = listenerRef;
block->statements.Add(returnStat);
}
return func;
}
/***********************************************************************
ExpandObserveEvent
***********************************************************************/
Ptr<WfExpression> ExpandObserveEvent(WfLexicalScopeManager* manager, const WString& cacheName, WfExpression* observe, vint eventIndex)
{
if (auto observeExpr = dynamic_cast<WfObserveExpression*>(observe))
{
if (observeExpr->observeType == WfObserveType::SimpleObserve)
{
auto expr = MakePtr<WfMemberExpression>();
expr->parent = CreateReference(cacheName);
expr->name.value = observeExpr->events[eventIndex].Cast<WfReferenceExpression>()->name.value;
return expr;
}
else
{
Dictionary<WfExpression*, WString> cacheNames;
Dictionary<WString, WString> referenceReplacement;
referenceReplacement.Add(observeExpr->name.value, cacheName);
return ExpandObserveExpression(observeExpr->events[eventIndex].Obj(), cacheNames, referenceReplacement);
}
}
else
{
auto memberExpr = dynamic_cast<WfMemberExpression*>(observe);
auto result = manager->expressionResolvings[memberExpr];
auto td = result.propertyInfo->GetOwnerTypeDescriptor();
auto ev = result.propertyInfo->GetValueChangedEvent();
if (!ev)
{
ev = td->GetEventByName(result.propertyInfo->GetName() + L"Changed", true);
}
auto eventName = ev->GetName();
auto expr = MakePtr<WfMemberExpression>();
expr->parent = CreateReference(cacheName);
expr->name.value = eventName;
return expr;
}
}
/***********************************************************************
ObserveInfo
***********************************************************************/
struct CallbackInfo
{
WfExpression* observe;
IEventInfo* eventInfo;
vint eventIndex;
WString handlerName;
WString callbackName;
};
struct BindCallbackInfo
{
Dictionary<WfExpression*, WfExpression*> observeParents;
Dictionary<WfExpression*, WString> cacheNames;
Dictionary<WString, Ptr<ITypeInfo>> variableTypes;
Dictionary<vint, WfExpression*> orderedObserves;
Group<WfExpression*, CallbackInfo> observeCallbackInfos;
};
/***********************************************************************
CreateBindAttachStatement
***********************************************************************/
void CreateBindAttachStatement(Ptr<WfBlockStatement> block, WfLexicalScopeManager* manager, WfExpression* observe, BindCallbackInfo& info)
{
auto cachedName = info.cacheNames[info.observeParents[observe]];
FOREACH(CallbackInfo, callbackInfo, info.observeCallbackInfos[observe])
{
auto attach = MakePtr<WfAttachEventExpression>();
attach->event = ExpandObserveEvent(manager, cachedName, observe, callbackInfo.eventIndex);
attach->function = CreateReference(callbackInfo.callbackName);
auto assign = MakePtr<WfBinaryExpression>();
assign->op = WfBinaryOperator::Assign;
assign->first = CreateReference(callbackInfo.handlerName);
assign->second = attach;
auto stat = MakePtr<WfExpressionStatement>();
stat->expression = assign;
block->statements.Add(stat);
}
}
/***********************************************************************
CreateBindDetachStatement
***********************************************************************/
void CreateBindDetachStatement(Ptr<WfBlockStatement> block, WfLexicalScopeManager* manager, WfExpression* observe, BindCallbackInfo& info)
{
auto cachedName = info.cacheNames[info.observeParents[observe]];
FOREACH(CallbackInfo, callbackInfo, info.observeCallbackInfos[observe])
{
auto detach = MakePtr<WfDetachEventExpression>();
detach->event = ExpandObserveEvent(manager, cachedName, observe, callbackInfo.eventIndex);
detach->handler = CreateReference(callbackInfo.handlerName);
auto stat = MakePtr<WfExpressionStatement>();
stat->expression = detach;
block->statements.Add(stat);
}
}
/***********************************************************************
CreateBindCacheAssignStatement
***********************************************************************/
void CreateBindCacheAssignStatement(Ptr<WfBlockStatement> block, WfExpression* observe, BindCallbackInfo& info)
{
auto parent = info.observeParents[observe];
auto name = info.cacheNames[parent];
auto assign = MakePtr<WfBinaryExpression>();
assign->op = WfBinaryOperator::Assign;
assign->first = CreateReference(name);
Dictionary<WString, WString> referenceReplacement;
assign->second = ExpandObserveExpression(parent, info.cacheNames, referenceReplacement, false);
auto stat = MakePtr<WfExpressionStatement>();
stat->expression = assign;
block->statements.Add(stat);
}
/***********************************************************************
IValueSubscription::Update
***********************************************************************/
Ptr<WfFunctionDeclaration> CreateBindUpdateFunction(BindCallbackInfo& info)
{
auto func = MakePtr<WfFunctionDeclaration>();
func->name.value = L"Update";
func->anonymity = WfFunctionAnonymity::Named;
{
auto typeInfo = TypeInfoRetriver<bool>::CreateTypeInfo();
func->returnType = GetTypeFromTypeInfo(typeInfo.Obj());
}
auto block = MakePtr<WfBlockStatement>();
func->statement = block;
{
auto ifStat = MakePtr<WfIfStatement>();
block->statements.Add(ifStat);
{
auto notExpr = MakePtr<WfUnaryExpression>();
notExpr->op = WfUnaryOperator::Not;
notExpr->operand = CreateReference(L"<bind-closed>");
ifStat->expression = notExpr;
}
auto ifBlock = MakePtr<WfBlockStatement>();
ifStat->trueBranch = ifBlock;
{
auto ref = CreateReference(L"<bind-activator>");
auto call = MakePtr<WfCallExpression>();
call->function = ref;
auto stat = MakePtr<WfExpressionStatement>();
stat->expression = call;
ifBlock->statements.Add(stat);
}
{
auto literal = MakePtr<WfLiteralExpression>();
literal->value = WfLiteralValue::True;
auto returnStat = MakePtr<WfReturnStatement>();
returnStat->expression = literal;
ifBlock->statements.Add(returnStat);
}
}
{
auto literal = MakePtr<WfLiteralExpression>();
literal->value = WfLiteralValue::False;
auto returnStat = MakePtr<WfReturnStatement>();
returnStat->expression = literal;
block->statements.Add(returnStat);
}
return func;
}
/***********************************************************************
IValueSubscription::Close
***********************************************************************/
Ptr<WfFunctionDeclaration> CreateBindCloseFunction(WfLexicalScopeManager* manager, BindCallbackInfo& info)
{
auto func = MakePtr<WfFunctionDeclaration>();
func->name.value = L"Close";
func->anonymity = WfFunctionAnonymity::Named;
{
auto typeInfo = TypeInfoRetriver<bool>::CreateTypeInfo();
func->returnType = GetTypeFromTypeInfo(typeInfo.Obj());
}
auto block = MakePtr<WfBlockStatement>();
func->statement = block;
{
auto ifStat = MakePtr<WfIfStatement>();
block->statements.Add(ifStat);
{
auto notExpr = MakePtr<WfUnaryExpression>();
notExpr->op = WfUnaryOperator::Not;
notExpr->operand = CreateReference(L"<bind-closed>");
ifStat->expression = notExpr;
}
auto ifBlock = MakePtr<WfBlockStatement>();
ifStat->trueBranch = ifBlock;
{
auto literal = MakePtr<WfLiteralExpression>();
literal->value = WfLiteralValue::True;
auto assign = MakePtr<WfBinaryExpression>();
assign->op = WfBinaryOperator::Assign;
assign->first = CreateReference(L"<bind-closed>");
assign->second = literal;
auto stat = MakePtr<WfExpressionStatement>();
stat->expression = assign;
ifBlock->statements.Add(stat);
}
FOREACH(WfExpression*, observe, info.orderedObserves.Values())
{
WString cachedName = info.cacheNames[info.observeParents[observe]];
CreateBindDetachStatement(ifBlock, manager, observe, info);
}
SortedList<WString> callbackFunctions;
for (vint i = 0; i < info.observeCallbackInfos.Count(); i++)
{
const auto& values = info.observeCallbackInfos.GetByIndex(i);
FOREACH(CallbackInfo, callbackInfo, values)
{
callbackFunctions.Add(callbackInfo.callbackName);
}
}
FOREACH_INDEXER(WString, name, index, info.variableTypes.Keys())
{
if (!callbackFunctions.Contains(name))
{
auto assign = MakePtr<WfBinaryExpression>();
assign->op = WfBinaryOperator::Assign;
assign->first = CreateReference(name);
assign->second = CreateDefaultValue(info.variableTypes.Values()[index].Obj());
auto stat = MakePtr<WfExpressionStatement>();
stat->expression = assign;
ifBlock->statements.Add(stat);
}
}
{
auto ref = CreateReference(L"<bind-listeners>");
auto func = MakePtr<WfMemberExpression>();
func->parent = ref;
func->name.value = L"Clear";
auto call = MakePtr<WfCallExpression>();
call->function = func;
auto stat = MakePtr<WfExpressionStatement>();
stat->expression = call;
ifBlock->statements.Add(stat);
}
{
auto literal = MakePtr<WfLiteralExpression>();
literal->value = WfLiteralValue::True;
auto returnStat = MakePtr<WfReturnStatement>();
returnStat->expression = literal;
ifBlock->statements.Add(returnStat);
}
}
{
auto literal = MakePtr<WfLiteralExpression>();
literal->value = WfLiteralValue::False;
auto returnStat = MakePtr<WfReturnStatement>();
returnStat->expression = literal;
block->statements.Add(returnStat);
}
return func;
}
/***********************************************************************
ExpandBindExpression
***********************************************************************/
void ExpandBindExpression(WfLexicalScopeManager* manager, WfBindExpression* node)
{
Group<WfExpression*, WfExpression*> group;
WfObservingDependency dependency(group);
GetObservingDependency(manager, node->expression, dependency);
dependency.Cleanup();
BindCallbackInfo bcInfo;
auto newSubscription = MakePtr<WfNewInterfaceExpression>();
node->expandedExpression = newSubscription;
{
auto typeInfo = TypeInfoRetriver<Ptr<IValueSubscription>>::CreateTypeInfo();
newSubscription->type = GetTypeFromTypeInfo(typeInfo.Obj());
}
{
// stable symbol order by sorting them by code
List<WfExpression*> orderedObserves;
auto printExpression = [](WfExpression* observe)
{
stream::MemoryStream stream;
{
stream::StreamWriter writer(stream);
WfPrint(observe, WString::Empty, writer);
}
stream.SeekFromBegin(0);
{
stream::StreamReader reader(stream);
return reader.ReadToEnd();
}
};
CopyFrom(
orderedObserves,
From(dependency.dependencies.Keys())
.Where([](WfExpression* expr)
{
return expr != nullptr;
})
.OrderBy([&](WfExpression* a, WfExpression* b)
{
auto codeA = printExpression(a);
auto codeB = printExpression(b);
auto compare = WString::Compare(codeA, codeB);
if (compare) return compare;
return a->codeRange.start.index - b->codeRange.start.index;
})
);
FOREACH_INDEXER(WfExpression*, observe, observeIndex, orderedObserves)
{
List<IEventInfo*> events;
WfExpression* parent = 0;
DecodeObserveExpression(manager, observe, events, parent);
WString cacheName = L"<bind-cache>" + itow(observeIndex);
bcInfo.cacheNames.Add(parent, cacheName);
bcInfo.observeParents.Add(observe, parent);
bcInfo.orderedObserves.Add(observeIndex, observe);
{
auto elementType = manager->expressionResolvings[parent].type;
bcInfo.variableTypes.Add(cacheName, elementType);
newSubscription->declarations.Add(AssignNormalMember(CreateWritableVariable(cacheName, elementType.Obj())));
}
FOREACH_INDEXER(IEventInfo*, ev, eventIndex, events)
{
WString handlerName = L"<bind-handler>" + itow(observeIndex) + L"_" + itow(eventIndex);
{
auto elementType = TypeInfoRetriver<Ptr<IEventHandler>>::CreateTypeInfo();
bcInfo.variableTypes.Add(handlerName, elementType);
newSubscription->declarations.Add(AssignNormalMember(CreateWritableVariable(handlerName, elementType.Obj())));
}
WString callbackName = L"<bind-callback>" + itow(observeIndex) + L"_" + itow(eventIndex);
{
auto elementType = CopyTypeInfo(ev->GetHandlerType());
bcInfo.variableTypes.Add(callbackName, elementType);
}
CallbackInfo callbackInfo;
callbackInfo.observe = observe;
callbackInfo.eventInfo = ev;
callbackInfo.eventIndex = eventIndex;
callbackInfo.callbackName = callbackName;
callbackInfo.handlerName = handlerName;
bcInfo.observeCallbackInfos.Add(observe, callbackInfo);
}
}
newSubscription->declarations.Add(AssignNormalMember(CreateWritableVariable(L"<bind-opened>", TypeInfoRetriver<bool>::CreateTypeInfo().Obj())));
newSubscription->declarations.Add(AssignNormalMember(CreateWritableVariable(L"<bind-closed>", TypeInfoRetriver<bool>::CreateTypeInfo().Obj())));
{
auto typeInfo = TypeInfoRetriver<Dictionary<Ptr<IValueListener>, Func<void(Value)>>>::CreateTypeInfo();
auto decl = MakePtr<WfVariableDeclaration>();
decl->name.value = L"<bind-listeners>";
decl->type = GetTypeFromTypeInfo(typeInfo.Obj());
decl->expression = MakePtr<WfConstructorExpression>();
newSubscription->declarations.Add(AssignNormalMember(decl));
}
{
auto func = MakePtr<WfFunctionDeclaration>();
func->name.value = L"<bind-activator>";
func->anonymity = WfFunctionAnonymity::Named;
func->returnType = GetTypeFromTypeInfo(TypeInfoRetriver<void>::CreateTypeInfo().Obj());
auto block = MakePtr<WfBlockStatement>();
func->statement = block;
{
auto var = MakePtr<WfVariableDeclaration>();
var->name.value = L"<bind-activator-result>";
Dictionary<WString, WString> referenceReplacement;
var->expression = ExpandObserveExpression(node->expression.Obj(), bcInfo.cacheNames, referenceReplacement);
auto varStat = MakePtr<WfVariableStatement>();
varStat->variable = var;
block->statements.Add(varStat);
}
{
auto ref = CreateReference(L"<bind-listeners>");
auto values = MakePtr<WfMemberExpression>();
values->parent = ref;
values->name.value = L"Values";
auto forStat = MakePtr<WfForEachStatement>();
block->statements.Add(forStat);
forStat->name.value = L"<bind-callback>";
forStat->collection = values;
forStat->direction = WfForEachDirection::Normal;
auto forBlock = MakePtr<WfBlockStatement>();
forStat->statement = forBlock;
auto refResult = CreateReference(L"<bind-activator-result>");
auto refFunction = CreateReference(L"<bind-callback>");
auto cast = MakePtr<WfTypeCastingExpression>();
cast->expression = refFunction;
cast->type = GetTypeFromTypeInfo(TypeInfoRetriver<Func<void(Value)>>::CreateTypeInfo().Obj());
cast->strategy = WfTypeCastingStrategy::Strong;
auto call = MakePtr<WfCallExpression>();
call->function = cast;
call->arguments.Add(refResult);
auto stat = MakePtr<WfExpressionStatement>();
stat->expression = call;
forBlock->statements.Add(stat);
}
newSubscription->declarations.Add(AssignNormalMember(func));
}
FOREACH(WfExpression*, observe, bcInfo.orderedObserves.Values())
{
FOREACH(CallbackInfo, callbackInfo, bcInfo.observeCallbackInfos[observe])
{
auto func = MakePtr<WfFunctionDeclaration>();
func->name.value = callbackInfo.callbackName;
func->anonymity = WfFunctionAnonymity::Named;
{
auto genericType = bcInfo.variableTypes[callbackInfo.callbackName]->GetElementType();
func->returnType = GetTypeFromTypeInfo(genericType->GetGenericArgument(0));
vint count = genericType->GetGenericArgumentCount();
for (vint i = 1; i < count; i++)
{
auto arg = MakePtr<WfFunctionArgument>();
arg->name.value = L"<bind-callback-argument>" + itow(i - 1);
arg->type = GetTypeFromTypeInfo(genericType->GetGenericArgument(i));
func->arguments.Add(arg);
}
}
auto block = MakePtr<WfBlockStatement>();
func->statement = block;
{
List<WfExpression*> affected;
affected.Add(observe);
for (vint i = 0; i < affected.Count(); i++)
{
auto current = affected[i];
vint dependencyIndex = dependency.dependencies.Keys().IndexOf(current);
if (dependencyIndex != -1)
{
FOREACH(WfExpression*, affectedObserve, dependency.dependencies.GetByIndex(dependencyIndex))
{
if (affectedObserve && !affected.Contains(affectedObserve))
{
affected.Add(affectedObserve);
}
}
}
}
affected.Remove(observe);
FOREACH(WfExpression*, affectedObserve, From(affected).Reverse())
{
CreateBindDetachStatement(block, manager, affectedObserve, bcInfo);
}
FOREACH(WfExpression*, affectedObserve, affected)
{
CreateBindCacheAssignStatement(block, affectedObserve, bcInfo);
}
FOREACH(WfExpression*, affectedObserve, affected)
{
CreateBindAttachStatement(block, manager, affectedObserve, bcInfo);
}
}
{
auto ref = CreateReference(L"<bind-activator>");
auto call = MakePtr<WfCallExpression>();
call->function = ref;
auto stat = MakePtr<WfExpressionStatement>();
stat->expression = call;
block->statements.Add(stat);
}
newSubscription->declarations.Add(AssignNormalMember(func));
}
}
{
auto func = MakePtr<WfFunctionDeclaration>();
func->name.value = L"<bind-initialize>";
func->anonymity = WfFunctionAnonymity::Named;
func->returnType = GetTypeFromTypeInfo(TypeInfoRetriver<void>::CreateTypeInfo().Obj());
auto block = MakePtr<WfBlockStatement>();
func->statement = block;
{
Group<WfExpression*, WfExpression*> reversedDependencies;
FOREACH_INDEXER(WfExpression*, key, index, dependency.dependencies.Keys())
{
FOREACH(WfExpression*, value, dependency.dependencies.GetByIndex(index))
{
if (value)
{
reversedDependencies.Add(value, key);
}
}
}
SortedList<WfExpression*> freeObserves;
while (reversedDependencies.Count() > 0)
{
CopyFrom(
freeObserves,
From(reversedDependencies.Keys())
.Where([&](WfExpression* observe)
{
return From(reversedDependencies[observe])
.All([&](WfExpression* parent)
{
return !reversedDependencies.Contains(parent);
});
})
);
FOREACH(WfExpression*, observe, bcInfo.orderedObserves.Values())
{
if (freeObserves.Contains(observe))
{
CreateBindCacheAssignStatement(block, observe, bcInfo);
}
}
FOREACH(WfExpression*, observe, freeObserves)
{
reversedDependencies.Remove(observe);
}
freeObserves.Clear();
}
}
{
FOREACH(WfExpression*, observe, bcInfo.orderedObserves.Values())
{
CreateBindAttachStatement(block, manager, observe, bcInfo);
}
}
newSubscription->declarations.Add(AssignNormalMember(func));
}
}
newSubscription->declarations.Add(AssignOverrideMember(CreateBindSubscribeFunction()));
newSubscription->declarations.Add(AssignOverrideMember(CreateBindUpdateFunction(bcInfo)));
newSubscription->declarations.Add(AssignOverrideMember(CreateBindCloseFunction(manager, bcInfo)));
}
}
}
}
/***********************************************************************
ANALYZER\WFANALYZER_EXPANDMIXINCASTEXPRESSION.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace analyzer
{
using namespace collections;
using namespace reflection;
using namespace reflection::description;
/***********************************************************************
ExpandNewCoroutineExpression
***********************************************************************/
void ExpandMixinCastExpression(WfLexicalScopeManager* manager, WfMixinCastExpression* node)
{
auto sourceType = manager->expressionResolvings[node->expression.Obj()].type;
auto newExpr = MakePtr<WfNewInterfaceExpression>();
node->expandedExpression = newExpr;
newExpr->type = CopyType(node->type);
{
auto varDecl = MakePtr<WfVariableDeclaration>();
newExpr->declarations.Add(varDecl);
{
varDecl->classMember = MakePtr<WfClassMember>();
varDecl->classMember->kind = WfClassMemberKind::Normal;
}
varDecl->name.value = L"<mixin-source>";
varDecl->expression = CopyExpression(node->expression);
if (sourceType->GetDecorator() == ITypeInfo::RawPtr)
{
auto tdType = MakePtr<TypeDescriptorTypeInfo>(sourceType->GetTypeDescriptor(), TypeInfoHint::Normal);
auto pointerType = MakePtr<SharedPtrTypeInfo>(tdType);
auto castExpr = MakePtr<WfTypeCastingExpression>();
castExpr->strategy = WfTypeCastingStrategy::Strong;
castExpr->expression = varDecl->expression;
castExpr->type = GetTypeFromTypeInfo(pointerType.Obj());
varDecl->expression = castExpr;
}
}
List<ITypeDescriptor*> unprocessed;
unprocessed.Add(sourceType->GetTypeDescriptor());
for (vint i = 0; i < unprocessed.Count(); i++)
{
auto td = unprocessed[i];
vint groupCount = td->GetMethodGroupCount();
for (vint j = 0; j < groupCount; j++)
{
auto group = td->GetMethodGroup(j);
vint methodCount = group->GetMethodCount();
for (vint k = 0; k < methodCount; k++)
{
auto method = group->GetMethod(k);
if (!method->IsStatic())
{
auto funcDecl = MakePtr<WfFunctionDeclaration>();
newExpr->declarations.Add(funcDecl);
{
funcDecl->classMember = MakePtr<WfClassMember>();
funcDecl->classMember->kind = WfClassMemberKind::Override;
}
funcDecl->anonymity = WfFunctionAnonymity::Named;
funcDecl->name.value = method->GetName();
funcDecl->returnType = GetTypeFromTypeInfo(method->GetReturn());
vint parameterCount = method->GetParameterCount();
for (vint l = 0; l < parameterCount; l++)
{
auto parameter = method->GetParameter(l);
auto argument = MakePtr<WfFunctionArgument>();
argument->name.value = parameter->GetName();
argument->type = GetTypeFromTypeInfo(parameter->GetType());
funcDecl->arguments.Add(argument);
}
auto implBlock = MakePtr<WfBlockStatement>();
funcDecl->statement = implBlock;
{
auto refSource = MakePtr<WfReferenceExpression>();
refSource->name.value = L"<mixin-source>";
auto castExpr = MakePtr<WfTypeCastingExpression>();
castExpr->strategy = WfTypeCastingStrategy::Strong;
castExpr->expression = refSource;
{
auto tdType = MakePtr<TypeDescriptorTypeInfo>(sourceType->GetTypeDescriptor(), TypeInfoHint::Normal);
auto pointerType = MakePtr<RawPtrTypeInfo>(tdType);
castExpr->type = GetTypeFromTypeInfo(pointerType.Obj());
}
auto inferExpr = MakePtr<WfInferExpression>();
inferExpr->expression = castExpr;
{
auto tdType = MakePtr<TypeDescriptorTypeInfo>(method->GetOwnerTypeDescriptor(), TypeInfoHint::Normal);
auto pointerType = MakePtr<RawPtrTypeInfo>(tdType);
inferExpr->type = GetTypeFromTypeInfo(pointerType.Obj());
}
auto memberExpr = MakePtr<WfMemberExpression>();
memberExpr->parent = inferExpr;
memberExpr->name.value = method->GetName();
auto callExpr = MakePtr<WfCallExpression>();
callExpr->function = memberExpr;
for (vint l = 0; l < parameterCount; l++)
{
auto parameter = method->GetParameter(l);
auto argumentExpr = MakePtr<WfReferenceExpression>();
argumentExpr->name.value = parameter->GetName();
callExpr->arguments.Add(argumentExpr);
}
if (method->GetReturn()->GetTypeDescriptor() == description::GetTypeDescriptor<void>())
{
auto stat = MakePtr<WfExpressionStatement>();
stat->expression = callExpr;
implBlock->statements.Add(stat);
}
else
{
auto stat = MakePtr<WfReturnStatement>();
stat->expression = callExpr;
implBlock->statements.Add(stat);
}
}
}
}
}
vint count = td->GetBaseTypeDescriptorCount();
for (vint j = 0; j < count; j++)
{
auto baseTd = td->GetBaseTypeDescriptor(j);
if (!unprocessed.Contains(baseTd))
{
unprocessed.Add(baseTd);
}
}
}
}
}
}
}
/***********************************************************************
ANALYZER\WFANALYZER_EXPANDNEWCOROUTINEEXPRESSION.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace analyzer
{
using namespace collections;
using namespace reflection;
using namespace reflection::description;
/***********************************************************************
FindCoroutineAwaredStatements
***********************************************************************/
class FindCoroutineAwaredStatementVisitor : public empty_visitor::StatementVisitor
{
public:
List<WfStatement*>& awaredStatements;
bool awared = false;
FindCoroutineAwaredStatementVisitor(List<WfStatement*>& _awaredStatements)
:awaredStatements(_awaredStatements)
{
}
bool Call(Ptr<WfStatement> node)
{
if (!node) return false;
awared = false;
node->Accept(this);
if (awared)
{
awaredStatements.Add(node.Obj());
}
return awared;
}
void Dispatch(WfVirtualStatement* node)override
{
awared = Call(node->expandedStatement);
}
void Dispatch(WfCoroutineStatement* node)override
{
awared = true;
}
void Visit(WfReturnStatement* node)override
{
awared = true;
}
void Visit(WfIfStatement* node)override
{
bool a = Call(node->trueBranch);
bool b = Call(node->falseBranch);
awared = a || b;
}
void Visit(WfWhileStatement* node)override
{
awared = Call(node->statement);
}
void Visit(WfTryStatement* node)override
{
bool a = Call(node->protectedStatement);
bool b = Call(node->catchStatement);
bool c = Call(node->finallyStatement);
awared = a || b || c;
}
void Visit(WfBlockStatement* node)override
{
bool result = false;
FOREACH(Ptr<WfStatement>, stat, node->statements)
{
bool a = Call(stat);
result |= a;
}
awared = result;
}
};
void FindCoroutineAwaredStatements(Ptr<WfStatement> node, List<WfStatement*>& awaredStatements)
{
FindCoroutineAwaredStatementVisitor(awaredStatements).Call(node);
}
/***********************************************************************
FindCoroutineAwaredVariables
***********************************************************************/
class FindCoroutineAwaredVariableVisitor : public empty_visitor::StatementVisitor
{
public:
List<WfVariableStatement*>& awaredVariables;
FindCoroutineAwaredVariableVisitor(List<WfVariableStatement*>& _awaredVariables)
:awaredVariables(_awaredVariables)
{
}
void Dispatch(WfVirtualStatement* node)override
{
node->expandedStatement->Accept(this);
}
void Dispatch(WfCoroutineStatement* node)override
{
}
void Visit(WfVariableStatement* node)override
{
awaredVariables.Add(node);
}
};
class FindCoroutineAwaredBlockVisitor : public empty_visitor::StatementVisitor
{
public:
List<WfVariableStatement*>& awaredVariables;
FindCoroutineAwaredBlockVisitor(List<WfVariableStatement*>& _awaredVariables)
:awaredVariables(_awaredVariables)
{
}
void Dispatch(WfVirtualStatement* node)override
{
// If an virtual node is coroutine awared
// than its expandedStatement is also in the list
// no need to find variables again
}
void Dispatch(WfCoroutineStatement* node)override
{
}
void Visit(WfBlockStatement* node)override
{
FindCoroutineAwaredVariableVisitor visitor(awaredVariables);
FOREACH(Ptr<WfStatement>, stat, node->statements)
{
stat->Accept(&visitor);
}
}
};
void FindCoroutineAwaredVariables(WfStatement* node, List<WfVariableStatement*>& awaredVariables)
{
FindCoroutineAwaredBlockVisitor visitor(awaredVariables);
node->Accept(&visitor);
}
/***********************************************************************
FindCoroutineReferenceRenaming
***********************************************************************/
void FindCoroutineReferenceRenaming(WfLexicalScopeManager* manager, List<WfStatement*>& awaredStatements, List<WfVariableStatement*>& awaredVariables, Dictionary<WfLexicalSymbol*, WString>& referenceRenaming)
{
vint renameCounter = 0;
auto rename = [&](const WString& name)
{
if (name.Length() > 0 && name[0] == L'<')
{
vint index = INVLOC.FindFirst(name, L">", Locale::None).key;
auto category = name.Sub(1, index - 1);
auto local = name.Sub(index + 1, name.Length() - index - 1);
return L"<co" + itow(renameCounter++) + L"-" + category + L">" + local;
}
else
{
return L"<co" + itow(renameCounter++) + L">" + name;
}
};
FOREACH(WfVariableStatement*, stat, awaredVariables)
{
auto scope = manager->nodeScopes[stat];
auto symbol = scope->symbols[stat->variable->name.value][0];
auto name = rename(stat->variable->name.value);
referenceRenaming.Add(symbol.Obj(), name);
}
FOREACH(WfStatement*, stat, awaredStatements)
{
if (auto tryStat = dynamic_cast<WfTryStatement*>(stat))
{
if (tryStat->catchStatement)
{
auto scope = manager->nodeScopes[tryStat->catchStatement.Obj()]->parentScope.Obj();
auto symbol = scope->symbols[tryStat->name.value][0];
auto name = rename(tryStat->name.value);
referenceRenaming.Add(symbol.Obj(), name);
}
}
else if (auto ifStat = dynamic_cast<WfIfStatement*>(stat))
{
if (ifStat->name.value != L"")
{
auto scope = manager->nodeScopes[ifStat->trueBranch.Obj()]->parentScope.Obj();
auto symbol = scope->symbols[ifStat->name.value][0];
auto name = rename(ifStat->name.value);
referenceRenaming.Add(symbol.Obj(), name);
}
}
}
}
/***********************************************************************
FlowChart
***********************************************************************/
class FlowChartNode;
class FlowChartBranch : public Object
{
public:
Ptr<WfExpression> condition;
FlowChartNode* destination = nullptr;
};
enum class FlowChartNodeAction
{
None,
SetPause,
};
class FlowChartNode : public Object
{
public:
FlowChartNodeAction action = FlowChartNodeAction::None;
bool embedInBranch = false;
List<Ptr<WfStatement>> statements;
List<Ptr<FlowChartBranch>> branches;
FlowChartNode* destination = nullptr;
FlowChartNode* exceptionDestination = nullptr;
FlowChartNode* pauseDestination = nullptr;
WfLexicalSymbol* exceptionVariable = nullptr;
};
class FlowChart : public Object
{
typedef Dictionary<WfTryStatement*, Ptr<WfLexicalSymbol>> TempExVarMap;
public:
List<Ptr<FlowChartNode>> nodes;
FlowChartNode* headNode = nullptr;
FlowChartNode* lastNode = nullptr;
TempExVarMap tempExVars;
FlowChartNode* CreateNode(FlowChartNode* catchNode)
{
auto node = MakePtr<FlowChartNode>();
node->exceptionDestination = catchNode;
nodes.Add(node);
return node.Obj();
}
FlowChartNode* AppendNode(FlowChartNode* head, FlowChartNode* catchNode, FlowChartNodeAction action = FlowChartNodeAction::None)
{
auto node = CreateNode(catchNode);
node->action = action;
if (head)
{
CHECK_ERROR(head->destination == nullptr, L"FlowChart::AppendNode(FlowChartNode*, FlowChartNode*, FlowChartNodeAction)#Cannot append a new node to a flow chart node that already has a default destination.");
head->destination = node;
}
return node;
}
FlowChartNode* EnsureAppendStatement(FlowChartNode* head, FlowChartNode* catchNode)
{
if (head == nullptr)
{
return CreateNode(catchNode);
}
else if(head->branches.Count() > 0 || head->exceptionDestination != catchNode)
{
CHECK_ERROR(head->destination == nullptr, L"FlowChart::EnsureAppendStatement(FlowChartNode*, FlowChartNode*)#Cannot append a statement to a flow chart node that already has a default destination.");
auto node = CreateNode(catchNode);
head->destination = node;
return node;
}
else
{
return head;
}
}
};
/***********************************************************************
GenerateFlowChart
***********************************************************************/
class GenerateFlowChartModuleVisitor : public copy_visitor::ModuleVisitor
{
public:
WfLexicalScopeManager* manager;
Dictionary<WfLexicalSymbol*, WString>& referenceRenaming;
GenerateFlowChartModuleVisitor(WfLexicalScopeManager* _manager, Dictionary<WfLexicalSymbol*, WString>& _referenceRenaming)
:manager(_manager)
, referenceRenaming(_referenceRenaming)
{
}
void Visit(WfReferenceExpression* node)override
{
copy_visitor::ExpressionVisitor::Visit(node);
vint index = manager->expressionResolvings.Keys().IndexOf(node);
if (index != -1)
{
auto resolvingResult = manager->expressionResolvings.Values()[index];
vint index = referenceRenaming.Keys().IndexOf(resolvingResult.symbol.Obj());
if (index != -1)
{
result.Cast<WfReferenceExpression>()->name.value = referenceRenaming.Values()[index];
}
}
}
};
class GenerateFlowChartStatementVisitor
: public Object
, public WfStatement::IVisitor
, public WfCoroutineStatement::IVisitor
{
public:
enum class ScopeType
{
Function,
Loop,
TryCatch,
};
struct ScopeContext
{
ScopeContext* parent = nullptr;
ScopeType type = ScopeType::Function;
FlowChartNode* enterNode = nullptr;
FlowChartNode* leaveNode = nullptr;
ScopeContext* exitStatementScope = nullptr;
Ptr<WfStatement> exitStatement;
};
public:
WfLexicalScopeManager* manager;
SortedList<WfStatement*>& awaredStatements;
Dictionary<WfLexicalSymbol*, WString>& referenceRenaming;
Ptr<FlowChart> flowChart;
FlowChartNode* headNode;
FlowChartNode* catchNode;
ScopeContext* scopeContext;
FlowChartNode* resultHead = nullptr;
FlowChartNode* resultLast = nullptr;
GenerateFlowChartStatementVisitor(WfLexicalScopeManager* _manager, SortedList<WfStatement*>& _awaredStatements, Dictionary<WfLexicalSymbol*, WString>& _referenceRenaming, Ptr<FlowChart> _flowChart, FlowChartNode* _headNode, FlowChartNode* _catchNode, ScopeContext* _scopeContext)
:manager(_manager)
, awaredStatements(_awaredStatements)
, referenceRenaming(_referenceRenaming)
, flowChart(_flowChart)
, headNode(_headNode)
, catchNode(_catchNode)
, scopeContext(_scopeContext)
{
}
#define COPY_AST(STATEMENT) GenerateFlowChartModuleVisitor(manager, referenceRenaming).CreateField(STATEMENT)
void AppendAwaredStatement(FlowChartNode* catchNode, ScopeContext* scopeContext, Ptr<WfStatement> statement)
{
if (!resultHead)
{
resultHead = flowChart->EnsureAppendStatement(headNode, catchNode);
resultLast = resultHead;
}
resultLast = Execute(resultHead, catchNode, scopeContext, statement).value;
}
void AppendUnawaredCopiedStatement(FlowChartNode* catchNode, ScopeContext* scopeContext, Ptr<WfStatement> statement)
{
if (!resultHead)
{
resultHead = flowChart->EnsureAppendStatement(headNode, catchNode);
resultLast = resultHead;
}
resultHead->statements.Add(statement);
}
ScopeContext* InlineScopeExitCode(ScopeType untilScopeType, bool exclusive)
{
auto current = scopeContext;
while (current)
{
if (exclusive && current->type == untilScopeType) break;
if (current->exitStatement)
{
AppendAwaredStatement(catchNode, current->exitStatementScope, current->exitStatement);
}
if (!exclusive && current->type == untilScopeType) break;
current = current->parent;
}
return current;
}
static Pair<FlowChartNode*, FlowChartNode*> Execute(WfLexicalScopeManager* manager, SortedList<WfStatement*>& awaredStatements, Dictionary<WfLexicalSymbol*, WString>& referenceRenaming, Ptr<FlowChart> flowChart, FlowChartNode* headNode, FlowChartNode* catchNode, ScopeContext* scopeContext, Ptr<WfStatement> statement)
{
GenerateFlowChartStatementVisitor visitor(manager, awaredStatements, referenceRenaming, flowChart, headNode, catchNode, scopeContext);
if (awaredStatements.Contains(statement.Obj()))
{
statement->Accept(&visitor);
}
else
{
visitor.AppendUnawaredCopiedStatement(catchNode, scopeContext, COPY_AST(statement));
}
return{ visitor.resultHead,visitor.resultLast };
}
Pair<FlowChartNode*, FlowChartNode*> Execute(FlowChartNode* headNode, FlowChartNode* catchNode, ScopeContext* scopeContext, Ptr<WfStatement> statement)
{
return Execute(manager, awaredStatements, referenceRenaming, flowChart, headNode, catchNode, scopeContext, statement);
}
void Visit(WfBreakStatement* node)override
{
auto targetContext = InlineScopeExitCode(ScopeType::Loop, false);
resultLast->destination = targetContext->leaveNode;
}
void Visit(WfContinueStatement* node)override
{
auto targetContext = InlineScopeExitCode(ScopeType::Loop, true);
resultLast->destination = targetContext->enterNode;
}
void Visit(WfReturnStatement* node)override
{
auto targetContext = InlineScopeExitCode(ScopeType::Function, false);
AppendUnawaredCopiedStatement(catchNode, scopeContext, COPY_AST(node));
resultLast->destination = targetContext->leaveNode;
}
void Visit(WfDeleteStatement* node)override
{
AppendUnawaredCopiedStatement(catchNode, scopeContext, COPY_AST(node));
}
void Visit(WfRaiseExceptionStatement* node)override
{
AppendUnawaredCopiedStatement(catchNode, scopeContext, COPY_AST(node));
}
void GenerateIfWithVar(WfIfStatement* node)
{
resultHead = flowChart->EnsureAppendStatement(headNode, catchNode);
{
auto branch = MakePtr<FlowChartBranch>();
resultHead->branches.Add(branch);
auto scope = manager->nodeScopes[node];
auto symbol = scope->symbols[node->name.value][0].Obj();
{
auto refExpr = MakePtr<WfReferenceExpression>();
refExpr->name.value = referenceRenaming[symbol];
auto assignExpr = MakePtr<WfBinaryExpression>();
assignExpr->op = WfBinaryOperator::Assign;
assignExpr->first = refExpr;
assignExpr->second = COPY_AST(node->expression);
auto stat = MakePtr<WfExpressionStatement>();
stat->expression = assignExpr;
SetCodeRange((Ptr<WfStatement>)stat, node->expression->codeRange);
resultHead->statements.Add(stat);
}
{
auto refExpr = MakePtr<WfReferenceExpression>();
refExpr->name.value = referenceRenaming[symbol];
auto testExpr = MakePtr<WfTypeTestingExpression>();
testExpr->test = WfTypeTesting::IsNotNull;
testExpr->expression = refExpr;
SetCodeRange((Ptr<WfExpression>)testExpr, node->expression->codeRange);
branch->condition = testExpr;
}
}
resultLast = flowChart->CreateNode(catchNode);
{
auto pair = Execute(nullptr, catchNode, scopeContext, node->trueBranch);
pair.value->destination = resultLast;
resultHead->branches[0]->destination = pair.key;
}
if (node->falseBranch)
{
auto pair = Execute(nullptr, catchNode, scopeContext, node->falseBranch);
pair.value->destination = resultLast;
resultHead->destination = pair.key;
}
else
{
resultHead->destination = resultLast;
}
}
void GenerateIfWithoutVar(WfIfStatement* node)
{
resultHead = flowChart->EnsureAppendStatement(headNode, catchNode);
resultLast = flowChart->CreateNode(catchNode);
while (true)
{
auto branch = MakePtr<FlowChartBranch>();
resultHead->branches.Add(branch);
branch->condition = COPY_AST(node->expression);
auto pair = Execute(nullptr, catchNode, scopeContext, node->trueBranch);
pair.value->destination = resultLast;
branch->destination = pair.key;
auto next = dynamic_cast<WfIfStatement*>(node->falseBranch.Obj());
if (next && next->name.value == L"")
{
node = next;
}
else
{
break;
}
}
if (node->falseBranch)
{
auto pair = Execute(nullptr, catchNode, scopeContext, node->falseBranch);
pair.value->destination = resultLast;
resultHead->destination = pair.key;
}
else
{
resultHead->destination = resultLast;
}
}
void Visit(WfIfStatement* node)override
{
if (node->name.value == L"")
{
GenerateIfWithoutVar(node);
}
else
{
GenerateIfWithVar(node);
}
}
void Visit(WfWhileStatement* node)override
{
resultHead = flowChart->EnsureAppendStatement(headNode, catchNode);
{
auto branch = MakePtr<FlowChartBranch>();
resultHead->branches.Add(branch);
branch->condition = COPY_AST(node->condition);
}
auto loopEnd = flowChart->CreateNode(catchNode);
{
auto branch = MakePtr<FlowChartBranch>();
loopEnd->branches.Add(branch);
branch->condition = COPY_AST(node->condition);
}
resultLast = flowChart->CreateNode(catchNode);
ScopeContext loopContext;
loopContext.parent = scopeContext;
loopContext.type = ScopeType::Loop;
loopContext.enterNode = loopEnd;
loopContext.leaveNode = resultLast;
auto pair = Execute(nullptr, catchNode, &loopContext, node->statement);
pair.value->destination = loopEnd;
resultHead->branches[0]->destination = pair.key;
loopEnd->branches[0]->destination = pair.key;
resultHead->destination = resultLast;
loopEnd->destination = resultLast;
}
WfLexicalSymbol* GetExceptionVariableSymbol(WfTryStatement* node)
{
if (node->catchStatement)
{
auto scope = manager->nodeScopes[node->catchStatement.Obj()]->parentScope.Obj();
auto symbol = scope->symbols[node->name.value][0];
return symbol.Obj();
}
else
{
vint index = flowChart->tempExVars.Keys().IndexOf(node);
if (index == -1)
{
auto symbol = MakePtr<WfLexicalSymbol>(nullptr);
symbol->name = L"ex";
symbol->typeInfo = TypeInfoRetriver<Ptr<IValueException>>::CreateTypeInfo();
flowChart->tempExVars.Add(node, symbol);
referenceRenaming.Add(symbol.Obj(), L"<co-tempexvar" + itow(flowChart->tempExVars.Count() - 1) + L">ex");
return symbol.Obj();
}
return flowChart->tempExVars.Values()[index].Obj();
}
}
Pair<FlowChartNode*, FlowChartNode*> GenerateCatch(WfTryStatement* node, FlowChartNode* catchNode)
{
auto pair = Execute(nullptr, catchNode, scopeContext, node->catchStatement);
pair.key->exceptionVariable = GetExceptionVariableSymbol(node);
return pair;
}
Pair<FlowChartNode*, FlowChartNode*> GenerateFinally(WfTryStatement* node, FlowChartNode* catchNode)
{
return Execute(nullptr, catchNode, scopeContext, node->finallyStatement);
}
Pair<FlowChartNode*, FlowChartNode*> GenerateFinallyAndRaise(WfTryStatement* node, FlowChartNode* catchNode)
{
auto pair = Execute(nullptr, catchNode, scopeContext, node->finallyStatement);
auto raiseNode = flowChart->CreateNode(catchNode);
{
pair.key->exceptionVariable = GetExceptionVariableSymbol(node);
auto refExpr = MakePtr<WfReferenceExpression>();
refExpr->name.value = referenceRenaming[pair.key->exceptionVariable];
auto memberExpr = MakePtr<WfMemberExpression>();
memberExpr->parent = refExpr;
memberExpr->name.value = L"Message";
auto raiseStat = MakePtr<WfRaiseExceptionStatement>();
raiseStat->expression = memberExpr;
SetCodeRange((Ptr<WfStatement>)raiseStat, node->finallyStatement->codeRange);
raiseNode->statements.Add(raiseStat);
}
pair.value->destination = raiseNode;
return { pair.key,raiseNode };
}
void Visit(WfTryStatement* node)override
{
ScopeContext tryContext;
tryContext.parent = scopeContext;
tryContext.type = ScopeType::TryCatch;
if (node->finallyStatement)
{
tryContext.exitStatementScope = scopeContext;
tryContext.exitStatement = node->finallyStatement;
}
if (node->catchStatement && !node->finallyStatement)
{
auto pairCatch = GenerateCatch(node, catchNode);
AppendAwaredStatement(pairCatch.key, &tryContext, node->protectedStatement);
auto endNode = flowChart->CreateNode(catchNode);
pairCatch.value->destination = endNode;
resultLast->destination = endNode;
resultLast = endNode;
}
else if (!node->catchStatement && node->finallyStatement)
{
auto pairFinallyAndRaise = GenerateFinallyAndRaise(node, catchNode);
AppendAwaredStatement(pairFinallyAndRaise.key, &tryContext, node->protectedStatement);
auto pairFinally = GenerateFinally(node, catchNode);
auto endNode = flowChart->CreateNode(catchNode);
resultLast->destination = pairFinally.key;
pairFinally.value->destination = endNode;
pairFinallyAndRaise.value->destination = endNode;
resultLast = endNode;
}
else
{
auto pairFinallyAndRaise = GenerateFinallyAndRaise(node, catchNode);
auto pairCatch = GenerateCatch(node, pairFinallyAndRaise.key);
AppendAwaredStatement(pairCatch.key, &tryContext, node->protectedStatement);
auto pairFinally = GenerateFinally(node, catchNode);
auto endNode = flowChart->CreateNode(catchNode);
resultLast->destination = pairFinally.key;
pairCatch.value->destination = pairFinally.key;
pairFinally.value->destination = endNode;
pairFinallyAndRaise.value->destination = endNode;
resultLast = endNode;
}
}
void Visit(WfBlockStatement* node)override
{
resultHead = flowChart->EnsureAppendStatement(headNode, catchNode);
resultLast = resultHead;
FOREACH_INDEXER(Ptr<WfStatement>, stat, index, node->statements)
{
auto pair = Execute(resultLast, catchNode, scopeContext, stat);
resultLast = pair.value;
}
}
void Visit(WfVariableStatement* node)override
{
resultHead = flowChart->EnsureAppendStatement(headNode, catchNode);
resultLast = resultHead;
auto scope = manager->nodeScopes[node];
auto symbol = scope->symbols[node->variable->name.value][0].Obj();
auto refExpr = MakePtr<WfReferenceExpression>();
refExpr->name.value = referenceRenaming[symbol];
auto assignExpr = MakePtr<WfBinaryExpression>();
assignExpr->op = WfBinaryOperator::Assign;
assignExpr->first = refExpr;
assignExpr->second = COPY_AST(node->variable->expression);
auto stat = MakePtr<WfExpressionStatement>();
stat->expression = assignExpr;
SetCodeRange((Ptr<WfStatement>)stat, node->codeRange);
AppendUnawaredCopiedStatement(catchNode, scopeContext, stat);
}
void Visit(WfExpressionStatement* node)override
{
AppendUnawaredCopiedStatement(catchNode, scopeContext, COPY_AST(node));
}
void Visit(WfVirtualStatement* node)override
{
node->expandedStatement->Accept(this);
}
void Visit(WfCoroutineStatement* node)override
{
node->Accept(static_cast<WfCoroutineStatement::IVisitor*>(this));
}
void Visit(WfCoPauseStatement* node)override
{
resultHead = flowChart->AppendNode(headNode, catchNode, FlowChartNodeAction::SetPause);
resultLast = resultHead;
if (node->statement)
{
AppendUnawaredCopiedStatement(catchNode, scopeContext, COPY_AST(node->statement));
}
resultLast = flowChart->AppendNode(resultLast, catchNode);
{
auto pauseStat = MakePtr<WfCoPauseStatement>();
SetCodeRange((Ptr<WfStatement>)pauseStat, node->codeRange);
resultLast->statements.Add(pauseStat);
}
resultLast = flowChart->AppendNode(resultLast, catchNode);
resultHead->pauseDestination = resultLast;
}
void Visit(WfCoOperatorStatement* node)override
{
CHECK_FAIL(L"GenerateFlowChartStatementVisitor::Visit(WfCoOperatorStatement*)#Internal error, co-operator statement is not allowed in $coroutine expression.");
}
#undef COPY_STATEMENT
};
Ptr<FlowChart> GenerateFlowChart(WfLexicalScopeManager* manager, List<WfStatement*>& awaredStatements, List<WfVariableStatement*>& awaredVariables, Dictionary<WfLexicalSymbol*, WString>& referenceRenaming, Ptr<WfStatement> statement)
{
auto flowChart = MakePtr<FlowChart>();
SortedList<WfStatement*> sortedAwaredStatements;
CopyFrom(sortedAwaredStatements, awaredStatements, true);
CopyFrom(sortedAwaredStatements, awaredVariables, true);
auto endNode = flowChart->CreateNode(nullptr);
GenerateFlowChartStatementVisitor::ScopeContext context;
context.leaveNode = endNode;
auto pair = GenerateFlowChartStatementVisitor::Execute(manager, sortedAwaredStatements, referenceRenaming, flowChart, nullptr, nullptr, &context, statement);
pair.value->destination = endNode;
flowChart->headNode = pair.key;
flowChart->lastNode = endNode;
return flowChart;
}
/***********************************************************************
RemoveUnnecessaryNodes
***********************************************************************/
void CalculateEnterCounts(Ptr<FlowChart> flowChart, Dictionary<FlowChartNode*, vint>& enterCounts)
{
const auto& keys = enterCounts.Keys();
auto& values = const_cast<Dictionary<FlowChartNode*, vint>::ValueContainer&>(enterCounts.Values());
FOREACH(Ptr<FlowChartNode>, node, flowChart->nodes)
{
enterCounts.Add(node.Obj(), 0);
}
enterCounts.Set(flowChart->headNode, 1);
auto Inc = [&](FlowChartNode* node)
{
if (node)
{
vint index = keys.IndexOf(node);
values[index]++;
}
};
FOREACH(Ptr<FlowChartNode>, node, flowChart->nodes)
{
Inc(node->destination);
Inc(node->exceptionDestination);
Inc(node->pauseDestination);
FOREACH(Ptr<FlowChartBranch>, branch, node->branches)
{
Inc(branch->destination);
}
}
}
void RemoveUnnecessaryNodesPass(Ptr<FlowChart> flowChart)
{
Dictionary<FlowChartNode*, vint> enterCounts;
CalculateEnterCounts(flowChart, enterCounts);
SortedList<FlowChartNode*> mergableNodes;
List<Ptr<FlowChartNode>> keepingNodes;
FOREACH(Ptr<FlowChartNode>, node, flowChart->nodes)
{
bool mergable = false;
if (node->branches.Count() == 0 && node->destination)
{
if (node->statements.Count() == 0 && node->action == FlowChartNodeAction::None && !node->exceptionVariable)
{
mergable = true;
}
else if (node->destination->action == FlowChartNodeAction::None && !node->destination->exceptionVariable && enterCounts[node->destination] == 1)
{
mergable = true;
}
}
if (mergable)
{
mergableNodes.Add(node.Obj());
}
else
{
keepingNodes.Add(node);
}
}
Dictionary<FlowChartNode*, FlowChartNode*> merging;
FOREACH(FlowChartNode*, node, mergableNodes)
{
auto current = node;
while (mergableNodes.Contains(current))
{
auto target = current->destination;
if (current->action == FlowChartNodeAction::SetPause)
{
target->action = current->action;
target->pauseDestination = current->pauseDestination;
}
if (current->exceptionVariable)
{
target->exceptionVariable = current->exceptionVariable;
}
if (current->statements.Count() > 0)
{
CopyFrom(current->statements, target->statements, true);
CopyFrom(target->statements, current->statements);
current->statements.Clear();
}
current = target;
}
merging.Add(node, current);
}
#define MERGE_FLOW_CHART_NODE(DESTINATION)\
{\
vint index = merging.Keys().IndexOf(DESTINATION);\
if (index != -1) DESTINATION = merging.Values()[index];\
}\
FOREACH(Ptr<FlowChartNode>, node, flowChart->nodes)
{
if (!mergableNodes.Contains(node.Obj()))
{
MERGE_FLOW_CHART_NODE(node->destination);
MERGE_FLOW_CHART_NODE(node->exceptionDestination);
MERGE_FLOW_CHART_NODE(node->pauseDestination);
FOREACH(Ptr<FlowChartBranch>, branch, node->branches)
{
MERGE_FLOW_CHART_NODE(branch->destination);
}
}
}
MERGE_FLOW_CHART_NODE(flowChart->headNode);
MERGE_FLOW_CHART_NODE(flowChart->lastNode);
#undef MERGE_FLOW_CHART_NODE
vint headNodeIndex = keepingNodes.IndexOf(flowChart->headNode);
if (headNodeIndex != 0)
{
auto headNode = keepingNodes[headNodeIndex];
keepingNodes.RemoveAt(headNodeIndex);
keepingNodes.Insert(0, headNode);
}
CopyFrom(flowChart->nodes, keepingNodes);
}
void RemoveUnnecessaryNodes(Ptr<FlowChart> flowChart)
{
RemoveUnnecessaryNodesPass(flowChart);
FOREACH(Ptr<FlowChartNode>, node, flowChart->nodes)
{
if (node->pauseDestination && node->statements.Count() > 0 && node->statements[node->statements.Count() - 1].Cast<WfCoPauseStatement>())
{
node->destination = nullptr;
}
}
Dictionary<FlowChartNode*, vint> enterCounts;
CalculateEnterCounts(flowChart, enterCounts);
FOREACH(Ptr<FlowChartNode>, node, flowChart->nodes)
{
FOREACH(Ptr<FlowChartBranch>, branch, node->branches)
{
if (enterCounts[branch->destination] == 1)
{
branch->destination->embedInBranch = true;
}
}
}
}
/***********************************************************************
GenerateSetStatus
***********************************************************************/
Ptr<WfStatement> GenerateSetStatus(const WString& status)
{
auto refExpr = MakePtr<WfReferenceExpression>();
refExpr->name.value = status;
auto funcExpr = MakePtr<WfReferenceExpression>();
funcExpr->name.value = L"SetStatus";
auto callExpr = MakePtr<WfCallExpression>();
callExpr->function = funcExpr;
callExpr->arguments.Add(refExpr);
auto stat = MakePtr<WfExpressionStatement>();
stat->expression = callExpr;
return stat;
};
/***********************************************************************
GenerateSetCoState
***********************************************************************/
Ptr<WfStatement> GenerateSetCoState(List<FlowChartNode*>& nodeOrders, FlowChartNode* node)
{
auto refState = MakePtr<WfReferenceExpression>();
refState->name.value = L"<co-state>";
auto intState = MakePtr<WfIntegerExpression>();
intState->value.value = itow(nodeOrders.IndexOf(node));
auto assignExpr = MakePtr<WfBinaryExpression>();
assignExpr->op = WfBinaryOperator::Assign;
assignExpr->first = refState;
assignExpr->second = intState;
auto stat = MakePtr<WfExpressionStatement>();
stat->expression = assignExpr;
return stat;
};
/***********************************************************************
ExpandExceptionDestination
***********************************************************************/
Ptr<WfBlockStatement> ExpandExceptionDestination(FlowChartNode* catchNode, Dictionary<WfLexicalSymbol*, WString>& referenceRenaming, List<FlowChartNode*>& nodeOrders, Ptr<WfBlockStatement> stateBlock)
{
/////////////////////////////////////////////////////////////////////////////
// try { ... }
/////////////////////////////////////////////////////////////////////////////
auto nodeTryStat = MakePtr<WfTryStatement>();
auto nodeBlock = MakePtr<WfBlockStatement>();
nodeTryStat->protectedStatement = nodeBlock;
/////////////////////////////////////////////////////////////////////////////
// catch(<co-ex>)
// {
// THE_EXCEPTION_VARIABLE = <co-ex>;
// <co-state> = THE_EXCEPTION_STATE;
// continue;
// }
/////////////////////////////////////////////////////////////////////////////
nodeTryStat->name.value = L"<co-ex>";
auto catchBlock = MakePtr<WfBlockStatement>();
nodeTryStat->catchStatement = catchBlock;
{
auto refTarget = MakePtr<WfReferenceExpression>();
refTarget->name.value = referenceRenaming[catchNode->exceptionVariable];
auto refEx = MakePtr<WfReferenceExpression>();
refEx->name.value = L"<co-ex>";
auto assignExpr = MakePtr<WfBinaryExpression>();
assignExpr->op = WfBinaryOperator::Assign;
assignExpr->first = refTarget;
assignExpr->second = refEx;
auto stat = MakePtr<WfExpressionStatement>();
stat->expression = assignExpr;
catchBlock->statements.Add(stat);
}
catchBlock->statements.Add(GenerateSetCoState(nodeOrders, catchNode));
catchBlock->statements.Add(MakePtr<WfContinueStatement>());
stateBlock->statements.Add(nodeTryStat);
return nodeBlock;
}
/***********************************************************************
ExpandFlowChartNode
***********************************************************************/
void ExpandFlowChartNode(Ptr<FlowChart> flowChart, FlowChartNode* flowChartNode, Dictionary<WfLexicalSymbol*, WString>& referenceRenaming, List<FlowChartNode*>& nodeOrders, FlowChartNode* parentCatchNode, Ptr<WfBlockStatement> stateBlock)
{
if (flowChartNode->action == FlowChartNodeAction::SetPause)
{
/////////////////////////////////////////////////////////////////////////////
// <co-state> = THE_NEXT_STATE;
// SetStatus(Waiting);
/////////////////////////////////////////////////////////////////////////////
stateBlock->statements.Add(GenerateSetStatus(L"Waiting"));
stateBlock->statements.Add(GenerateSetCoState(nodeOrders, flowChartNode->pauseDestination));
}
auto nodeBlock = stateBlock;
if (flowChartNode->exceptionDestination && parentCatchNode != flowChartNode->exceptionDestination)
{
nodeBlock = ExpandExceptionDestination(flowChartNode->exceptionDestination, referenceRenaming, nodeOrders, stateBlock);
}
bool exited = false;
FOREACH(Ptr<WfStatement>, stat, flowChartNode->statements)
{
if (stat.Cast<WfCoPauseStatement>())
{
exited = true;
/////////////////////////////////////////////////////////////////////////////
// return;
/////////////////////////////////////////////////////////////////////////////
nodeBlock->statements.Add(MakePtr<WfReturnStatement>());
}
else if (stat.Cast<WfReturnStatement>())
{
exited = true;
/////////////////////////////////////////////////////////////////////////////
// SetStatus(Stopped);
// return;
/////////////////////////////////////////////////////////////////////////////
stateBlock->statements.Add(GenerateSetStatus(L"Stopped"));
{
auto returnStat = MakePtr<WfReturnStatement>();
stateBlock->statements.Add(returnStat);
}
}
else
{
if (stat.Cast<WfRaiseExceptionStatement>())
{
exited = true;
}
nodeBlock->statements.Add(stat);
}
}
FOREACH(Ptr<FlowChartBranch>, branch, flowChartNode->branches)
{
auto ifStat = MakePtr<WfIfStatement>();
ifStat->expression = branch->condition;
auto trueBlock = MakePtr<WfBlockStatement>();
ifStat->trueBranch = trueBlock;
if (branch->destination->embedInBranch)
{
ExpandFlowChartNode(flowChart, branch->destination, referenceRenaming, nodeOrders, flowChartNode->exceptionDestination, trueBlock);
}
else
{
trueBlock->statements.Add(GenerateSetCoState(nodeOrders, branch->destination));
trueBlock->statements.Add(MakePtr<WfContinueStatement>());
}
nodeBlock->statements.Add(ifStat);
}
if (!exited)
{
if (flowChartNode == flowChart->lastNode)
{
/////////////////////////////////////////////////////////////////////////////
// SetStatus(Stopped);
// return;
/////////////////////////////////////////////////////////////////////////////
stateBlock->statements.Add(GenerateSetStatus(L"Stopped"));
{
auto returnStat = MakePtr<WfReturnStatement>();
stateBlock->statements.Add(returnStat);
}
}
else
{
/////////////////////////////////////////////////////////////////////////////
// <co-state> = THE_NEXT_STATE;
// continue;
/////////////////////////////////////////////////////////////////////////////
stateBlock->statements.Add(GenerateSetCoState(nodeOrders, flowChartNode->destination));
stateBlock->statements.Add(MakePtr<WfContinueStatement>());
}
}
}
/***********************************************************************
ExpandNewCoroutineExpression
***********************************************************************/
void ExpandNewCoroutineExpression(WfLexicalScopeManager* manager, WfNewCoroutineExpression* node)
{
List<WfStatement*> awaredStatements;
List<WfVariableStatement*> awaredVariables;
Dictionary<WfLexicalSymbol*, WString> referenceRenaming;
FindCoroutineAwaredStatements(node->statement, awaredStatements);
FOREACH(WfStatement*, stat, awaredStatements)
{
FindCoroutineAwaredVariables(stat, awaredVariables);
}
FindCoroutineReferenceRenaming(manager, awaredStatements, awaredVariables, referenceRenaming);
auto flowChart = GenerateFlowChart(manager, awaredStatements, awaredVariables, referenceRenaming, node->statement);
RemoveUnnecessaryNodes(flowChart);
List<FlowChartNode*> nodeOrders;
CopyFrom(
nodeOrders,
From(flowChart->nodes)
.Select([](Ptr<FlowChartNode> node)
{
return node.Obj();
})
.Where([](FlowChartNode* node)
{
return !node->embedInBranch;
})
);
auto newExpr = MakePtr<WfNewInterfaceExpression>();
node->expandedExpression = newExpr;
newExpr->type = GetTypeFromTypeInfo(TypeInfoRetriver<Ptr<ICoroutine>>::CreateTypeInfo().Obj());
/////////////////////////////////////////////////////////////////////////////
// Coroutine Awared Variables
/////////////////////////////////////////////////////////////////////////////
FOREACH(WfLexicalSymbol*, symbol,
From(referenceRenaming.Keys())
.OrderBy([&](WfLexicalSymbol* a, WfLexicalSymbol* b)
{
return WString::Compare(referenceRenaming[a], referenceRenaming[b]);
}))
{
auto varDecl = MakePtr<WfVariableDeclaration>();
newExpr->declarations.Add(varDecl);
{
auto member = MakePtr<WfClassMember>();
member->kind = WfClassMemberKind::Normal;
varDecl->classMember = member;
}
varDecl->name.value = referenceRenaming[symbol];
varDecl->type = GetTypeFromTypeInfo(symbol->typeInfo.Obj());
varDecl->expression = CreateDefaultValue(symbol->typeInfo.Obj());
}
/////////////////////////////////////////////////////////////////////////////
// <co-state>
/////////////////////////////////////////////////////////////////////////////
{
auto varDecl = MakePtr<WfVariableDeclaration>();
newExpr->declarations.Add(varDecl);
{
auto member = MakePtr<WfClassMember>();
member->kind = WfClassMemberKind::Normal;
varDecl->classMember = member;
}
varDecl->name.value = L"<co-state>";
varDecl->type = GetTypeFromTypeInfo(TypeInfoRetriver<vint>::CreateTypeInfo().Obj());
auto stateExpr = MakePtr<WfIntegerExpression>();
stateExpr->value.value = L"0";
varDecl->expression = stateExpr;
}
/////////////////////////////////////////////////////////////////////////////
// prop Failure : Exception^ {const, not observe}
/////////////////////////////////////////////////////////////////////////////
{
auto propDecl = MakePtr<WfAutoPropertyDeclaration>();
newExpr->declarations.Add(propDecl);
{
auto member = MakePtr<WfClassMember>();
member->kind = WfClassMemberKind::Override;
propDecl->classMember = member;
}
propDecl->name.value = L"Failure";
propDecl->type = GetTypeFromTypeInfo(TypeInfoRetriver<Ptr<IValueException>>::CreateTypeInfo().Obj());
propDecl->configConst = WfAPConst::Readonly;
propDecl->configObserve = WfAPObserve::NotObservable;
auto nullExpr = MakePtr<WfLiteralExpression>();
nullExpr->value = WfLiteralValue::Null;
propDecl->expression = nullExpr;
}
/////////////////////////////////////////////////////////////////////////////
// prop Status : CoroutineStatus^ {const, not observe}
/////////////////////////////////////////////////////////////////////////////
{
auto propDecl = MakePtr<WfAutoPropertyDeclaration>();
newExpr->declarations.Add(propDecl);
{
auto member = MakePtr<WfClassMember>();
member->kind = WfClassMemberKind::Override;
propDecl->classMember = member;
}
propDecl->name.value = L"Status";
propDecl->type = GetTypeFromTypeInfo(TypeInfoRetriver<CoroutineStatus>::CreateTypeInfo().Obj());
propDecl->configConst = WfAPConst::Readonly;
propDecl->configObserve = WfAPObserve::NotObservable;
auto refExpr = MakePtr<WfReferenceExpression>();
refExpr->name.value = L"Waiting";
propDecl->expression = refExpr;
}
/////////////////////////////////////////////////////////////////////////////
// func Resume(<raise-exception> : bool, <coroutine-output> : CoroutineResult^) : void
/////////////////////////////////////////////////////////////////////////////
{
auto funcDecl = MakePtr<WfFunctionDeclaration>();
newExpr->declarations.Add(funcDecl);
{
auto member = MakePtr<WfClassMember>();
member->kind = WfClassMemberKind::Override;
funcDecl->classMember = member;
}
funcDecl->name.value = L"Resume";
funcDecl->returnType = GetTypeFromTypeInfo(TypeInfoRetriver<void>::CreateTypeInfo().Obj());
{
auto argument = MakePtr<WfFunctionArgument>();
funcDecl->arguments.Add(argument);
argument->name.value = L"<raise-exception>";
argument->type = GetTypeFromTypeInfo(TypeInfoRetriver<bool>::CreateTypeInfo().Obj());
}
{
auto argument = MakePtr<WfFunctionArgument>();
funcDecl->arguments.Add(argument);
if (node->name.value == L"")
{
argument->name.value = L"<coroutine-output>";
}
else
{
argument->name.value = node->name.value;
}
argument->type = GetTypeFromTypeInfo(TypeInfoRetriver<Ptr<CoroutineResult>>::CreateTypeInfo().Obj());
}
auto block = MakePtr<WfBlockStatement>();
funcDecl->statement = block;
/////////////////////////////////////////////////////////////////////////////
// if (Status != Waiting) raise "...";
/////////////////////////////////////////////////////////////////////////////
{
auto ifStat = MakePtr<WfIfStatement>();
{
auto refStatus = MakePtr<WfReferenceExpression>();
refStatus->name.value = L"Status";
auto waitingStatus = MakePtr<WfChildExpression>();
waitingStatus->parent = GetExpressionFromTypeDescriptor(description::GetTypeDescriptor<CoroutineStatus>());
waitingStatus->name.value = L"Waiting";
auto compExpr = MakePtr<WfBinaryExpression>();
compExpr->op = WfBinaryOperator::NE;
compExpr->first = refStatus;
compExpr->second = waitingStatus;
ifStat->expression = compExpr;
}
auto trueBlock = MakePtr<WfBlockStatement>();
ifStat->trueBranch = trueBlock;
{
auto exExpr = MakePtr<WfStringExpression>();
exExpr->value.value = L"Resume should be called only when the coroutine is in the waiting status.";
auto raiseStat = MakePtr<WfRaiseExceptionStatement>();
raiseStat->expression = exExpr;
trueBlock->statements.Add(raiseStat);
}
block->statements.Add(ifStat);
}
/////////////////////////////////////////////////////////////////////////////
// SetStatus(Executing);
/////////////////////////////////////////////////////////////////////////////
block->statements.Add(GenerateSetStatus(L"Executing"));
{
/////////////////////////////////////////////////////////////////////////////
// try { ... }
/////////////////////////////////////////////////////////////////////////////
auto tryStat = MakePtr<WfTryStatement>();
auto tryBlock = MakePtr<WfBlockStatement>();
tryStat->protectedStatement = tryBlock;
{
/////////////////////////////////////////////////////////////////////////////
// while (true) { ... }
/////////////////////////////////////////////////////////////////////////////
auto whileStat = MakePtr<WfWhileStatement>();
{
auto trueExpr = MakePtr<WfLiteralExpression>();
trueExpr->value = WfLiteralValue::True;
whileStat->condition = trueExpr;
}
auto whileBlock = MakePtr<WfBlockStatement>();
whileStat->statement = whileBlock;
using GroupPair = Pair<FlowChartNode*, LazyList<FlowChartNode*>>;
auto nodeByCatches = From(nodeOrders)
.GroupBy([](FlowChartNode* node)
{
return node->exceptionDestination;
})
.OrderBy([&](const GroupPair& p1, const GroupPair& p2)
{
return nodeOrders.IndexOf(p1.key) - nodeOrders.IndexOf(p2.key);
});
FOREACH(GroupPair, group, nodeByCatches)
{
auto catchNode = group.key;
auto groupBlock = whileBlock;
if (catchNode)
{
groupBlock = ExpandExceptionDestination(catchNode, referenceRenaming, nodeOrders, whileBlock);
}
FOREACH(FlowChartNode*, flowChartNode, group.value)
{
/////////////////////////////////////////////////////////////////////////////
// if (<co-state> == THE_CURRENT_STATE) { ... }
/////////////////////////////////////////////////////////////////////////////
auto ifStat = MakePtr<WfIfStatement>();
groupBlock->statements.Add(ifStat);
{
auto refState = MakePtr<WfReferenceExpression>();
refState->name.value = L"<co-state>";
auto intState = MakePtr<WfIntegerExpression>();
intState->value.value = itow(nodeOrders.IndexOf(flowChartNode));
auto compExpr = MakePtr<WfBinaryExpression>();
compExpr->op = WfBinaryOperator::EQ;
compExpr->first = refState;
compExpr->second = intState;
ifStat->expression = compExpr;
}
auto stateBlock = MakePtr<WfBlockStatement>();
ifStat->trueBranch = stateBlock;
{
ExpandFlowChartNode(flowChart, flowChartNode, referenceRenaming, nodeOrders, catchNode, stateBlock);
}
}
}
tryBlock->statements.Add(whileStat);
}
/////////////////////////////////////////////////////////////////////////////
// catch(<co-ex>)
// {
// SetFailure(<co-ex>);
// SetStatus(Stopped);
// if (<raise-exception>) raise <co-ex>;
// }
/////////////////////////////////////////////////////////////////////////////
tryStat->name.value = L"<co-ex>";
auto catchBlock = MakePtr<WfBlockStatement>();
tryStat->catchStatement = catchBlock;
{
auto refExpr = MakePtr<WfReferenceExpression>();
refExpr->name.value = L"<co-ex>";
auto funcExpr = MakePtr<WfReferenceExpression>();
funcExpr->name.value = L"SetFailure";
auto callExpr = MakePtr<WfCallExpression>();
callExpr->function = funcExpr;
callExpr->arguments.Add(refExpr);
auto stat = MakePtr<WfExpressionStatement>();
stat->expression = callExpr;
catchBlock->statements.Add(stat);
}
catchBlock->statements.Add(GenerateSetStatus(L"Stopped"));
{
auto refExpr = MakePtr<WfReferenceExpression>();
refExpr->name.value = L"<raise-exception>";
auto ifStat = MakePtr<WfIfStatement>();
ifStat->expression = refExpr;
auto trueBlock = MakePtr<WfBlockStatement>();
ifStat->trueBranch = trueBlock;
{
auto raiseStat = MakePtr<WfRaiseExceptionStatement>();
trueBlock->statements.Add(raiseStat);
}
catchBlock->statements.Add(ifStat);
}
block->statements.Add(tryStat);
}
}
}
}
}
}
/***********************************************************************
ANALYZER\WFANALYZER_EXPANDSTATEMENT.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace analyzer
{
using namespace collections;
using namespace parsing;
using namespace reflection;
using namespace reflection::description;
/***********************************************************************
ExpandSwitchStatement
***********************************************************************/
void ExpandSwitchStatement(WfLexicalScopeManager* manager, WfSwitchStatement* node)
{
auto block = MakePtr<WfBlockStatement>();
node->expandedStatement = block;
auto varName = L"<switch>" + itow(manager->usedTempVars++);
{
auto result = manager->expressionResolvings[node->expression.Obj()];
auto decl = MakePtr<WfVariableDeclaration>();
decl->name.value = varName;
decl->type = GetTypeFromTypeInfo(result.type.Obj());
decl->expression = CopyExpression(node->expression);
auto stat = MakePtr<WfVariableStatement>();
stat->variable = decl;
block->statements.Add(stat);
}
Ptr<WfStatement> rootIfStat;
auto tailIfStat = &rootIfStat;
FOREACH(Ptr<WfSwitchCase>, switchCase, node->caseBranches)
{
auto ifStat = MakePtr<WfIfStatement>();
*tailIfStat = ifStat;
tailIfStat = &ifStat->falseBranch;
{
auto refExpr = MakePtr<WfReferenceExpression>();
refExpr->name.value = varName;
auto inferExpr = MakePtr<WfInferExpression>();
inferExpr->expression= CopyExpression(switchCase->expression);
{
auto result = manager->expressionResolvings[switchCase->expression.Obj()];
inferExpr->type = GetTypeFromTypeInfo(result.type.Obj());
}
auto compare = MakePtr<WfBinaryExpression>();
compare->first = refExpr;
compare->second = inferExpr;
compare->op = WfBinaryOperator::EQ;
ifStat->expression = compare;
}
ifStat->trueBranch = CopyStatement(switchCase->statement);
}
if (node->defaultBranch)
{
*tailIfStat = CopyStatement(node->defaultBranch);
}
if (rootIfStat)
{
block->statements.Add(rootIfStat);
}
}
/***********************************************************************
ExpandForEachStatement
***********************************************************************/
Ptr<WfStatement> GenerateForEachStepStatement(WfForEachStatement* node)
{
auto refVar1 = MakePtr<WfReferenceExpression>();
refVar1->name.value = node->name.value;
auto refVar2 = MakePtr<WfReferenceExpression>();
refVar2->name.value = node->name.value;
auto one = MakePtr<WfIntegerExpression>();
one->value.value = L"1";
auto stepExpr = MakePtr<WfBinaryExpression>();
stepExpr->first = refVar2;
stepExpr->second = one;
stepExpr->op = node->direction == WfForEachDirection::Normal ? WfBinaryOperator::Add : WfBinaryOperator::Sub;
auto assignExpr = MakePtr<WfBinaryExpression>();
assignExpr->first = refVar1;
assignExpr->second = stepExpr;
assignExpr->op = WfBinaryOperator::Assign;
auto stat = MakePtr<WfExpressionStatement>();
stat->expression = assignExpr;
return stat;
}
class CopyForEachRangeBodyVisitor
: public copy_visitor::ModuleVisitor
{
public:
WfLexicalScopeManager* manager;
WfForEachStatement* forEach;
CopyForEachRangeBodyVisitor(WfLexicalScopeManager* _manager, WfForEachStatement* _forEach)
:manager(_manager)
, forEach(_forEach)
{
}
void Visit(WfContinueStatement* node)
{
auto scope = manager->nodeScopes[node];
while (scope)
{
if (scope->ownerNode.Cast<WfWhileStatement>())
{
break;
}
else if (scope->ownerNode.Cast<WfForEachStatement>())
{
if (scope->ownerNode != forEach)
{
break;
}
else
{
auto block = MakePtr<WfBlockStatement>();
block->statements.Add(GenerateForEachStepStatement(forEach));
block->statements.Add(MakePtr<WfContinueStatement>());
SetCodeRange((Ptr<WfStatement>)block, node->codeRange);
result = block;
return;
}
}
scope = scope->parentScope;
}
copy_visitor::StatementVisitor::Visit(node);
}
};
void ExpandForEachStatement(WfLexicalScopeManager* manager, WfForEachStatement* node)
{
auto block = MakePtr<WfBlockStatement>();
node->expandedStatement = block;
if (auto range = node->collection.Cast<WfRangeExpression>())
{
auto varBegin = L"<for-begin>" + node->name.value;
auto varEnd = L"<for-end>" + node->name.value;
{
auto result = manager->expressionResolvings[range->begin.Obj()];
auto decl = MakePtr<WfVariableDeclaration>();
decl->name.value = varBegin;
decl->type = GetTypeFromTypeInfo(result.type.Obj());
decl->expression = CopyExpression(range->begin);
if (range->beginBoundary == WfRangeBoundary::Exclusive)
{
auto one = MakePtr<WfIntegerExpression>();
one->value.value = L"1";
auto addExpr = MakePtr<WfBinaryExpression>();
addExpr->first = decl->expression;
addExpr->second = one;
addExpr->op = WfBinaryOperator::Add;
decl->expression = addExpr;
}
auto stat = MakePtr<WfVariableStatement>();
stat->variable = decl;
block->statements.Add(stat);
}
{
auto result = manager->expressionResolvings[range->end.Obj()];
auto decl = MakePtr<WfVariableDeclaration>();
decl->name.value = varEnd;
decl->type = GetTypeFromTypeInfo(result.type.Obj());
decl->expression = CopyExpression(range->end);
if (range->endBoundary == WfRangeBoundary::Exclusive)
{
auto one = MakePtr<WfIntegerExpression>();
one->value.value = L"1";
auto subExpr = MakePtr<WfBinaryExpression>();
subExpr->first = decl->expression;
subExpr->second = one;
subExpr->op = WfBinaryOperator::Sub;
decl->expression = subExpr;
}
auto stat = MakePtr<WfVariableStatement>();
stat->variable = decl;
block->statements.Add(stat);
}
{
auto refBegin = MakePtr<WfReferenceExpression>();
refBegin->name.value = node->direction == WfForEachDirection::Normal ? varBegin : varEnd;
auto decl = MakePtr<WfVariableDeclaration>();
decl->name.value = node->name.value;
decl->expression = refBegin;
auto stat = MakePtr<WfVariableStatement>();
stat->variable = decl;
block->statements.Add(stat);
}
{
auto whileStat = MakePtr<WfWhileStatement>();
{
auto refVar = MakePtr<WfReferenceExpression>();
refVar->name.value = node->name.value;
auto refBegin = MakePtr<WfReferenceExpression>();
refBegin->name.value = node->direction == WfForEachDirection::Normal ? varEnd : varBegin;
auto compare = MakePtr<WfBinaryExpression>();
compare->first = refVar;
compare->second = refBegin;
compare->op = node->direction == WfForEachDirection::Normal ? WfBinaryOperator::LE : WfBinaryOperator::GE;
whileStat->condition = compare;
}
{
auto whileBlock = MakePtr<WfBlockStatement>();
whileStat->statement = whileBlock;
{
CopyForEachRangeBodyVisitor visitor(manager, node);
node->statement->Accept(&visitor);
whileBlock->statements.Add(visitor.result.Cast<WfStatement>());
}
whileBlock->statements.Add(GenerateForEachStepStatement(node));
}
block->statements.Add(whileStat);
}
}
else
{
auto varEnum = L"<for-enumerable>" + node->name.value;
auto varIter = L"<for-enumerator>" + node->name.value;
{
auto decl = MakePtr<WfVariableDeclaration>();
decl->name.value = varEnum;
if (node->direction == WfForEachDirection::Normal)
{
auto inferExpr = MakePtr<WfInferExpression>();
inferExpr->expression = CopyExpression(node->collection);
inferExpr->type = GetTypeFromTypeInfo(TypeInfoRetriver<Ptr<IValueEnumerable>>::CreateTypeInfo().Obj());
decl->expression = inferExpr;
}
else
{
auto refSystem = MakePtr<WfTopQualifiedExpression>();
refSystem->name.value = L"system";
auto refSys = MakePtr<WfChildExpression>();
refSys->parent = refSystem;
refSys->name.value = L"Sys";
auto refMethod = MakePtr<WfChildExpression>();
refMethod->parent = refSys;
refMethod->name.value = L"ReverseEnumerable";
auto refCall = MakePtr<WfCallExpression>();
refCall->function = refMethod;
refCall->arguments.Add(CopyExpression(node->collection));
decl->expression = refCall;
}
auto stat = MakePtr<WfVariableStatement>();
stat->variable = decl;
block->statements.Add(stat);
}
{
auto refEnum = MakePtr<WfReferenceExpression>();
refEnum->name.value = varEnum;
auto refMethod = MakePtr<WfMemberExpression>();
refMethod->parent = refEnum;
refMethod->name.value = L"CreateEnumerator";
auto callExpr = MakePtr<WfCallExpression>();
callExpr->function = refMethod;
auto decl = MakePtr<WfVariableDeclaration>();
decl->name.value = varIter;
decl->expression = callExpr;
auto stat = MakePtr<WfVariableStatement>();
stat->variable = decl;
block->statements.Add(stat);
}
{
auto whileStat = MakePtr<WfWhileStatement>();
{
auto refIter = MakePtr<WfReferenceExpression>();
refIter->name.value = varIter;
auto refMethod = MakePtr<WfMemberExpression>();
refMethod->parent = refIter;
refMethod->name.value = L"Next";
auto callExpr = MakePtr<WfCallExpression>();
callExpr->function = refMethod;
whileStat->condition = callExpr;
}
{
auto whileBlock = MakePtr<WfBlockStatement>();
whileStat->statement = whileBlock;
{
auto refIter = MakePtr<WfReferenceExpression>();
refIter->name.value = varIter;
auto refMethod = MakePtr<WfMemberExpression>();
refMethod->parent = refIter;
refMethod->name.value = L"GetCurrent";
auto callExpr = MakePtr<WfCallExpression>();
callExpr->function = refMethod;
auto castExpr = MakePtr<WfTypeCastingExpression>();
castExpr->expression = callExpr;
castExpr->strategy = WfTypeCastingStrategy::Strong;
{
auto parentScope = manager->nodeScopes[node];
auto symbol = parentScope->symbols[node->name.value][0];
castExpr->type = GetTypeFromTypeInfo(symbol->typeInfo.Obj());
}
auto decl = MakePtr<WfVariableDeclaration>();
decl->name.value = node->name.value;
decl->expression = castExpr;
auto stat = MakePtr<WfVariableStatement>();
stat->variable = decl;
whileBlock->statements.Add(stat);
}
whileBlock->statements.Add(CopyStatement(node->statement));
}
block->statements.Add(whileStat);
}
}
}
/***********************************************************************
ExpandCoProviderStatement
***********************************************************************/
class ExpandCoProviderStatementVisitor
: public copy_visitor::StatementVisitor
, public copy_visitor::CoroutineStatementVisitor
{
public:
WfLexicalScopeManager* manager;
ExpandCoProviderStatementVisitor(WfLexicalScopeManager* _manager)
:manager(_manager)
{
}
Ptr<WfExpression> CreateField(Ptr<WfExpression> from)override
{
if (!from) return nullptr;
return CopyExpression(from);
}
Ptr<WfType> CreateField(Ptr<WfType> from)override
{
if (!from) return nullptr;
return CopyType(from);
}
Ptr<WfStatement> CreateField(Ptr<WfStatement> from)override
{
if (!from) return nullptr;
from->Accept(this);
return result.Cast<WfStatement>();
}
void Visit(WfReturnStatement* node)override
{
auto opInfo = manager->coOperatorResolvings[node].methodInfo;
auto block = MakePtr<WfBlockStatement>();
{
auto refImpl = MakePtr<WfReferenceExpression>();
refImpl->name.value = L"<co-impl>";
auto funcExpr = MakePtr<WfChildExpression>();
funcExpr->parent = GetExpressionFromTypeDescriptor(opInfo->GetOwnerTypeDescriptor());
funcExpr->name.value = opInfo->GetName();
auto callExpr = MakePtr<WfCallExpression>();
callExpr->function = funcExpr;
callExpr->arguments.Add(refImpl);
if (node->expression)
{
callExpr->arguments.Add(CreateField(node->expression));
}
auto stat = MakePtr<WfExpressionStatement>();
stat->expression = callExpr;
block->statements.Add(stat);
}
block->statements.Add(MakePtr<WfReturnStatement>());
SetCodeRange(Ptr<WfStatement>(block), node->codeRange);
result = block;
}
void Visit(WfCoOperatorStatement* node)override
{
auto opInfo = manager->coOperatorResolvings[node].methodInfo;
auto block = MakePtr<WfBlockStatement>();
{
auto refImpl = MakePtr<WfReferenceExpression>();
refImpl->name.value = L"<co-impl>";
auto funcExpr = MakePtr<WfChildExpression>();
funcExpr->parent = GetExpressionFromTypeDescriptor(opInfo->GetOwnerTypeDescriptor());
funcExpr->name.value = opInfo->GetName();
auto callExpr = MakePtr<WfCallExpression>();
callExpr->function = funcExpr;
callExpr->arguments.Add(refImpl);
FOREACH(Ptr<WfExpression>, argument, node->arguments)
{
callExpr->arguments.Add(CreateField(argument));
}
auto stat = MakePtr<WfExpressionStatement>();
stat->expression = callExpr;
auto pauseBlock = MakePtr<WfBlockStatement>();
pauseBlock->statements.Add(stat);
auto pauseStat = MakePtr<WfCoPauseStatement>();
pauseStat->statement = pauseBlock;
block->statements.Add(pauseStat);
}
{
Ptr<WfIfStatement> ifHasResultStat;
if (node->varName.value == L"")
{
ifHasResultStat = MakePtr<WfIfStatement>();
{
auto refCoResult = MakePtr<WfReferenceExpression>();
refCoResult->name.value = L"<co-result>";
auto testExpr = MakePtr<WfTypeTestingExpression>();
testExpr->expression = refCoResult;
testExpr->test = WfTypeTesting::IsNotNull;
ifHasResultStat->expression = testExpr;
}
}
auto ifStat = MakePtr<WfIfStatement>();
{
auto refCoResult = MakePtr<WfReferenceExpression>();
refCoResult->name.value = L"<co-result>";
auto refFailure = MakePtr<WfMemberExpression>();
refFailure->parent = refCoResult;
refFailure->name.value = L"Failure";
auto testExpr = MakePtr<WfTypeTestingExpression>();
testExpr->expression = refFailure;
testExpr->test = WfTypeTesting::IsNotNull;
ifStat->expression = testExpr;
}
{
auto refCoResult = MakePtr<WfReferenceExpression>();
refCoResult->name.value = L"<co-result>";
auto refFailure = MakePtr<WfMemberExpression>();
refFailure->parent = refCoResult;
refFailure->name.value = L"Failure";
auto raiseStat = MakePtr<WfRaiseExceptionStatement>();
raiseStat->expression = refFailure;
auto ifBlock = MakePtr<WfBlockStatement>();
ifBlock->statements.Add(raiseStat);
ifStat->trueBranch = ifBlock;
}
if (ifHasResultStat)
{
auto ifBlock = MakePtr<WfBlockStatement>();
ifHasResultStat->trueBranch = ifBlock;
ifBlock->statements.Add(ifStat);
block->statements.Add(ifHasResultStat);
}
else
{
block->statements.Add(ifStat);
}
}
if (node->varName.value != L"")
{
auto refCoResult = MakePtr<WfReferenceExpression>();
refCoResult->name.value = L"<co-result>";
auto refResult = MakePtr<WfMemberExpression>();
refResult->parent = refCoResult;
refResult->name.value = L"Result";
auto castResultInfo = manager->coCastResultResolvings[node].methodInfo;
auto refCastResult = MakePtr<WfChildExpression>();
refCastResult->parent = GetExpressionFromTypeDescriptor(castResultInfo->GetOwnerTypeDescriptor());
refCastResult->name.value = L"CastResult";
auto callExpr = MakePtr<WfCallExpression>();
callExpr->function = refCastResult;
callExpr->arguments.Add(refResult);
auto varDecl = MakePtr<WfVariableDeclaration>();
varDecl->name.value = node->varName.value;
varDecl->expression = callExpr;
auto stat = MakePtr<WfVariableStatement>();
stat->variable = varDecl;
block->statements.Add(stat);
}
SetCodeRange(Ptr<WfStatement>(block), node->codeRange);
result = block;
}
void Visit(WfBlockStatement* node)override
{
auto block = MakePtr<WfBlockStatement>();
FOREACH(Ptr<WfStatement>, statement, node->statements)
{
while (auto virtualStat = statement.Cast<WfVirtualStatement>())
{
statement = virtualStat->expandedStatement;
}
if (auto coOperatorStat = statement.Cast<WfCoOperatorStatement>())
{
coOperatorStat->Accept(this);
CopyFrom(block->statements, result.Cast<WfBlockStatement>()->statements, true);
}
else
{
block->statements.Add(CreateField(statement));
}
}
SetCodeRange(Ptr<WfStatement>(block), node->codeRange);
result = block;
}
Ptr<ParsingTreeCustomBase> Dispatch(WfVirtualStatement* node)override
{
node->expandedStatement->Accept(this);
return result;
}
Ptr<ParsingTreeCustomBase> Dispatch(WfCoroutineStatement* node)override
{
node->Accept((WfCoroutineStatement::IVisitor*)this);
return result;
}
};
void ExpandCoProviderStatement(WfLexicalScopeManager* manager, WfCoProviderStatement* node)
{
auto scope = manager->nodeScopes[node].Obj();
auto functionScope = scope->FindFunctionScope();
auto funcDecl = functionScope->ownerNode.Cast<WfFunctionDeclaration>();
auto providerScope = manager->nodeScopes[funcDecl->statement.Obj()];
auto providerType = providerScope->symbols[L"$PROVIDER"][0]->typeInfo;
auto implType = providerScope->symbols[L"$IMPL"][0]->typeInfo;
auto coroutineExpr = MakePtr<WfNewCoroutineExpression>();
{
coroutineExpr->name.value = L"<co-result>";
coroutineExpr->statement = ExpandCoProviderStatementVisitor(manager).CreateField(node->statement);
}
auto creatorExpr = MakePtr<WfFunctionExpression>();
{
auto creatorDecl = MakePtr<WfFunctionDeclaration>();
creatorExpr->function = creatorDecl;
creatorDecl->anonymity = WfFunctionAnonymity::Anonymous;
creatorDecl->returnType = GetTypeFromTypeInfo(TypeInfoRetriver<Ptr<ICoroutine>>::CreateTypeInfo().Obj());
{
auto argument = MakePtr<WfFunctionArgument>();
creatorDecl->arguments.Add(argument);
argument->name.value = L"<co-impl>";
argument->type = GetTypeFromTypeInfo(implType.Obj());
}
auto block = MakePtr<WfBlockStatement>();
creatorDecl->statement = block;
auto returnStat = MakePtr<WfReturnStatement>();
returnStat->expression = coroutineExpr;
block->statements.Add(returnStat);
}
auto providerBlock = MakePtr<WfBlockStatement>();
{
auto funcReturnType = CreateTypeInfoFromType(functionScope, funcDecl->returnType);
auto creatorInfo = manager->coProviderResolvings[node].methodInfo;
auto funcExpr = MakePtr<WfChildExpression>();
funcExpr->parent = GetExpressionFromTypeDescriptor(creatorInfo->GetOwnerTypeDescriptor());
funcExpr->name.value = creatorInfo->GetName();
auto callExpr = MakePtr<WfCallExpression>();
callExpr->function = funcExpr;
callExpr->arguments.Add(creatorExpr);
if (funcReturnType->GetTypeDescriptor() == description::GetTypeDescriptor<void>())
{
auto stat = MakePtr<WfExpressionStatement>();
stat->expression = callExpr;
providerBlock->statements.Add(stat);
}
else
{
if (IsSameType(funcReturnType.Obj(), creatorInfo->GetReturn()))
{
auto stat = MakePtr<WfReturnStatement>();
stat->expression = callExpr;
providerBlock->statements.Add(stat);
}
else if (funcReturnType->GetTypeDescriptor() == creatorInfo->GetReturn()->GetTypeDescriptor())
{
auto castExpr = MakePtr<WfTypeCastingExpression>();
castExpr->strategy = WfTypeCastingStrategy::Strong;
castExpr->type = GetTypeFromTypeInfo(funcReturnType.Obj());
castExpr->expression = callExpr;
auto stat = MakePtr<WfReturnStatement>();
stat->expression = castExpr;
providerBlock->statements.Add(stat);
}
else
{
{
auto varDecl = MakePtr<WfVariableDeclaration>();
varDecl->name.value = L"<co-mixin-source-variable>";
varDecl->expression = callExpr;
auto stat = MakePtr<WfVariableStatement>();
stat->variable = varDecl;
providerBlock->statements.Add(stat);
}
{
auto refExpr = MakePtr<WfReferenceExpression>();
refExpr->name.value = L"<co-mixin-source-variable>";
auto castExpr = MakePtr<WfMixinCastExpression>();
castExpr->type = GetTypeFromTypeInfo(funcReturnType.Obj());
castExpr->expression = refExpr;
auto stat = MakePtr<WfReturnStatement>();
stat->expression = castExpr;
providerBlock->statements.Add(stat);
}
}
}
}
node->expandedStatement = providerBlock;
}
}
}
}
/***********************************************************************
ANALYZER\WFANALYZER_MISC.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace analyzer
{
using namespace collections;
using namespace reflection;
using namespace reflection::description;
/***********************************************************************
IsExpressionDependOnExpectedType(Expression)
***********************************************************************/
class IsExpressionDependOnExpectedTypeVisitor
: public empty_visitor::ExpressionVisitor
, public empty_visitor::VirtualExpressionVisitor
{
public:
WfLexicalScopeManager* manager;
bool result;
IsExpressionDependOnExpectedTypeVisitor(WfLexicalScopeManager* _manager)
:manager(_manager)
, result(false)
{
}
void Dispatch(WfVirtualExpression* node)override
{
node->Accept(static_cast<empty_visitor::VirtualExpressionVisitor*>(this));
}
bool Execute(Ptr<WfExpression> expression)
{
result = false;
expression->Accept(this);
return result;
}
void Visit(WfReferenceExpression* node)override
{
auto scope = manager->nodeScopes[node].Obj();
List<ResolveExpressionResult> testResults;
manager->ResolveName(scope, node->name.value, testResults);
if (testResults.Count() == 0)
{
result = true;
}
}
void Visit(WfOrderedLambdaExpression* node)override
{
auto scope = manager->nodeScopes[node].Obj();
result = scope->symbols.Count() > 0;
}
void Visit(WfLiteralExpression* node)override
{
if (node->value == WfLiteralValue::Null)
{
result = true;
}
}
void Visit(WfIfExpression* node)override
{
result = Execute(node->trueBranch) && Execute(node->falseBranch);
}
void Visit(WfConstructorExpression* node)override
{
if (node->arguments.Count() == 0)
{
result = true;
}
else
{
vint possibleFieldCount = 0;
bool unresolvableField = false;
auto scope = manager->nodeScopes[node].Obj();
FOREACH(Ptr<WfConstructorArgument>, argument, node->arguments)
{
if (argument->value)
{
if (auto refExpr = argument->key.Cast<WfReferenceExpression>())
{
possibleFieldCount++;
List<ResolveExpressionResult> testResults;
manager->ResolveName(scope, refExpr->name.value, testResults);
if (testResults.Count() == 0)
{
unresolvableField = true;
}
}
}
}
result = unresolvableField&&possibleFieldCount == node->arguments.Count();
}
}
};
bool IsExpressionDependOnExpectedType(WfLexicalScopeManager* manager, Ptr<WfExpression> expression)
{
IsExpressionDependOnExpectedTypeVisitor visitor(manager);
expression->Accept(&visitor);
return visitor.result;
}
/***********************************************************************
GetExpressionName(Expression)
***********************************************************************/
class GetExpressionNameVisitor
: public empty_visitor::ExpressionVisitor
, public empty_visitor::VirtualExpressionVisitor
{
public:
WString result;
void Dispatch(WfVirtualExpression* node)override
{
node->Accept(static_cast<empty_visitor::VirtualExpressionVisitor*>(this));
}
void Visit(WfTopQualifiedExpression* node)override
{
result = node->name.value;
}
void Visit(WfReferenceExpression* node)override
{
result = node->name.value;
}
void Visit(WfOrderedNameExpression* node)override
{
result = node->name.value;
}
void Visit(WfMemberExpression* node)override
{
result = node->name.value;
}
void Visit(WfChildExpression* node)override
{
result = node->name.value;
}
};
WString GetExpressionName(Ptr<WfExpression> expression)
{
GetExpressionNameVisitor visitor;
expression->Accept(&visitor);
return visitor.result;
}
}
}
}
/***********************************************************************
ANALYZER\WFANALYZER_SEARCHORDEREDNAME.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace analyzer
{
using namespace collections;
/***********************************************************************
SearchOrderedName
***********************************************************************/
class SearchOrderedNameVisitor : public traverse_visitor::ModuleVisitor
{
public:
WfLexicalScope* scope;
SortedList<vint>& names;
SearchOrderedNameVisitor(WfLexicalScope* _scope, SortedList<vint>& _names)
:scope(_scope)
, names(_names)
{
}
void Traverse(WfOrderedNameExpression* node)override
{
vint name = wtoi(node->name.value.Sub(1, node->name.value.Length() - 1));
if (!names.Contains(name))
{
WfLexicalScope* currentScope = scope;
while (currentScope)
{
if (currentScope->symbols.Keys().Contains(node->name.value))
{
return;
}
currentScope = currentScope->parentScope.Obj();
}
names.Add(name);
}
}
void Visit(WfOrderedLambdaExpression* node)override
{
// names in nested ordered lambda expression is not counted
}
static void Execute(WfLexicalScope* scope, Ptr<WfExpression> expression, SortedList<vint>& names)
{
SearchOrderedNameVisitor visitor(scope, names);
expression->Accept(&visitor);
}
};
void SearchOrderedName(WfLexicalScope* scope, Ptr<WfExpression> expression, collections::SortedList<vint>& names)
{
SearchOrderedNameVisitor::Execute(scope, expression, names);
}
}
}
}
/***********************************************************************
ANALYZER\WFANALYZER_TYPEINFO.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace analyzer
{
using namespace collections;
using namespace reflection;
using namespace reflection::description;
/***********************************************************************
GetTypeFlag
***********************************************************************/
TypeFlag GetTypeFlag(reflection::description::ITypeDescriptor* typeDescriptor)
{
if (typeDescriptor == GetTypeDescriptor<bool>()) return TypeFlag::Bool;
if (typeDescriptor == GetTypeDescriptor<vint8_t>()) return TypeFlag::I1;
if (typeDescriptor == GetTypeDescriptor<vint16_t>()) return TypeFlag::I2;
if (typeDescriptor == GetTypeDescriptor<vint32_t>()) return TypeFlag::I4;
if (typeDescriptor == GetTypeDescriptor<vint64_t>()) return TypeFlag::I8;
if (typeDescriptor == GetTypeDescriptor<vuint8_t>()) return TypeFlag::U1;
if (typeDescriptor == GetTypeDescriptor<vuint16_t>()) return TypeFlag::U2;
if (typeDescriptor == GetTypeDescriptor<vuint32_t>()) return TypeFlag::U4;
if (typeDescriptor == GetTypeDescriptor<vuint64_t>()) return TypeFlag::U8;
if (typeDescriptor == GetTypeDescriptor<float>()) return TypeFlag::F4;
if (typeDescriptor == GetTypeDescriptor<double>()) return TypeFlag::F8;
if (typeDescriptor == GetTypeDescriptor<WString>()) return TypeFlag::String;
switch (typeDescriptor->GetTypeDescriptorFlags())
{
case TypeDescriptorFlags::FlagEnum:
case TypeDescriptorFlags::NormalEnum:
return TypeFlag::Enum;
case TypeDescriptorFlags::Struct:
return TypeFlag::Struct;
default:
return TypeFlag::Others;
}
}
TypeFlag GetTypeFlag(reflection::description::ITypeInfo* typeInfo)
{
ITypeDescriptor* td = typeInfo->GetTypeDescriptor();
return GetTypeFlag(td);
}
/***********************************************************************
CreateTypeInfoFromTypeFlag
***********************************************************************/
Ptr<reflection::description::ITypeInfo> CreateTypeInfoFromTypeFlag(TypeFlag flag)
{
switch (flag)
{
case TypeFlag::Bool: return TypeInfoRetriver<bool>::CreateTypeInfo();
case TypeFlag::I1: return TypeInfoRetriver<vint8_t>::CreateTypeInfo();
case TypeFlag::I2: return TypeInfoRetriver<vint16_t>::CreateTypeInfo();
case TypeFlag::I4: return TypeInfoRetriver<vint32_t>::CreateTypeInfo();
case TypeFlag::I8: return TypeInfoRetriver<vint64_t>::CreateTypeInfo();
case TypeFlag::U1: return TypeInfoRetriver<vuint8_t>::CreateTypeInfo();
case TypeFlag::U2: return TypeInfoRetriver<vuint16_t>::CreateTypeInfo();
case TypeFlag::U4: return TypeInfoRetriver<vuint32_t>::CreateTypeInfo();
case TypeFlag::U8: return TypeInfoRetriver<vuint64_t>::CreateTypeInfo();
case TypeFlag::F4: return TypeInfoRetriver<float>::CreateTypeInfo();
case TypeFlag::F8: return TypeInfoRetriver<double>::CreateTypeInfo();
case TypeFlag::String: return TypeInfoRetriver<WString>::CreateTypeInfo();
default: return nullptr;
}
}
/***********************************************************************
GetTypeFragments
***********************************************************************/
void GetTypeFragments(reflection::description::ITypeDescriptor* typeDescriptor, collections::List<WString>& fragments)
{
WString name = typeDescriptor->GetTypeName();
const wchar_t* reading = name.Buffer();
while (reading)
{
const wchar_t* delimiter = wcsstr(reading, L"::");
if (delimiter)
{
fragments.Add(WString(reading, vint(delimiter - reading)));
reading = delimiter + 2;
}
else
{
fragments.Add(reading);
break;
}
}
}
/***********************************************************************
GetExpressionFromTypeDescriptor
***********************************************************************/
Ptr<WfExpression> GetExpressionFromTypeDescriptor(reflection::description::ITypeDescriptor* typeDescriptor)
{
List<WString> fragments;
GetTypeFragments(typeDescriptor, fragments);
Ptr<WfExpression> parentExpr;
FOREACH(WString, fragment, fragments)
{
if (!parentExpr)
{
auto expr = MakePtr<WfTopQualifiedExpression>();
expr->name.value = fragment;
parentExpr = expr;
}
else
{
auto expr = MakePtr<WfChildExpression>();
expr->parent = parentExpr;
expr->name.value = fragment;
parentExpr = expr;
}
}
return parentExpr;
}
/***********************************************************************
GetTypeFromTypeInfo
***********************************************************************/
Ptr<WfType> GetTypeFromTypeInfo(reflection::description::ITypeInfo* typeInfo)
{
switch (typeInfo->GetDecorator())
{
case ITypeInfo::RawPtr:
{
Ptr<WfType> element = GetTypeFromTypeInfo(typeInfo->GetElementType());
if (element)
{
Ptr<WfRawPointerType> type = new WfRawPointerType;
type->element = element;
return type;
}
return 0;
}
case ITypeInfo::SharedPtr:
{
if (typeInfo->GetElementType()->GetDecorator() == ITypeInfo::Generic)
{
return GetTypeFromTypeInfo(typeInfo->GetElementType());
}
else
{
Ptr<WfType> element = GetTypeFromTypeInfo(typeInfo->GetElementType());
if (element)
{
Ptr<WfSharedPointerType> type = new WfSharedPointerType;
type->element = element;
return type;
}
return 0;
}
}
case ITypeInfo::Nullable:
{
Ptr<WfType> element = GetTypeFromTypeInfo(typeInfo->GetElementType());
if (element)
{
Ptr<WfNullableType> type = new WfNullableType;
type->element = element;
return type;
}
return 0;
}
case ITypeInfo::TypeDescriptor:
{
List<WString> fragments;
GetTypeFragments(typeInfo->GetTypeDescriptor(), fragments);
Ptr<WfType> parentType;
FOREACH(WString, fragment, fragments)
{
if (!parentType)
{
auto type = MakePtr<WfTopQualifiedType>();
type->name.value = fragment;
parentType = type;
}
else
{
auto type = MakePtr<WfChildType>();
type->parent = parentType;
type->name.value = fragment;
parentType = type;
}
}
return parentType;
}
case ITypeInfo::Generic:
{
if (typeInfo->GetElementType()->GetDecorator() == ITypeInfo::TypeDescriptor)
{
if (typeInfo->GetTypeDescriptor() == GetTypeDescriptor<IValueEnumerable>())
{
if (typeInfo->GetGenericArgumentCount() == 1)
{
if (Ptr<WfType> elementType = GetTypeFromTypeInfo(typeInfo->GetGenericArgument(0)))
{
Ptr<WfEnumerableType> type = new WfEnumerableType;
type->element = elementType;
return type;
}
}
}
else if (typeInfo->GetTypeDescriptor() == GetTypeDescriptor<IValueReadonlyList>())
{
if (typeInfo->GetGenericArgumentCount() == 1)
{
if (Ptr<WfType> valueType = GetTypeFromTypeInfo(typeInfo->GetGenericArgument(0)))
{
Ptr<WfMapType> type = new WfMapType;
type->writability = WfMapWritability::Readonly;
type->value = valueType;
return type;
}
}
}
else if (typeInfo->GetTypeDescriptor() == GetTypeDescriptor<IValueList>())
{
if (typeInfo->GetGenericArgumentCount() == 1)
{
if (Ptr<WfType> valueType = GetTypeFromTypeInfo(typeInfo->GetGenericArgument(0)))
{
Ptr<WfMapType> type = new WfMapType;
type->writability = WfMapWritability::Writable;
type->value = valueType;
return type;
}
}
}
else if (typeInfo->GetTypeDescriptor() == GetTypeDescriptor<IValueReadonlyDictionary>())
{
if (typeInfo->GetGenericArgumentCount() == 2)
{
if (Ptr<WfType> keyType = GetTypeFromTypeInfo(typeInfo->GetGenericArgument(0)))
if (Ptr<WfType> valueType = GetTypeFromTypeInfo(typeInfo->GetGenericArgument(1)))
{
Ptr<WfMapType> type = new WfMapType;
type->writability = WfMapWritability::Readonly;
type->key = keyType;
type->value = valueType;
return type;
}
}
}
else if (typeInfo->GetTypeDescriptor() == GetTypeDescriptor<IValueDictionary>())
{
if (typeInfo->GetGenericArgumentCount() == 2)
{
if (Ptr<WfType> keyType = GetTypeFromTypeInfo(typeInfo->GetGenericArgument(0)))
if (Ptr<WfType> valueType = GetTypeFromTypeInfo(typeInfo->GetGenericArgument(1)))
{
Ptr<WfMapType> type = new WfMapType;
type->writability = WfMapWritability::Writable;
type->key = keyType;
type->value = valueType;
return type;
}
}
}
else if (typeInfo->GetTypeDescriptor() == GetTypeDescriptor<IValueFunctionProxy>())
{
if (typeInfo->GetGenericArgumentCount() >= 1)
{
if (Ptr<WfType> returnType = GetTypeFromTypeInfo(typeInfo->GetGenericArgument(0)))
{
Ptr<WfFunctionType> type = new WfFunctionType;
type->result = GetTypeFromTypeInfo(typeInfo->GetGenericArgument(0));
for (vint i = 1; i < typeInfo->GetGenericArgumentCount(); i++)
{
if (Ptr<WfType> argumentType = GetTypeFromTypeInfo(typeInfo->GetGenericArgument(i)))
{
type->arguments.Add(argumentType);
}
else
{
return 0;
}
}
return type;
}
}
}
}
return 0;
}
default:
return 0;
}
}
/***********************************************************************
GetScopeNameFromReferenceType
***********************************************************************/
class GetScopeNameFromReferenceTypeVisitor : public Object, public WfType::IVisitor
{
public:
WfLexicalScope* scope;
Ptr<WfLexicalScopeName> result;
GetScopeNameFromReferenceTypeVisitor(WfLexicalScope* _scope)
:scope(_scope)
{
}
Ptr<WfLexicalScopeName> Call(WfType* node)
{
node->Accept(this);
Ptr<WfLexicalScopeName> scopeName = result;
result = 0;
return scopeName;
}
void Visit(WfPredefinedType* node)override
{
WString name;
switch (node->name)
{
case WfPredefinedTypeName::Void:
name = L"Void";
break;
case WfPredefinedTypeName::Object:
name = L"Object";
break;
case WfPredefinedTypeName::Interface:
name = L"Interface";
break;
case WfPredefinedTypeName::Int:
#if defined VCZH_64
name = L"Int64";
#else
name = L"Int32";
#endif
break;
case WfPredefinedTypeName::UInt:
#if defined VCZH_64
name = L"UInt64";
#else
name = L"UInt32";
#endif
break;
case WfPredefinedTypeName::Float:
name = L"Single";
break;
case WfPredefinedTypeName::Double:
name = L"Double";
break;
case WfPredefinedTypeName::String:
name = L"String";
break;
case WfPredefinedTypeName::Char:
name = L"Char";
break;
case WfPredefinedTypeName::Bool:
name = L"Boolean";
break;
default:
CHECK_FAIL(L"GetScopeNameFromReferenceTypeVisitor::Visit(WfPredefinedType*)#Internal error, ValidateTypeStructure function should check correctly.");
}
Ptr<WfTopQualifiedType> ns = new WfTopQualifiedType;
ns->name.value = L"system";
Ptr<WfChildType> type = new WfChildType;
type->parent = ns;
type->name.value = name;
type->Accept(this);
}
void Visit(WfTopQualifiedType* node)override
{
auto manager = scope->FindManager();
if (manager->globalName)
{
vint index = manager->globalName->children.Keys().IndexOf(node->name.value);
if (index != -1)
{
result = manager->globalName->children.Values()[index];
return;
}
}
manager->errors.Add(WfErrors::TopQualifiedSymbolNotExists(node, node->name.value));
}
void Visit(WfReferenceType* node)override
{
auto manager = scope->FindManager();
List<ResolveExpressionResult> results;
manager->ResolveName(scope, node->name.value, results);
if (results.Count() > 1)
{
manager->errors.Add(WfErrors::TooManyTargets(node, results, node->name.value));
}
else if (results.Count() == 1)
{
if (auto scopeName = results[0].scopeName)
{
result = scopeName;
}
else
{
manager->errors.Add(WfErrors::TypeNotExists(node, results[0].symbol));
}
}
else
{
manager->errors.Add(WfErrors::ReferenceNotExists(node, node->name.value));
}
}
void Visit(WfRawPointerType* node)override
{
CHECK_FAIL(L"GetScopeNameFromReferenceTypeVisitor::Visit(WfRawPointerType*)#Internal error, ValidateTypeStructure function should check correctly.");
}
void Visit(WfSharedPointerType* node)override
{
CHECK_FAIL(L"GetScopeNameFromReferenceTypeVisitor::Visit(WfSharedPointerType*)#Internal error, ValidateTypeStructure function should check correctly.");
}
void Visit(WfNullableType* node)override
{
CHECK_FAIL(L"GetScopeNameFromReferenceTypeVisitor::Visit(WfNullableType*)#Internal error, ValidateTypeStructure function should check correctly.");
}
void Visit(WfEnumerableType* node)override
{
CHECK_FAIL(L"GetScopeNameFromReferenceTypeVisitor::Visit(WfEnumerableType*)#Internal error, ValidateTypeStructure function should check correctly.");
}
void Visit(WfMapType* node)override
{
CHECK_FAIL(L"GetScopeNameFromReferenceTypeVisitor::Visit(WfMapType*)#Internal error, ValidateTypeStructure function should check correctly.");
}
void Visit(WfFunctionType* node)override
{
CHECK_FAIL(L"GetScopeNameFromReferenceTypeVisitor::Visit(WfFunctionType*)#Internal error, ValidateTypeStructure function should check correctly.");
}
void Visit(WfChildType* node)override
{
if (Ptr<WfLexicalScopeName> scopeName = Call(node->parent.Obj()))
{
vint index = scopeName->children.Keys().IndexOf(node->name.value);
if (index != -1)
{
result = scopeName->children.Values()[index];
return;
}
scope->FindManager()->errors.Add(WfErrors::ChildSymbolNotExists(node, scopeName, node->name.value));
}
}
static Ptr<WfLexicalScopeName> Execute(WfLexicalScope* scope, WfType* type)
{
return GetScopeNameFromReferenceTypeVisitor(scope).Call(type);
}
};
Ptr<WfLexicalScopeName> GetScopeNameFromReferenceType(WfLexicalScope* scope, Ptr<WfType> type)
{
return GetScopeNameFromReferenceTypeVisitor::Execute(scope, type.Obj());
}
/***********************************************************************
CreateTypeInfoFromType
***********************************************************************/
class CreateTypeInfoFromTypeVisitor : public Object, public WfType::IVisitor
{
public:
WfLexicalScope* scope;
Ptr<ITypeInfo> result;
CreateTypeInfoFromTypeVisitor(WfLexicalScope* _scope)
:scope(_scope)
{
}
Ptr<ITypeInfo> Call(WfType* node, bool checkTypeForValue)
{
node->Accept(this);
Ptr<ITypeInfo> typeInfo = result;
result = 0;
if (typeInfo)
{
auto manager = scope->FindManager();
switch (typeInfo->GetDecorator())
{
case ITypeInfo::RawPtr:
case ITypeInfo::SharedPtr:
switch (typeInfo->GetTypeDescriptor()->GetTypeDescriptorFlags())
{
case TypeDescriptorFlags::IDescriptable:
case TypeDescriptorFlags::Class:
case TypeDescriptorFlags::Interface:
break;
default:
if (typeInfo->GetDecorator() == ITypeInfo::RawPtr)
{
manager->errors.Add(WfErrors::RawPointerToNonReferenceType(node, typeInfo.Obj()));
}
else
{
manager->errors.Add(WfErrors::SharedPointerToNonReferenceType(node, typeInfo.Obj()));
}
}
break;
case ITypeInfo::Nullable:
switch (typeInfo->GetTypeDescriptor()->GetTypeDescriptorFlags())
{
case TypeDescriptorFlags::Primitive:
case TypeDescriptorFlags::Struct:
case TypeDescriptorFlags::FlagEnum:
case TypeDescriptorFlags::NormalEnum:
break;
default:
manager->errors.Add(WfErrors::NullableToNonReferenceType(node, typeInfo.Obj()));
}
break;
case ITypeInfo::TypeDescriptor:
if (checkTypeForValue)
{
switch (typeInfo->GetTypeDescriptor()->GetTypeDescriptorFlags())
{
case TypeDescriptorFlags::Object:
case TypeDescriptorFlags::Primitive:
case TypeDescriptorFlags::Struct:
case TypeDescriptorFlags::FlagEnum:
case TypeDescriptorFlags::NormalEnum:
break;
default:
manager->errors.Add(WfErrors::TypeNotForValue(node, typeInfo.Obj()));
}
}
break;
case ITypeInfo::Generic:
if (checkTypeForValue)
{
manager->errors.Add(WfErrors::TypeNotForValue(node, typeInfo.Obj()));
}
break;
}
}
return typeInfo;
}
void VisitReferenceType(WfType* node)
{
if (auto scopeName = GetScopeNameFromReferenceTypeVisitor::Execute(scope, node))
{
if (scopeName->typeDescriptor)
{
result = MakePtr<TypeDescriptorTypeInfo>(scopeName->typeDescriptor, TypeInfoHint::Normal);
}
else
{
scope->FindManager()->errors.Add(WfErrors::TypeNotExists(node, scopeName));
}
}
}
void Visit(WfPredefinedType* node)override
{
ITypeDescriptor* typeDescriptor = 0;
switch (node->name)
{
case WfPredefinedTypeName::Void:
typeDescriptor = description::GetTypeDescriptor<VoidValue>();
break;
case WfPredefinedTypeName::Object:
typeDescriptor = description::GetTypeDescriptor<Value>();
break;
case WfPredefinedTypeName::Interface:
typeDescriptor = description::GetTypeDescriptor<IDescriptable>();
break;
case WfPredefinedTypeName::Int:
typeDescriptor = description::GetTypeDescriptor<vint>();
break;
case WfPredefinedTypeName::UInt:
typeDescriptor = description::GetTypeDescriptor<vuint>();
break;
case WfPredefinedTypeName::Float:
typeDescriptor = description::GetTypeDescriptor<float>();
break;
case WfPredefinedTypeName::Double:
typeDescriptor = description::GetTypeDescriptor<double>();
break;
case WfPredefinedTypeName::String:
typeDescriptor = description::GetTypeDescriptor<WString>();
break;
case WfPredefinedTypeName::Char:
typeDescriptor = description::GetTypeDescriptor<wchar_t>();
break;
case WfPredefinedTypeName::Bool:
typeDescriptor = description::GetTypeDescriptor<bool>();
break;
default:
CHECK_FAIL(L"CreateTypeInfoFromTypeVisitor::Visit(WfPredefinedType*)#Internal error, ValidateTypeStructure function should check correctly.");
}
if (typeDescriptor)
{
result = MakePtr<TypeDescriptorTypeInfo>(typeDescriptor, TypeInfoHint::Normal);
}
}
void Visit(WfTopQualifiedType* node)override
{
VisitReferenceType(node);
}
void Visit(WfReferenceType* node)override
{
VisitReferenceType(node);
}
void Visit(WfRawPointerType* node)override
{
if (Ptr<ITypeInfo> element = Call(node->element.Obj(), false))
{
result = MakePtr<RawPtrTypeInfo>(element);
}
}
void Visit(WfSharedPointerType* node)override
{
if (Ptr<ITypeInfo> element = Call(node->element.Obj(), false))
{
result = MakePtr<SharedPtrTypeInfo>(element);
}
}
void Visit(WfNullableType* node)override
{
if (Ptr<ITypeInfo> element = Call(node->element.Obj(), false))
{
result = MakePtr<NullableTypeInfo>(element);
}
}
void Visit(WfEnumerableType* node)override
{
if (Ptr<ITypeInfo> element = Call(node->element.Obj(), true))
{
auto enumerableTypeInfo = MakePtr<TypeDescriptorTypeInfo>(description::GetTypeDescriptor<IValueEnumerable>(), TypeInfoHint::Normal);
auto genericTypeInfo = MakePtr<GenericTypeInfo>(enumerableTypeInfo);
genericTypeInfo->AddGenericArgument(element);
result = MakePtr<SharedPtrTypeInfo>(genericTypeInfo);
}
}
void Visit(WfMapType* node)override
{
Ptr<ITypeInfo> key, value;
if (!(value = Call(node->value.Obj(), true))) return;
if (node->key)
{
if (!(key = Call(node->key.Obj(), true))) return;
}
ITypeDescriptor* typeDescriptor = nullptr;
if (node->writability == WfMapWritability::Writable)
{
if (node->key)
{
typeDescriptor = description::GetTypeDescriptor<IValueDictionary>();
}
else
{
typeDescriptor = description::GetTypeDescriptor<IValueList>();
}
}
else
{
if (node->key)
{
typeDescriptor = description::GetTypeDescriptor<IValueReadonlyDictionary>();
}
else
{
typeDescriptor = description::GetTypeDescriptor<IValueReadonlyList>();
}
}
auto mapTypeInfo = MakePtr<TypeDescriptorTypeInfo>(typeDescriptor, TypeInfoHint::Normal);
auto genericTypeInfo = MakePtr<GenericTypeInfo>(mapTypeInfo);
if (key) genericTypeInfo->AddGenericArgument(key);
genericTypeInfo->AddGenericArgument(value);
result = MakePtr<SharedPtrTypeInfo>(genericTypeInfo);
}
void Visit(WfFunctionType* node)override
{
if (Ptr<ITypeInfo> returnType = Call(node->result.Obj(), true))
{
auto enumerableTypeInfo = MakePtr<TypeDescriptorTypeInfo>(description::GetTypeDescriptor<IValueFunctionProxy>(), TypeInfoHint::Normal);
auto genericTypeInfo = MakePtr<GenericTypeInfo>(enumerableTypeInfo);
genericTypeInfo->AddGenericArgument(returnType);
FOREACH(Ptr<WfType>, argument, node->arguments)
{
if (Ptr<ITypeInfo> argumentType = Call(argument.Obj(), true))
{
genericTypeInfo->AddGenericArgument(argumentType);
}
else
{
return;
}
}
result = MakePtr<SharedPtrTypeInfo>(genericTypeInfo);
}
}
void Visit(WfChildType* node)override
{
VisitReferenceType(node);
}
static Ptr<ITypeInfo> Execute(WfLexicalScope* scope, WfType* type)
{
return CreateTypeInfoFromTypeVisitor(scope).Call(type, true);
}
};
Ptr<reflection::description::ITypeInfo> CreateTypeInfoFromType(WfLexicalScope* scope, Ptr<WfType> type)
{
return CreateTypeInfoFromTypeVisitor::Execute(scope, type.Obj());
}
/***********************************************************************
CreateTypeInfoFromType
***********************************************************************/
Ptr<reflection::description::ITypeInfo> CopyTypeInfo(reflection::description::ITypeInfo* typeInfo)
{
switch (typeInfo->GetDecorator())
{
case ITypeInfo::RawPtr:
return MakePtr<RawPtrTypeInfo>(CopyTypeInfo(typeInfo->GetElementType()));
case ITypeInfo::SharedPtr:
return MakePtr<SharedPtrTypeInfo>(CopyTypeInfo(typeInfo->GetElementType()));
case ITypeInfo::Nullable:
return MakePtr<NullableTypeInfo>(CopyTypeInfo(typeInfo->GetElementType()));
case ITypeInfo::TypeDescriptor:
return MakePtr<TypeDescriptorTypeInfo>(typeInfo->GetTypeDescriptor(), typeInfo->GetHint());
case ITypeInfo::Generic:
{
auto impl = MakePtr<GenericTypeInfo>(typeInfo->GetElementType());
vint count = typeInfo->GetGenericArgumentCount();
for (vint i = 0; i < count; i++)
{
impl->AddGenericArgument(CopyTypeInfo(typeInfo->GetGenericArgument(i)));
}
return impl;
}
default:
return 0;
}
}
/***********************************************************************
CanConvertToType
***********************************************************************/
bool CanConvertToType(reflection::description::ITypeInfo* fromType, reflection::description::ITypeInfo* toType, bool explicitly)
{
ITypeDescriptor* objectType = GetTypeDescriptor<Value>();
bool fromObject = fromType->GetDecorator() == ITypeInfo::TypeDescriptor && fromType->GetTypeDescriptor() == objectType;
bool toObject = toType->GetDecorator() == ITypeInfo::TypeDescriptor && toType->GetTypeDescriptor() == objectType;
if (fromObject && toObject)
{
return true;
}
else if (fromObject)
{
return explicitly;
}
else if (toObject)
{
return true;
}
switch (fromType->GetDecorator())
{
case ITypeInfo::RawPtr:
switch (toType->GetDecorator())
{
case ITypeInfo::RawPtr:
return CanConvertToType(fromType->GetElementType(), toType->GetElementType(), explicitly);
case ITypeInfo::SharedPtr:
return explicitly && CanConvertToType(fromType->GetElementType(), toType->GetElementType(), explicitly);
case ITypeInfo::Nullable:
case ITypeInfo::TypeDescriptor:
case ITypeInfo::Generic:
return false;
}
break;
case ITypeInfo::SharedPtr:
switch (toType->GetDecorator())
{
case ITypeInfo::RawPtr:
return explicitly && CanConvertToType(fromType->GetElementType(), toType->GetElementType(), explicitly);
case ITypeInfo::SharedPtr:
return CanConvertToType(fromType->GetElementType(), toType->GetElementType(), explicitly);
case ITypeInfo::Nullable:
case ITypeInfo::TypeDescriptor:
case ITypeInfo::Generic:
return false;
}
break;
case ITypeInfo::Nullable:
switch (toType->GetDecorator())
{
case ITypeInfo::RawPtr:
case ITypeInfo::SharedPtr:
return false;
case ITypeInfo::Nullable:
return CanConvertToType(fromType->GetElementType(), toType->GetElementType(), explicitly);
case ITypeInfo::TypeDescriptor:
return explicitly && CanConvertToType(fromType->GetElementType(), toType, explicitly);
case ITypeInfo::Generic:
return false;
}
break;
case ITypeInfo::TypeDescriptor:
switch (toType->GetDecorator())
{
case ITypeInfo::RawPtr:
case ITypeInfo::SharedPtr:
return false;
case ITypeInfo::Nullable:
return CanConvertToType(fromType, toType->GetElementType(), explicitly);
case ITypeInfo::TypeDescriptor:
{
ITypeDescriptor* fromTd = fromType->GetTypeDescriptor();
ITypeDescriptor* toTd = toType->GetTypeDescriptor();
bool fromValue = (fromTd->GetTypeDescriptorFlags() & TypeDescriptorFlags::ReferenceType) == TypeDescriptorFlags::Undefined;
bool toValue = (toTd->GetTypeDescriptorFlags() & TypeDescriptorFlags::ReferenceType) == TypeDescriptorFlags::Undefined;
if (fromValue != toValue)
{
return false;
}
if (fromValue)
{
if (fromTd == toTd)
{
return true;
}
else if (fromTd == GetTypeDescriptor<WString>())
{
return explicitly && toTd->GetSerializableType() != nullptr;
}
else if (toTd == GetTypeDescriptor<WString>())
{
return fromTd->GetSerializableType() != nullptr;
}
TypeFlag fromFlag = GetTypeFlag(fromTd);
TypeFlag toFlag = GetTypeFlag(toTd);
static vint conversionTable[(vint)TypeFlag::Count][(vint)TypeFlag::Count] = {
/*Bool */{1, /**/ 0, 0, 0, 0, /**/ 0, 0, 0, 0, /**/ 0, 0, /**/ 1, 0, 0, 0},
//-------------------------------------------------------------------------------
/*I1 */{0, /**/ 1, 1, 1, 1, /**/ 2, 2, 2, 2, /**/ 1, 1, /**/ 1, 0, 0, 0},
/*I2 */{0, /**/ 2, 1, 1, 1, /**/ 2, 2, 2, 2, /**/ 1, 1, /**/ 1, 0, 0, 0},
/*I4 */{0, /**/ 2, 2, 1, 1, /**/ 2, 2, 2, 2, /**/ 2, 1, /**/ 1, 0, 0, 0},
/*I8 */{0, /**/ 2, 2, 2, 1, /**/ 2, 2, 2, 2, /**/ 2, 1, /**/ 1, 0, 0, 0},
//-------------------------------------------------------------------------------
/*U1 */{0, /**/ 2, 2, 2, 2, /**/ 1, 1, 1, 1, /**/ 1, 1, /**/ 1, 0, 0, 0},
/*U2 */{0, /**/ 2, 2, 2, 2, /**/ 2, 1, 1, 1, /**/ 1, 1, /**/ 1, 0, 0, 0},
/*U4 */{0, /**/ 2, 2, 2, 2, /**/ 2, 2, 1, 1, /**/ 2, 1, /**/ 1, 0, 0, 0},
/*U8 */{0, /**/ 2, 2, 2, 2, /**/ 2, 2, 2, 1, /**/ 2, 1, /**/ 1, 2, 0, 0},
//-------------------------------------------------------------------------------
/*F4 */{0, /**/ 2, 2, 2, 2, /**/ 2, 2, 2, 2, /**/ 1, 1, /**/ 1, 0, 0, 0},
/*F8 */{0, /**/ 2, 2, 2, 2, /**/ 2, 2, 2, 2, /**/ 2, 1, /**/ 1, 0, 0, 0},
//-------------------------------------------------------------------------------
/*String */{2, /**/ 2, 2, 2, 2, /**/ 2, 2, 2, 2, /**/ 2, 2, /**/ 1, 0, 0, 0},
/*Enum */{0, /**/ 0, 0, 0, 0, /**/ 0, 0, 0, 2, /**/ 0, 0, /**/ 0, 0, 0, 0},
/*Struct */{0, /**/ 0, 0, 0, 0, /**/ 0, 0, 0, 0, /**/ 0, 0, /**/ 0, 0, 0, 0},
/*Others */{0, /**/ 0, 0, 0, 0, /**/ 0, 0, 0, 0, /**/ 0, 0, /**/ 0, 0, 0, 0},
};
vint conversion = conversionTable[(vint)fromFlag][(vint)toFlag];
return conversion == 1 || (explicitly && conversion == 2);
}
else
{
if (fromTd->CanConvertTo(toTd))
{
return true;
}
if (explicitly && toTd->CanConvertTo(fromTd))
{
return true;
}
}
}
break;
case ITypeInfo::Generic:
return explicitly && CanConvertToType(fromType, toType->GetElementType(), explicitly);
}
break;
case ITypeInfo::Generic:
switch (toType->GetDecorator())
{
case ITypeInfo::RawPtr:
case ITypeInfo::SharedPtr:
case ITypeInfo::Nullable:
return false;
case ITypeInfo::TypeDescriptor:
return CanConvertToType(fromType->GetElementType(), toType, explicitly);
case ITypeInfo::Generic:
if (explicitly) return true;
if (fromType->GetGenericArgumentCount() != toType->GetGenericArgumentCount())
{
return false;
}
if (!CanConvertToType(fromType->GetElementType(), toType->GetElementType(), explicitly)) return false;
for (vint i = 0; i < fromType->GetGenericArgumentCount(); i++)
{
if (!IsSameType(fromType->GetGenericArgument(i), toType->GetGenericArgument(i)))
{
return false;
}
}
return true;
}
break;
}
return false;
}
/***********************************************************************
IsSameType
***********************************************************************/
bool IsSameType(reflection::description::ITypeInfo* fromType, reflection::description::ITypeInfo* toType)
{
if (fromType->GetDecorator() != toType->GetDecorator())
{
return false;
}
switch (fromType->GetDecorator())
{
case ITypeInfo::RawPtr:
case ITypeInfo::SharedPtr:
case ITypeInfo::Nullable:
return IsSameType(fromType->GetElementType(), toType->GetElementType());
case ITypeInfo::TypeDescriptor:
return fromType->GetTypeDescriptor() == toType->GetTypeDescriptor();
case ITypeInfo::Generic:
if (fromType->GetGenericArgumentCount() != toType->GetGenericArgumentCount())
{
return false;
}
if (!IsSameType(fromType->GetElementType(), toType->GetElementType())) return false;
for (vint i = 0; i < fromType->GetGenericArgumentCount(); i++)
{
if (!IsSameType(fromType->GetGenericArgument(i), toType->GetGenericArgument(i)))
{
return false;
}
}
return true;
}
return false;
}
/***********************************************************************
GetMergedType
***********************************************************************/
Ptr<reflection::description::ITypeInfo> GetMergedType(Ptr<reflection::description::ITypeInfo> firstType, Ptr<reflection::description::ITypeInfo> secondType)
{
if (CanConvertToType(secondType.Obj(), firstType.Obj(), false))
{
return firstType;
}
else if (CanConvertToType(firstType.Obj(), secondType.Obj(), false))
{
return secondType;
}
else
{
return 0;
}
}
/***********************************************************************
IsNullAcceptableType
***********************************************************************/
bool IsNullAcceptableType(reflection::description::ITypeInfo* type)
{
switch (type->GetDecorator())
{
case ITypeInfo::RawPtr:
case ITypeInfo::SharedPtr:
case ITypeInfo::Nullable:
return true;
case ITypeInfo::TypeDescriptor:
return type->GetTypeDescriptor() == description::GetTypeDescriptor<Value>();
case ITypeInfo::Generic:
return false;
}
return false;
}
/***********************************************************************
CreateTypeInfoFromMethodInfo
***********************************************************************/
Ptr<reflection::description::ITypeInfo> CreateTypeInfoFromMethodInfo(reflection::description::IMethodInfo* info)
{
auto elementType = MakePtr<TypeDescriptorTypeInfo>(description::GetTypeDescriptor<IValueFunctionProxy>(), TypeInfoHint::Normal);
auto genericType = MakePtr<GenericTypeInfo>(elementType);
genericType->AddGenericArgument(CopyTypeInfo(info->GetReturn()));
vint parameterCount = info->GetParameterCount();
for (vint j = 0; j < parameterCount; j++)
{
genericType->AddGenericArgument(CopyTypeInfo(info->GetParameter(j)->GetType()));
}
return MakePtr<SharedPtrTypeInfo>(genericType);
}
}
}
}
/***********************************************************************
ANALYZER\WFANALYZER_VALIDATESEMANTIC.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace analyzer
{
using namespace collections;
using namespace reflection;
using namespace reflection::description;
using namespace typeimpl;
/***********************************************************************
Helper Functions
***********************************************************************/
IMethodInfo* FindInterfaceConstructor(ITypeDescriptor* type)
{
if (auto ctors = type->GetConstructorGroup())
{
auto proxyTd = description::GetTypeDescriptor<IValueInterfaceProxy>();
for (vint i = 0; i < ctors->GetMethodCount(); i++)
{
IMethodInfo* info = ctors->GetMethod(i);
if (info->GetParameterCount() == 1)
{
ITypeInfo* parameterType = info->GetParameter(0)->GetType();
if (parameterType->GetDecorator() == ITypeInfo::SharedPtr)
{
parameterType = parameterType->GetElementType();
if (parameterType->GetDecorator() == ITypeInfo::TypeDescriptor && parameterType->GetTypeDescriptor() == proxyTd)
{
return info;
}
}
}
}
}
return nullptr;
}
ITypeInfo* GetFunctionType(const ResolveExpressionResult& result)
{
if (result.eventInfo)
{
return result.eventInfo->GetHandlerType();
}
else if (result.type)
{
return result.type.Obj();
}
else
{
return nullptr;
}
}
Ptr<ITypeInfo> SelectFunction(WfLexicalScopeManager* manager, parsing::ParsingTreeCustomBase* node, Ptr<WfExpression> functionExpression, List<ResolveExpressionResult>& functions, List<Ptr<WfExpression>>& arguments, vint& selectedFunctionIndex)
{
selectedFunctionIndex = -1;
List<bool> resolvables;
List<Ptr<ITypeInfo>> types;
FOREACH(Ptr<WfExpression>, argument, arguments)
{
if (!argument || IsExpressionDependOnExpectedType(manager, argument))
{
resolvables.Add(false);
types.Add(nullptr);
}
else
{
resolvables.Add(true);
types.Add(GetExpressionType(manager, argument, 0));
}
}
List<Ptr<parsing::ParsingError>> functionErrors, nonFunctionErrors;
List<vint> selectedFunctionIndices;
ITypeDescriptor* functionFd = description::GetTypeDescriptor<IValueFunctionProxy>();
for (vint i = 0; i < functions.Count(); i++)
{
bool failed = false;
auto result = functions[i];
ITypeInfo* expressionType = GetFunctionType(result);
if (expressionType->GetDecorator() == ITypeInfo::SharedPtr)
{
ITypeInfo* genericType = expressionType->GetElementType();
if (genericType->GetDecorator() != ITypeInfo::Generic) goto FUNCTION_TYPE_FAILED;
ITypeInfo* functionType = genericType->GetElementType();
if (functionType->GetDecorator() != ITypeInfo::TypeDescriptor || functionType->GetTypeDescriptor() != functionFd) goto FUNCTION_TYPE_FAILED;
if (genericType->GetGenericArgumentCount() != types.Count() + 1)
{
functionErrors.Add(WfErrors::FunctionArgumentCountMismatched(node, arguments.Count(), result));
failed = true;
}
else
{
for (vint j = 0; j < types.Count(); j++)
{
if (resolvables[j] && types[j])
{
ITypeInfo* argumentType = genericType->GetGenericArgument(j + 1);
if (!CanConvertToType(types[j].Obj(), argumentType, false))
{
functionErrors.Add(WfErrors::FunctionArgumentTypeMismatched(node, result, i + 1, types[j].Obj(), argumentType));
failed = true;
}
}
}
}
}
else
{
goto FUNCTION_TYPE_FAILED;
}
goto FUNCTION_TYPE_FINISHED;
FUNCTION_TYPE_FAILED:
nonFunctionErrors.Add(WfErrors::ExpressionIsNotFunction(functionExpression.Obj(), result.type.Obj()));
failed = true;
FUNCTION_TYPE_FINISHED:
if (!failed)
{
selectedFunctionIndices.Add(i);
}
}
if (selectedFunctionIndices.Count() == 1)
{
selectedFunctionIndex = selectedFunctionIndices[0];
ITypeInfo* genericType = GetFunctionType(functions[selectedFunctionIndex])->GetElementType();
for (vint i = 0; i < types.Count(); i++)
{
if (!resolvables[i])
{
ITypeInfo* argumentType = genericType->GetGenericArgument(i + 1);
if (arguments[i])
{
GetExpressionType(manager, arguments[i], CopyTypeInfo(argumentType));
}
}
}
return CopyTypeInfo(genericType->GetGenericArgument(0));
}
else
{
if (selectedFunctionIndices.Count() > 1)
{
List<ResolveExpressionResult> overloadedFunctions;
CopyFrom(
overloadedFunctions,
From(selectedFunctionIndices)
.Select([&functions](vint index)
{
return functions[index];
}));
manager->errors.Add(WfErrors::CannotPickOverloadedFunctions(node, overloadedFunctions));
}
if (functionErrors.Count() > 0)
{
CopyFrom(manager->errors, functionErrors, true);
}
else
{
CopyFrom(manager->errors, nonFunctionErrors, true);
}
return nullptr;
}
}
/***********************************************************************
ValidateSemantic(ClassMember)
***********************************************************************/
class ValidateSemanticClassMemberVisitor : public Object, public WfDeclaration::IVisitor
{
public:
WfLexicalScopeManager* manager;
Ptr<WfCustomType> td;
Ptr<WfClassDeclaration> classDecl;
ValidateSemanticClassMemberVisitor(Ptr<WfCustomType> _td, Ptr<WfClassDeclaration> _classDecl, WfLexicalScopeManager* _manager)
:td(_td)
, classDecl(_classDecl)
, manager(_manager)
{
}
void Visit(WfNamespaceDeclaration* node)override
{
}
void Visit(WfFunctionDeclaration* node)override
{
ValidateDeclarationSemantic(manager, node);
}
void Visit(WfVariableDeclaration* node)override
{
ValidateDeclarationSemantic(manager, node);
}
void Visit(WfEventDeclaration* node)override
{
ValidateDeclarationSemantic(manager, node);
}
void Visit(WfPropertyDeclaration* node)override
{
ValidateDeclarationSemantic(manager, node);
auto scope = manager->nodeScopes[node];
if (auto typeInfo = CreateTypeInfoFromType(scope.Obj(), node->type))
{
if (node->getter.value != L"")
{
auto getter = td->GetMethodGroupByName(node->getter.value, false)->GetMethod(0);
if (!IsSameType(typeInfo.Obj(), getter->GetReturn()) || getter->GetParameterCount() != 0)
{
manager->errors.Add(WfErrors::PropertyGetterTypeMismatched(node, classDecl.Obj()));
}
}
if (node->setter.value != L"")
{
auto setter = td->GetMethodGroupByName(node->setter.value, false)->GetMethod(0);
if (setter->GetReturn()->GetTypeDescriptor() != description::GetTypeDescriptor<void>() || setter->GetParameterCount() != 1 || !IsSameType(typeInfo.Obj(), setter->GetParameter(0)->GetType()))
{
manager->errors.Add(WfErrors::PropertySetterTypeMismatched(node, classDecl.Obj()));
}
}
}
}
static void SelectConstructor(WfLexicalScopeManager* manager, WfConstructorDeclaration* ctorDecl, parsing::ParsingTreeCustomBase* node, ITypeDescriptor* td, List<Ptr<WfExpression>>& arguments)
{
List<ResolveExpressionResult> functions;
if (auto ctors = td->GetConstructorGroup())
{
vint count = ctors->GetMethodCount();
for (vint i = 0; i < count; i++)
{
auto ctor = ctors->GetMethod(i);
functions.Add(ResolveExpressionResult::Method(ctor));
}
}
vint selectedFunctionIndex = -1;
SelectFunction(manager, node, nullptr, functions, arguments, selectedFunctionIndex);
if (selectedFunctionIndex != -1)
{
auto ctor = functions[selectedFunctionIndex].methodInfo;
auto call = dynamic_cast<WfBaseConstructorCall*>(node);
manager->baseConstructorCallResolvings.Add({ctorDecl, td}, {call, ctor});
}
}
void Visit(WfConstructorDeclaration* node)override
{
ValidateDeclarationSemantic(manager, node);
auto scope = manager->nodeScopes[node].Obj();
auto classScope = scope->parentScope.Obj();
SortedList<ITypeDescriptor*> baseTypes, initTypes;
{
auto td = classScope->typeOfThisExpr;
vint count = td->GetBaseTypeDescriptorCount();
for (vint i = 0; i < count; i++)
{
auto baseTd = td->GetBaseTypeDescriptor(i);
if (!baseTypes.Contains(baseTd))
{
baseTypes.Add(baseTd);
}
}
}
FOREACH(Ptr<WfBaseConstructorCall>, call, node->baseConstructorCalls)
{
if (auto scopeName = GetScopeNameFromReferenceType(classScope, call->type))
{
if (auto td = scopeName->typeDescriptor)
{
if (initTypes.Contains(td))
{
manager->errors.Add(WfErrors::DuplicatedBaseConstructorCall(call.Obj(), td));
}
else if (baseTypes.Contains(td))
{
initTypes.Add(td);
SelectConstructor(manager, node, call.Obj(), td, call->arguments);
}
else
{
manager->errors.Add(WfErrors::WrongBaseConstructorCall(call.Obj(), td));
}
}
}
}
{
vint index = -1;
for (vint i = 0; i < initTypes.Count(); i++)
{
while (baseTypes[++index] != initTypes[i])
{
auto td = baseTypes[index];
List<Ptr<WfExpression>> arguments;
SelectConstructor(manager, node, node, td, arguments);
}
}
while (++index < baseTypes.Count())
{
auto td = baseTypes[index];
List<Ptr<WfExpression>> arguments;
SelectConstructor(manager, node, node, td, arguments);
}
}
ValidateStatementSemantic(manager, node->statement);
}
void Visit(WfDestructorDeclaration* node)override
{
ValidateDeclarationSemantic(manager, node);
ValidateStatementSemantic(manager, node->statement);
}
void Visit(WfClassDeclaration* node)override
{
ValidateDeclarationSemantic(manager, node);
}
void Visit(WfEnumDeclaration* node)override
{
ValidateDeclarationSemantic(manager, node);
}
void Visit(WfStructDeclaration* node)override
{
ValidateDeclarationSemantic(manager, node);
}
void Visit(WfVirtualDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, decl, node->expandedDeclarations)
{
decl->Accept(this);
}
}
static void Execute(Ptr<WfCustomType> td, Ptr<WfClassDeclaration> classDecl, Ptr<WfDeclaration> memberDecl, WfLexicalScopeManager* manager)
{
ValidateSemanticClassMemberVisitor visitor(td, classDecl, manager);
memberDecl->Accept(&visitor);
}
};
/***********************************************************************
ValidateSemantic(Declaration)
***********************************************************************/
class ValidateSemanticDeclarationVisitor : public Object, public WfDeclaration::IVisitor
{
public:
WfLexicalScopeManager* manager;
ValidateSemanticDeclarationVisitor(WfLexicalScopeManager* _manager)
:manager(_manager)
{
}
void Visit(List<Ptr<WfAttribute>>& attributes)
{
FOREACH(Ptr<WfAttribute>, attribute, attributes)
{
auto key = Pair<WString, WString>(attribute->category.value, attribute->name.value);
vint index = manager->attributes.Keys().IndexOf(key);
if (index == -1)
{
manager->errors.Add(WfErrors::AttributeNotExists(attribute.Obj()));
}
else
{
auto expectedType = manager->attributes.Values()[index];
if (attribute->value)
{
ValidateConstantExpression(manager, attribute->value, expectedType);
}
else if (expectedType->GetTypeDescriptor() != description::GetTypeDescriptor<void>())
{
manager->errors.Add(WfErrors::AttributeMissValue(attribute.Obj()));
}
}
}
}
void Visit(WfNamespaceDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, declaration, node->declarations)
{
ValidateDeclarationSemantic(manager, declaration);
}
}
void Visit(WfFunctionDeclaration* node)override
{
if (node->statement)
{
ValidateStatementSemantic(manager, node->statement);
}
FOREACH(Ptr<WfFunctionArgument>, argument, node->arguments)
{
Visit(argument->attributes);
}
}
void Visit(WfVariableDeclaration* node)override
{
auto scope = manager->nodeScopes[node];
auto symbol = scope->symbols[node->name.value][0];
symbol->typeInfo = GetExpressionType(manager, node->expression, symbol->typeInfo);
if (symbol->typeInfo && !symbol->type)
{
symbol->type = GetTypeFromTypeInfo(symbol->typeInfo.Obj());
}
}
void Visit(WfEventDeclaration* node)override
{
}
void Visit(WfPropertyDeclaration* node)override
{
}
void Visit(WfConstructorDeclaration* node)override
{
}
void Visit(WfDestructorDeclaration* node)override
{
}
void Visit(WfClassDeclaration* node)override
{
auto scope = manager->nodeScopes[node];
auto td = manager->declarationTypes[node].Cast<WfCustomType>();
if (node->kind == WfClassKind::Interface)
{
FOREACH(Ptr<WfType>, baseType, node->baseTypes)
{
auto scopeName = GetScopeNameFromReferenceType(scope->parentScope.Obj(), baseType);
auto baseTd = scopeName->typeDescriptor;
auto ctor = FindInterfaceConstructor(baseTd);
if (ctor == nullptr)
{
manager->errors.Add(WfErrors::WrongInterfaceBaseType(node, baseTd));
}
}
}
FOREACH(Ptr<WfDeclaration>, memberDecl, node->declarations)
{
ValidateClassMemberSemantic(manager, td, node, memberDecl);
}
}
void Visit(WfEnumDeclaration* node)override
{
FOREACH(Ptr<WfEnumItem>, item, node->items)
{
Visit(item->attributes);
}
}
void SearchForItself(WfStructDeclaration* node, ITypeDescriptor* target, ITypeDescriptor* current, List<WString>& path)
{
if (target == current)
{
manager->errors.Add(WfErrors::StructRecursivelyIncludeItself(
node,
From(path).Aggregate([](const WString& a, const WString& b) {return a + L"::" + b; })
));
return;
}
if (current == nullptr)
{
current = target;
}
vint count = current->GetPropertyCount();
for (vint i = 0; i < count; i++)
{
auto prop = current->GetProperty(i);
auto propType = prop->GetReturn();
auto propTd = prop->GetReturn()->GetTypeDescriptor();
if (propType->GetDecorator()==ITypeInfo::TypeDescriptor && propTd->GetTypeDescriptorFlags() == TypeDescriptorFlags::Struct)
{
vint index = path.Add(prop->GetName());
SearchForItself(node, target, propTd, path);
path.RemoveAt(index);
}
}
}
void Visit(WfStructDeclaration* node)override
{
auto scope = manager->nodeScopes[node];
auto td = manager->declarationTypes[node].Cast<WfStruct>();
FOREACH(Ptr<WfStructMember>, member, node->members)
{
auto memberTd = td->GetPropertyByName(member->name.value, false)->GetReturn()->GetTypeDescriptor();
if ((memberTd->GetTypeDescriptorFlags() & TypeDescriptorFlags::ReferenceType) != TypeDescriptorFlags::Undefined)
{
manager->errors.Add(WfErrors::StructContainsNonValueType(member.Obj(), node));
}
}
List<WString> path;
path.Add(td->GetTypeName());
SearchForItself(node, td.Obj(), nullptr, path);
FOREACH(Ptr<WfStructMember>, member, node->members)
{
Visit(member->attributes);
}
}
void Visit(WfVirtualDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, decl, node->expandedDeclarations)
{
decl->Accept(this);
}
}
static void Execute(Ptr<WfDeclaration> declaration, WfLexicalScopeManager* manager)
{
ValidateSemanticDeclarationVisitor visitor(manager);
declaration->Accept(&visitor);
visitor.Visit(declaration->attributes);
}
};
/***********************************************************************
ValidateSemantic(Statement)
***********************************************************************/
class ExpandVirtualStatementVisitor : public Object, public WfVirtualStatement::IVisitor
{
public:
WfLexicalScopeManager* manager;
ExpandVirtualStatementVisitor(WfLexicalScopeManager* _manager)
:manager(_manager)
{
}
void Visit(WfSwitchStatement* node)override
{
ExpandSwitchStatement(manager, node);
}
void Visit(WfForEachStatement* node)override
{
ExpandForEachStatement(manager, node);
}
void Visit(WfCoProviderStatement* node)override
{
ExpandCoProviderStatement(manager, node);
}
};
class ValidateSemanticStatementVisitor
: public Object
, public WfStatement::IVisitor
, public WfVirtualStatement::IVisitor
, public WfCoroutineStatement::IVisitor
{
public:
WfLexicalScopeManager* manager;
ValidateSemanticStatementVisitor(WfLexicalScopeManager* _manager)
:manager(_manager)
{
}
void Visit(WfBreakStatement* node)override
{
}
void Visit(WfContinueStatement* node)override
{
}
void Visit(WfReturnStatement* node)override
{
auto scope = manager->nodeScopes[node].Obj();
auto functionScope = scope->FindFunctionScope();
if (auto funcDecl = functionScope->ownerNode.Cast<WfFunctionDeclaration>())
{
auto providerStat = funcDecl->statement.Cast<WfCoProviderStatement>();
if (providerStat && !providerStat->expandedStatement)
{
auto providerScope = manager->nodeScopes[funcDecl->statement.Obj()];
auto providerSymbol = providerScope->symbols[L"$PROVIDER"][0];
auto implSymbol = providerScope->symbols[L"$IMPL"][0];
if (providerSymbol->typeInfo && implSymbol->typeInfo)
{
if (auto group = providerSymbol->typeInfo->GetTypeDescriptor()->GetMethodGroupByName(L"ReturnAndExit", true))
{
List<ResolveExpressionResult> functions;
vint count = group->GetMethodCount();
for (vint i = 0; i < count; i++)
{
auto method = group->GetMethod(i);
if (method->IsStatic())
{
if (method->GetParameterCount() > 0 && IsSameType(implSymbol->typeInfo.Obj(), method->GetParameter(0)->GetType()))
{
functions.Add(ResolveExpressionResult::Method(method));
}
}
}
vint selectedFunctionIndex = -1;
List<Ptr<WfExpression>> arguments;
arguments.Add(nullptr);
if (node->expression)
{
arguments.Add(node->expression);
}
SelectFunction(manager, node, nullptr, functions, arguments, selectedFunctionIndex);
if (selectedFunctionIndex != -1)
{
manager->coOperatorResolvings.Add(node, functions[selectedFunctionIndex]);
}
}
else
{
manager->errors.Add(WfErrors::CoOperatorNotExists(node, providerSymbol->typeInfo.Obj()));
}
}
}
else
{
auto returnType = CreateTypeInfoFromType(scope, funcDecl->returnType);
if (node->expression)
{
if (returnType->GetTypeDescriptor() == description::GetTypeDescriptor<void>())
{
manager->errors.Add(WfErrors::CannotReturnExpression(node));
}
else
{
GetExpressionType(manager, node->expression, returnType);
}
}
else if (returnType->GetDecorator() != ITypeInfo::TypeDescriptor || returnType->GetTypeDescriptor() != description::GetTypeDescriptor<void>())
{
manager->errors.Add(WfErrors::ReturnMissExpression(node, returnType.Obj()));
}
}
}
else
{
if (node->expression)
{
manager->errors.Add(WfErrors::CannotReturnExpression(node));
}
}
}
void Visit(WfDeleteStatement* node)override
{
Ptr<ITypeInfo> type = GetExpressionType(manager, node->expression, 0);
if (type)
{
if (type->GetDecorator() != ITypeInfo::RawPtr)
{
manager->errors.Add(WfErrors::DeleteNonRawPointer(node, type.Obj()));
}
}
}
void Visit(WfRaiseExceptionStatement* node)override
{
if (node->expression)
{
if (auto type = GetExpressionType(manager, node->expression, nullptr))
{
auto stringType = TypeInfoRetriver<WString>::CreateTypeInfo();
auto exceptionType = TypeInfoRetriver<Ptr<IValueException>>::CreateTypeInfo();
if (!CanConvertToType(type.Obj(), stringType.Obj(), false) && !CanConvertToType(type.Obj(), exceptionType.Obj(), false))
{
manager->errors.Add(WfErrors::ExpressionCannotImplicitlyConvertToType(node->expression.Obj(), type.Obj(), stringType.Obj()));
}
}
}
}
void Visit(WfIfStatement* node)override
{
if (node->type)
{
auto scope = manager->nodeScopes[node].Obj();
auto symbol = scope->symbols[node->name.value][0];
if (!IsNullAcceptableType(symbol->typeInfo.Obj()))
{
manager->errors.Add(WfErrors::NullCannotImplicitlyConvertToType(node->expression.Obj(), symbol->typeInfo.Obj()));
}
GetExpressionType(manager, node->expression, nullptr);
}
else
{
Ptr<ITypeInfo> boolType = TypeInfoRetriver<bool>::CreateTypeInfo();
GetExpressionType(manager, node->expression, boolType);
}
ValidateStatementSemantic(manager, node->trueBranch);
if (node->falseBranch)
{
ValidateStatementSemantic(manager, node->falseBranch);
}
}
void Visit(WfWhileStatement* node)override
{
Ptr<ITypeInfo> boolType = TypeInfoRetriver<bool>::CreateTypeInfo();
GetExpressionType(manager, node->condition, boolType);
ValidateStatementSemantic(manager, node->statement);
}
void Visit(WfTryStatement* node)override
{
ValidateStatementSemantic(manager, node->protectedStatement);
if (node->catchStatement)
{
ValidateStatementSemantic(manager, node->catchStatement);
}
if (node->finallyStatement)
{
ValidateStatementSemantic(manager, node->finallyStatement);
}
}
void Visit(WfBlockStatement* node)override
{
FOREACH(Ptr<WfStatement>, statement, node->statements)
{
ValidateStatementSemantic(manager, statement);
}
}
void Visit(WfExpressionStatement* node)override
{
GetExpressionType(manager, node->expression, 0);
}
void Visit(WfVariableStatement* node)override
{
ValidateDeclarationSemantic(manager, node->variable);
}
void Visit(WfVirtualStatement* node)override
{
bool expanded = node->expandedStatement;
vint errorCount = manager->errors.Count();
node->Accept((WfVirtualStatement::IVisitor*)this);
if (!expanded && manager->errors.Count() == errorCount)
{
ExpandVirtualStatementVisitor visitor(manager);
node->Accept(&visitor);
SetCodeRange(node->expandedStatement, node->codeRange);
auto parentScope = manager->nodeScopes[node];
if (parentScope->ownerNode == node)
{
parentScope = parentScope->parentScope;
}
ContextFreeStatementDesugar(manager, node->expandedStatement);
BuildScopeForStatement(manager, parentScope, node->expandedStatement);
if (!CheckScopes_DuplicatedSymbol(manager) || !CheckScopes_SymbolType(manager))
{
return;
}
}
if (node->expandedStatement)
{
ValidateStatementSemantic(manager, node->expandedStatement);
}
}
void Visit(WfSwitchStatement* node)override
{
Ptr<ITypeInfo> type = GetExpressionType(manager, node->expression, 0);
FOREACH(Ptr<WfSwitchCase>, switchCase, node->caseBranches)
{
Ptr<ITypeInfo> caseType;
if (IsExpressionDependOnExpectedType(manager, switchCase->expression))
{
caseType = GetExpressionType(manager, switchCase->expression, type);
}
else
{
caseType = GetExpressionType(manager, switchCase->expression, 0);
}
if (type && caseType)
{
if (!GetMergedType(type, caseType))
{
manager->errors.Add(WfErrors::CannotMergeTwoType(switchCase->expression.Obj(), type.Obj(), caseType.Obj()));
}
}
ValidateStatementSemantic(manager, switchCase->statement);
}
if (node->defaultBranch)
{
ValidateStatementSemantic(manager, node->defaultBranch);
}
}
void Visit(WfForEachStatement* node)override
{
Ptr<ITypeInfo> elementType = GetEnumerableExpressionItemType(manager, node->collection, 0);
if (elementType)
{
auto scope = manager->nodeScopes[node].Obj();
auto symbol = scope->symbols[node->name.value][0];
symbol->typeInfo = elementType;
symbol->type = GetTypeFromTypeInfo(elementType.Obj());
}
ValidateStatementSemantic(manager, node->statement);
}
void Visit(WfCoProviderStatement* node)override
{
auto scope = manager->nodeScopes[node].Obj();
auto providerSymbol = scope->symbols[L"$PROVIDER"][0];
auto implSymbol = scope->symbols[L"$IMPL"][0];
Ptr<ITypeInfo> funcReturnType;
{
auto decl = scope->parentScope->ownerNode.Cast<WfFunctionDeclaration>();
funcReturnType = CreateTypeInfoFromType(scope->parentScope.Obj(), decl->returnType);
}
ITypeDescriptor* selectedProviderTd = nullptr;
List<WString> candidates;
if (node->name.value == L"")
{
if (funcReturnType)
{
List<ITypeDescriptor*> unprocessed;
unprocessed.Add(funcReturnType->GetTypeDescriptor());
for (vint i = 0; i < unprocessed.Count(); i++)
{
auto td = unprocessed[i];
auto candidate = td->GetTypeName() + L"Coroutine";
if ((selectedProviderTd = description::GetTypeDescriptor(candidate)))
{
break;
}
else
{
candidates.Add(candidate);
}
vint count = td->GetBaseTypeDescriptorCount();
for (vint i = 0; i < count; i++)
{
auto baseTd = td->GetBaseTypeDescriptor(i);
if (!unprocessed.Contains(baseTd))
{
unprocessed.Add(baseTd);
}
}
}
}
}
else
{
List<ResolveExpressionResult> results, resolveResults;
auto providerName = node->name.value.Right(node->name.value.Length() - 1);
if (manager->ResolveName(scope, providerName, resolveResults))
{
CopyFrom(results, resolveResults);
for (vint i = results.Count() - 1; i >= 0; i--)
{
auto& result = results[i];
ITypeDescriptor* providerTd = nullptr;
if (result.scopeName && result.scopeName->typeDescriptor)
{
auto candidate = result.scopeName->typeDescriptor->GetTypeName() + L"Coroutine";
providerTd = description::GetTypeDescriptor(candidate);
if (providerTd)
{
selectedProviderTd = providerTd;
}
else
{
candidates.Add(candidate);
}
}
if (!providerTd)
{
results.RemoveAt(i);
}
}
if (results.Count() == 1)
{
goto FINISH_SEARCHING;
}
else if (results.Count() > 1)
{
manager->errors.Add(WfErrors::TooManyTargets(node, resolveResults, providerName));
goto SKIP_SEARCHING;
}
}
resolveResults.Clear();
if (manager->ResolveName(scope, providerName + L"Coroutine", resolveResults))
{
CopyFrom(results, resolveResults);
for (vint i = results.Count() - 1; i >= 0; i--)
{
auto& result = results[i];
if (result.scopeName && result.scopeName->typeDescriptor)
{
selectedProviderTd = result.scopeName->typeDescriptor;
}
else
{
results.RemoveAt(i);
}
}
if (results.Count() == 1)
{
goto FINISH_SEARCHING;
}
else if (results.Count() > 1)
{
manager->errors.Add(WfErrors::TooManyTargets(node, resolveResults, providerName));
goto SKIP_SEARCHING;
}
}
candidates.Add(providerName);
candidates.Add(providerName + L"Coroutine");
}
FINISH_SEARCHING:
if (selectedProviderTd)
{
providerSymbol->typeInfo = MakePtr<TypeDescriptorTypeInfo>(selectedProviderTd, TypeInfoHint::Normal);
if (funcReturnType)
{
WString creatorName;
if (funcReturnType->GetTypeDescriptor() == description::GetTypeDescriptor<void>())
{
creatorName = L"CreateAndRun";
}
else
{
creatorName = L"Create";
}
if (auto group = selectedProviderTd->GetMethodGroupByName(creatorName, true))
{
List<ResolveExpressionResult> results;
ITypeInfo* selectedImplType = nullptr;
IMethodInfo* selectedCreator = nullptr;
vint count = group->GetMethodCount();
for (vint i = 0; i < count; i++)
{
auto method = group->GetMethod(i);
if (method->IsStatic())
{
if (method->GetParameterCount() == 1)
{
auto creatorType = method->GetParameter(0)->GetType();
if (creatorType->GetDecorator() == ITypeInfo::SharedPtr)
{
auto functionType = creatorType->GetElementType();
if (functionType->GetDecorator() == ITypeInfo::Generic &&
functionType->GetGenericArgumentCount() == 2 &&
functionType->GetTypeDescriptor() == description::GetTypeDescriptor<IValueFunctionProxy>()
)
{
auto returnType = functionType->GetGenericArgument(0);
if (returnType->GetDecorator() == ITypeInfo::SharedPtr &&returnType->GetTypeDescriptor() == description::GetTypeDescriptor<ICoroutine>())
{
selectedImplType = functionType->GetGenericArgument(1);
selectedCreator = method;
results.Add(ResolveExpressionResult::Method(method));
}
}
}
}
}
}
if (results.Count() == 1)
{
implSymbol->typeInfo = CopyTypeInfo(selectedImplType);
manager->coProviderResolvings.Add(node, ResolveExpressionResult::Method(selectedCreator));
}
else if (results.Count() > 1)
{
manager->errors.Add(WfErrors::TooManyTargets(node, results, creatorName));
}
}
if (!implSymbol->typeInfo)
{
if (funcReturnType->GetTypeDescriptor() == description::GetTypeDescriptor<void>())
{
manager->errors.Add(WfErrors::CoProviderCreateAndRunNotExists(node, providerSymbol->typeInfo.Obj()));
}
else
{
manager->errors.Add(WfErrors::CoProviderCreateNotExists(node, providerSymbol->typeInfo.Obj()));
}
}
}
}
else
{
manager->errors.Add(WfErrors::CoProviderNotExists(node, candidates));
}
SKIP_SEARCHING:
ValidateStatementSemantic(manager, node->statement);
}
void Visit(WfCoroutineStatement* node)override
{
node->Accept((WfCoroutineStatement::IVisitor*)this);
}
void Visit(WfCoPauseStatement* node)override
{
if (node->statement)
{
ValidateStatementSemantic(manager, node->statement);
}
}
void Visit(WfCoOperatorStatement* node)override
{
auto scope = manager->nodeScopes[node].Obj();
auto functionScope = scope->FindFunctionScope();
if (auto funcDecl = functionScope->ownerNode.Cast<WfFunctionDeclaration>())
{
if (funcDecl->statement.Cast<WfCoProviderStatement>())
{
auto providerScope = manager->nodeScopes[funcDecl->statement.Obj()];
auto providerSymbol = providerScope->symbols[L"$PROVIDER"][0];
auto implSymbol = providerScope->symbols[L"$IMPL"][0];
if (providerSymbol->typeInfo && implSymbol->typeInfo)
{
List<IMethodGroupInfo*> groups;
auto operatorName = node->opName.value.Right(node->opName.value.Length() - 1);
if (auto group = providerSymbol->typeInfo->GetTypeDescriptor()->GetMethodGroupByName(operatorName + L"AndRead", true))
{
groups.Add(group);
}
if (node->varName.value == L"")
{
if (auto group = providerSymbol->typeInfo->GetTypeDescriptor()->GetMethodGroupByName(operatorName + L"AndPause", true))
{
groups.Add(group);
}
}
if (groups.Count() == 0)
{
manager->errors.Add(WfErrors::CoOperatorNotExists(node, providerSymbol->typeInfo.Obj()));
}
else
{
List<ResolveExpressionResult> functions;
FOREACH(IMethodGroupInfo*, group, groups)
{
vint count = group->GetMethodCount();
for (vint i = 0; i < count; i++)
{
auto method = group->GetMethod(i);
if (method->IsStatic())
{
if (method->GetParameterCount() > 0 && IsSameType(implSymbol->typeInfo.Obj(), method->GetParameter(0)->GetType()))
{
functions.Add(ResolveExpressionResult::Method(method));
}
}
}
}
vint selectedFunctionIndex = -1;
vint oldErrorCount = manager->errors.Count();
List<Ptr<WfExpression>> arguments;
arguments.Add(nullptr);
CopyFrom(arguments, node->arguments, true);
SelectFunction(manager, node, nullptr, functions, arguments, selectedFunctionIndex);
if (selectedFunctionIndex != -1)
{
manager->coOperatorResolvings.Add(node, functions[selectedFunctionIndex]);
if (node->varName.value != L"" && manager->errors.Count() == oldErrorCount)
{
auto symbol = scope->symbols[node->varName.value][0];
List<ITypeInfo*> types;
FOREACH(Ptr<WfExpression>, argument, node->arguments)
{
vint index = manager->expressionResolvings.Keys().IndexOf(argument.Obj());
if (index != -1)
{
auto type = manager->expressionResolvings.Values()[index].type;
if (!types.Contains(type.Obj()))
{
types.Add(type.Obj());
if (auto group = type->GetTypeDescriptor()->GetMethodGroupByName(L"CastResult", true))
{
vint count = group->GetMethodCount();
for (vint i = 0; i < count; i++)
{
auto method = group->GetMethod(i);
if (method->IsStatic())
{
if (method->GetParameterCount() == 1 &&
method->GetParameter(0)->GetType()->GetTypeDescriptor() == description::GetTypeDescriptor<Value>() &&
method->GetReturn()->GetTypeDescriptor() != description::GetTypeDescriptor<void>()
)
{
manager->coCastResultResolvings.Add(node, ResolveExpressionResult::Method(method));
symbol->typeInfo = CopyTypeInfo(method->GetReturn());
break;
}
}
}
}
}
}
}
if (!symbol->typeInfo)
{
manager->errors.Add(WfErrors::CoOperatorCannotResolveResultType(node, types));
}
}
}
}
}
}
}
}
static void Execute(Ptr<WfStatement> statement, WfLexicalScopeManager* manager)
{
ValidateSemanticStatementVisitor visitor(manager);
statement->Accept(&visitor);
}
};
/***********************************************************************
ValidateSemantic(Expression)
***********************************************************************/
class ExpandVirtualExpressionVisitor : public Object, public WfVirtualExpression::IVisitor
{
public:
WfLexicalScopeManager* manager;
ExpandVirtualExpressionVisitor(WfLexicalScopeManager* _manager)
:manager(_manager)
{
}
void Visit(WfBindExpression* node)override
{
ExpandBindExpression(manager, node);
}
void Visit(WfFormatExpression* node)override
{
}
void Visit(WfNewCoroutineExpression* node)override
{
ExpandNewCoroutineExpression(manager, node);
}
void Visit(WfMixinCastExpression* node)override
{
ExpandMixinCastExpression(manager, node);
}
};
class ValidateSemanticExpressionVisitor
: public Object
, public WfExpression::IVisitor
, public WfVirtualExpression::IVisitor
{
public:
WfLexicalScopeManager* manager;
Ptr<ITypeInfo> expectedType;
List<ResolveExpressionResult>& results;
ValidateSemanticExpressionVisitor(WfLexicalScopeManager* _manager, Ptr<ITypeInfo> _expectedType, List<ResolveExpressionResult>& _results)
:manager(_manager)
, expectedType(_expectedType)
, results(_results)
{
}
void Visit(WfThisExpression* node)override
{
auto scope = manager->nodeScopes[node].Obj();
Ptr<WfLexicalFunctionConfig> lastConfig;
while (scope)
{
if (auto config = scope->functionConfig)
{
lastConfig = config;
if (!lastConfig->thisAccessable)
{
break;
}
}
if (scope->typeOfThisExpr)
{
if (!lastConfig)
{
break;
}
if (lastConfig->thisAccessable)
{
auto elementType = MakePtr<TypeDescriptorTypeInfo>(scope->typeOfThisExpr, TypeInfoHint::Normal);
auto pointerType = MakePtr<RawPtrTypeInfo>(elementType);
results.Add(ResolveExpressionResult::ReadonlyType(pointerType));
return;
}
}
scope = scope->parentScope.Obj();
}
manager->errors.Add(WfErrors::WrongThisExpression(node));
}
void Visit(WfTopQualifiedExpression* node)override
{
if (manager->globalName)
{
vint index = manager->globalName->children.Keys().IndexOf(node->name.value);
if (index != -1)
{
results.Add(ResolveExpressionResult::ScopeName(manager->globalName->children.Values()[index]));
return;
}
}
manager->errors.Add(WfErrors::TopQualifiedSymbolNotExists(node, node->name.value));
}
void ResolveName(WfExpression* node, const WString& name)
{
auto scope = manager->nodeScopes[node].Obj();
List<ResolveExpressionResult> nameResults;
manager->ResolveName(scope, name, nameResults);
for (vint i = 0; i < nameResults.Count(); i++)
{
auto& result = nameResults[i];
if (result.symbol)
{
if (!result.type)
{
manager->errors.Add(WfErrors::ExpressionCannotResolveType(node, result.symbol));
}
else if (!result.symbol->creatorNode.Cast<WfDeclaration>() || result.symbol->creatorNode.Cast<WfVariableDeclaration>())
{
bool readonlyCaptured = false;
if (!result.symbol->ownerScope->ownerNode.Cast<WfModule>() && !result.symbol->ownerScope->ownerNode.Cast<WfNamespaceDeclaration>())
{
auto currentScope = scope;
WfLexicalScope* firstConfigScope = nullptr;
WfLexicalScope* lastConfigScope = nullptr;
while (currentScope)
{
if (currentScope->functionConfig)
{
if (!firstConfigScope)
{
firstConfigScope = currentScope;
}
lastConfigScope = currentScope;
}
if (result.symbol->ownerScope == currentScope)
{
if (firstConfigScope && firstConfigScope->functionConfig->lambda)
{
readonlyCaptured = true;
}
if (currentScope->ownerNode.Cast<WfNewInterfaceExpression>())
{
if (firstConfigScope)
{
readonlyCaptured = firstConfigScope != lastConfigScope;
if (!lastConfigScope->GetOwnerClassMember())
{
manager->errors.Add(WfErrors::FieldCannotInitializeUsingEachOther(node, result));
}
}
else
{
manager->errors.Add(WfErrors::FieldCannotInitializeUsingEachOther(node, result));
}
}
break;
}
if (currentScope->ownerNode.Cast<WfNewInterfaceExpression>())
{
auto capture = manager->lambdaCaptures[currentScope->ownerNode.Obj()];
if (!capture->ctorArgumentSymbols.Contains(result.symbol.Obj()))
{
if (lastConfigScope == nullptr)
{
capture->ctorArgumentSymbols.Add(result.symbol);
}
else
{
auto functionCapture = manager->lambdaCaptures[lastConfigScope->ownerNode.Obj()];
if (capture != functionCapture)
{
capture->ctorArgumentSymbols.Add(result.symbol);
}
}
}
}
if (currentScope->functionConfig)
{
if (currentScope->functionConfig->lambda)
{
auto capture = manager->lambdaCaptures[currentScope->ownerNode.Obj()];
if (!capture->symbols.Contains(result.symbol.Obj()))
{
capture->symbols.Add(result.symbol);
}
}
}
currentScope = currentScope->parentScope.Obj();
}
}
if (readonlyCaptured)
{
results.Add(ResolveExpressionResult::ReadonlySymbol(result.symbol));
}
else
{
results.Add(ResolveExpressionResult::Symbol(result.symbol));
}
}
else
{
results.Add(result);
}
}
else
{
if (result.propertyInfo && dynamic_cast<WfReferenceExpression*>(node))
{
auto currentScope = scope;
WfLexicalScope* firstConfigScope = nullptr;
WfLexicalScope* lastConfigScope = nullptr;
while (currentScope)
{
if (currentScope->functionConfig)
{
if (!firstConfigScope)
{
firstConfigScope = currentScope;
}
lastConfigScope = currentScope;
}
if (currentScope->ownerNode.Cast<WfClassDeclaration>() && currentScope->typeOfThisExpr == result.propertyInfo->GetOwnerTypeDescriptor())
{
if (firstConfigScope)
{
bool inMethodBody = lastConfigScope->GetOwnerClassMember() && lastConfigScope->ownerNode.Cast<WfFunctionDeclaration>();
bool inDtorBody = lastConfigScope->GetOwnerClassMember() && lastConfigScope->ownerNode.Cast<WfDestructorDeclaration>();
bool inCtorBody = lastConfigScope->parentScope->GetOwnerClassMember() && lastConfigScope->parentScope->ownerNode.Cast<WfConstructorDeclaration>();
if (!inMethodBody && !inDtorBody && !inCtorBody)
{
manager->errors.Add(WfErrors::FieldCannotInitializeUsingEachOther(node, result));
}
}
else if (!scope->ownerNode.Cast<WfConstructorDeclaration>())
{
manager->errors.Add(WfErrors::FieldCannotInitializeUsingEachOther(node, result));
}
}
currentScope = currentScope->parentScope.Obj();
}
}
results.Add(result);
}
}
if (results.Count() == 0)
{
if (nameResults.Count() > 0)
{
FOREACH(ResolveExpressionResult, result, nameResults)
{
manager->errors.Add(WfErrors::ExpressionCannotResolveType(node, result.symbol));
}
}
else
{
manager->errors.Add(WfErrors::ReferenceNotExists(node, name));
}
}
}
void Visit(WfReferenceExpression* node)override
{
if (expectedType && (expectedType->GetTypeDescriptor()->GetTypeDescriptorFlags() & TypeDescriptorFlags::EnumType) != TypeDescriptorFlags::Undefined)
{
auto scope = manager->nodeScopes[node].Obj();
List<ResolveExpressionResult> testResults;
manager->ResolveName(scope, node->name.value, testResults);
if (testResults.Count() == 0)
{
auto enumType = expectedType->GetTypeDescriptor()->GetEnumType();
if (enumType->IndexOfItem(node->name.value) == -1)
{
manager->errors.Add(WfErrors::EnumItemNotExists(node, expectedType->GetTypeDescriptor(), node->name.value));
}
else
{
results.Add(ResolveExpressionResult::ReadonlyType(expectedType));
}
return;
}
}
ResolveName(node, node->name.value);
FOREACH(ResolveExpressionResult, result, results)
{
ITypeDescriptor* td = nullptr;
if (result.methodInfo)
{
td = result.methodInfo->GetOwnerTypeDescriptor();
}
else if (result.propertyInfo)
{
td = result.propertyInfo->GetOwnerTypeDescriptor();
}
else if (result.eventInfo)
{
td = result.eventInfo->GetOwnerTypeDescriptor();
}
if (td)
{
auto scope = manager->nodeScopes[node].Obj();
bool visibleToNonStatic = false;
while (scope)
{
if (scope->functionConfig)
{
visibleToNonStatic = scope->functionConfig->thisAccessable || scope->functionConfig->parentThisAccessable;
}
if (scope->typeOfThisExpr && scope->typeOfThisExpr->CanConvertTo(td))
{
if (!visibleToNonStatic)
{
if (result.methodInfo)
{
if (!result.methodInfo->IsStatic())
{
manager->errors.Add(WfErrors::CannotCallMemberInStaticFunction(node, result));
}
}
else if (result.propertyInfo)
{
manager->errors.Add(WfErrors::CannotCallMemberInStaticFunction(node, result));
}
else if (result.eventInfo)
{
manager->errors.Add(WfErrors::CannotCallMemberInStaticFunction(node, result));
}
break;
}
}
scope = scope->parentScope.Obj();
}
}
}
}
void Visit(WfOrderedNameExpression* node)override
{
ResolveName(node, node->name.value);
}
void Visit(WfOrderedLambdaExpression* node)override
{
auto scope = manager->nodeScopes[node].Obj();
List<Ptr<WfLexicalSymbol>> parameterSymbols;
CopyFrom(
parameterSymbols,
Range<vint>(0, scope->symbols.Count())
.Select([scope](vint index)->Ptr<WfLexicalSymbol>{return scope->symbols.GetByIndex(index)[0];})
.OrderBy([](Ptr<WfLexicalSymbol> a, Ptr<WfLexicalSymbol> b)
{
vint aId = wtoi(a->name.Sub(1, a->name.Length() - 1));
vint bId = wtoi(b->name.Sub(1, a->name.Length() - 1));
return aId - bId;
})
);
Ptr<ITypeInfo> resultType = expectedType;
if (!expectedType && parameterSymbols.Count() > 0)
{
manager->errors.Add(WfErrors::OrderedLambdaCannotResolveType(node));
return;
}
else if (expectedType)
{
ITypeInfo* type = expectedType.Obj();
if (type->GetDecorator() != ITypeInfo::SharedPtr)
{
goto ORDERED_FAILED;
}
type = type->GetElementType();
if (type->GetDecorator() != ITypeInfo::Generic)
{
goto ORDERED_FAILED;
}
{
ITypeInfo* functionType = type->GetElementType();
if (functionType->GetDecorator() != ITypeInfo::TypeDescriptor)
{
goto ORDERED_FAILED;
}
if (functionType->GetTypeDescriptor() != description::GetTypeDescriptor<IValueFunctionProxy>())
{
goto ORDERED_FAILED;
}
}
if (type->GetGenericArgumentCount() != parameterSymbols.Count() + 1)
{
goto ORDERED_FAILED;
}
Ptr<ITypeInfo> resultType = type->GetGenericArgument(0);
FOREACH_INDEXER(Ptr<WfLexicalSymbol>, symbol, index, parameterSymbols)
{
symbol->typeInfo = type->GetGenericArgument(index + 1);
symbol->type = GetTypeFromTypeInfo(symbol->typeInfo.Obj());
}
GetExpressionType(manager, node->body, resultType);
}
else
{
auto bodyType = GetExpressionType(manager, node->body, 0);
if (bodyType)
{
auto funcType = MakePtr<TypeDescriptorTypeInfo>(description::GetTypeDescriptor<IValueFunctionProxy>(), TypeInfoHint::Normal);
auto genericType = MakePtr<GenericTypeInfo>(funcType);
genericType->AddGenericArgument(bodyType);
resultType = MakePtr<SharedPtrTypeInfo>(genericType);
}
}
goto ORDERED_FINISHED;
ORDERED_FAILED:
manager->errors.Add(WfErrors::OrderedLambdaCannotImplicitlyConvertToType(node, expectedType.Obj()));
ORDERED_FINISHED:
if (resultType)
{
results.Add(ResolveExpressionResult::ReadonlyType(resultType));
}
}
void Visit(WfMemberExpression* node)override
{
Ptr<ITypeInfo> type = GetExpressionType(manager, node->parent, 0);
if (type)
{
SortedList<ITypeDescriptor*> searchedTypes;
manager->ResolveMember(type->GetTypeDescriptor(), node->name.value, false, searchedTypes, results);
if (results.Count() == 0)
{
manager->errors.Add(WfErrors::MemberNotExists(node, type->GetTypeDescriptor(), node->name.value));
}
}
}
void Visit(WfChildExpression* node)override
{
if (Ptr<WfLexicalScopeName> scopeName = GetExpressionScopeName(manager, node->parent))
{
vint index = scopeName->children.Keys().IndexOf(node->name.value);
if (index != -1)
{
results.Add(ResolveExpressionResult::ScopeName(scopeName->children.Values()[index]));
return;
}
if (scopeName->typeDescriptor)
{
SortedList<ITypeDescriptor*> searchedTypes;
manager->ResolveMember(scopeName->typeDescriptor, node->name.value, true, searchedTypes, results);
if (results.Count() > 0)
{
FOREACH(ResolveExpressionResult, result, results)
{
if (result.methodInfo)
{
if (!result.methodInfo->IsStatic())
{
manager->errors.Add(WfErrors::CannotCallMemberOutsideOfClass(node, result));
}
}
else if (result.propertyInfo)
{
manager->errors.Add(WfErrors::CannotCallMemberOutsideOfClass(node, result));
}
else if (result.eventInfo)
{
manager->errors.Add(WfErrors::CannotCallMemberOutsideOfClass(node, result));
}
}
return;
}
}
if (scopeName->typeDescriptor != nullptr && (scopeName->typeDescriptor->GetTypeDescriptorFlags() & TypeDescriptorFlags::EnumType) != TypeDescriptorFlags::Undefined)
{
manager->errors.Add(WfErrors::EnumItemNotExists(node, scopeName->typeDescriptor, node->name.value));
}
else
{
manager->errors.Add(WfErrors::ChildSymbolNotExists(node, scopeName, node->name.value));
}
}
}
void Visit(WfLiteralExpression* node)override
{
if (node->value == WfLiteralValue::Null)
{
if (!expectedType)
{
manager->errors.Add(WfErrors::NullCannotResolveType(node));
}
else if (!IsNullAcceptableType(expectedType.Obj()))
{
manager->errors.Add(WfErrors::NullCannotImplicitlyConvertToType(node, expectedType.Obj()));
}
results.Add(ResolveExpressionResult::ReadonlyType(expectedType));
}
else
{
results.Add(ResolveExpressionResult::ReadonlyType(TypeInfoRetriver<bool>::CreateTypeInfo()));
}
}
void Visit(WfFloatingExpression* node)override
{
results.Add(ResolveExpressionResult::ReadonlyType(TypeInfoRetriver<double>::CreateTypeInfo()));
}
template<typename T>
bool ValidateInteger(const WString& text, ITypeDescriptor*& resultTd)
{
T value;
if (TypedValueSerializerProvider<T>::Deserialize(text, value))
{
resultTd = description::GetTypeDescriptor<T>();
return true;
}
return false;
}
void Visit(WfIntegerExpression* node)override
{
ITypeDescriptor* typeDescriptor = nullptr;
#ifndef VCZH_64
if (ValidateInteger<vint32_t>(node->value.value, typeDescriptor)) goto TYPE_FINISHED;
if (ValidateInteger<vuint32_t>(node->value.value, typeDescriptor)) goto TYPE_FINISHED;
#endif
if (ValidateInteger<vint64_t>(node->value.value, typeDescriptor)) goto TYPE_FINISHED;
if (ValidateInteger<vuint64_t>(node->value.value, typeDescriptor)) goto TYPE_FINISHED;
manager->errors.Add(WfErrors::IntegerLiteralOutOfRange(node));
typeDescriptor = description::GetTypeDescriptor<vint>();
TYPE_FINISHED:
results.Add(ResolveExpressionResult::ReadonlyType(MakePtr<TypeDescriptorTypeInfo>(typeDescriptor, TypeInfoHint::Normal)));
}
void Visit(WfStringExpression* node)override
{
results.Add(ResolveExpressionResult::ReadonlyType(TypeInfoRetriver<WString>::CreateTypeInfo()));
}
void Visit(WfUnaryExpression* node)override
{
Ptr<ITypeInfo> typeInfo = GetExpressionType(manager, node->operand, 0);
if (typeInfo)
{
TypeFlag flag = GetTypeFlag(typeInfo.Obj());
switch (node->op)
{
case WfUnaryOperator::Not:
switch (flag)
{
case TypeFlag::F4:
case TypeFlag::F8:
case TypeFlag::String:
case TypeFlag::Enum:
case TypeFlag::Struct:
case TypeFlag::Others:
manager->errors.Add(WfErrors::UnaryOperatorOnWrongType(node, typeInfo.Obj()));
break;
default:;
}
break;
case WfUnaryOperator::Positive:
switch (flag)
{
case TypeFlag::Bool:
case TypeFlag::String:
case TypeFlag::Enum:
case TypeFlag::Struct:
case TypeFlag::Others:
manager->errors.Add(WfErrors::UnaryOperatorOnWrongType(node, typeInfo.Obj()));
break;
default:;
}
break;
case WfUnaryOperator::Negative:
switch (flag)
{
case TypeFlag::Bool:
case TypeFlag::U1:
case TypeFlag::U2:
case TypeFlag::U4:
case TypeFlag::U8:
case TypeFlag::String:
case TypeFlag::Enum:
case TypeFlag::Struct:
case TypeFlag::Others:
manager->errors.Add(WfErrors::UnaryOperatorOnWrongType(node, typeInfo.Obj()));
break;
default:;
}
break;
}
results.Add(ResolveExpressionResult::ReadonlyType(typeInfo));
}
}
void Visit(WfBinaryExpression* node)override
{
if (node->op == WfBinaryOperator::Assign)
{
Ptr<ITypeInfo> variableType = GetLeftValueExpressionType(manager, node->first);
GetExpressionType(manager, node->second, variableType);
if (variableType)
{
results.Add(ResolveExpressionResult::ReadonlyType(variableType));
}
}
else if (node->op == WfBinaryOperator::Index)
{
Ptr<ITypeInfo> containerType = GetExpressionType(manager, node->first, 0);
if (containerType)
{
if (containerType->GetDecorator() == ITypeInfo::SharedPtr)
{
ITypeInfo* genericType = containerType->GetElementType();
Ptr<ITypeInfo> indexType;
Ptr<ITypeInfo> resultType;
bool leftValue = false;
if (genericType->GetDecorator() == ITypeInfo::Generic)
{
ITypeInfo* classType = genericType->GetElementType();
if (classType->GetTypeDescriptor() == description::GetTypeDescriptor<IValueReadonlyList>())
{
indexType = TypeInfoRetriver<vint>::CreateTypeInfo();
resultType = CopyTypeInfo(genericType->GetGenericArgument(0));
}
else if (classType->GetTypeDescriptor() == description::GetTypeDescriptor<IValueList>())
{
indexType = TypeInfoRetriver<vint>::CreateTypeInfo();
resultType = CopyTypeInfo(genericType->GetGenericArgument(0));
leftValue = true;
}
else if (classType->GetTypeDescriptor() == description::GetTypeDescriptor<IValueReadonlyDictionary>())
{
indexType = CopyTypeInfo(genericType->GetGenericArgument(0));
resultType = CopyTypeInfo(genericType->GetGenericArgument(1));
}
else if (classType->GetTypeDescriptor() == description::GetTypeDescriptor<IValueDictionary>())
{
indexType = CopyTypeInfo(genericType->GetGenericArgument(0));
resultType = CopyTypeInfo(genericType->GetGenericArgument(1));
leftValue = true;
}
else
{
manager->errors.Add(WfErrors::IndexOperatorOnWrongType(node, containerType.Obj()));
}
}
else
{
if (genericType->GetTypeDescriptor() == description::GetTypeDescriptor<IValueReadonlyList>())
{
indexType = TypeInfoRetriver<vint>::CreateTypeInfo();
resultType = TypeInfoRetriver<Value>::CreateTypeInfo();
}
else if (genericType->GetTypeDescriptor() == description::GetTypeDescriptor<IValueList>())
{
indexType = TypeInfoRetriver<vint>::CreateTypeInfo();
resultType = TypeInfoRetriver<Value>::CreateTypeInfo();
leftValue = true;
}
else if (genericType->GetTypeDescriptor() == description::GetTypeDescriptor<IValueReadonlyDictionary>())
{
indexType = TypeInfoRetriver<Value>::CreateTypeInfo();
resultType = TypeInfoRetriver<Value>::CreateTypeInfo();
}
else if (genericType->GetTypeDescriptor() == description::GetTypeDescriptor<IValueDictionary>())
{
indexType = TypeInfoRetriver<Value>::CreateTypeInfo();
resultType = TypeInfoRetriver<Value>::CreateTypeInfo();
leftValue = true;
}
else
{
manager->errors.Add(WfErrors::IndexOperatorOnWrongType(node, containerType.Obj()));
}
}
GetExpressionType(manager, node->second, indexType);
if (resultType)
{
if (leftValue)
{
results.Add(ResolveExpressionResult::WritableType(resultType));
}
else
{
results.Add(ResolveExpressionResult::ReadonlyType(resultType));
}
}
}
else
{
manager->errors.Add(WfErrors::IndexOperatorOnWrongType(node, containerType.Obj()));
}
}
}
else if (node->op == WfBinaryOperator::Union)
{
auto typeA = GetExpressionType(manager, node->first, expectedType);
auto typeB = GetExpressionType(manager, node->second, expectedType);
if (typeA && typeB)
{
auto stringType = TypeInfoRetriver<WString>::CreateTypeInfo();
if (CanConvertToType(typeA.Obj(), stringType.Obj(), false) && CanConvertToType(typeB.Obj(), stringType.Obj(), false))
{
results.Add(ResolveExpressionResult::ReadonlyType(stringType));
}
else if (auto type = GetMergedType(typeA, typeB))
{
if (type->GetTypeDescriptor()->GetTypeDescriptorFlags() != TypeDescriptorFlags::FlagEnum)
{
manager->errors.Add(WfErrors::IncorrectTypeForUnion(node->first.Obj(), type.Obj()));
}
results.Add(ResolveExpressionResult::ReadonlyType(type));
}
else
{
manager->errors.Add(WfErrors::CannotMergeTwoType(node, typeA.Obj(), typeB.Obj()));
}
}
}
else if (node->op == WfBinaryOperator::Intersect)
{
auto typeA = GetExpressionType(manager, node->first, expectedType);
auto typeB = GetExpressionType(manager, node->second, expectedType);
if (typeA && typeB)
{
if (auto type = GetMergedType(typeA, typeB))
{
if (type->GetTypeDescriptor()->GetTypeDescriptorFlags() != TypeDescriptorFlags::FlagEnum)
{
manager->errors.Add(WfErrors::IncorrectTypeForIntersect(node->first.Obj(), type.Obj()));
}
results.Add(ResolveExpressionResult::ReadonlyType(type));
}
else
{
manager->errors.Add(WfErrors::CannotMergeTwoType(node, typeA.Obj(), typeB.Obj()));
}
}
}
else if (node->op == WfBinaryOperator::FailedThen)
{
Ptr<ITypeInfo> firstType = GetExpressionType(manager, node->first, 0);
bool depend = IsExpressionDependOnExpectedType(manager, node->second);
Ptr<ITypeInfo> secondType = GetExpressionType(manager, node->second, (depend ? firstType : nullptr));
if (firstType && secondType)
{
auto mergedType = GetMergedType(firstType, secondType);
results.Add(ResolveExpressionResult::ReadonlyType(mergedType ? mergedType : firstType));
}
}
else
{
Ptr<ITypeInfo> firstType = GetExpressionType(manager, node->first, 0);
Ptr<ITypeInfo> secondType = GetExpressionType(manager, node->second, 0);
Ptr<ITypeInfo> elementType;
if (firstType && secondType)
{
if (!(elementType = GetMergedType(firstType, secondType)))
{
manager->errors.Add(WfErrors::CannotMergeTwoType(node, firstType.Obj(), secondType.Obj()));
}
}
if (elementType)
{
TypeFlag flag = GetTypeFlag(elementType.Obj());
TypeFlag* selectedTable = 0;
switch (node->op)
{
case WfBinaryOperator::Exp:
{
static TypeFlag conversionTable[(vint)TypeFlag::Count] = {
/*Bool */TypeFlag::Unknown,
/*I1 */TypeFlag::F4,
/*I2 */TypeFlag::F4,
/*I4 */TypeFlag::F8,
/*I8 */TypeFlag::F8,
/*U1 */TypeFlag::F4,
/*U2 */TypeFlag::F4,
/*U4 */TypeFlag::F8,
/*U8 */TypeFlag::F8,
/*F4 */TypeFlag::F4,
/*F8 */TypeFlag::F8,
/*String */TypeFlag::Unknown,
/*Enum */TypeFlag::Unknown,
/*Struct */TypeFlag::Unknown,
/*Others */TypeFlag::Unknown,
};
selectedTable = conversionTable;
}
break;
case WfBinaryOperator::Add:
case WfBinaryOperator::Sub:
case WfBinaryOperator::Mul:
case WfBinaryOperator::Div:
{
static TypeFlag conversionTable[(vint)TypeFlag::Count] = {
/*Bool */TypeFlag::Unknown,
/*I1 */TypeFlag::I,
/*I2 */TypeFlag::I,
/*I4 */TypeFlag::I,
/*I8 */TypeFlag::I8,
/*U1 */TypeFlag::U,
/*U2 */TypeFlag::U,
/*U4 */TypeFlag::U,
/*U8 */TypeFlag::U8,
/*F4 */TypeFlag::F4,
/*F8 */TypeFlag::F8,
/*String */TypeFlag::Unknown,
/*Enum */TypeFlag::Unknown,
/*Struct */TypeFlag::Unknown,
/*Others */TypeFlag::Unknown,
};
selectedTable = conversionTable;
}
break;
case WfBinaryOperator::Mod:
case WfBinaryOperator::Shl:
case WfBinaryOperator::Shr:
{
static TypeFlag conversionTable[(vint)TypeFlag::Count] = {
/*Bool */TypeFlag::Unknown,
/*I1 */TypeFlag::I,
/*I2 */TypeFlag::I,
/*I4 */TypeFlag::I,
/*I8 */TypeFlag::I8,
/*U1 */TypeFlag::U,
/*U2 */TypeFlag::U,
/*U4 */TypeFlag::U,
/*U8 */TypeFlag::U8,
/*F4 */TypeFlag::Unknown,
/*F8 */TypeFlag::Unknown,
/*String */TypeFlag::Unknown,
/*Enum */TypeFlag::Unknown,
/*Struct */TypeFlag::Unknown,
/*Others */TypeFlag::Unknown,
};
selectedTable = conversionTable;
}
break;
case WfBinaryOperator::LT:
case WfBinaryOperator::GT:
case WfBinaryOperator::LE:
case WfBinaryOperator::GE:
{
static TypeFlag conversionTable[(vint)TypeFlag::Count] = {
/*Bool */TypeFlag::Unknown,
/*I1 */TypeFlag::Bool,
/*I2 */TypeFlag::Bool,
/*I4 */TypeFlag::Bool,
/*I8 */TypeFlag::Bool,
/*U1 */TypeFlag::Bool,
/*U2 */TypeFlag::Bool,
/*U4 */TypeFlag::Bool,
/*U8 */TypeFlag::Bool,
/*F4 */TypeFlag::Bool,
/*F8 */TypeFlag::Bool,
/*String */TypeFlag::Bool,
/*Enum */TypeFlag::Unknown,
/*Struct */TypeFlag::Unknown,
/*Others */TypeFlag::Unknown,
};
selectedTable = conversionTable;
}
break;
case WfBinaryOperator::EQ:
case WfBinaryOperator::NE:
{
results.Add(ResolveExpressionResult::ReadonlyType(TypeInfoRetriver<bool>::CreateTypeInfo()));
return;
}
break;
case WfBinaryOperator::Xor:
case WfBinaryOperator::And:
case WfBinaryOperator::Or:
{
static TypeFlag conversionTable[(vint)TypeFlag::Count] = {
/*Bool */TypeFlag::Bool,
/*I1 */TypeFlag::I1,
/*I2 */TypeFlag::I2,
/*I4 */TypeFlag::I4,
/*I8 */TypeFlag::I8,
/*U1 */TypeFlag::U1,
/*U2 */TypeFlag::U2,
/*U4 */TypeFlag::U4,
/*U8 */TypeFlag::U8,
/*F4 */TypeFlag::Unknown,
/*F8 */TypeFlag::Unknown,
/*String */TypeFlag::Unknown,
/*Enum */TypeFlag::Unknown,
/*Struct */TypeFlag::Unknown,
/*Others */TypeFlag::Unknown,
};
selectedTable = conversionTable;
}
break;
default:;
}
TypeFlag resultFlag = selectedTable[(vint)flag];
if (resultFlag == TypeFlag::Unknown)
{
manager->errors.Add(WfErrors::BinaryOperatorOnWrongType(node, elementType.Obj()));
}
else
{
results.Add(ResolveExpressionResult::ReadonlyType(CreateTypeInfoFromTypeFlag(resultFlag)));
}
}
}
}
void Visit(WfLetExpression* node)override
{
auto scope = manager->nodeScopes[node].Obj();
FOREACH(Ptr<WfLetVariable>, variable, node->variables)
{
auto symbol = scope->symbols[variable->name.value][0];
symbol->typeInfo = GetExpressionType(manager, variable->value, 0);
if (symbol->typeInfo)
{
symbol->type = GetTypeFromTypeInfo(symbol->typeInfo.Obj());
}
}
Ptr<ITypeInfo> type = GetExpressionType(manager, node->expression, expectedType);
if (type)
{
results.Add(ResolveExpressionResult::ReadonlyType(type));
}
}
void Visit(WfIfExpression* node)override
{
Ptr<ITypeInfo> boolType = TypeInfoRetriver<bool>::CreateTypeInfo();
GetExpressionType(manager, node->condition, boolType);
Ptr<ITypeInfo> firstType, secondType;
if (expectedType)
{
firstType = GetExpressionType(manager, node->trueBranch, expectedType);
secondType = GetExpressionType(manager, node->falseBranch, expectedType);
}
else
{
bool resolveFirst = !IsExpressionDependOnExpectedType(manager, node->trueBranch);
bool resolveSecond = !IsExpressionDependOnExpectedType(manager, node->falseBranch);
if (resolveFirst == resolveSecond)
{
firstType = GetExpressionType(manager, node->trueBranch, 0);
secondType = GetExpressionType(manager, node->falseBranch, 0);
}
else if (resolveFirst)
{
firstType = GetExpressionType(manager, node->trueBranch, 0);
secondType = GetExpressionType(manager, node->falseBranch, firstType);
}
else if (resolveSecond)
{
secondType = GetExpressionType(manager, node->falseBranch, 0);
firstType = GetExpressionType(manager, node->trueBranch, secondType);
}
}
if (firstType && !secondType)
{
results.Add(ResolveExpressionResult::ReadonlyType(firstType));
}
else if (!firstType && secondType)
{
results.Add(ResolveExpressionResult::ReadonlyType(secondType));
}
else if (firstType && secondType)
{
if (auto mergedType = GetMergedType(firstType, secondType))
{
results.Add(ResolveExpressionResult::ReadonlyType(mergedType));
}
else
{
manager->errors.Add(WfErrors::CannotMergeTwoType(node, firstType.Obj(), secondType.Obj()));
}
}
}
void Visit(WfRangeExpression* node)override
{
Ptr<ITypeInfo> firstType = GetExpressionType(manager, node->begin, 0);
Ptr<ITypeInfo> secondType = GetExpressionType(manager, node->end, 0);
Ptr<ITypeInfo> elementType;
if (firstType && !secondType)
{
elementType = firstType;
}
else if (!firstType && secondType)
{
elementType = secondType;
}
else if (firstType && secondType)
{
if (!(elementType = GetMergedType(firstType, secondType)))
{
manager->errors.Add(WfErrors::CannotMergeTwoType(node, firstType.Obj(), secondType.Obj()));
}
}
if (elementType)
{
TypeFlag flag = GetTypeFlag(elementType.Obj());
switch (flag)
{
case TypeFlag::I1:
case TypeFlag::I2:
case TypeFlag::I4:
case TypeFlag::I8:
case TypeFlag::U1:
case TypeFlag::U2:
case TypeFlag::U4:
case TypeFlag::U8:
break;
default:
manager->errors.Add(WfErrors::RangeShouldBeInteger(node, elementType.Obj()));
}
auto enumerableType = MakePtr<TypeDescriptorTypeInfo>(description::GetTypeDescriptor<IValueEnumerable>(), TypeInfoHint::Normal);
auto genericType = MakePtr<GenericTypeInfo>(enumerableType);
genericType->AddGenericArgument(elementType);
auto pointerType = MakePtr<SharedPtrTypeInfo>(genericType);
results.Add(ResolveExpressionResult::ReadonlyType(pointerType));
}
}
void Visit(WfSetTestingExpression* node)override
{
Ptr<ITypeInfo> elementType = GetExpressionType(manager, node->element, 0);
if (auto range = node->collection.Cast<WfRangeExpression>())
{
Ptr<ITypeInfo> beginType = GetExpressionType(manager, range->begin, 0);
Ptr<ITypeInfo> endType = GetExpressionType(manager, range->end, 0);
if (elementType && beginType)
{
if (!GetMergedType(elementType, beginType))
{
manager->errors.Add(WfErrors::CannotMergeTwoType(node, elementType.Obj(), beginType.Obj()));
}
}
if (elementType && endType)
{
if (!GetMergedType(elementType, endType))
{
manager->errors.Add(WfErrors::CannotMergeTwoType(node, elementType.Obj(), endType.Obj()));
}
}
}
else
{
Ptr<ITypeInfo> itemType = GetEnumerableExpressionItemType(manager, node->collection, 0);
if (elementType && itemType)
{
if (!GetMergedType(elementType, itemType))
{
manager->errors.Add(WfErrors::CannotMergeTwoType(node, elementType.Obj(), itemType.Obj()));
}
}
}
results.Add(ResolveExpressionResult::ReadonlyType(TypeInfoRetriver<bool>::CreateTypeInfo()));
}
void Visit(WfConstructorExpression* node)override
{
if (expectedType && expectedType->GetTypeDescriptor()->GetTypeDescriptorFlags() == TypeDescriptorFlags::Struct)
{
SortedList<WString> fields;
FOREACH(Ptr<WfConstructorArgument>, argument, node->arguments)
{
if (!argument->value)
{
manager->errors.Add(WfErrors::ConstructorMixStructAndList(node));
return;
}
else if (auto field = argument->key.Cast<WfReferenceExpression>())
{
if (auto prop = expectedType->GetTypeDescriptor()->GetPropertyByName(field->name.value, true))
{
if (fields.Contains(field->name.value))
{
manager->errors.Add(WfErrors::DuplicatedConstructorField(field.Obj()));
}
else
{
fields.Add(field->name.value);
}
GetExpressionType(manager, argument->value, CopyTypeInfo(prop->GetReturn()));
}
else
{
manager->errors.Add(WfErrors::MemberNotExists(field.Obj(), expectedType->GetTypeDescriptor(), field->name.value));
}
}
else
{
manager->errors.Add(WfErrors::ConstructorMixStructAndList(argument->value.Obj()));
}
}
results.Add(ResolveExpressionResult::ReadonlyType(expectedType));
}
else if (node->arguments.Count() == 0)
{
if (expectedType)
{
ITypeDescriptor* td = expectedType->GetTypeDescriptor();
if (!td->CanConvertTo(description::GetTypeDescriptor<IValueEnumerable>()) && !td->CanConvertTo(description::GetTypeDescriptor<IValueReadonlyDictionary>()))
{
manager->errors.Add(WfErrors::ConstructorCannotImplicitlyConvertToType(node, expectedType.Obj()));
}
results.Add(ResolveExpressionResult::ReadonlyType(expectedType));
}
else
{
manager->errors.Add(WfErrors::ConstructorCannotResolveType(node));
}
}
else
{
bool map = node->arguments[0]->value;
Ptr<ITypeInfo> keyType, valueType;
FOREACH(Ptr<WfConstructorArgument>, argument, node->arguments)
{
{
Ptr<ITypeInfo> newKeyType = GetExpressionType(manager, argument->key, 0);
if (!keyType)
{
keyType = newKeyType;
}
else if (auto mergedType = GetMergedType(keyType, newKeyType))
{
keyType = mergedType;
}
else
{
manager->errors.Add(WfErrors::CannotMergeTwoType(node, keyType.Obj(), newKeyType.Obj()));
}
}
if (map)
{
Ptr<ITypeInfo> newValueType = GetExpressionType(manager, argument->value, 0);
if (!valueType)
{
valueType = newValueType;
}
else if (auto mergedType = GetMergedType(valueType, newValueType))
{
valueType = mergedType;
}
else
{
manager->errors.Add(WfErrors::CannotMergeTwoType(node, valueType.Obj(), newValueType.Obj()));
}
}
}
if (map)
{
if (keyType && valueType)
{
auto classType = MakePtr<TypeDescriptorTypeInfo>(description::GetTypeDescriptor<IValueDictionary>(), TypeInfoHint::Normal);
auto genericType = MakePtr<GenericTypeInfo>(classType);
genericType->AddGenericArgument(keyType);
genericType->AddGenericArgument(valueType);
auto pointerType = MakePtr<SharedPtrTypeInfo>(genericType);
results.Add(ResolveExpressionResult::ReadonlyType(pointerType));
}
}
else
{
if (keyType)
{
auto classType = MakePtr<TypeDescriptorTypeInfo>(description::GetTypeDescriptor<IValueList>(), TypeInfoHint::Normal);
auto genericType = MakePtr<GenericTypeInfo>(classType);
genericType->AddGenericArgument(keyType);
auto pointerType = MakePtr<SharedPtrTypeInfo>(genericType);
results.Add(ResolveExpressionResult::ReadonlyType(pointerType));
}
}
}
}
void Visit(WfInferExpression* node)override
{
auto scope = manager->nodeScopes[node].Obj();
Ptr<ITypeInfo> type = CreateTypeInfoFromType(scope, node->type);
Ptr<ITypeInfo> expressionType = GetExpressionType(manager, node->expression, type);
if (expressionType)
{
results.Add(ResolveExpressionResult::ReadonlyType(type));
}
}
void Visit(WfTypeCastingExpression* node)override
{
auto scope = manager->nodeScopes[node].Obj();
if (auto type = CreateTypeInfoFromType(scope, node->type))
{
if (auto expressionType = GetExpressionType(manager, node->expression, 0))
{
if (!CanConvertToType(expressionType.Obj(), type.Obj(), true))
{
manager->errors.Add(WfErrors::ExpressionCannotExplicitlyConvertToType(node->expression.Obj(), expressionType.Obj(), type.Obj()));
}
}
if (node->strategy == WfTypeCastingStrategy::Weak)
{
switch (type->GetDecorator())
{
case ITypeInfo::RawPtr:
case ITypeInfo::SharedPtr:
case ITypeInfo::Nullable:
break;
default:
manager->errors.Add(WfErrors::CannotWeakCastToType(node->expression.Obj(), type.Obj()));
}
}
results.Add(ResolveExpressionResult::ReadonlyType(type));
}
}
void Visit(WfTypeTestingExpression* node)override
{
Ptr<ITypeInfo> type = GetExpressionType(manager, node->expression, 0);
if (type)
{
switch (node->test)
{
case WfTypeTesting::IsNull:
case WfTypeTesting::IsNotNull:
if (!IsNullAcceptableType(type.Obj()))
{
manager->errors.Add(WfErrors::NullCannotImplicitlyConvertToType(node->expression.Obj(), type.Obj()));
}
break;
default:;
}
}
results.Add(ResolveExpressionResult::ReadonlyType(TypeInfoRetriver<bool>::CreateTypeInfo()));
}
void Visit(WfTypeOfTypeExpression* node)override
{
results.Add(ResolveExpressionResult::ReadonlyType(TypeInfoRetriver<ITypeDescriptor*>::CreateTypeInfo()));
}
void Visit(WfTypeOfExpressionExpression* node)override
{
GetExpressionType(manager, node->expression, 0);
results.Add(ResolveExpressionResult::ReadonlyType(TypeInfoRetriver<ITypeDescriptor*>::CreateTypeInfo()));
}
void Visit(WfAttachEventExpression* node)override
{
IEventInfo* eventInfo = GetExpressionEventInfo(manager, node->event);
Ptr<ITypeInfo> functionType;
if (eventInfo)
{
functionType = CopyTypeInfo(eventInfo->GetHandlerType());
}
GetExpressionType(manager, node->function, functionType);
results.Add(ResolveExpressionResult::ReadonlyType(TypeInfoRetriver<Ptr<IEventHandler>>::CreateTypeInfo()));
}
void Visit(WfDetachEventExpression* node)override
{
GetExpressionEventInfo(manager, node->event);
Ptr<ITypeInfo> pointerType = TypeInfoRetriver<Ptr<IEventHandler>>::CreateTypeInfo();
GetExpressionType(manager, node->handler, pointerType);
results.Add(ResolveExpressionResult::ReadonlyType(TypeInfoRetriver<bool>::CreateTypeInfo()));
}
void Visit(WfObserveExpression* node)override
{
Ptr<ITypeInfo> parentType = GetExpressionType(manager, node->parent, 0);
Ptr<ITypeInfo> observeeType;
if (parentType)
{
if (node->observeType == WfObserveType::SimpleObserve)
{
ITypeDescriptor* td = parentType->GetTypeDescriptor();
IPropertyInfo* propertyInfo = 0;
{
auto ref = node->expression.Cast<WfReferenceExpression>();
propertyInfo = td->GetPropertyByName(ref->name.value, true);
if (propertyInfo)
{
observeeType = CopyTypeInfo(propertyInfo->GetReturn());
}
else
{
manager->errors.Add(WfErrors::MemberNotExists(ref.Obj(), td, ref->name.value));
}
}
if (node->events.Count() == 0)
{
if (propertyInfo)
{
IEventInfo* eventInfo = propertyInfo->GetValueChangedEvent();
if (!eventInfo)
{
eventInfo = td->GetEventByName(propertyInfo->GetName() + L"Changed", true);
}
if (!eventInfo)
{
manager->errors.Add(WfErrors::MemberNotExists(node->expression.Obj(), td, propertyInfo->GetName() + L"Changed"));
}
}
}
else
{
FOREACH(Ptr<WfExpression>, eventExpr, node->events)
{
auto ref = eventExpr.Cast<WfReferenceExpression>();
IEventInfo* info = td->GetEventByName(ref->name.value, true);
if (!info)
{
manager->errors.Add(WfErrors::MemberNotExists(ref.Obj(), td, ref->name.value));
}
}
}
}
else
{
auto scope = manager->nodeScopes[node].Obj();
auto symbol = scope->symbols[node->name.value][0];
symbol->typeInfo = parentType;
symbol->type = GetTypeFromTypeInfo(parentType.Obj());
observeeType = GetExpressionType(manager, node->expression, 0);
FOREACH(Ptr<WfExpression>, eventExpr, node->events)
{
GetExpressionEventInfo(manager, eventExpr);
}
}
}
if (observeeType)
{
results.Add(ResolveExpressionResult::ReadonlyType(observeeType));
}
}
void Visit(WfCallExpression* node)override
{
List<ResolveExpressionResult> functions;
GetExpressionTypes(manager, node->function, nullptr, true, functions);
vint selectedFunctionIndex = -1;
Ptr<ITypeInfo> resultType = SelectFunction(manager, node, node->function, functions, node->arguments, selectedFunctionIndex);
if (resultType)
{
manager->expressionResolvings.Add(node->function, functions[selectedFunctionIndex]);
results.Add(ResolveExpressionResult::ReadonlyType(resultType));
}
}
void Visit(WfFunctionExpression* node)override
{
ValidateDeclarationSemantic(manager, node->function);
auto scope = manager->nodeScopes[node->function.Obj()].Obj();
auto classType = MakePtr<TypeDescriptorTypeInfo>(description::GetTypeDescriptor<IValueFunctionProxy>(), TypeInfoHint::Normal);
auto genericType = MakePtr<GenericTypeInfo>(classType);
genericType->AddGenericArgument(CreateTypeInfoFromType(scope, node->function->returnType));
FOREACH(Ptr<WfFunctionArgument>, argument, node->function->arguments)
{
genericType->AddGenericArgument(scope->symbols[argument->name.value][0]->typeInfo);
}
auto pointerType = MakePtr<SharedPtrTypeInfo>(genericType);
results.Add(ResolveExpressionResult::ReadonlyType(pointerType));
}
Ptr<ITypeInfo> GetFunctionDeclarationType(WfLexicalScope* scope, Ptr<WfFunctionDeclaration> decl)
{
Ptr<WfLexicalSymbol> symbol = From(manager->nodeScopes[decl.Obj()]->parentScope->symbols[decl->name.value])
.Where([decl](Ptr<WfLexicalSymbol> symbol)
{
return symbol->creatorNode == decl;
})
.First();
return symbol->typeInfo;
}
class NewInterfaceExpressionVisitor : public empty_visitor::DeclarationVisitor
{
public:
WfLexicalScopeManager* manager;
List<Ptr<WfFunctionDeclaration>> overrideFunctions;
List<Ptr<WfLexicalSymbol>> variableSymbols;
WfFunctionDeclaration* lastFunction = nullptr;
NewInterfaceExpressionVisitor(WfLexicalScopeManager* _manager)
:manager(_manager)
{
}
void Dispatch(WfVirtualDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, decl, node->expandedDeclarations)
{
decl->Accept(this);
}
}
void Visit(WfFunctionDeclaration* node)override
{
lastFunction = node;
if (node->classMember->kind == WfClassMemberKind::Override)
{
overrideFunctions.Add(node);
}
}
void Visit(WfVariableDeclaration* node)override
{
variableSymbols.Add(
From(manager->nodeScopes[node]->symbols[node->name.value])
.Where([=](Ptr<WfLexicalSymbol> symbol)
{
return symbol->creatorNode == node;
})
.First()
);
}
void Execute(WfNewInterfaceExpression* node)
{
FOREACH(Ptr<WfDeclaration>, memberDecl, node->declarations)
{
memberDecl->Accept(this);
ValidateDeclarationSemantic(manager, memberDecl);
}
}
};
void Visit(WfNewClassExpression* node)override
{
auto scope = manager->nodeScopes[node].Obj();
Ptr<ITypeInfo> type = CreateTypeInfoFromType(scope, node->type);
if (type)
{
ITypeDescriptor* td = type->GetTypeDescriptor();
IMethodGroupInfo* ctors = td->GetConstructorGroup();
Ptr<ITypeInfo> selectedType;
IMethodInfo* selectedConstructor = nullptr;
if (!ctors || ctors->GetMethodCount() == 0)
{
manager->errors.Add(WfErrors::ClassContainsNoConstructor(node, type.Obj()));
}
else
{
if ((td->GetTypeDescriptorFlags() & TypeDescriptorFlags::ClassType) != TypeDescriptorFlags::Undefined)
{
List<ResolveExpressionResult> functions;
for (vint i = 0; i < ctors->GetMethodCount(); i++)
{
IMethodInfo* info = ctors->GetMethod(i);
functions.Add(ResolveExpressionResult::Method(info));
}
vint selectedFunctionIndex = -1;
selectedType = SelectFunction(manager, node, nullptr, functions, node->arguments, selectedFunctionIndex);
if (selectedType)
{
selectedConstructor = functions[selectedFunctionIndex].methodInfo;
}
}
else if ((td->GetTypeDescriptorFlags() & TypeDescriptorFlags::InterfaceType) != TypeDescriptorFlags::Undefined)
{
manager->errors.Add(WfErrors::ConstructorMixClassAndInterface(node));
}
else
{
manager->errors.Add(WfErrors::ClassContainsNoConstructor(node, type.Obj()));
}
}
if (selectedType)
{
auto result = ResolveExpressionResult::Constructor(selectedConstructor);
if (!IsSameType(selectedType.Obj(), type.Obj()))
{
manager->errors.Add(WfErrors::ConstructorReturnTypeMismatched(node, result, selectedType.Obj(), type.Obj()));
}
results.Add(result);
}
}
}
void Visit(WfNewInterfaceExpression* node)override
{
auto scope = manager->nodeScopes[node].Obj();
Ptr<ITypeInfo> type = CreateTypeInfoFromType(scope, node->type);
if (type)
{
ITypeDescriptor* td = type->GetTypeDescriptor();
IMethodGroupInfo* ctors = td->GetConstructorGroup();
Ptr<ITypeInfo> selectedType;
IMethodInfo* selectedConstructor = nullptr;
scope->typeOfThisExpr = td;
if (!ctors || ctors->GetMethodCount() == 0)
{
manager->errors.Add(WfErrors::ClassContainsNoConstructor(node, type.Obj()));
}
else
{
if ((td->GetTypeDescriptorFlags() & TypeDescriptorFlags::ClassType) != TypeDescriptorFlags::Undefined)
{
manager->errors.Add(WfErrors::ConstructorMixClassAndInterface(node));
}
else if ((td->GetTypeDescriptorFlags() & TypeDescriptorFlags::InterfaceType) != TypeDescriptorFlags::Undefined)
{
if (auto info = FindInterfaceConstructor(td))
{
selectedType = CopyTypeInfo(info->GetReturn());
selectedConstructor = info;
}
else
{
manager->errors.Add(WfErrors::InterfaceContainsNoConstructor(node, type.Obj()));
}
Group<WString, IMethodInfo*> interfaceMethods;
Group<WString, Ptr<WfFunctionDeclaration>> implementMethods;
{
NewInterfaceExpressionVisitor declVisitor(manager);
declVisitor.Execute(node);
if (declVisitor.lastFunction)
{
FOREACH(Ptr<WfFunctionDeclaration>, func, declVisitor.overrideFunctions)
{
implementMethods.Add(func->name.value, func);
}
auto capture = manager->lambdaCaptures[declVisitor.lastFunction];
List<Ptr<WfLexicalSymbol>> readonlySymbols;
CopyFrom(readonlySymbols, From(capture->symbols).Except(declVisitor.variableSymbols));
CopyFrom(capture->symbols, declVisitor.variableSymbols);
CopyFrom(capture->symbols, readonlySymbols, true);
}
}
{
SortedList<ITypeDescriptor*> searchedTypes;
List<ITypeDescriptor*> types;
types.Add(td);
vint begin = 0;
while (begin < types.Count())
{
ITypeDescriptor* currentType = types[begin++];
if (searchedTypes.Contains(currentType))
{
continue;
}
searchedTypes.Add(currentType);
vint count = currentType->GetBaseTypeDescriptorCount();
for (vint i = 0; i < count; i++)
{
types.Add(currentType->GetBaseTypeDescriptor(i));
}
count = currentType->GetMethodGroupCount();
for (vint i = 0; i < count; i++)
{
IMethodGroupInfo* group = currentType->GetMethodGroup(i);
vint methodCount = group->GetMethodCount();
for (vint j = 0; j < methodCount; j++)
{
auto method = group->GetMethod(j);
if (!method->IsStatic())
{
interfaceMethods.Add(group->GetName(), method);
}
}
}
}
}
auto discardFirst = [=](const WString& key, const List<IMethodInfo*>& methods)
{
FOREACH(IMethodInfo*, method, methods)
{
manager->errors.Add(WfErrors::InterfaceMethodNotImplemented(node, method));
}
};
auto discardSecond = [=](const WString& key, const List<Ptr<WfFunctionDeclaration>>& methods)
{
FOREACH(Ptr<WfFunctionDeclaration>, decl, methods)
{
Ptr<ITypeInfo> declType = GetFunctionDeclarationType(scope, decl);
manager->errors.Add(WfErrors::InterfaceMethodNotFound(decl.Obj(), type.Obj(), declType.Obj()));
}
};
GroupInnerJoin(
interfaceMethods,
implementMethods,
discardFirst,
discardSecond,
[=](const WString& key, const List<IMethodInfo*>& interfaces, const List<Ptr<WfFunctionDeclaration>>& implements)
{
Group<WString, IMethodInfo*> typedInterfaceMethods;
Group<WString, Ptr<WfFunctionDeclaration>> typedImplementMethods;
FOREACH(IMethodInfo*, method, interfaces)
{
Ptr<ITypeInfo> methodType = CreateTypeInfoFromMethodInfo(method);
typedInterfaceMethods.Add(methodType->GetTypeFriendlyName(), method);
}
FOREACH(Ptr<WfFunctionDeclaration>, decl, implements)
{
Ptr<ITypeInfo> methodType = GetFunctionDeclarationType(scope, decl);
typedImplementMethods.Add(methodType->GetTypeFriendlyName(), decl);
}
GroupInnerJoin(
typedInterfaceMethods,
typedImplementMethods,
discardFirst,
discardSecond,
[=](const WString& key, const List<IMethodInfo*>& interfaces, const List<Ptr<WfFunctionDeclaration>>& implements)
{
if (interfaces.Count() > 1)
{
List<ResolveExpressionResult> functions;
FOREACH(IMethodInfo*, method, interfaces)
{
functions.Add(ResolveExpressionResult::Constructor(method));
manager->errors.Add(WfErrors::CannotPickOverloadedInterfaceMethods(node, functions));
}
}
if (implements.Count() > 1)
{
auto decl = implements[0];
Ptr<ITypeInfo> methodType = GetFunctionDeclarationType(scope, decl);
manager->errors.Add(WfErrors::CannotPickOverloadedImplementMethods(decl.Obj(), methodType.Obj()));
}
if (interfaces.Count() == 1 && implements.Count() == 1)
{
manager->interfaceMethodImpls.Add(implements[0].Obj(), interfaces[0]);
}
});
});
}
else
{
manager->errors.Add(WfErrors::ClassContainsNoConstructor(node, type.Obj()));
}
}
if (selectedType)
{
auto result = ResolveExpressionResult::Constructor(selectedConstructor);
if (!IsSameType(selectedType.Obj(), type.Obj()))
{
manager->errors.Add(WfErrors::ConstructorReturnTypeMismatched(node, result, selectedType.Obj(), type.Obj()));
}
results.Add(result);
}
}
}
void Visit(WfVirtualExpression* node)override
{
bool expanded = node->expandedExpression;
vint errorCount = manager->errors.Count();
node->Accept((WfVirtualExpression::IVisitor*)this);
if (!expanded && manager->errors.Count() == errorCount)
{
ExpandVirtualExpressionVisitor visitor(manager);
node->Accept(&visitor);
SetCodeRange(node->expandedExpression, node->codeRange);
auto parentScope = manager->nodeScopes[node];
if (parentScope->ownerNode == node)
{
parentScope = parentScope->parentScope;
}
ContextFreeExpressionDesugar(manager, node->expandedExpression);
BuildScopeForExpression(manager, parentScope, node->expandedExpression);
if (!CheckScopes_DuplicatedSymbol(manager) || !CheckScopes_SymbolType(manager))
{
return;
}
}
if (node->expandedExpression)
{
if (results.Count() == 1)
{
GetExpressionType(manager, node->expandedExpression, results[0].type);
}
else
{
GetExpressionType(manager, node->expandedExpression, nullptr);
}
}
}
void Visit(WfBindExpression* node)override
{
GetExpressionType(manager, node->expression, 0);
results.Add(ResolveExpressionResult::ReadonlyType(TypeInfoRetriver<Ptr<IValueSubscription>>::CreateTypeInfo()));
}
void Visit(WfFormatExpression* node)override
{
Ptr<ITypeInfo> typeInfo = TypeInfoRetriver<WString>::CreateTypeInfo();
results.Add(ResolveExpressionResult::ReadonlyType(typeInfo));
}
void Visit(WfNewCoroutineExpression* node)override
{
Ptr<ITypeInfo> typeInfo = TypeInfoRetriver<Ptr<ICoroutine>>::CreateTypeInfo();
results.Add(ResolveExpressionResult::ReadonlyType(typeInfo));
ValidateStatementSemantic(manager, node->statement);
}
void Visit(WfMixinCastExpression* node)override
{
auto scope = manager->nodeScopes[node].Obj();
auto type = CreateTypeInfoFromType(scope, node->type);
auto expressionType = GetExpressionType(manager, node->expression, 0);
if (type && expressionType)
{
results.Add(ResolveExpressionResult::ReadonlyType(type));
if (expressionType)
{
auto fromTd = expressionType->GetTypeDescriptor();
auto toTd = type->GetTypeDescriptor();
if ((fromTd->GetTypeDescriptorFlags() & TypeDescriptorFlags::InterfaceType) != TypeDescriptorFlags::Undefined)
{
if ((toTd->GetTypeDescriptorFlags() & TypeDescriptorFlags::InterfaceType) != TypeDescriptorFlags::Undefined)
{
if (fromTd != toTd && toTd->CanConvertTo(fromTd))
{
goto PASS_VALIDATION;
}
}
}
manager->errors.Add(WfErrors::WrongMixinTargetType(node, expressionType.Obj(), type.Obj()));
PASS_VALIDATION:;
}
}
}
static void Execute(Ptr<WfExpression> expression, WfLexicalScopeManager* manager, Ptr<ITypeInfo> expectedType, List<ResolveExpressionResult>& results)
{
ValidateSemanticExpressionVisitor visitor(manager, expectedType, results);
expression->Accept(&visitor);
}
};
/***********************************************************************
IsConstantExpression
***********************************************************************/
class ValidateConstantExpressionVisitor
: public Object
, public WfExpression::IVisitor
{
public:
WfLexicalScopeManager* manager;
bool isConstant = false;
ValidateConstantExpressionVisitor(WfLexicalScopeManager* _manager)
:manager(_manager)
{
}
bool Call(Ptr<WfExpression> node)
{
bool cache = isConstant;
isConstant = false;
node->Accept(this);
bool result = isConstant;
isConstant = cache;
return result;
}
void VisitReferenceExpression(WfExpression* node, const WString& name)
{
auto result = manager->expressionResolvings[node];
if (auto enumType = result.type->GetTypeDescriptor()->GetEnumType())
{
vint index = enumType->IndexOfItem(name);
if (index != -1)
{
isConstant = true;
}
}
}
void Visit(WfThisExpression* node)override
{
}
void Visit(WfTopQualifiedExpression* node)override
{
}
void Visit(WfReferenceExpression* node)override
{
VisitReferenceExpression(node, node->name.value);
}
void Visit(WfOrderedNameExpression* node)override
{
}
void Visit(WfOrderedLambdaExpression* node)override
{
}
void Visit(WfMemberExpression* node)override
{
}
void Visit(WfChildExpression* node)override
{
VisitReferenceExpression(node, node->name.value);
}
void Visit(WfLiteralExpression* node)override
{
isConstant = true;
}
void Visit(WfFloatingExpression* node)override
{
isConstant = true;
}
void Visit(WfIntegerExpression* node)override
{
isConstant = true;
}
void Visit(WfStringExpression* node)override
{
isConstant = true;
}
void Visit(WfUnaryExpression* node)override
{
isConstant = Call(node->operand);
}
void Visit(WfBinaryExpression* node)override
{
if (node->op == WfBinaryOperator::Intersect)
{
isConstant = Call(node->first) && Call(node->second);
}
}
void Visit(WfLetExpression* node)override
{
}
void Visit(WfIfExpression* node)override
{
}
void Visit(WfRangeExpression* node)override
{
isConstant = Call(node->begin) && Call(node->end);
}
void Visit(WfSetTestingExpression* node)override
{
}
void Visit(WfConstructorExpression* node)override
{
auto result = manager->expressionResolvings[node];
bool isStruct = (result.type->GetTypeDescriptor()->GetTypeDescriptorFlags() == TypeDescriptorFlags::Struct);
FOREACH(Ptr<WfConstructorArgument>, argument, node->arguments)
{
if (argument->key && !isStruct)
{
if (!Call(argument->key)) return;
}
if (argument->value)
{
if (!Call(argument->value)) return;
}
}
isConstant = true;
}
void Visit(WfInferExpression* node)override
{
}
void Visit(WfTypeCastingExpression* node)override
{
}
void Visit(WfTypeTestingExpression* node)override
{
}
void Visit(WfTypeOfTypeExpression* node)override
{
isConstant = true;
}
void Visit(WfTypeOfExpressionExpression* node)override
{
isConstant = true;
}
void Visit(WfAttachEventExpression* node)override
{
}
void Visit(WfDetachEventExpression* node)override
{
}
void Visit(WfObserveExpression* node)override
{
}
void Visit(WfCallExpression* node)override
{
}
void Visit(WfFunctionExpression* node)override
{
}
void Visit(WfNewClassExpression* node)override
{
}
void Visit(WfNewInterfaceExpression* node)override
{
}
void Visit(WfVirtualExpression* node)override
{
if (node->expandedExpression)
{
isConstant = Call(node->expandedExpression);
}
}
static void Execute(Ptr<WfExpression> expression, WfLexicalScopeManager* manager, Ptr<ITypeInfo> expectedType)
{
if (GetExpressionType(manager, expression, expectedType))
{
ValidateConstantExpressionVisitor visitor(manager);
expression->Accept(&visitor);
if (!visitor.isConstant)
{
manager->errors.Add(WfErrors::ExpressionIsNotConstant(expression.Obj()));
}
}
}
};
/***********************************************************************
ValidateSemantic
***********************************************************************/
void ValidateModuleSemantic(WfLexicalScopeManager* manager, Ptr<WfModule> module)
{
FOREACH(Ptr<WfDeclaration>, declaration, module->declarations)
{
ValidateDeclarationSemantic(manager, declaration);
}
}
void ValidateClassMemberSemantic(WfLexicalScopeManager* manager, Ptr<typeimpl::WfCustomType> td, Ptr<WfClassDeclaration> classDecl, Ptr<WfDeclaration> memberDecl)
{
return ValidateSemanticClassMemberVisitor::Execute(td, classDecl, memberDecl, manager);
}
void ValidateDeclarationSemantic(WfLexicalScopeManager* manager, Ptr<WfDeclaration> declaration)
{
return ValidateSemanticDeclarationVisitor::Execute(declaration, manager);
}
void ValidateStatementSemantic(WfLexicalScopeManager* manager, Ptr<WfStatement> statement)
{
return ValidateSemanticStatementVisitor::Execute(statement, manager);
}
void ValidateExpressionSemantic(WfLexicalScopeManager* manager, Ptr<WfExpression> expression, Ptr<reflection::description::ITypeInfo> expectedType, collections::List<ResolveExpressionResult>& results)
{
ValidateSemanticExpressionVisitor::Execute(expression, manager, expectedType, results);
for (vint i = results.Count() - 1; i >= 0; i--)
{
auto result = results[i];
if (result.scopeName && result.scopeName->declarations.Count() > 0)
{
List<ResolveExpressionResult> replaces;
FOREACH(Ptr<WfDeclaration>, decl, result.scopeName->declarations)
{
vint index = manager->nodeScopes.Keys().IndexOf(decl.Obj());
if (index == -1) continue;
auto scope = manager->nodeScopes.Values()[index];
if (scope->ownerNode == decl)
{
scope = scope->parentScope;
}
index = scope->symbols.Keys().IndexOf(decl->name.value);
if (index == -1) continue;
FOREACH(Ptr<WfLexicalSymbol>, symbol, scope->symbols.GetByIndex(index))
{
if (symbol->creatorNode == decl && symbol->typeInfo)
{
replaces.Add(ResolveExpressionResult::Symbol(symbol));
}
}
}
if (replaces.Count() > 0)
{
results.RemoveAt(i);
FOREACH_INDEXER(ResolveExpressionResult, replaceResult, index, replaces)
{
results.Insert(i + index, replaceResult);
}
}
}
}
}
void ValidateConstantExpression(WfLexicalScopeManager* manager, Ptr<WfExpression> expression, Ptr<reflection::description::ITypeInfo> expectedType)
{
ValidateConstantExpressionVisitor::Execute(expression, manager, expectedType);
}
/***********************************************************************
GetExpressionScopeName
***********************************************************************/
Ptr<WfLexicalScopeName> GetExpressionScopeName(WfLexicalScopeManager* manager, Ptr<WfExpression> expression)
{
List<ResolveExpressionResult> results;
ValidateExpressionSemantic(manager, expression, 0, results);
if (results.Count() == 0) return 0;
for (vint i = results.Count() - 1; i >= 0; i--)
{
auto& result = results[i];
if (!result.scopeName)
{
results.RemoveAt(i);
}
}
if (results.Count() == 0)
{
manager->errors.Add(WfErrors::ExpressionIsNotScopeName(expression.Obj()));
return 0;
}
else if (results.Count() > 1)
{
manager->errors.Add(WfErrors::TooManyTargets(expression.Obj(), results, GetExpressionName(expression)));
return 0;
}
auto result = results[0];
manager->expressionResolvings.Add(expression, result);
return result.scopeName;
}
/***********************************************************************
GetExpressionEventInfo
***********************************************************************/
reflection::description::IEventInfo* GetExpressionEventInfo(WfLexicalScopeManager* manager, Ptr<WfExpression> expression)
{
List<ResolveExpressionResult> results;
ValidateExpressionSemantic(manager, expression, 0, results);
if (results.Count() == 0) return 0;
for (vint i = results.Count() - 1; i >= 0; i--)
{
auto& result = results[i];
if (!result.eventInfo)
{
results.RemoveAt(i);
}
}
if (results.Count() == 0)
{
manager->errors.Add(WfErrors::ExpressionIsNotEvent(expression.Obj()));
return 0;
}
else if (results.Count() > 1)
{
manager->errors.Add(WfErrors::TooManyTargets(expression.Obj(), results, GetExpressionName(expression)));
return 0;
}
auto result = results[0];
manager->expressionResolvings.Add(expression, result);
return result.eventInfo;
}
/***********************************************************************
GetExpressionTypes/GetExpressionType/GetLeftValueExpressionType
***********************************************************************/
void GetExpressionTypes(WfLexicalScopeManager* manager, Ptr<WfExpression> expression, Ptr<reflection::description::ITypeInfo> expectedType, bool allowEvent, collections::List<ResolveExpressionResult>& results)
{
ValidateExpressionSemantic(manager, expression, expectedType, results);
if (results.Count() == 0) return;
Ptr<WfLexicalScopeName> scopeName;
IEventInfo* eventInfo = 0;
for (vint i = results.Count() - 1; i >= 0; i--)
{
auto& result = results[i];
if (result.scopeName && !scopeName)
{
scopeName = result.scopeName;
}
if (result.eventInfo && !eventInfo)
{
eventInfo = result.eventInfo;
}
if (!result.type && !(allowEvent && eventInfo))
{
results.RemoveAt(i);
}
}
if (results.Count() == 0)
{
if (scopeName)
{
manager->errors.Add(WfErrors::ScopeNameIsNotExpression(expression.Obj(), scopeName));
}
if (eventInfo)
{
manager->errors.Add(WfErrors::EventIsNotExpression(expression.Obj(), eventInfo));
}
}
if (expectedType)
{
List<Ptr<ITypeInfo>> failedTypes;
for (vint i = results.Count() - 1; i >= 0; i--)
{
auto& result = results[i];
if (!CanConvertToType(result.type.Obj(), expectedType.Obj(), false))
{
failedTypes.Add(result.type);
results.RemoveAt(i);
}
}
if (results.Count() == 0)
{
FOREACH(Ptr<ITypeInfo>, type, failedTypes)
{
manager->errors.Add(WfErrors::ExpressionCannotImplicitlyConvertToType(expression.Obj(), type.Obj(), expectedType.Obj()));
}
}
}
}
Ptr<reflection::description::ITypeInfo> GetExpressionType(WfLexicalScopeManager* manager, Ptr<WfExpression> expression, Ptr<reflection::description::ITypeInfo> expectedType)
{
List<ResolveExpressionResult> results;
GetExpressionTypes(manager, expression, expectedType, false, results);
if (results.Count() > 1)
{
manager->errors.Add(WfErrors::TooManyTargets(expression.Obj(), results, GetExpressionName(expression)));
return expectedType;
}
else if (results.Count() == 1)
{
auto result = results[0];
result.expectedType = expectedType;
manager->expressionResolvings.Add(expression, result);
return expectedType ? expectedType : result.type;
}
else
{
return expectedType;
}
}
Ptr<reflection::description::ITypeInfo> GetLeftValueExpressionType(WfLexicalScopeManager* manager, Ptr<WfExpression> expression)
{
List<ResolveExpressionResult> results;
GetExpressionTypes(manager, expression, nullptr, false, results);
if (results.Count() > 1)
{
manager->errors.Add(WfErrors::TooManyTargets(expression.Obj(), results, GetExpressionName(expression)));
}
else if (results.Count() == 1)
{
if (results[0].writableType)
{
auto result = results[0];
manager->expressionResolvings.Add(expression, result);
return result.writableType;
}
else
{
manager->errors.Add(WfErrors::ExpressionIsNotLeftValue(expression.Obj(), results[0]));
}
}
return 0;
}
/***********************************************************************
GetEnumerableExpressionItemType
***********************************************************************/
Ptr<reflection::description::ITypeInfo> GetEnumerableExpressionItemType(WfLexicalScopeManager* manager, Ptr<WfExpression> expression, Ptr<reflection::description::ITypeInfo> expectedType)
{
Ptr<ITypeInfo> collectionType = GetExpressionType(manager, expression, expectedType);
if (collectionType)
{
if (collectionType->GetTypeDescriptor()->CanConvertTo(description::GetTypeDescriptor<IValueEnumerable>()))
{
if (collectionType->GetDecorator() == ITypeInfo::SharedPtr)
{
ITypeInfo* genericType = collectionType->GetElementType();
if (genericType->GetDecorator() == ITypeInfo::Generic && genericType->GetGenericArgumentCount() == 1)
{
return CopyTypeInfo(genericType->GetGenericArgument(0));
}
}
return TypeInfoRetriver<Value>::CreateTypeInfo();
}
manager->errors.Add(WfErrors::ExpressionIsNotCollection(expression.Obj(), collectionType.Obj()));
}
return 0;
}
}
}
}
/***********************************************************************
ANALYZER\WFANALYZER_VALIDATESTRUCTURE.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace analyzer
{
using namespace collections;
using namespace parsing;
using namespace reflection::description;
/***********************************************************************
ValidateStructureContext
***********************************************************************/
ValidateStructureContext::ValidateStructureContext()
:currentBindExpression(0)
, currentObserveExpression(0)
, currentLoopStatement(0)
, currentCatchStatement(0)
{
}
/***********************************************************************
ValidateStructure(Type)
***********************************************************************/
class ValidateReferenceTypeVisitor : public Object, public WfType::IVisitor
{
public:
WfLexicalScopeManager* manager;
bool result;
ValidateReferenceTypeVisitor(WfLexicalScopeManager* _manager)
:manager(_manager)
, result(true)
{
}
void Visit(WfPredefinedType* node)override
{
}
void Visit(WfTopQualifiedType* node)override
{
}
void Visit(WfReferenceType* node)override
{
}
void Visit(WfRawPointerType* node)override
{
result = false;
}
void Visit(WfSharedPointerType* node)override
{
result = false;
}
void Visit(WfNullableType* node)override
{
result = false;
}
void Visit(WfEnumerableType* node)override
{
result = false;
}
void Visit(WfMapType* node)override
{
result = false;
}
void Visit(WfFunctionType* node)override
{
result = false;
}
void Visit(WfChildType* node)override
{
node->parent->Accept(this);
}
static bool Execute(Ptr<WfType> type, WfLexicalScopeManager* manager)
{
ValidateReferenceTypeVisitor visitor(manager);
type->Accept(&visitor);
return visitor.result;
}
};
class ValidateStructureTypeVisitor : public Object, public WfType::IVisitor
{
public:
WfLexicalScopeManager* manager;
ValidateTypeStragety strategy;
WfClassDeclaration* classDecl;
ValidateStructureTypeVisitor(WfLexicalScopeManager* _manager, ValidateTypeStragety _strategy, WfClassDeclaration* _classDecl)
:manager(_manager)
, strategy(_strategy)
, classDecl(_classDecl)
{
}
void Visit(WfPredefinedType* node)override
{
switch (node->name)
{
case WfPredefinedTypeName::Void:
switch (strategy)
{
case ValidateTypeStragety::Value:
manager->errors.Add(WfErrors::WrongVoidType(node));
break;
case ValidateTypeStragety::BaseType:
manager->errors.Add(WfErrors::WrongBaseType(classDecl, node));
default:;
}
break;
case WfPredefinedTypeName::Interface:
switch (strategy)
{
case ValidateTypeStragety::ReturnType:
case ValidateTypeStragety::Value:
manager->errors.Add(WfErrors::WrongInterfaceType(node));
break;
default:;
}
default:;
}
}
void Visit(WfTopQualifiedType* node)override
{
}
void Visit(WfReferenceType* node)override
{
}
void Visit(WfRawPointerType* node)override
{
if (strategy == ValidateTypeStragety::BaseType)
{
manager->errors.Add(WfErrors::WrongBaseType(classDecl, node));
}
if (!ValidateReferenceTypeVisitor::Execute(node->element, manager))
{
manager->errors.Add(WfErrors::RawPointerToNonReferenceType(node));
}
else if (auto predefinedType = node->element.Cast<WfPredefinedType>())
{
if (predefinedType->name != WfPredefinedTypeName::Interface)
{
manager->errors.Add(WfErrors::RawPointerToNonReferenceType(node));
}
}
}
void Visit(WfSharedPointerType* node)override
{
if (strategy == ValidateTypeStragety::BaseType)
{
manager->errors.Add(WfErrors::WrongBaseType(classDecl, node));
}
if (!ValidateReferenceTypeVisitor::Execute(node->element, manager))
{
manager->errors.Add(WfErrors::SharedPointerToNonReferenceType(node));
}
else if (auto predefinedType = node->element.Cast<WfPredefinedType>())
{
if (predefinedType->name != WfPredefinedTypeName::Interface)
{
manager->errors.Add(WfErrors::SharedPointerToNonReferenceType(node));
}
}
}
void Visit(WfNullableType* node)override
{
if (strategy == ValidateTypeStragety::BaseType)
{
manager->errors.Add(WfErrors::WrongBaseType(classDecl, node));
}
if (!ValidateReferenceTypeVisitor::Execute(node->element, manager))
{
manager->errors.Add(WfErrors::NullableToNonReferenceType(node));
}
else if (auto predefinedType = node->element.Cast<WfPredefinedType>())
{
switch (predefinedType->name)
{
case WfPredefinedTypeName::Void:
case WfPredefinedTypeName::Object:
case WfPredefinedTypeName::Interface:
manager->errors.Add(WfErrors::NullableToNonReferenceType(node));
break;
default:;
}
}
}
void Visit(WfEnumerableType* node)override
{
if (strategy == ValidateTypeStragety::BaseType)
{
manager->errors.Add(WfErrors::WrongBaseType(classDecl, node));
}
ValidateTypeStructure(manager, node->element);
}
void Visit(WfMapType* node)override
{
if (strategy == ValidateTypeStragety::BaseType)
{
manager->errors.Add(WfErrors::WrongBaseType(classDecl, node));
}
if (node->key)
{
ValidateTypeStructure(manager, node->key);
}
ValidateTypeStructure(manager, node->value);
}
void Visit(WfFunctionType* node)override
{
if (strategy == ValidateTypeStragety::BaseType)
{
manager->errors.Add(WfErrors::WrongBaseType(classDecl, node));
}
ValidateTypeStructure(manager, node->result, ValidateTypeStragety::ReturnType);
FOREACH(Ptr<WfType>, argument, node->arguments)
{
ValidateTypeStructure(manager, argument);
}
}
void Visit(WfChildType* node)override
{
if (!ValidateReferenceTypeVisitor::Execute(node->parent, manager))
{
manager->errors.Add(WfErrors::ChildOfNonReferenceType(node));
}
}
static void Execute(Ptr<WfType> type, WfLexicalScopeManager* manager, ValidateTypeStragety strategy, WfClassDeclaration* classDecl)
{
ValidateStructureTypeVisitor visitor(manager, strategy, classDecl);
type->Accept(&visitor);
}
};
/***********************************************************************
ValidateStructure(Declaration)
***********************************************************************/
class ValidateStructureDeclarationVisitor
: public Object
, public WfDeclaration::IVisitor
, public WfVirtualDeclaration::IVisitor
{
public:
WfLexicalScopeManager* manager;
WfClassDeclaration* classDecl;
WfExpression* surroundingLambda;
ValidateStructureDeclarationVisitor(WfLexicalScopeManager* _manager, WfClassDeclaration* _classDecl, WfExpression* _surroundingLambda)
:manager(_manager)
, classDecl(_classDecl)
, surroundingLambda(_surroundingLambda)
{
}
void Visit(WfNamespaceDeclaration* node)override
{
if (dynamic_cast<WfNewInterfaceExpression*>(surroundingLambda))
{
manager->errors.Add(WfErrors::WrongDeclarationInInterfaceConstructor(node));
}
if (node->classMember)
{
manager->errors.Add(WfErrors::WrongClassMember(node));
}
for (vint i = 0; i < node->declarations.Count(); i++)
{
ValidateDeclarationStructure(manager, node->declarations[i]);
}
}
void Visit(WfFunctionDeclaration* node)override
{
if (classDecl && node->classMember)
{
switch (classDecl->kind)
{
case WfClassKind::Class:
{
switch (node->classMember->kind)
{
case WfClassMemberKind::Normal:
case WfClassMemberKind::Static:
if (!node->statement)
{
manager->errors.Add(WfErrors::FunctionShouldHaveImplementation(node));
}
break;
case WfClassMemberKind::Override:
manager->errors.Add(WfErrors::OverrideShouldImplementInterfaceMethod(node));
break;
}
}
break;
case WfClassKind::Interface:
{
switch (node->classMember->kind)
{
case WfClassMemberKind::Normal:
if (node->statement)
{
manager->errors.Add(WfErrors::InterfaceMethodShouldNotHaveImplementation(node));
}
break;
case WfClassMemberKind::Static:
if (!node->statement)
{
manager->errors.Add(WfErrors::FunctionShouldHaveImplementation(node));
}
break;
case WfClassMemberKind::Override:
manager->errors.Add(WfErrors::OverrideShouldImplementInterfaceMethod(node));
break;
}
}
break;
}
}
else
{
if (dynamic_cast<WfNewInterfaceExpression*>(surroundingLambda))
{
switch (node->classMember->kind)
{
case WfClassMemberKind::Normal:
break;
case WfClassMemberKind::Static:
manager->errors.Add(WfErrors::FunctionInNewTypeExpressionCannotBeStatic(node));
break;
case WfClassMemberKind::Override:
break;
}
}
if (!node->statement)
{
manager->errors.Add(WfErrors::FunctionShouldHaveImplementation(node));
}
}
if (node->anonymity == WfFunctionAnonymity::Anonymous)
{
if (!dynamic_cast<WfFunctionExpression*>(surroundingLambda))
{
manager->errors.Add(WfErrors::FunctionShouldHaveName(node));
}
}
ValidateTypeStructure(manager, node->returnType, ValidateTypeStragety::ReturnType);
FOREACH(Ptr<WfFunctionArgument>, argument, node->arguments)
{
ValidateTypeStructure(manager, argument->type);
}
if (node->statement)
{
ValidateStructureContext context;
ValidateStatementStructure(manager, &context, node->statement);
}
}
void Visit(WfVariableDeclaration* node)override
{
if (classDecl && node->classMember)
{
switch (node->classMember->kind)
{
case WfClassMemberKind::Normal:
break;
case WfClassMemberKind::Static:
case WfClassMemberKind::Override:
manager->errors.Add(WfErrors::WrongClassMemberConfig(node));
break;
}
}
if (node->type)
{
ValidateTypeStructure(manager, node->type);
}
else if (classDecl)
{
manager->errors.Add(WfErrors::MissingFieldType(node));
}
ValidateStructureContext context;
ValidateExpressionStructure(manager, &context, node->expression);
}
void Visit(WfEventDeclaration* node)override
{
if (classDecl && node->classMember)
{
switch (node->classMember->kind)
{
case WfClassMemberKind::Normal:
break;
case WfClassMemberKind::Static:
case WfClassMemberKind::Override:
manager->errors.Add(WfErrors::WrongClassMemberConfig(node));
break;
}
FOREACH(Ptr<WfType>, argument, node->arguments)
{
ValidateTypeStructure(manager, argument);
}
}
else if (dynamic_cast<WfNewInterfaceExpression*>(surroundingLambda))
{
manager->errors.Add(WfErrors::WrongDeclarationInInterfaceConstructor(node));
}
else
{
manager->errors.Add(WfErrors::WrongDeclaration(node));
}
}
class FindPropertyRelatedDeclVisitor
: public empty_visitor::DeclarationVisitor
{
public:
WfLexicalScopeManager* manager;
WfClassDeclaration* classDecl;
WfPropertyDeclaration* propDecl;
Ptr<WfDeclaration> getter;
Ptr<WfDeclaration> setter;
Ptr<WfDeclaration> valueChangedEvent;
bool duplicateGetter = false;
bool duplicateSetter = false;
bool duplicateEvent = false;
FindPropertyRelatedDeclVisitor(WfLexicalScopeManager* _manager, WfClassDeclaration* _classDecl, WfPropertyDeclaration* _propDecl)
:manager(_manager)
, classDecl(_classDecl)
, propDecl(_propDecl)
{
}
void Dispatch(WfVirtualDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, decl, node->expandedDeclarations)
{
Execute(decl);
}
}
void Execute(Ptr<WfDeclaration> memberDecl)
{
memberDecl->Accept(this);
if (!duplicateGetter && memberDecl->name.value == propDecl->getter.value)
{
if (getter)
{
duplicateGetter = true;
manager->errors.Add(WfErrors::TooManyPropertyGetter(propDecl, classDecl));
}
else
{
getter = memberDecl;
}
}
if (!duplicateSetter && propDecl->setter.value != L"" && memberDecl->name.value == propDecl->setter.value)
{
if (setter)
{
duplicateSetter = true;
manager->errors.Add(WfErrors::TooManyPropertySetter(propDecl, classDecl));
}
else
{
setter = memberDecl;
}
}
if (!duplicateEvent && propDecl->valueChangedEvent.value != L"" && memberDecl->name.value == propDecl->valueChangedEvent.value)
{
if (valueChangedEvent)
{
duplicateEvent = true;
manager->errors.Add(WfErrors::TooManyPropertyEvent(propDecl, classDecl));
}
else
{
valueChangedEvent = memberDecl;
}
}
}
};
void Visit(WfPropertyDeclaration* node)override
{
if (classDecl && node->classMember)
{
switch (node->classMember->kind)
{
case WfClassMemberKind::Normal:
break;
case WfClassMemberKind::Static:
case WfClassMemberKind::Override:
manager->errors.Add(WfErrors::WrongClassMemberConfig(node));
break;
}
ValidateTypeStructure(manager, node->type);
FindPropertyRelatedDeclVisitor visitor(manager, classDecl, node);
FOREACH(Ptr<WfDeclaration>, memberDecl, classDecl->declarations)
{
visitor.Execute(memberDecl);
}
if (!visitor.getter || visitor.getter->classMember->kind == WfClassMemberKind::Static || !visitor.getter.Cast<WfFunctionDeclaration>())
{
manager->errors.Add(WfErrors::PropertyGetterNotFound(node, classDecl));
}
if (node->setter.value != L"" && (!visitor.setter || visitor.setter->classMember->kind == WfClassMemberKind::Static || !visitor.setter.Cast<WfFunctionDeclaration>()))
{
manager->errors.Add(WfErrors::PropertySetterNotFound(node, classDecl));
}
if (node->valueChangedEvent.value != L"" && (!visitor.valueChangedEvent || visitor.valueChangedEvent->classMember->kind == WfClassMemberKind::Static || !visitor.valueChangedEvent.Cast<WfEventDeclaration>()))
{
manager->errors.Add(WfErrors::PropertyEventNotFound(node, classDecl));
}
}
else if (dynamic_cast<WfNewInterfaceExpression*>(surroundingLambda))
{
manager->errors.Add(WfErrors::WrongDeclarationInInterfaceConstructor(node));
}
else
{
manager->errors.Add(WfErrors::WrongDeclaration(node));
}
}
void Visit(WfConstructorDeclaration* node)override
{
if (classDecl && node->classMember)
{
switch (node->classMember->kind)
{
case WfClassMemberKind::Normal:
break;
case WfClassMemberKind::Static:
case WfClassMemberKind::Override:
manager->errors.Add(WfErrors::WrongClassMemberConfig(node));
break;
}
if (classDecl->kind != WfClassKind::Class)
{
manager->errors.Add(WfErrors::WrongDeclaration(node));
}
FOREACH(Ptr<WfBaseConstructorCall>, call, node->baseConstructorCalls)
{
ValidateTypeStructure(manager, call->type, ValidateTypeStragety::BaseType, classDecl);
FOREACH(Ptr<WfExpression>, argument, call->arguments)
{
ValidateStructureContext context;
ValidateExpressionStructure(manager, &context, argument);
}
}
{
ValidateStructureContext context;
ValidateStatementStructure(manager, &context, node->statement);
}
}
else
{
manager->errors.Add(WfErrors::WrongDeclaration(node));
}
}
void Visit(WfDestructorDeclaration* node)override
{
if (classDecl && node->classMember)
{
switch (node->classMember->kind)
{
case WfClassMemberKind::Normal:
break;
case WfClassMemberKind::Static:
case WfClassMemberKind::Override:
manager->errors.Add(WfErrors::WrongClassMemberConfig(node));
break;
}
if (classDecl->kind != WfClassKind::Class)
{
manager->errors.Add(WfErrors::WrongDeclaration(node));
}
ValidateStructureContext context;
ValidateStatementStructure(manager, &context, node->statement);
}
else
{
manager->errors.Add(WfErrors::WrongDeclaration(node));
}
}
class FindCtorVisitor
: public empty_visitor::DeclarationVisitor
{
public:
WfConstructorDeclaration* ctor = nullptr;
void Dispatch(WfVirtualDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, decl, node->expandedDeclarations)
{
decl->Accept(this);
}
}
void Visit(WfConstructorDeclaration* node)override
{
ctor = node;
}
};
class TooManyDtorVisitor
: public empty_visitor::DeclarationVisitor
{
public:
WfLexicalScopeManager* manager;
WfClassDeclaration* classDecl;
WfDestructorDeclaration* dtor = nullptr;
TooManyDtorVisitor(WfLexicalScopeManager* _manager, WfClassDeclaration* _classDecl)
:manager(_manager)
, classDecl(_classDecl)
{
}
void Dispatch(WfVirtualDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, decl, node->expandedDeclarations)
{
decl->Accept(this);
}
}
void Visit(WfDestructorDeclaration* node)override
{
if (!dtor)
{
dtor = node;
}
else
{
manager->errors.Add(WfErrors::TooManyDestructor(node, classDecl));
}
}
};
void Visit(WfClassDeclaration* node)override
{
if (classDecl && node->classMember)
{
switch (node->classMember->kind)
{
case WfClassMemberKind::Normal:
break;
case WfClassMemberKind::Static:
case WfClassMemberKind::Override:
manager->errors.Add(WfErrors::WrongClassMemberConfig(node));
break;
}
}
else if (dynamic_cast<WfNewInterfaceExpression*>(surroundingLambda))
{
manager->errors.Add(WfErrors::WrongDeclarationInInterfaceConstructor(node));
}
switch (node->kind)
{
case WfClassKind::Class:
{
if (node->constructorType != WfConstructorType::Undefined)
{
manager->errors.Add(WfErrors::ClassWithInterfaceConstructor(node));
}
{
FindCtorVisitor visitor;
FOREACH(Ptr<WfDeclaration>, memberDecl, node->declarations)
{
memberDecl->Accept(&visitor);
}
if (!visitor.ctor)
{
auto ctor = MakePtr<WfConstructorDeclaration>();
node->declarations.Add(ctor);
ctor->codeRange = node->codeRange;
ctor->classMember = MakePtr<WfClassMember>();
ctor->classMember->codeRange = node->codeRange;
ctor->classMember->kind = WfClassMemberKind::Normal;
auto stat = MakePtr<WfBlockStatement>();
ctor->statement = stat;
stat->codeRange = node->codeRange;
}
}
}
break;
case WfClassKind::Interface:
break;
}
FOREACH(Ptr<WfType>, type, node->baseTypes)
{
ValidateTypeStructure(manager, type, ValidateTypeStragety::BaseType, node);
}
{
TooManyDtorVisitor visitor(manager, node);
FOREACH(Ptr<WfDeclaration>, memberDecl, node->declarations)
{
ValidateDeclarationStructure(manager, memberDecl, node);
memberDecl->Accept(&visitor);
}
}
}
void Visit(WfEnumDeclaration* node)override
{
if (classDecl && node->classMember)
{
switch (node->classMember->kind)
{
case WfClassMemberKind::Normal:
break;
case WfClassMemberKind::Static:
case WfClassMemberKind::Override:
manager->errors.Add(WfErrors::WrongClassMemberConfig(node));
break;
}
}
else if (dynamic_cast<WfNewInterfaceExpression*>(surroundingLambda))
{
manager->errors.Add(WfErrors::WrongDeclarationInInterfaceConstructor(node));
}
vuint64_t current = 0;
bool reportedNotConsecutive = false;
SortedList<WString> discoveredItems;
FOREACH(Ptr<WfEnumItem>, item, node->items)
{
switch (item->kind)
{
case WfEnumItemKind::Constant:
{
vuint64_t value = -1;
TypedValueSerializerProvider<vuint64_t>::Deserialize(item->number.value, value);
if (!reportedNotConsecutive && value != current)
{
reportedNotConsecutive = true;
switch (node->kind)
{
case WfEnumKind::Normal:
manager->errors.Add(WfErrors::EnumValuesNotConsecutiveFromZero(node));
break;
case WfEnumKind::Flag:
manager->errors.Add(WfErrors::FlagValuesNotConsecutiveFromZero(node));
break;
}
}
switch (node->kind)
{
case WfEnumKind::Normal:
current++;
break;
case WfEnumKind::Flag:
current = current == 0 ? 1 : current * 2;
break;
}
}
break;
case WfEnumItemKind::Intersection:
FOREACH(Ptr<WfEnumItemIntersection>, enumInt, item->intersections)
{
if (!discoveredItems.Contains(enumInt->name.value))
{
manager->errors.Add(WfErrors::FlagValueNotExists(enumInt.Obj(), node));
}
}
break;
}
if (discoveredItems.Contains(item->name.value))
{
manager->errors.Add(WfErrors::DuplicatedEnumValue(item.Obj(), node));
}
else
{
discoveredItems.Add(item->name.value);
}
}
}
void Visit(WfStructDeclaration* node)override
{
if (classDecl && node->classMember)
{
switch (node->classMember->kind)
{
case WfClassMemberKind::Normal:
break;
case WfClassMemberKind::Static:
case WfClassMemberKind::Override:
manager->errors.Add(WfErrors::WrongClassMemberConfig(node));
break;
}
}
else if (dynamic_cast<WfNewInterfaceExpression*>(surroundingLambda))
{
manager->errors.Add(WfErrors::WrongDeclarationInInterfaceConstructor(node));
}
SortedList<WString> discoveredItems;
FOREACH(Ptr<WfStructMember>, member, node->members)
{
if (discoveredItems.Contains(member->name.value))
{
manager->errors.Add(WfErrors::DuplicatedStructMember(member.Obj(), node));
}
else
{
discoveredItems.Add(member->name.value);
}
}
}
void Visit(WfVirtualDeclaration* node)override
{
node->Accept(static_cast<WfVirtualDeclaration::IVisitor*>(this));
FOREACH(Ptr<WfDeclaration>, decl, node->expandedDeclarations)
{
decl->Accept(this);
}
}
void Visit(WfAutoPropertyDeclaration* node)override
{
switch (node->classMember->kind)
{
case WfClassMemberKind::Normal:
if (dynamic_cast<WfNewInterfaceExpression*>(surroundingLambda))
{
manager->errors.Add(WfErrors::AutoPropertyCannotBeNormalOutsideOfClass(node));
}
break;
case WfClassMemberKind::Static:
manager->errors.Add(WfErrors::AutoPropertyCannotBeStatic(node));
break;
case WfClassMemberKind::Override:
if (!dynamic_cast<WfNewInterfaceExpression*>(surroundingLambda))
{
manager->errors.Add(WfErrors::OverrideShouldImplementInterfaceMethod(node));
}
break;
}
if (classDecl)
{
switch (classDecl->kind)
{
case WfClassKind::Class:
if (!node->expression)
{
manager->errors.Add(WfErrors::AutoPropertyShouldBeInitialized(node));
}
break;
case WfClassKind::Interface:
if (node->expression)
{
manager->errors.Add(WfErrors::AutoPropertyCannotBeInitializedInInterface(node, classDecl));
}
break;
}
}
else if (dynamic_cast<WfNewInterfaceExpression*>(surroundingLambda))
{
if (!node->expression)
{
manager->errors.Add(WfErrors::AutoPropertyShouldBeInitialized(node));
}
}
else
{
manager->errors.Add(WfErrors::WrongDeclaration(node));
}
ValidateTypeStructure(manager, node->type);
if (node->expression)
{
ValidateStructureContext context;
ValidateExpressionStructure(manager, &context, node->expression);
}
}
void Visit(WfCastResultInterfaceDeclaration* node)override
{
}
static void Execute(Ptr<WfDeclaration> declaration, WfLexicalScopeManager* manager, WfClassDeclaration* classDecl, WfExpression* surroundingLambda)
{
ValidateStructureDeclarationVisitor visitor(manager, classDecl, surroundingLambda);
declaration->Accept(&visitor);
}
};
/***********************************************************************
ValidateStructure(Statement)
***********************************************************************/
class ValidateStructureStatementVisitor
: public Object
, public WfStatement::IVisitor
, public WfVirtualStatement::IVisitor
, public WfCoroutineStatement::IVisitor
{
public:
WfLexicalScopeManager* manager;
ValidateStructureContext* context;
Ptr<WfStatement> result;
ValidateStructureStatementVisitor(WfLexicalScopeManager* _manager, ValidateStructureContext* _context)
:manager(_manager)
, context(_context)
{
}
void Visit(WfBreakStatement* node)override
{
if (!context->currentLoopStatement)
{
manager->errors.Add(WfErrors::BreakNotInLoop(node));
}
}
void Visit(WfContinueStatement* node)override
{
if (!context->currentLoopStatement)
{
manager->errors.Add(WfErrors::ContinueNotInLoop(node));
}
}
void Visit(WfReturnStatement* node)override
{
if (node->expression)
{
ValidateExpressionStructure(manager, context, node->expression);
}
}
void Visit(WfDeleteStatement* node)override
{
ValidateExpressionStructure(manager, context, node->expression);
}
void Visit(WfRaiseExceptionStatement* node)override
{
if (node->expression)
{
ValidateExpressionStructure(manager, context, node->expression);
}
else if (!context->currentCatchStatement)
{
manager->errors.Add(WfErrors::RethrowNotInCatch(node));
}
}
void Visit(WfIfStatement* node)override
{
if (node->type)
{
ValidateTypeStructure(manager, node->type);
}
ValidateExpressionStructure(manager, context, node->expression);
ValidateStatementStructure(manager, context, node->trueBranch);
if (node->falseBranch)
{
ValidateStatementStructure(manager, context, node->falseBranch);
}
}
void Visit(WfWhileStatement* node)override
{
auto oldLoop = context->currentLoopStatement;
context->currentLoopStatement = node;
ValidateExpressionStructure(manager, context, node->condition);
ValidateStatementStructure(manager, context, node->statement);
context->currentLoopStatement = oldLoop;
}
void Visit(WfTryStatement* node)override
{
ValidateStatementStructure(manager, context, node->protectedStatement);
if (node->catchStatement)
{
auto oldCatch = context->currentCatchStatement;
context->currentCatchStatement = node->catchStatement.Obj();
ValidateStatementStructure(manager, context, node->catchStatement);
context->currentCatchStatement = oldCatch;
}
if (node->finallyStatement)
{
ValidateStatementStructure(manager, context, node->finallyStatement);
}
if (!node->catchStatement && !node->finallyStatement)
{
manager->errors.Add(WfErrors::TryMissCatchAndFinally(node));
}
}
void Visit(WfBlockStatement* node)override
{
for (vint i = 0; i < node->statements.Count(); i++)
{
ValidateStatementStructure(manager, context, node->statements[i]);
}
}
void Visit(WfExpressionStatement* node)override
{
ValidateExpressionStructure(manager, context, node->expression);
}
void Visit(WfVariableStatement* node)override
{
ValidateDeclarationStructure(manager, node->variable);
}
void Visit(WfVirtualStatement* node)override
{
node->Accept((WfVirtualStatement::IVisitor*)this);
if (node->expandedStatement)
{
ValidateStatementStructure(manager, context, node->expandedStatement);
}
}
void Visit(WfSwitchStatement* node)override
{
ValidateExpressionStructure(manager, context, node->expression);
FOREACH(Ptr<WfSwitchCase>, switchCase, node->caseBranches)
{
ValidateExpressionStructure(manager, context, switchCase->expression);
ValidateStatementStructure(manager, context, switchCase->statement);
}
if (node->defaultBranch)
{
ValidateStatementStructure(manager, context, node->defaultBranch);
}
}
void Visit(WfForEachStatement* node)override
{
auto oldLoop = context->currentLoopStatement;
context->currentLoopStatement = node;
ValidateExpressionStructure(manager, context, node->collection);
ValidateStatementStructure(manager, context, node->statement);
context->currentLoopStatement = oldLoop;
}
void Visit(WfCoProviderStatement* node)override
{
auto oldProvider = context->currentCoProviderStatement;
context->currentCoProviderStatement = node;
ValidateStatementStructure(manager, context, node->statement);
context->currentCoProviderStatement = oldProvider;
}
void Visit(WfCoroutineStatement* node)override
{
node->Accept((WfCoroutineStatement::IVisitor*)this);
}
void Visit(WfCoPauseStatement* node)override
{
if (!context->currentNewCoroutineExpression || context->currentCoPauseStatement)
{
manager->errors.Add(WfErrors::WrongCoPause(node));
}
if (node->statement)
{
auto oldCpPause = context->currentCoPauseStatement;
context->currentCoPauseStatement = node;
ValidateStatementStructure(manager, context, node->statement);
context->currentCoPauseStatement = oldCpPause;
}
}
void Visit(WfCoOperatorStatement* node)override
{
if (!context->currentCoProviderStatement)
{
manager->errors.Add(WfErrors::WrongCoOperator(node));
}
}
static void Execute(Ptr<WfStatement>& statement, WfLexicalScopeManager* manager, ValidateStructureContext* context)
{
ValidateStructureStatementVisitor visitor(manager, context);
statement->Accept(&visitor);
if (visitor.result)
{
statement = visitor.result;
}
}
};
/***********************************************************************
ValidateStructure(Expression)
***********************************************************************/
class ValidateStructureExpressionVisitor
: public Object
, public WfExpression::IVisitor
, public WfVirtualExpression::IVisitor
{
public:
WfLexicalScopeManager* manager;
ValidateStructureContext* context;
Ptr<WfExpression> result;
ValidateStructureExpressionVisitor(WfLexicalScopeManager* _manager, ValidateStructureContext* _context)
:manager(_manager)
, context(_context)
{
}
void Visit(WfThisExpression* node)override
{
if (context->currentBindExpression)
{
manager->errors.Add(WfErrors::WrongThisExpression(node));
}
}
void Visit(WfTopQualifiedExpression* node)override
{
}
void Visit(WfReferenceExpression* node)override
{
}
void Visit(WfOrderedNameExpression* node)override
{
}
void Visit(WfOrderedLambdaExpression* node)override
{
auto oldBind = context->currentBindExpression;
context->currentBindExpression = 0;
ValidateExpressionStructure(manager, context, node->body);
context->currentBindExpression = oldBind;
}
void Visit(WfMemberExpression* node)override
{
ValidateExpressionStructure(manager, context, node->parent);
}
void Visit(WfChildExpression* node)override
{
ValidateExpressionStructure(manager, context, node->parent);
}
void Visit(WfLiteralExpression* node)override
{
}
void Visit(WfFloatingExpression* node)override
{
}
void Visit(WfIntegerExpression* node)override
{
}
void Visit(WfStringExpression* node)override
{
}
void Visit(WfUnaryExpression* node)override
{
ValidateExpressionStructure(manager, context, node->operand);
}
void Visit(WfBinaryExpression* node)override
{
ValidateExpressionStructure(manager, context, node->first);
ValidateExpressionStructure(manager, context, node->second);
}
void Visit(WfLetExpression* node)override
{
FOREACH(Ptr<WfLetVariable>, variable, node->variables)
{
ValidateExpressionStructure(manager, context, variable->value);
}
ValidateExpressionStructure(manager, context, node->expression);
}
void Visit(WfIfExpression* node)override
{
ValidateExpressionStructure(manager, context, node->condition);
ValidateExpressionStructure(manager, context, node->trueBranch);
ValidateExpressionStructure(manager, context, node->falseBranch);
}
void Visit(WfRangeExpression* node)override
{
ValidateExpressionStructure(manager, context, node->begin);
ValidateExpressionStructure(manager, context, node->end);
}
void Visit(WfSetTestingExpression* node)override
{
ValidateExpressionStructure(manager, context, node->element);
ValidateExpressionStructure(manager, context, node->collection);
}
void Visit(WfConstructorExpression* node)override
{
vint listElementCount = 0;
vint mapElementCount = 0;
FOREACH(Ptr<WfConstructorArgument>, argument, node->arguments)
{
ValidateExpressionStructure(manager, context, argument->key);
if (argument->value)
{
ValidateExpressionStructure(manager, context, argument->value);
mapElementCount++;
}
else
{
listElementCount++;
}
}
if (listElementCount*mapElementCount != 0)
{
manager->errors.Add(WfErrors::ConstructorMixMapAndList(node));
}
}
void Visit(WfInferExpression* node)override
{
ValidateTypeStructure(manager, node->type);
ValidateExpressionStructure(manager, context, node->expression);
}
void Visit(WfTypeCastingExpression* node)override
{
ValidateTypeStructure(manager, node->type);
ValidateExpressionStructure(manager, context, node->expression);
}
void Visit(WfTypeTestingExpression* node)override
{
if (node->type)
{
ValidateTypeStructure(manager, node->type);
}
ValidateExpressionStructure(manager, context, node->expression);
}
void Visit(WfTypeOfTypeExpression* node)override
{
ValidateTypeStructure(manager, node->type);
}
void Visit(WfTypeOfExpressionExpression* node)override
{
ValidateExpressionStructure(manager, context, node->expression);
}
void Visit(WfAttachEventExpression* node)override
{
if (context->currentBindExpression)
{
manager->errors.Add(WfErrors::AttachInBind(node));
}
ValidateExpressionStructure(manager, context, node->event);
ValidateExpressionStructure(manager, context, node->function);
}
void Visit(WfDetachEventExpression* node)override
{
if (context->currentBindExpression)
{
manager->errors.Add(WfErrors::DetachInBind(node));
}
ValidateExpressionStructure(manager, context, node->event);
ValidateExpressionStructure(manager, context, node->handler);
}
void Visit(WfObserveExpression* node)override
{
if (!context->currentBindExpression)
{
manager->errors.Add(WfErrors::ObserveNotInBind(node));
}
if (context->currentObserveExpression)
{
manager->errors.Add(WfErrors::ObserveInObserveEvent(node));
}
if (node->observeType == WfObserveType::SimpleObserve)
{
if (!node->expression.Cast<WfReferenceExpression>())
{
manager->errors.Add(WfErrors::WrongSimpleObserveExpression(node->expression.Obj()));
}
FOREACH(Ptr<WfExpression>, event, node->events)
{
if (!event.Cast<WfReferenceExpression>())
{
manager->errors.Add(WfErrors::WrongSimpleObserveEvent(event.Obj()));
}
}
}
if (node->events.Count() == 0)
{
manager->errors.Add(WfErrors::EmptyObserveEvent(node));
}
ValidateExpressionStructure(manager, context, node->parent);
ValidateExpressionStructure(manager, context, node->expression);
context->currentObserveExpression = node;
for (vint i = 0; i < node->events.Count(); i++)
{
ValidateExpressionStructure(manager, context, node->events[i]);
}
context->currentObserveExpression = 0;
}
void Visit(WfCallExpression* node)override
{
ValidateExpressionStructure(manager, context, node->function);
for (vint i = 0; i < node->arguments.Count(); i++)
{
ValidateExpressionStructure(manager, context, node->arguments[i]);
}
}
void Visit(WfFunctionExpression* node)override
{
ValidateDeclarationStructure(manager, node->function, nullptr, node);
}
void Visit(WfNewClassExpression* node)override
{
ValidateTypeStructure(manager, node->type);
for (vint i = 0; i < node->arguments.Count(); i++)
{
ValidateExpressionStructure(manager, context, node->arguments[i]);
}
}
void Visit(WfNewInterfaceExpression* node)override
{
ValidateTypeStructure(manager, node->type);
FOREACH(Ptr<WfDeclaration>, memberDecl, node->declarations)
{
ValidateDeclarationStructure(manager, memberDecl, nullptr, node);
}
}
void Visit(WfVirtualExpression* node)override
{
node->Accept((WfVirtualExpression::IVisitor*)this);
if (node->expandedExpression)
{
ValidateExpressionStructure(manager, context, node->expandedExpression);
}
}
void Visit(WfBindExpression* node)override
{
if (context->currentBindExpression)
{
manager->errors.Add(WfErrors::BindInBind(node));
}
auto bind = context->currentBindExpression;
context->currentBindExpression = node;
ValidateExpressionStructure(manager, context, node->expression);
context->currentBindExpression = bind;
}
void Visit(WfFormatExpression* node)override
{
}
void Visit(WfNewCoroutineExpression* node)override
{
ValidateStructureContext context;
context.currentNewCoroutineExpression = node;
ValidateStatementStructure(manager, &context, node->statement);
}
void Visit(WfMixinCastExpression* node)override
{
ValidateTypeStructure(manager, node->type);
ValidateExpressionStructure(manager, context, node->expression);
}
static void Execute(Ptr<WfExpression>& expression, WfLexicalScopeManager* manager, ValidateStructureContext* context)
{
ValidateStructureExpressionVisitor visitor(manager, context);
expression->Accept(&visitor);
if (visitor.result)
{
expression = visitor.result;
}
}
};
/***********************************************************************
ValidateStructure
***********************************************************************/
void ValidateTypeStructure(WfLexicalScopeManager* manager, Ptr<WfType> type, ValidateTypeStragety strategy, WfClassDeclaration* classDecl)
{
ValidateStructureTypeVisitor::Execute(type, manager, strategy, classDecl);
}
void ValidateModuleStructure(WfLexicalScopeManager* manager, Ptr<WfModule> module)
{
FOREACH(Ptr<WfModuleUsingPath>, path, module->paths)
{
FOREACH_INDEXER(Ptr<WfModuleUsingItem>, item, index, path->items)
{
vint counter = 0;
FOREACH(Ptr<WfModuleUsingFragment>, fragment, item->fragments)
{
if (fragment.Cast<WfModuleUsingWildCardFragment>())
{
if (index == path->items.Count() - 1)
{
counter++;
}
else
{
goto USING_PATH_INCORRECT;
}
}
}
if (index == path->items.Count() - 1 && counter != 1)
{
goto USING_PATH_INCORRECT;
}
}
continue;
USING_PATH_INCORRECT:
manager->errors.Add(WfErrors::WrongUsingPathWildCard(path.Obj()));
}
for (vint i = 0; i < module->declarations.Count(); i++)
{
ValidateDeclarationStructure(manager, module->declarations[i]);
}
}
void ValidateDeclarationStructure(WfLexicalScopeManager* manager, Ptr<WfDeclaration> declaration, WfClassDeclaration* classDecl, WfExpression* surroundingLambda)
{
ValidateStructureDeclarationVisitor::Execute(declaration, manager, classDecl, surroundingLambda);
}
void ValidateStatementStructure(WfLexicalScopeManager* manager, ValidateStructureContext* context, Ptr<WfStatement>& statement)
{
ValidateStructureStatementVisitor::Execute(statement, manager, context);
}
void ValidateExpressionStructure(WfLexicalScopeManager* manager, ValidateStructureContext* context, Ptr<WfExpression>& expression)
{
ValidateStructureExpressionVisitor::Execute(expression, manager, context);
}
}
}
}
/***********************************************************************
CPP\WFCPP.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace cppcodegen
{
using namespace collections;
using namespace regex;
using namespace reflection;
using namespace reflection::description;
using namespace stream;
using namespace emitter;
/***********************************************************************
WfCppConfig
***********************************************************************/
void WfCppConfig::Collect()
{
FOREACH(Ptr<WfModule>, module, manager->GetModules())
{
CollectModule(this, module);
}
FOREACH(Ptr<WfExpression>, lambda, lambdaExprs.Keys())
{
auto closureInfo = CollectClosureInfo(lambda);
closureInfo->lambdaClassName = lambdaExprs[lambda.Obj()];
closureInfos.Add(lambda, closureInfo);
}
FOREACH(Ptr<WfNewInterfaceExpression>, classExpr, classExprs.Keys())
{
auto closureInfo = CollectClosureInfo(classExpr);
closureInfo->lambdaClassName = classExprs[classExpr.Obj()];
closureInfos.Add(classExpr, closureInfo);
}
}
void WfCppConfig::Sort(collections::List<Ptr<WfStructDeclaration>>& structDecls)
{
List<ITypeDescriptor*> tds;
FOREACH_INDEXER(Ptr<WfStructDeclaration>, decl, index, structDecls)
{
tds.Add(manager->declarationTypes[decl.Obj()].Obj());
}
for (vint i = 0; i < tds.Count(); i++)
{
for (vint j = i; i < tds.Count(); j++)
{
auto td = tds[j];
vint count = td->GetPropertyCount();
bool found = false;
for (vint k = 0; k < count && !found; k++)
{
auto prop = td->GetProperty(k);
auto propTd = prop->GetReturn()->GetTypeDescriptor();
for (vint l = k + 1; l < tds.Count() && !found; l++)
{
found = tds[l] == propTd;
}
}
if (!found)
{
if (j != i)
{
auto t = tds[j];
tds.RemoveAt(j);
tds.Insert(i, t);
auto decl = structDecls[j];
structDecls.RemoveAt(j);
structDecls.Insert(i, decl);
}
break;
}
}
}
}
WfCppConfig::WfCppConfig(analyzer::WfLexicalScopeManager* _manager, const WString& _assemblyName, const WString& _assemblyNamespace)
:manager(_manager)
, regexSplitName(L"::")
, regexSpecialName(L"/<(<category>/w+)(-(<category>/w+))*/>(<name>/w*)")
, regexTemplate(L", /$Arguments|/$Arguments, |/$/l+")
, assemblyName(_assemblyName)
, assemblyNamespace(_assemblyNamespace)
{
attributeEvaluator = MakePtr<WfAttributeEvaluator>(manager);
Collect();
for (vint i = 0; i < structDecls.Count(); i++)
{
const auto& values = structDecls.GetByIndex(i);
Sort(const_cast<List<Ptr<WfStructDeclaration>>&>(values));
}
}
WfCppConfig::~WfCppConfig()
{
}
void WfCppConfig::WriteFunctionBody(stream::StreamWriter& writer, Ptr<WfExpression> expr, const WString& prefix, ITypeInfo* expectedType)
{
writer.WriteString(prefix);
writer.WriteString(L"return ");
GenerateExpression(this, writer, expr, expectedType);
writer.WriteLine(L";");
}
void WfCppConfig::WriteFunctionBody(stream::StreamWriter& writer, Ptr<WfStatement> stat, const WString& prefix, ITypeInfo* expectedType)
{
GenerateStatement(this, MakePtr<FunctionRecord>(), writer, stat, prefix, WString(L"\t", false), expectedType);
}
WString WfCppConfig::ConvertName(const WString& name)
{
if (name.Length() > 0 && name[0] == L'$')
{
return L"__vwsno_" + name.Sub(1, name.Length() - 1);
}
auto match = regexSpecialName.Match(name);
if (match)
{
return L"__vwsn_"
+ From(match->Groups()[L"category"])
.Select([](const RegexString& rs)
{
return rs.Value();
})
.Aggregate([](const WString& a, const WString& b)
{
return a + L"_" + b;
})
+ L"_" + match->Groups()[L"name"][0].Value();
}
else
{
return name;
}
}
WString WfCppConfig::ConvertFullName(const WString& fullName, WString delimiter)
{
List<Ptr<RegexMatch>> matches;
regexSplitName.Split(fullName, false, matches);
return (fullName[0] == L':' ? delimiter : WString::Empty) + From(matches)
.Select([this](Ptr<RegexMatch> match)
{
return ConvertName(match->Result().Value());
})
.Aggregate([&](const WString& a, const WString& b)
{
return a + delimiter + b;
});
}
WString WfCppConfig::ConvertFunctionType(IMethodInfo* methodInfo, WString name)
{
WString type = ConvertType(methodInfo->GetReturn()) + name + L"(";
vint count = methodInfo->GetParameterCount();
for (vint i = 0; i < count; i++)
{
if (i > 0)
{
type += L", ";
}
type += ConvertArgumentType(methodInfo->GetParameter(i)->GetType());
}
type += L")";
return type;
}
WString WfCppConfig::ConvertFunctionType(ITypeInfo* typeInfo)
{
if (typeInfo->GetDecorator() == ITypeInfo::SharedPtr)
{
return ConvertFunctionType(typeInfo->GetElementType());
}
CHECK_ERROR(typeInfo->GetDecorator() == ITypeInfo::Generic, L"WfCppConfig::ConvertFunctionType(ITypeInfo*)#Wrong function type.");
CHECK_ERROR(typeInfo->GetTypeDescriptor() == description::GetTypeDescriptor<IValueFunctionProxy>(), L"WfCppConfig::ConvertFunctionType(ITypeInfo*)#Wrong function type.");
WString type = ConvertType(typeInfo->GetGenericArgument(0)) + L"(";
vint count = typeInfo->GetGenericArgumentCount();
for (vint i = 1; i < count; i++)
{
if (i > 1) type += L", ";
type += ConvertArgumentType(typeInfo->GetGenericArgument(i));
}
type += L")";
return type;
}
bool WfCppConfig::IsSpecialGenericType(ITypeInfo* typeInfo)
{
switch (typeInfo->GetDecorator())
{
case ITypeInfo::SharedPtr:
if (typeInfo->GetTypeDescriptor() == description::GetTypeDescriptor<IValueFunctionProxy>())
{
return true;
}
else if (typeInfo->GetTypeDescriptor() == description::GetTypeDescriptor<IValueEnumerable>())
{
return true;
}
else
{
return false;
}
default:
return false;
}
}
WString WfCppConfig::ConvertType(ITypeDescriptor* typeInfo, WString delimiter)
{
return ConvertFullName(CppGetFullName(typeInfo), delimiter);
}
WString WfCppConfig::ConvertType(ITypeInfo* typeInfo)
{
switch (typeInfo->GetDecorator())
{
case ITypeInfo::RawPtr:
return ConvertType(typeInfo->GetElementType()) + L"*";
case ITypeInfo::SharedPtr:
if (typeInfo->GetElementType()->GetDecorator() == ITypeInfo::Generic)
{
if (typeInfo->GetTypeDescriptor() == description::GetTypeDescriptor<IValueFunctionProxy>())
{
return ConvertType(typeInfo->GetElementType());
}
else if (typeInfo->GetTypeDescriptor() == description::GetTypeDescriptor<IValueEnumerable>())
{
return ConvertType(typeInfo->GetElementType());
}
}
return L"::vl::Ptr<" + ConvertType(typeInfo->GetElementType()) + L">";
case ITypeInfo::Nullable:
return L"::vl::Nullable<" + ConvertType(typeInfo->GetElementType()) + L">";
case ITypeInfo::Generic:
if (typeInfo->GetTypeDescriptor() == description::GetTypeDescriptor<IValueFunctionProxy>())
{
return L"::vl::Func<" + ConvertFunctionType(typeInfo) + L">";
}
else if(typeInfo->GetTypeDescriptor() == description::GetTypeDescriptor<IValueEnumerable>())
{
return L"::vl::collections::LazyList<" + ConvertType(typeInfo->GetGenericArgument(0)) + L">";
}
else
{
return ConvertType(typeInfo->GetElementType());
}
default:;
}
return ConvertType(typeInfo->GetTypeDescriptor());
}
WString WfCppConfig::ConvertArgumentType(ITypeInfo* typeInfo)
{
auto td = typeInfo->GetTypeDescriptor();
bool constRef =
td == description::GetTypeDescriptor<WString>() ||
td == description::GetTypeDescriptor<Value>() ||
(
typeInfo->GetDecorator() == ITypeInfo::SharedPtr && typeInfo->GetElementType()->GetDecorator() == ITypeInfo::Generic &&
(
td == description::GetTypeDescriptor<IValueFunctionProxy>() ||
td == description::GetTypeDescriptor<IValueEnumerable>()
)
);
if (constRef)
{
return L"const " + ConvertType(typeInfo) + L"&";
}
else
{
return ConvertType(typeInfo);
}
}
WString WfCppConfig::DefaultValue(ITypeInfo* typeInfo)
{
switch (typeInfo->GetDecorator())
{
case ITypeInfo::RawPtr:
return L"nullptr";
case ITypeInfo::SharedPtr:
return L"";
case ITypeInfo::Nullable:
return L"";
case ITypeInfo::Generic:
return L"";
default:;
}
auto td = typeInfo->GetTypeDescriptor();
if ((td->GetTypeDescriptorFlags()&TypeDescriptorFlags::EnumType) != TypeDescriptorFlags::Undefined)
{
return L"static_cast<" + ConvertType(typeInfo) + L">(0)";
}
if (td == description::GetTypeDescriptor<vint8_t>()) return L"0";
if (td == description::GetTypeDescriptor<vint16_t>()) return L"0";
if (td == description::GetTypeDescriptor<vint32_t>()) return L"0";
if (td == description::GetTypeDescriptor<vint64_t>()) return L"0";
if (td == description::GetTypeDescriptor<vuint8_t>()) return L"0";
if (td == description::GetTypeDescriptor<vuint16_t>()) return L"0";
if (td == description::GetTypeDescriptor<vuint32_t>()) return L"0";
if (td == description::GetTypeDescriptor<vuint64_t>()) return L"0";
if (td == description::GetTypeDescriptor<bool>()) return L"false";
if (td == description::GetTypeDescriptor<float>()) return L"0.0f";
if (td == description::GetTypeDescriptor<double>()) return L"0.0";
return L"";
}
vint WfCppConfig::CountClassNamespace(Ptr<WfClassDeclaration> decl)
{
vint result = 0;
auto scope = manager->nodeScopes[decl.Obj()].Obj();
while (scope)
{
if (scope->ownerNode.Cast<WfNamespaceDeclaration>())
{
result++;
}
scope = scope->parentScope.Obj();
}
return result;
}
void WfCppConfig::GetClassNamespace(Ptr<WfClassDeclaration> decl, collections::List<WString>& nss)
{
auto td = manager->declarationTypes[decl.Obj()].Obj();
auto name = ConvertType(td);
vint count = CountClassNamespace(decl);
List<Ptr<RegexMatch>> matches;
regexSplitName.Split(name, false, matches);
CopyFrom(
nss,
From(matches)
.Take(count)
.Select([this](Ptr<RegexMatch> match)
{
return ConvertName(match->Result().Value());
})
);
}
WString WfCppConfig::GetClassBaseName(Ptr<WfClassDeclaration> decl)
{
auto td = manager->declarationTypes[decl.Obj()].Obj();
auto name = ConvertType(td);
vint count = CountClassNamespace(decl);
List<Ptr<RegexMatch>> matches;
regexSplitName.Split(name, false, matches);
return From(matches)
.Skip(count)
.Select([this](Ptr<RegexMatch> match)
{
return ConvertName(match->Result().Value());
})
.Aggregate([](const WString& a, const WString& b)
{
return a + L"::" + b;
});
}
WString WfCppConfig::WriteNamespace(stream::StreamWriter& writer, collections::List<WString>& nss, collections::List<WString>& nss2)
{
vint commonPrefix = 0;
for (vint i = 0; i < nss.Count() && i < nss2.Count(); i++)
{
if (nss[i] == nss2[i])
{
commonPrefix++;
}
else
{
break;
}
}
while (nss.Count() > commonPrefix)
{
for (vint i = 1; i < nss.Count(); i++)
{
writer.WriteChar(L'\t');
}
writer.WriteLine(L"}");
nss.RemoveAt(nss.Count() - 1);
}
WString prefix;
for (vint i = 0; i < nss.Count(); i++)
{
prefix += L'\t';
}
for (vint i = commonPrefix; i < nss2.Count(); i++)
{
writer.WriteString(prefix);
writer.WriteString(L"namespace ");
writer.WriteLine(nss2[i]);
writer.WriteString(prefix);
writer.WriteLine(L"{");
nss.Add(nss2[i]);
prefix += L'\t';
}
return prefix;
}
WString WfCppConfig::WriteNamespace(stream::StreamWriter& writer, const WString& fullName, collections::List<WString>& nss, WString& name)
{
List<Ptr<RegexMatch>> matches;
regexSplitName.Split(fullName, false, matches);
List<WString> nss2;
CopyFrom(
nss2,
From(matches)
.Select([this](Ptr<RegexMatch> match)
{
return ConvertName(match->Result().Value());
})
);
name = nss2[nss2.Count() - 1];
nss2.RemoveAt(nss2.Count() - 1);
return WriteNamespace(writer, nss, nss2);
}
void WfCppConfig::WriteNamespaceEnd(stream::StreamWriter& writer, collections::List<WString>& nss)
{
while (nss.Count() > 0)
{
for (vint i = 1; i < nss.Count(); i++)
{
writer.WriteChar(L'\t');
}
writer.WriteLine(L"}");
nss.RemoveAt(0);
}
}
}
}
}
/***********************************************************************
CPP\WFCPP_CLASS.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace cppcodegen
{
using namespace collections;
using namespace reflection;
using namespace reflection::description;
using namespace analyzer;
bool IsVirtual(WfCppConfig* config, WfFunctionDeclaration* node)
{
vint index = config->manager->declarationMemberInfos.Keys().IndexOf(node);
if (index != -1)
{
auto methodInfo = dynamic_cast<IMethodInfo*>(config->manager->declarationMemberInfos.Values()[index].Obj());
if (methodInfo->IsStatic())
{
return false;
}
auto td = methodInfo->GetOwnerTypeDescriptor();
return td->GetTypeDescriptorFlags() == TypeDescriptorFlags::Interface;
}
return false;
}
/***********************************************************************
WfGenerateClassMemberDeclVisitor
***********************************************************************/
class WfGenerateClassMemberDeclVisitor : public Object, public WfDeclaration::IVisitor
{
public:
WfCppConfig* config;
stream::StreamWriter& writer;
WString className;
WString prefix;
bool forClassExpr;
WfGenerateClassMemberDeclVisitor(WfCppConfig* _config, stream::StreamWriter& _writer, const WString& _className, const WString& _prefix, bool _forClassExpr)
:config(_config)
, writer(_writer)
, className(_className)
, prefix(_prefix)
, forClassExpr(_forClassExpr)
{
}
void Visit(WfNamespaceDeclaration* node)override
{
}
void Visit(WfFunctionDeclaration* node)override
{
bool isVirtual = IsVirtual(config, node);
writer.WriteString(prefix);
if (isVirtual)
{
writer.WriteString(L"virtual ");
}
else if (node->classMember->kind == WfClassMemberKind::Static)
{
writer.WriteString(L"static ");
}
config->WriteFunctionHeader(writer, node, config->ConvertName(node->name.value), true);
if (isVirtual)
{
writer.WriteString(L" = 0");
}
else if (node->classMember->kind == WfClassMemberKind::Override)
{
writer.WriteString(L" override");
}
writer.WriteLine(L";");
}
void Visit(WfVariableDeclaration* node)override
{
auto scope = config->manager->nodeScopes[node].Obj();
auto symbol = scope->symbols[node->name.value][0];
auto typeInfo = symbol->typeInfo;
writer.WriteString(prefix + config->ConvertType(typeInfo.Obj()) + L" " + config->ConvertName(node->name.value));
if (!forClassExpr && node->expression)
{
writer.WriteString(L" = ");
GenerateExpression(config, writer, node->expression, typeInfo.Obj());
}
else
{
auto defaultValue = config->DefaultValue(typeInfo.Obj());
if (defaultValue != L"")
{
writer.WriteString(L" = ");
writer.WriteString(defaultValue);
}
}
writer.WriteLine(L";");
}
void Visit(WfEventDeclaration* node)override
{
auto eventInfo = dynamic_cast<IEventInfo*>(config->manager->declarationMemberInfos[node].Obj());
auto typeInfo = eventInfo->GetHandlerType();
writer.WriteString(prefix);
writer.WriteString(L"::vl::Event<void(");
vint count = typeInfo->GetGenericArgumentCount();
for (vint i = 1; i < count; i++)
{
if (i > 1) writer.WriteString(L", ");
writer.WriteString(config->ConvertType(typeInfo->GetGenericArgument(i)));
}
writer.WriteLine(L")> " + config->ConvertName(node->name.value) + L";");
}
void Visit(WfPropertyDeclaration* node)override
{
}
void Visit(WfConstructorDeclaration* node)override
{
auto methodInfo = dynamic_cast<IMethodInfo*>(config->manager->declarationMemberInfos[node].Obj());
writer.WriteString(prefix);
config->WriteFunctionHeader(writer, methodInfo, className, false);
writer.WriteLine(L";");
}
void Visit(WfDestructorDeclaration* node)override
{
writer.WriteLine(prefix + L"~" + className + L"();");
}
void Visit(WfClassDeclaration* node)override
{
}
void Visit(WfEnumDeclaration* node)override
{
}
void Visit(WfStructDeclaration* node)override
{
}
void Visit(WfVirtualDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, decl, node->expandedDeclarations)
{
decl->Accept(this);
}
}
};
void GenerateClassMemberDecl(WfCppConfig* config, stream::StreamWriter& writer, const WString& className, Ptr<WfDeclaration> memberDecl, const WString& prefix, bool forClassExpr)
{
WfGenerateClassMemberDeclVisitor visitor(config, writer, className, prefix, forClassExpr);
memberDecl->Accept(&visitor);
}
/***********************************************************************
WfGenerateClassMemberImplVisitor
***********************************************************************/
class WfGenerateClassMemberImplVisitor : public Object, public WfDeclaration::IVisitor
{
public:
WfCppConfig* config;
stream::StreamWriter& writer;
WString classBaseName;
WString className;
WString classFullName;
WString prefix;
bool printableMember = false;
WfGenerateClassMemberImplVisitor(WfCppConfig* _config, stream::StreamWriter& _writer, const WString& _classBaseName, const WString& _className, const WString& _classFullName, const WString& _prefix)
:config(_config)
, writer(_writer)
, classBaseName(_classBaseName)
, className(_className)
, classFullName(_classFullName)
, prefix(_prefix)
{
}
void WriteNotImplemented()
{
writer.WriteString(prefix);
writer.WriteLine(L"{");
writer.WriteString(prefix);
writer.WriteLine(L"\tthrow ::vl::Exception(L\"You should implement this function.\");");
writer.WriteString(prefix);
writer.WriteLine(L"}");
}
void Visit(WfNamespaceDeclaration* node)override
{
}
void Visit(WfFunctionDeclaration* node)override
{
if (!IsVirtual(config, node))
{
printableMember = true;
bool userImpl = config->attributeEvaluator->GetAttribute(node->attributes, L"cpp", L"UserImpl");
if (userImpl)
{
writer.WriteString(prefix);
writer.WriteString(L"USERIMPL(/* ");
writer.WriteString(classFullName);
writer.WriteLine(L" */)");
}
writer.WriteString(prefix);
auto returnType = config->WriteFunctionHeader(writer, node, classBaseName + L"::" + config->ConvertName(node->name.value), true);
writer.WriteLine(L"");
if (userImpl)
{
WriteNotImplemented();
}
else
{
config->WriteFunctionBody(writer, node->statement, prefix, returnType);
}
}
}
void Visit(WfVariableDeclaration* node)override
{
}
void Visit(WfEventDeclaration* node)override
{
}
void Visit(WfPropertyDeclaration* node)override
{
}
void Visit(WfConstructorDeclaration* node)override
{
auto scope = config->manager->nodeScopes[node].Obj();
printableMember = true;
auto methodInfo = dynamic_cast<IMethodInfo*>(config->manager->declarationMemberInfos[node].Obj());
List<WString> arguments;
FOREACH(Ptr<WfFunctionArgument>, argument, node->arguments)
{
arguments.Add(config->ConvertName(argument->name.value));
}
bool userImpl = config->attributeEvaluator->GetAttribute(node->attributes, L"cpp", L"UserImpl");
if (userImpl)
{
writer.WriteString(prefix);
writer.WriteString(L"USERIMPL(/* ");
writer.WriteString(classFullName);
writer.WriteLine(L" */)");
}
writer.WriteString(prefix);
config->WriteFunctionHeader(writer, methodInfo, arguments, classBaseName + L"::" + className, false);
writer.WriteLine(L"");
FOREACH_INDEXER(Ptr<WfBaseConstructorCall>, call, callIndex, node->baseConstructorCalls)
{
auto callType = CreateTypeInfoFromType(scope, call->type);
auto callCtor = config->manager->baseConstructorCallResolvings[{node, callType->GetTypeDescriptor()}].value;
writer.WriteString(prefix);
if (callIndex == 0)
{
writer.WriteString(L"\t: ");
}
else
{
writer.WriteString(L"\t, ");
}
writer.WriteString(config->ConvertType(callType->GetTypeDescriptor()));
writer.WriteString(L"(");
FOREACH_INDEXER(Ptr<WfExpression>, argument, argumentIndex, call->arguments)
{
if (argumentIndex) writer.WriteString(L", ");
GenerateExpression(config, writer, argument, callCtor->GetParameter(argumentIndex)->GetType());
}
writer.WriteLine(L")");
}
if (userImpl)
{
WriteNotImplemented();
}
else
{
config->WriteFunctionBody(writer, node->statement, prefix, nullptr);
}
}
void Visit(WfDestructorDeclaration* node)override
{
printableMember = true;
bool userImpl = config->attributeEvaluator->GetAttribute(node->attributes, L"cpp", L"UserImpl");
if (userImpl)
{
writer.WriteString(prefix);
writer.WriteString(L"USERIMPL(/* ");
writer.WriteString(classFullName);
writer.WriteLine(L" */)");
}
writer.WriteLine(prefix + classBaseName + L"::~" + className + L"()");
if (userImpl)
{
WriteNotImplemented();
}
else
{
config->WriteFunctionBody(writer, node->statement, prefix, nullptr);
}
}
void Visit(WfClassDeclaration* node)override
{
}
void Visit(WfEnumDeclaration* node)override
{
}
void Visit(WfStructDeclaration* node)override
{
}
void Visit(WfVirtualDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, decl, node->expandedDeclarations)
{
decl->Accept(this);
}
}
};
bool GenerateClassMemberImpl(WfCppConfig* config, stream::StreamWriter& writer, const WString& classBaseName, const WString& className, const WString& classFullName, Ptr<WfDeclaration> memberDecl, const WString& prefix)
{
WfGenerateClassMemberImplVisitor visitor(config, writer, classBaseName, className, classFullName, prefix);
memberDecl->Accept(&visitor);
return visitor.printableMember;
}
}
}
}
/***********************************************************************
CPP\WFCPP_COLLECT.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace cppcodegen
{
using namespace collections;
using namespace regex;
using namespace reflection::description;
using namespace analyzer;
/***********************************************************************
CollectModule
***********************************************************************/
class WfCollectModuleVisitor : public traverse_visitor::ModuleVisitor
{
public:
WfCppConfig* config;
WfClassDeclaration* surroundingClassDecl = nullptr;
WfFunctionDeclaration* funcDeclToSkip = nullptr;
WfVariableDeclaration* varDeclToSkip = nullptr;
WfCollectModuleVisitor(WfCppConfig* _config)
:config(_config)
{
}
WString GetScopePostfix(WfLexicalScope* scope)
{
WString name;
while (scope)
{
if (auto decl = scope->ownerNode.Cast<WfDeclaration>())
{
name = config->ConvertName(decl->name.value) + L"_" + name;
}
scope = scope->parentScope.Obj();
}
return name;
}
void Traverse(WfOrderedLambdaExpression* node)override
{
WString prefix = L"__vwsno" + itow(config->lambdaExprs.Count() + 1) + L"_" + config->assemblyName + L"_";
WString postfix = GetScopePostfix(config->manager->nodeScopes[node].Obj());
WString name = prefix + postfix;
config->lambdaExprs.Add(node, name);
config->classClosures.Add(surroundingClassDecl, node);
}
void Traverse(WfFunctionExpression* node)override
{
WString prefix = L"__vwsnf" + itow(config->lambdaExprs.Count() + 1) + L"_" + config->assemblyName + L"_";
WString postfix = GetScopePostfix(config->manager->nodeScopes[node].Obj());
WString name = prefix + postfix;
config->lambdaExprs.Add(node, name);
config->classClosures.Add(surroundingClassDecl, node);
}
void Traverse(WfNewInterfaceExpression* node)override
{
WString prefix = L"__vwsnc" + itow(config->classExprs.Count() + 1) + L"_" + config->assemblyName + L"_";
WString postfix = GetScopePostfix(config->manager->nodeScopes[node].Obj());
auto result = config->manager->expressionResolvings[node];
auto td = result.constructorInfo->GetOwnerTypeDescriptor();
WString name = prefix + postfix + config->ConvertType(td, L"_");
config->classExprs.Add(node, name);
config->classClosures.Add(surroundingClassDecl, node);
}
void Traverse(WfFunctionDeclaration* node)override
{
if (node != funcDeclToSkip && !node->classMember)
{
config->funcDecls.Add(node);
}
}
void Traverse(WfVariableDeclaration* node)override
{
if (node != varDeclToSkip && !node->classMember)
{
config->varDecls.Add(node);
}
}
void AddDeclFile(WfDeclaration* node)
{
if (surroundingClassDecl)
{
auto fileName = config->declFiles[surroundingClassDecl];
config->declFiles.Add(node, fileName);
}
else
{
config->declFiles.Add(node, L"");
}
}
void Visit(WfClassDeclaration* node)override
{
config->classDecls.Add(surroundingClassDecl, node);
if (surroundingClassDecl)
{
AddDeclFile(node);
}
else
{
WString file;
if (auto att = config->attributeEvaluator->GetAttribute(node->attributes, L"cpp", L"File"))
{
file = UnboxValue<WString>(config->attributeEvaluator->GetAttributeValue(att));
}
config->topLevelClassDeclsForFiles.Add(file, node);
config->declFiles.Add(node, file);
}
auto td = config->manager->declarationTypes[node].Obj();
vint count = td->GetBaseTypeDescriptorCount();
for (vint i = 0; i < count; i++)
{
auto baseTd = td->GetBaseTypeDescriptor(i);
auto scopeName = config->manager->typeNames[baseTd];
if (scopeName->declarations.Count() > 0)
{
config->declDependencies.Add(node, scopeName->declarations[0]);
}
}
auto oldSurroundingClassDecl = surroundingClassDecl;
surroundingClassDecl = node;
traverse_visitor::DeclarationVisitor::Visit(node);
surroundingClassDecl = oldSurroundingClassDecl;
}
void Traverse(WfEnumDeclaration* node)override
{
config->enumDecls.Add(surroundingClassDecl, node);
AddDeclFile(node);
}
void Traverse(WfStructDeclaration* node)override
{
config->structDecls.Add(surroundingClassDecl, node);
AddDeclFile(node);
auto td = config->manager->declarationTypes[node].Obj();
vint count = td->GetPropertyCount();
for (vint i = 0; i < count; i++)
{
auto propTd = td->GetProperty(i)->GetReturn()->GetTypeDescriptor();
auto scopeName = config->manager->typeNames[propTd];
if (scopeName->declarations.Count() > 0)
{
config->declDependencies.Add(node, scopeName->declarations[0]);
}
}
}
void Visit(WfFunctionExpression* node)override
{
auto old = funcDeclToSkip;
funcDeclToSkip = node->function.Obj();
traverse_visitor::ExpressionVisitor::Visit(node);
funcDeclToSkip = old;
}
void Visit(WfVariableStatement* node)override
{
auto old = varDeclToSkip;
varDeclToSkip = node->variable.Obj();
traverse_visitor::StatementVisitor::Visit(node);
varDeclToSkip = old;
}
};
void CollectModule(WfCppConfig* config, Ptr<WfModule> module)
{
WfCollectModuleVisitor(config).VisitField(module.Obj());
}
}
}
}
/***********************************************************************
CPP\WFCPP_EXPRESSION.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace cppcodegen
{
using namespace collections;
using namespace regex;
using namespace reflection;
using namespace reflection::description;
using namespace analyzer;
/***********************************************************************
Expression Helpers
***********************************************************************/
template<typename T>
void WriteBoxValue(WfCppConfig* config, stream::StreamWriter& writer, ITypeInfo* type, const T& writeExpression)
{
writer.WriteString(L"::vl::__vwsn::Box(");
writeExpression();
writer.WriteString(L")");
}
template<typename T>
void WriteUnboxValue(WfCppConfig* config, stream::StreamWriter& writer, ITypeInfo* type, const T& writeExpression)
{
writer.WriteString(L"::vl::__vwsn::Unbox<");
writer.WriteString(config->ConvertType(type));
writer.WriteString(L">(");
writeExpression();
writer.WriteString(L")");
}
template<typename T>
void WriteUnboxWeakValue(WfCppConfig* config, stream::StreamWriter& writer, ITypeInfo* type, const T& writeExpression)
{
writer.WriteString(L"::vl::__vwsn::UnboxWeak<");
writer.WriteString(config->ConvertType(type));
writer.WriteString(L">(");
writeExpression();
writer.WriteString(L")");
}
template<typename T>
void ConvertValueType(WfCppConfig* config, stream::StreamWriter& writer, ITypeDescriptor* fromTd, ITypeDescriptor* toTd, const T& writeExpression)
{
if (fromTd == toTd)
{
writeExpression();
}
else if (fromTd == description::GetTypeDescriptor<WString>())
{
writer.WriteString(L"::vl::__vwsn::Parse<");
writer.WriteString(config->ConvertType(toTd));
writer.WriteString(L">(");
writeExpression();
writer.WriteString(L")");
}
else if (toTd == description::GetTypeDescriptor<WString>())
{
writer.WriteString(L"::vl::__vwsn::ToString(");
writeExpression();
writer.WriteString(L")");
}
else
{
writer.WriteString(L"static_cast<");
writer.WriteString(config->ConvertType(toTd));
writer.WriteString(L">(");
writeExpression();
writer.WriteString(L")");
}
}
void ConvertType(WfCppConfig* config, stream::StreamWriter& writer, ITypeInfo* fromType, ITypeInfo* toType, const Func<void()>& writeExpression, bool strongCast)
{
if (fromType->GetTypeDescriptor()->GetTypeDescriptorFlags() == TypeDescriptorFlags::Object)
{
if (strongCast)
{
WriteUnboxValue(config, writer, toType, writeExpression);
}
else
{
WriteUnboxWeakValue(config, writer, toType, writeExpression);
}
return;
}
else if (toType->GetTypeDescriptor()->GetTypeDescriptorFlags() == TypeDescriptorFlags::Object)
{
WriteBoxValue(config, writer, fromType, writeExpression);
return;
}
else
{
auto tdVe = description::GetTypeDescriptor<IValueEnumerable>();
if (toType->GetTypeDescriptor() == tdVe)
{
if (toType->GetElementType()->GetDecorator() == ITypeInfo::Generic)
{
if ((fromType->GetTypeDescriptor() == tdVe && fromType->GetElementType()->GetDecorator() != ITypeInfo::Generic)
|| fromType->GetTypeDescriptor()->CanConvertTo(description::GetTypeDescriptor<IValueReadonlyList>())
|| fromType->GetTypeDescriptor()->CanConvertTo(description::GetTypeDescriptor<IValueReadonlyDictionary>())
)
{
writer.WriteString(L"::vl::reflection::description::GetLazyList<");
writer.WriteString(config->ConvertType(toType->GetElementType()->GetGenericArgument(0)));
writer.WriteString(L">(");
writeExpression();
writer.WriteString(L")");
return;
}
}
else
{
if ((fromType->GetTypeDescriptor() == tdVe && fromType->GetElementType()->GetDecorator() == ITypeInfo::Generic)
|| fromType->GetHint() == TypeInfoHint::NativeCollectionReference
)
{
writer.WriteString(L"::vl::__vwsn::UnboxCollection<");
writer.WriteString(config->ConvertType(tdVe));
writer.WriteString(L">(");
writeExpression();
writer.WriteString(L")");
return;
}
}
}
switch (fromType->GetDecorator())
{
case ITypeInfo::RawPtr:
{
switch (toType->GetDecorator())
{
case ITypeInfo::RawPtr:
if (strongCast) writer.WriteString(L"::vl::__vwsn::Ensure(");
if (fromType->GetTypeDescriptor()->CanConvertTo(toType->GetTypeDescriptor()))
{
writer.WriteString(L"static_cast<");
writer.WriteString(config->ConvertType(toType->GetTypeDescriptor()));
writer.WriteString(L"*>(");
writeExpression();
writer.WriteString(L")");
}
else
{
writer.WriteString(L"::vl::__vwsn::RawPtrCast<");
writer.WriteString(config->ConvertType(toType->GetTypeDescriptor()));
writer.WriteString(L">(");
writeExpression();
writer.WriteString(L")");
}
if (strongCast) writer.WriteString(L")");
return;
case ITypeInfo::SharedPtr:
if (strongCast) writer.WriteString(L"::vl::__vwsn::Ensure(");
if (fromType->GetTypeDescriptor()->CanConvertTo(toType->GetTypeDescriptor()))
{
writer.WriteString(L"::vl::Ptr<");
writer.WriteString(config->ConvertType(toType->GetTypeDescriptor()));
writer.WriteString(L">(");
writeExpression();
writer.WriteString(L")");
}
else
{
writer.WriteString(L"::vl::__vwsn::SharedPtrCast<");
writer.WriteString(config->ConvertType(toType->GetTypeDescriptor()));
writer.WriteString(L">(");
writeExpression();
writer.WriteString(L")");
}
if (strongCast) writer.WriteString(L")");
return;
default:;
}
}
break;
case ITypeInfo::SharedPtr:
{
switch (toType->GetDecorator())
{
case ITypeInfo::RawPtr:
if (strongCast) writer.WriteString(L"::vl::__vwsn::Ensure(");
if (fromType->GetTypeDescriptor()->CanConvertTo(toType->GetTypeDescriptor()))
{
writer.WriteString(L"static_cast<");
writer.WriteString(config->ConvertType(toType->GetTypeDescriptor()));
writer.WriteString(L"*>(");
writeExpression();
writer.WriteString(L".Obj())");
}
else
{
writer.WriteString(L"::vl::__vwsn::RawPtrCast<");
writer.WriteString(config->ConvertType(toType->GetTypeDescriptor()));
writer.WriteString(L">(");
writeExpression();
writer.WriteString(L".Obj())");
}
if (strongCast) writer.WriteString(L")");
return;
case ITypeInfo::SharedPtr:
if (strongCast) writer.WriteString(L"::vl::__vwsn::Ensure(");
if (fromType->GetTypeDescriptor()->CanConvertTo(toType->GetTypeDescriptor()))
{
writer.WriteString(L"::vl::Ptr<");
writer.WriteString(config->ConvertType(toType->GetTypeDescriptor()));
writer.WriteString(L">(");
writeExpression();
writer.WriteString(L")");
}
else
{
writer.WriteString(L"::vl::__vwsn::SharedPtrCast<");
writer.WriteString(config->ConvertType(toType->GetTypeDescriptor()));
writer.WriteString(L">(");
writeExpression();
writer.WriteString(L".Obj())");
}
if (strongCast) writer.WriteString(L")");
return;
default:;
}
}
break;
case ITypeInfo::Nullable:
{
switch (toType->GetDecorator())
{
case ITypeInfo::Nullable:
if (strongCast) writer.WriteString(L"::vl::__vwsn::Ensure(");
writer.WriteString(L"::vl::__vwsn::NullableCast<");
writer.WriteString(config->ConvertType(toType->GetTypeDescriptor()));
writer.WriteString(L">(");
writeExpression();
writer.WriteString(L")");
if (strongCast) writer.WriteString(L")");
return;
case ITypeInfo::TypeDescriptor:
ConvertValueType(config, writer, fromType->GetTypeDescriptor(), toType->GetTypeDescriptor(), [&]()
{
writeExpression();
writer.WriteString(L".Value()");
});
return;
default:;
}
}
break;
case ITypeInfo::TypeDescriptor:
{
switch (toType->GetDecorator())
{
case ITypeInfo::Nullable:
writer.WriteString(config->ConvertType(toType));
writer.WriteString(L"(");
ConvertValueType(config, writer, fromType->GetTypeDescriptor(), toType->GetTypeDescriptor(), writeExpression);
writer.WriteString(L")");
return;
case ITypeInfo::TypeDescriptor:
ConvertValueType(config, writer, fromType->GetTypeDescriptor(), toType->GetTypeDescriptor(), writeExpression);
return;
default:;
}
}
break;
default:;
}
}
writer.WriteString(L"/* NOT EXISTS: convert (");
writer.WriteString(config->ConvertType(fromType));
writer.WriteString(L") to (");
writer.WriteString(config->ConvertType(toType));
writer.WriteString(L") */ __vwsn_not_exists__(");
writeExpression();
writer.WriteString(L")");
}
/***********************************************************************
WfGenerateExpressionVisitor
***********************************************************************/
class WfGenerateExpressionVisitor
: public Object
, public WfExpression::IVisitor
{
public:
WfCppConfig* config;
stream::StreamWriter& writer;
bool useReturnValue;
WfGenerateExpressionVisitor(WfCppConfig* _config, stream::StreamWriter& _writer, bool _useReturnValue)
:config(_config)
, writer(_writer)
, useReturnValue(_useReturnValue)
{
}
bool NeedConvertType(ITypeInfo* fromType, ITypeInfo*& toType)
{
if (toType == nullptr)
{
toType = fromType;
return false;
}
if (IsSameType(fromType, toType))
{
return false;
}
else
{
return true;
}
}
template<typename T>
void WriteBoxValue(ITypeInfo* type, const T& writeExpression)
{
cppcodegen::WriteBoxValue(config, writer, type, writeExpression);
}
template<typename T>
void WriteUnboxValue(ITypeInfo* type, const T& writeExpression)
{
cppcodegen::WriteUnboxValue(config, writer, type, writeExpression);
}
template<typename T>
void WriteUnboxWeakValue(ITypeInfo* type, const T& writeExpression)
{
cppcodegen::WriteUnboxWeakValue(config, writer, type, writeExpression);
}
void ConvertMultipleTypes(ITypeInfo** types, vint typesLength, Func<void()> writeExpression)
{
if (typesLength == 1)
{
writeExpression();
}
else if (NeedConvertType(types[0], types[1]))
{
ConvertMultipleTypes(types + 1, typesLength - 1, [&]()
{
auto fromType = types[0];
auto toType = types[1];
ConvertType(config, writer, fromType, toType, writeExpression, false);
});
}
else
{
return ConvertMultipleTypes(types + 1, typesLength - 1, writeExpression);
}
}
void Call(Ptr<WfExpression> node, ITypeInfo* expectedType = nullptr, bool useReturnValue = true)
{
GenerateExpression(config, writer, node, expectedType, useReturnValue);
}
Ptr<WfCppConfig::ClosureInfo> GetClosureInfo(WfExpression* node, Ptr<WfLexicalSymbol> testCtorArgumentSymbol = nullptr)
{
Ptr<WfCppConfig::ClosureInfo> closureInfo;
auto scope = config->manager->nodeScopes[node].Obj();
if (dynamic_cast<WfOrderedLambdaExpression*>(node))
{
scope = scope->parentScope.Obj();
}
while (scope)
{
if (scope->functionConfig && scope->functionConfig->lambda)
{
auto source = scope->ownerNodeSource ? scope->ownerNodeSource : scope->ownerNode.Obj();
if (auto ordered = dynamic_cast<WfOrderedLambdaExpression*>(source))
{
closureInfo = config->closureInfos[ordered];
break;
}
else if (auto funcExpr = dynamic_cast<WfFunctionExpression*>(source))
{
closureInfo = config->closureInfos[funcExpr];
break;
}
else if (auto classExpr = dynamic_cast<WfNewInterfaceExpression*>(source))
{
closureInfo = config->closureInfos[classExpr];
break;
}
}
else if (auto classExpr = scope->ownerNode.Cast<WfNewInterfaceExpression>())
{
auto info = config->closureInfos[classExpr.Obj()];
if (info->ctorArgumentSymbols.Values().Contains(testCtorArgumentSymbol.Obj()))
{
closureInfo = info;
break;
}
}
scope = scope->parentScope.Obj();
}
return closureInfo;
}
void WriteNotExists(ITypeDescriptor* typeDescriptor)
{
writer.WriteString(L"/* NOT EXISTS: type(");
writer.WriteString(typeDescriptor->GetTypeName());
writer.WriteString(L") */ __vwsn_not_exists__");
}
void WriteNotExists(IMethodInfo* methodInfo)
{
writer.WriteString(L"/* NOT EXISTS: method(");
writer.WriteString(methodInfo->GetName());
writer.WriteString(L") of type (");
writer.WriteString(methodInfo->GetOwnerTypeDescriptor()->GetTypeName());
writer.WriteString(L") */ __vwsn_not_exists__");
}
void WriteNotExists(IPropertyInfo* propertyInfo)
{
writer.WriteString(L"/* NOT EXISTS: property(");
writer.WriteString(propertyInfo->GetName());
writer.WriteString(L") of type (");
writer.WriteString(propertyInfo->GetOwnerTypeDescriptor()->GetTypeName());
writer.WriteString(L") */ __vwsn_not_exists__");
}
void WriteNotExists(IEventInfo* eventInfo)
{
writer.WriteString(L"/* NOT EXISTS: event(");
writer.WriteString(eventInfo->GetName());
writer.WriteString(L") of type (");
writer.WriteString(eventInfo->GetOwnerTypeDescriptor()->GetTypeName());
writer.WriteString(L") */ __vwsn_not_exists__");
}
template<typename T>
void WriteTemplate(const WString& templateValue, const T& callback)
{
List<Ptr<RegexMatch>> matches;
config->regexTemplate.Cut(templateValue, false, matches);
FOREACH(Ptr<RegexMatch>, match, matches)
{
WString item = match->Result().Value();
if (match->Success())
{
if (!callback(item))
{
writer.WriteString(L"/* NOT EXISTS: ");
writer.WriteString(item);
writer.WriteString(L" */ __vwsn_not_exists__");
}
}
else
{
writer.WriteString(item);
}
}
}
void VisitThisExpression(WfExpression* node, ITypeDescriptor* td)
{
if (auto closureInfo = GetClosureInfo(node))
{
FOREACH_INDEXER(ITypeDescriptor*, thisType, index, closureInfo->thisTypes)
{
if (thisType->CanConvertTo(td))
{
writer.WriteString(L"__vwsnthis_");
writer.WriteString(itow(index));
return;
}
}
}
writer.WriteString(L"this");
}
void VisitSymbol(WfExpression* node, Ptr<WfLexicalSymbol> symbol, bool forLambdaArgument)
{
if (auto varDecl = symbol->creatorNode.Cast<WfVariableDeclaration>())
{
auto ownerNode = symbol->ownerScope->ownerNode;
if (ownerNode.Cast<WfNamespaceDeclaration>() || ownerNode.Cast<WfModule>())
{
writer.WriteString(L"GLOBAL_NAME ");
writer.WriteString(config->ConvertName(symbol->name));
return;
}
else if(auto closureInfo = GetClosureInfo(node, (forLambdaArgument ? nullptr : symbol)))
{
if (closureInfo->symbols.Values().Contains(symbol.Obj()))
{
writer.WriteString(L"::vl::__vwsn::This(this)->");
writer.WriteString(config->ConvertName(symbol->name));
return;
}
else if (closureInfo->ctorArgumentSymbols.Values().Contains(symbol.Obj()))
{
writer.WriteString(L"__vwsnctor_");
writer.WriteString(config->ConvertName(symbol->name));
return;
}
}
writer.WriteString(config->ConvertName(symbol->name));
return;
}
else if (auto funcDecl = symbol->creatorNode.Cast<WfFunctionDeclaration>())
{
auto ownerNode = symbol->ownerScope->ownerNode;
if (ownerNode.Cast<WfNamespaceDeclaration>() || ownerNode.Cast<WfModule>())
{
writer.WriteString(config->ConvertType(symbol->typeInfo.Obj()));
writer.WriteString(L"(GLOBAL_OBJ, &GLOBAL_SYMBOL ");
writer.WriteString(config->ConvertName(symbol->name));
writer.WriteString(L")");
return;
}
else if (auto classExpr = ownerNode.Cast<WfNewInterfaceExpression>())
{
writer.WriteString(config->ConvertType(symbol->typeInfo.Obj()));
writer.WriteString(L"(::vl::__vwsn::This(this), &");
writer.WriteString(config->classExprs[classExpr.Obj()]);
writer.WriteString(L"::");
writer.WriteString(config->ConvertName(symbol->name));
writer.WriteString(L")");
return;
}
else if (symbol->ownerScope->functionConfig && symbol->ownerScope->functionConfig->lambda && symbol->name == funcDecl->name.value)
{
auto scope = config->manager->nodeScopes[funcDecl.Obj()];
auto closureInfo = config->closureInfos[dynamic_cast<WfFunctionExpression*>(scope->ownerNodeSource)];
writer.WriteString(L"LAMBDA(::");
writer.WriteString(config->assemblyNamespace);
writer.WriteString(L"::");
writer.WriteString(closureInfo->lambdaClassName);
writer.WriteString(L"(");
FOREACH_INDEXER(WString, symbolName, index, closureInfo->symbols.Keys())
{
if (index > 0)
{
writer.WriteString(L", ");
}
writer.WriteString(config->ConvertName(symbol->name));
}
FOREACH_INDEXER(ITypeDescriptor*, thisType, index, closureInfo->thisTypes)
{
if (index > 0 || closureInfo->symbols.Count() > 0)
{
writer.WriteString(L", ");
}
writer.WriteString(L" __vwsnctorthis_" + itow(index));
}
writer.WriteString(L"))");
return;
}
}
writer.WriteString(config->ConvertName(symbol->name));
}
enum class CommaPosition
{
Left,
Right,
No,
};
bool IsCppRefGenericType(ITypeInfo* type)
{
switch (type->GetHint())
{
case TypeInfoHint::Array:
case TypeInfoHint::List:
case TypeInfoHint::SortedList:
case TypeInfoHint::Dictionary:
return true;
default:
return false;
}
}
template<typename TReturnValue>
void WriteReturnValue(ITypeInfo* type, const TReturnValue& returnValueCallback, bool castReturnValue)
{
if (castReturnValue)
{
if (IsCppRefGenericType(type) || type->GetHint() == TypeInfoHint::NativeCollectionReference)
{
writer.WriteString(L"::vl::__vwsn::UnboxCollection<");
writer.WriteString(config->ConvertType(type->GetTypeDescriptor()));
writer.WriteString(L">(");
returnValueCallback();
writer.WriteString(L")");
return;
}
}
returnValueCallback();
}
template<typename TType, typename TInvoke, typename TArgument, typename TInfo>
void WriteInvokeTemplate(vint count, ITypeInfo* returnType, const TType& typeCallback, const TInvoke& invokeCallback, const TArgument& argumentCallback, TInfo* info, bool castReturnValue)
{
if (Range<vint>(0, count).Any([&](vint index) {return IsCppRefGenericType(typeCallback(index)); }))
{
writer.WriteString(L"[&]()->decltype(auto){");
for (vint i = 0; i < count; i++)
{
auto type = typeCallback(i);
if (IsCppRefGenericType(type))
{
writer.WriteString(L" auto __vwsn_temp_x");
writer.WriteString(itow(i));
writer.WriteString(L" = ::vl::__vwsn::Box(");
argumentCallback(info, i);
writer.WriteString(L"); ");
switch (type->GetHint())
{
case TypeInfoHint::Array:
writer.WriteString(L"::vl::collections::Array<");
break;
case TypeInfoHint::List:
writer.WriteString(L"::vl::collections::List<");
break;
case TypeInfoHint::SortedList:
writer.WriteString(L"::vl::collections::SortedList<");
break;
case TypeInfoHint::Dictionary:
writer.WriteString(L"::vl::collections::Dictionary<");
break;
default:;
}
vint count = type->GetElementType()->GetGenericArgumentCount();
for (vint i = 0; i < count; i++)
{
if (i > 0) writer.WriteString(L", ");
writer.WriteString(config->ConvertType(type->GetElementType()->GetGenericArgument(i)));
}
writer.WriteString(L"> __vwsn_temp_");
writer.WriteString(itow(i));
writer.WriteString(L"; ::vl::reflection::description::UnboxParameter(__vwsn_temp_x");
writer.WriteString(itow(i));
writer.WriteString(L", __vwsn_temp_");
writer.WriteString(itow(i));
writer.WriteString(L");");
}
else
{
writer.WriteString(L" auto __vwsn_temp_");
writer.WriteString(itow(i));
writer.WriteString(L" = ");
argumentCallback(info, i);
writer.WriteString(L";");
}
}
writer.WriteString(L" return ");
WriteReturnValue(returnType, [&]() { invokeCallback(true); }, castReturnValue);
writer.WriteString(L"; }()");
}
else
{
WriteReturnValue(returnType, [&]() { invokeCallback(false); }, castReturnValue);
}
}
template<typename TThis, typename TArgument>
void WriteMethodTemplate(const WString& templateValue, IMethodInfo* methodInfo, const TThis& thisCallback, const TArgument& argumentCallback, bool castReturnValue)
{
WriteInvokeTemplate(methodInfo->GetParameterCount(), methodInfo->GetReturn(), [&](vint index) { return methodInfo->GetParameter(index)->GetType(); },
[&](bool useTemporaryArgument)
{
WriteTemplate(templateValue, [&](const WString& item)
{
auto cp = CommaPosition::No;
vint count = methodInfo->GetParameterCount();
if (item == L"$Type")
{
writer.WriteString(config->ConvertType(methodInfo->GetOwnerTypeDescriptor()));
return true;
}
else if (item == L"$Func")
{
writer.WriteString(config->ConvertFunctionType(methodInfo));
return true;
}
else if (item == L"$Name")
{
writer.WriteString(config->ConvertName(methodInfo->GetName()));
return true;
}
else if (item == L"$This")
{
if (!methodInfo->IsStatic())
{
return thisCallback(methodInfo);
}
}
else if (item == L"$Arguments")
{
if (count == 0)
{
return true;
}
}
else if (item == L", $Arguments")
{
if (count == 0)
{
return true;
}
cp = CommaPosition::Left;
}
else if (item == L"$Arguments, ")
{
if (count == 0)
{
return true;
}
cp = CommaPosition::Right;
}
else
{
return false;
}
if (count > 0)
{
if (cp == CommaPosition::Left) writer.WriteString(L", ");
for (vint i = 0; i < count; i++)
{
if (i > 0) writer.WriteString(L", ");
if (useTemporaryArgument)
{
writer.WriteString(L"__vwsn_temp_");
writer.WriteString(itow(i));
}
else
{
argumentCallback(methodInfo, i);
}
}
if (cp == CommaPosition::Right) writer.WriteString(L", ");
}
return true;
});
}, argumentCallback, methodInfo, castReturnValue);
}
template<typename TThis>
void WritePropertyTemplate(const WString& templateValue, IPropertyInfo* propertyInfo, const TThis& thisCallback, bool castReturnValue)
{
WriteReturnValue(propertyInfo->GetReturn(),
[&]()
{
WriteTemplate(templateValue, [&](const WString& item)
{
if (item == L"$Type")
{
writer.WriteString(config->ConvertType(propertyInfo->GetOwnerTypeDescriptor()));
return true;
}
else if (item == L"$Name")
{
writer.WriteString(config->ConvertName(propertyInfo->GetName()));
return true;
}
else if (item == L"$This")
{
return thisCallback(propertyInfo);
}
return false;
});
}, castReturnValue);
}
template<typename TThis, typename THandler, typename TArgument>
void WriteEventTemplate(const WString& templateValue, IEventInfo* eventInfo, const TThis& thisCallback, const THandler& handlerCallback, const TArgument& argumentCallback)
{
auto handlerType = eventInfo->GetHandlerType()->GetElementType();
WriteInvokeTemplate(handlerType->GetGenericArgumentCount() - 1, handlerType->GetGenericArgument(0), [&](vint index) { return handlerType->GetGenericArgument(index + 1); },
[&](bool useTemporaryArgument)
{
WriteTemplate(templateValue, [&](const WString& item)
{
auto cp = CommaPosition::No;
vint count = eventInfo->GetHandlerType()->GetElementType()->GetGenericArgumentCount() - 1;
if (item == L"$Name")
{
writer.WriteString(config->ConvertName(eventInfo->GetName()));
return true;
}
else if (item == L"$This")
{
return thisCallback(eventInfo);
}
else if (item == L"$Handler")
{
return handlerCallback(eventInfo);
}
else if (item == L"$Arguments")
{
if (count == 0)
{
return true;
}
}
else if (item == L", $Arguments")
{
if (count == 0)
{
return true;
}
cp = CommaPosition::Left;
}
else if (item == L"$Arguments, ")
{
if (count == 0)
{
return true;
}
cp = CommaPosition::Right;
}
else
{
return false;
}
if (count > 0)
{
if (cp == CommaPosition::Left) writer.WriteString(L", ");
for (vint i = 0; i < count; i++)
{
if (i > 0) writer.WriteString(L", ");
if (useTemporaryArgument)
{
writer.WriteString(L"__vwsn_temp_");
writer.WriteString(itow(i));
}
else
{
argumentCallback(eventInfo, i);
}
}
if (cp == CommaPosition::Right) writer.WriteString(L", ");
}
return true;
});
}, argumentCallback, eventInfo, false);
}
template<typename TMethodThis, typename TPropertyThis>
bool WriteReferenceTemplate(ResolveExpressionResult& result, const TMethodThis& methodThis, const TPropertyThis& propertyThis, bool castReturnValue)
{
if (result.methodInfo)
{
if (CppExists(result.methodInfo))
{
auto methodInfo = result.methodInfo;
WriteMethodTemplate(CppGetClosureTemplate(methodInfo), methodInfo, methodThis, [&](IMethodInfo*, vint){}, castReturnValue);
}
else
{
WriteNotExists(result.methodInfo);
}
return true;
}
else if (result.propertyInfo)
{
if (CppExists(result.propertyInfo))
{
if (result.propertyInfo->GetCpp() == nullptr && result.propertyInfo->GetGetter() != nullptr)
{
auto methodInfo = result.propertyInfo->GetGetter();
WriteMethodTemplate(CppGetInvokeTemplate(methodInfo), methodInfo, methodThis, [&](IMethodInfo*, vint){}, castReturnValue);
}
else
{
auto templateValue = CppGetReferenceTemplate(result.propertyInfo);
auto propertyInfo = result.propertyInfo;
WritePropertyTemplate(CppGetReferenceTemplate(propertyInfo), propertyInfo, propertyThis, castReturnValue);
}
}
else
{
WriteNotExists(result.propertyInfo);
}
return true;
}
else
{
return false;
}
}
void VisitReferenceExpression(WfExpression* node, const WString& name)
{
auto result = config->manager->expressionResolvings[node];
bool success = WriteReferenceTemplate(result,
[&](IMethodInfo* methodInfo)
{
writer.WriteString(L"::vl::__vwsn::This(");
VisitThisExpression(node, methodInfo->GetOwnerTypeDescriptor());
if (result.type->GetDecorator() == ITypeInfo::SharedPtr)
{
writer.WriteString(L".Obj()");
}
writer.WriteString(L")");
return true;
},
[&](IPropertyInfo* propertyInfo)
{
auto isRef = (propertyInfo->GetOwnerTypeDescriptor()->GetTypeDescriptorFlags() & TypeDescriptorFlags::ReferenceType) != TypeDescriptorFlags::Undefined;
if (isRef) writer.WriteString(L"::vl::__vwsn::This(");
VisitThisExpression(node, propertyInfo->GetOwnerTypeDescriptor());
if (isRef) writer.WriteString(L")");
return true;
}, useReturnValue);
if (!success)
{
if (result.symbol)
{
VisitSymbol(node, result.symbol, false);
}
else
{
if ((result.type->GetTypeDescriptor()->GetTypeDescriptorFlags() & TypeDescriptorFlags::EnumType) != TypeDescriptorFlags::Undefined)
{
auto enumType = result.type->GetTypeDescriptor()->GetEnumType();
vint index = enumType->IndexOfItem(name);
if (index != -1)
{
writer.WriteString(config->ConvertType(result.type.Obj()));
writer.WriteString(L"::");
writer.WriteString(name);
return;
}
}
CHECK_FAIL(L"WfGenerateExpressionVisitor::VisitReferenceExpression(WfExpression*, const WString&)#Internal error, cannot find any record of this expression.");
}
}
}
void WriteClosureArguments(Ptr<WfCppConfig::ClosureInfo> closureInfo, WfExpression* node)
{
vint index = 0;
FOREACH(Ptr<WfLexicalSymbol>, symbol, From(closureInfo->symbols.Values()).Union(closureInfo->ctorArgumentSymbols.Values()))
{
if (index++ > 0)
{
writer.WriteString(L", ");
}
VisitSymbol(node, symbol, true);
}
FOREACH(ITypeDescriptor*, thisType, closureInfo->thisTypes)
{
if (index++ > 0)
{
writer.WriteString(L", ");
}
VisitThisExpression(node, thisType);
}
}
void Visit(WfThisExpression* node)override
{
auto result = config->manager->expressionResolvings[node];
VisitThisExpression(node, result.type->GetTypeDescriptor());
}
void Visit(WfTopQualifiedExpression* node)override
{
VisitReferenceExpression(node, node->name.value);
}
void Visit(WfReferenceExpression* node)override
{
VisitReferenceExpression(node, node->name.value);
}
void Visit(WfOrderedNameExpression* node)override
{
VisitReferenceExpression(node, node->name.value);
}
void Visit(WfOrderedLambdaExpression* node)override
{
writer.WriteString(L"LAMBDA(::");
writer.WriteString(config->assemblyNamespace);
writer.WriteString(L"::");
writer.WriteString(config->lambdaExprs[node]);
writer.WriteString(L"(");
auto closureInfo = config->closureInfos[node];
WriteClosureArguments(closureInfo, node);
writer.WriteString(L"))");
}
void Visit(WfMemberExpression* node)override
{
auto result = config->manager->expressionResolvings[node];
auto parentResult = config->manager->expressionResolvings[node->parent.Obj()];
WriteReferenceTemplate(result,
[&](IMethodInfo* methodInfo)
{
writer.WriteString(L"::vl::__vwsn::This(");
Call(node->parent);
if (parentResult.type->GetDecorator() == ITypeInfo::SharedPtr)
{
writer.WriteString(L".Obj()");
}
writer.WriteString(L")");
return true;
},
[&](IPropertyInfo* propertyInfo)
{
auto isRef = (propertyInfo->GetOwnerTypeDescriptor()->GetTypeDescriptorFlags() & TypeDescriptorFlags::ReferenceType) != TypeDescriptorFlags::Undefined;
if (isRef) writer.WriteString(L"::vl::__vwsn::This(");
Call(node->parent);
if (parentResult.type->GetDecorator() == ITypeInfo::SharedPtr)
{
writer.WriteString(L".Obj()");
}
if (isRef) writer.WriteString(L")");
return true;
}, useReturnValue);
}
void Visit(WfChildExpression* node)override
{
VisitReferenceExpression(node, node->name.value);
}
void Visit(WfLiteralExpression* node)override
{
switch (node->value)
{
case WfLiteralValue::Null:
{
auto result = config->manager->expressionResolvings[node];
switch (result.type->GetDecorator())
{
case ITypeInfo::Nullable:
case ITypeInfo::SharedPtr:
writer.WriteString(config->ConvertType(result.type.Obj()));
writer.WriteString(L"()");
break;
case ITypeInfo::TypeDescriptor:
writer.WriteString(L"::vl::reflection::description::Value()");
break;
default:
writer.WriteString(L"static_cast<");
writer.WriteString(config->ConvertType(result.type.Obj()));
writer.WriteString(L">(nullptr)");
}
}
break;
case WfLiteralValue::True:
writer.WriteString(L"true");
break;
case WfLiteralValue::False:
writer.WriteString(L"false");
break;
}
}
void Visit(WfFloatingExpression* node)override
{
auto result = config->manager->expressionResolvings[node];
auto td = result.type->GetTypeDescriptor();
if (td == description::GetTypeDescriptor<float>())
{
writer.WriteString(node->value.value + L"f");
}
else if (td == description::GetTypeDescriptor<double>())
{
writer.WriteString(node->value.value);
}
}
void Visit(WfIntegerExpression* node)override
{
auto result = config->manager->expressionResolvings[node];
auto td = result.type->GetTypeDescriptor();
if (td == description::GetTypeDescriptor<vint32_t>())
{
writer.WriteString(node->value.value);
}
else if (td == description::GetTypeDescriptor<vuint32_t>())
{
writer.WriteString(node->value.value + L"U");
}
else if (td == description::GetTypeDescriptor<vint64_t>())
{
writer.WriteString(node->value.value + L"L");
}
else if (td == description::GetTypeDescriptor<vuint64_t>())
{
writer.WriteString(node->value.value + L"UL");
}
}
void Visit(WfStringExpression* node)override
{
writer.WriteString(L"::vl::WString(L\"");
for (vint i = 0; i < node->value.value.Length(); i++)
{
auto c = node->value.value[i];
switch (c)
{
case L'\'': writer.WriteString(L"\\\'"); break;
case L'\"': writer.WriteString(L"\\\""); break;
case L'\r': writer.WriteString(L"\\r"); break;
case L'\n': writer.WriteString(L"\\n"); break;
case L'\t': writer.WriteString(L"\\t"); break;
default: writer.WriteChar(c);
}
}
writer.WriteString(L"\", false)");
}
void Visit(WfUnaryExpression* node)override
{
auto result = config->manager->expressionResolvings[node];
switch (node->op)
{
case WfUnaryOperator::Positive:
writer.WriteString(L"(+ ");
Call(node->operand, result.type.Obj());
writer.WriteString(L")");
break;
case WfUnaryOperator::Negative:
writer.WriteString(L"(- ");
Call(node->operand, result.type.Obj());
writer.WriteString(L")");
break;
case WfUnaryOperator::Not:
{
if (result.type->GetTypeDescriptor() == description::GetTypeDescriptor<bool>())
{
writer.WriteString(L"(! ");
}
else
{
if (BinaryNeedConvert(result.type->GetTypeDescriptor()))
{
writer.WriteString(L"static_cast<");
writer.WriteString(config->ConvertType(result.type->GetTypeDescriptor()));
writer.WriteString(L">");
}
writer.WriteString(L"(~ ");
}
Call(node->operand, result.type.Obj());
writer.WriteString(L")");
}
break;
}
}
void VisitBinaryExpression(WfBinaryExpression* node, const wchar_t* op, ITypeDescriptor* resultType, ITypeInfo* operandType)
{
if (resultType)
{
writer.WriteString(L"static_cast<");
writer.WriteString(config->ConvertType(resultType));
writer.WriteString(L">");
}
writer.WriteString(L"(");
Call(node->first, operandType);
writer.WriteString(L" ");
writer.WriteString(op);
writer.WriteString(L" ");
Call(node->second, operandType);
writer.WriteString(L")");
}
bool BinaryNeedConvert(ITypeDescriptor* type)
{
return type == description::GetTypeDescriptor<vint8_t>()
|| type == description::GetTypeDescriptor<vint16_t>()
|| type == description::GetTypeDescriptor<vuint8_t>()
|| type == description::GetTypeDescriptor<vuint16_t>()
;
}
void Visit(WfBinaryExpression* node)override
{
if (node->op == WfBinaryOperator::Assign)
{
auto result = config->manager->expressionResolvings[node->first.Obj()];
if (result.propertyInfo)
{
auto propInfo = result.propertyInfo;
auto member = node->first.Cast<WfMemberExpression>();
if (CppExists(propInfo))
{
if (propInfo->GetCpp() == nullptr && propInfo->GetSetter() != nullptr)
{
WriteMethodTemplate(CppGetInvokeTemplate(propInfo->GetSetter()), propInfo->GetSetter(),
[&](IMethodInfo*)
{
writer.WriteString(L"::vl::__vwsn::This(");
if (member)
{
Call(member->parent);
auto parentResult = config->manager->expressionResolvings[member->parent.Obj()];
if (parentResult.type->GetDecorator() == ITypeInfo::SharedPtr)
{
writer.WriteString(L".Obj()");
}
}
else
{
VisitThisExpression(node->first.Obj(), propInfo->GetOwnerTypeDescriptor());
}
writer.WriteString(L")");
return true;
},
[&](IMethodInfo*, vint index)
{
Call(node->second);
}, useReturnValue);
}
else
{
writer.WriteString(L"(");
WritePropertyTemplate(CppGetReferenceTemplate(propInfo), propInfo,
[&](IPropertyInfo*)
{
writer.WriteString(L"::vl::__vwsn::This(");
if (member)
{
Call(member->parent);
auto parentResult = config->manager->expressionResolvings[member->parent.Obj()];
if (parentResult.type->GetDecorator() == ITypeInfo::SharedPtr)
{
writer.WriteString(L".Obj()");
}
}
else
{
VisitThisExpression(node->first.Obj(), propInfo->GetOwnerTypeDescriptor());
}
writer.WriteString(L")");
return true;
}, true);
writer.WriteString(L" = ");
Call(node->second, propInfo->GetReturn());
writer.WriteString(L")");
}
}
else
{
WriteNotExists(propInfo);
}
}
else if (auto binary = node->first.Cast<WfBinaryExpression>())
{
auto containerType = config->manager->expressionResolvings[binary->first.Obj()].type.Obj();
if (IsCppRefGenericType(containerType))
{
Call(binary->first, nullptr, false);
writer.WriteString(L".Set(");
Call(binary->second);
writer.WriteString(L", ");
Call(node->second);
writer.WriteString(L")");
}
else
{
auto keyType = config->manager->expressionResolvings[binary->second.Obj()].type.Obj();
auto valueType = config->manager->expressionResolvings[node->second.Obj()].type.Obj();
writer.WriteString(L"::vl::__vwsn::This(");
Call(binary->first);
writer.WriteString(L".Obj())->Set(");
if (containerType->GetTypeDescriptor() == description::GetTypeDescriptor<IValueDictionary>())
{
WriteBoxValue(keyType, [&]() {Call(binary->second); });
}
else
{
Call(binary->second);
}
writer.WriteString(L", ");
WriteBoxValue(valueType, [&]() {Call(node->second); });
writer.WriteString(L")");
}
}
else
{
VisitBinaryExpression(node, L"=", nullptr, nullptr);
}
}
else if (node->op == WfBinaryOperator::Index)
{
auto containerType = config->manager->expressionResolvings[node->first.Obj()].type.Obj();
if (IsCppRefGenericType(containerType))
{
Call(node->first, nullptr, false);
writer.WriteString(L"[");
Call(node->second);
writer.WriteString(L"]");
}
else
{
auto keyType = config->manager->expressionResolvings[node->second.Obj()].type.Obj();
auto valueType = config->manager->expressionResolvings[node].type.Obj();
WriteUnboxValue(valueType, [&]()
{
writer.WriteString(L"::vl::__vwsn::This(");
Call(node->first);
writer.WriteString(L".Obj())->Get(");
if (containerType->GetTypeDescriptor()->CanConvertTo(description::GetTypeDescriptor<IValueReadonlyDictionary>()))
{
WriteBoxValue(keyType, [&]() {Call(node->second); });
}
else
{
Call(node->second);
}
writer.WriteString(L")");
});
}
}
else if (node->op == WfBinaryOperator::Union)
{
auto type = config->manager->expressionResolvings[node].type;
if (type->GetTypeDescriptor() == description::GetTypeDescriptor<WString>())
{
VisitBinaryExpression(node, L"+", nullptr, type.Obj());
}
else
{
VisitBinaryExpression(node, L"&", nullptr, nullptr);
}
}
else if (node->op == WfBinaryOperator::Intersect)
{
VisitBinaryExpression(node, L"|", nullptr, nullptr);
}
else if (node->op == WfBinaryOperator::FailedThen)
{
auto firstResult = config->manager->expressionResolvings[node->first.Obj()];
auto secondResult = config->manager->expressionResolvings[node->second.Obj()];
auto mergedType = GetMergedType(firstResult.type, secondResult.type);
writer.WriteString(L"[&](){ try{ return ");
Call(node->first, mergedType.Obj());
writer.WriteString(L"; } catch(...){ return ");
Call(node->second, mergedType.Obj());
writer.WriteString(L"; } }()");
}
else
{
auto result = config->manager->expressionResolvings[node];
auto firstResult = config->manager->expressionResolvings[node->first.Obj()];
auto secondResult = config->manager->expressionResolvings[node->second.Obj()];
auto mergedType = GetMergedType(firstResult.type, secondResult.type);
switch (node->op)
{
case WfBinaryOperator::Exp:
writer.WriteString(L"static_cast<");
writer.WriteString(config->ConvertType(result.type->GetTypeDescriptor()));
writer.WriteString(L">(pow(static_cast<double>(");
Call(node->first);
writer.WriteString(L"), static_cast<double>(");
Call(node->second);
writer.WriteString(L")))");
return;
case WfBinaryOperator::Add:
case WfBinaryOperator::Sub:
case WfBinaryOperator::Mul:
case WfBinaryOperator::Div:
case WfBinaryOperator::Mod:
case WfBinaryOperator::Shl:
case WfBinaryOperator::Shr:
{
const wchar_t* op = nullptr;
switch (node->op)
{
case WfBinaryOperator::Add: op = L"+"; break;
case WfBinaryOperator::Sub: op = L"-"; break;
case WfBinaryOperator::Mul: op = L"*"; break;
case WfBinaryOperator::Div: op = L"/"; break;
case WfBinaryOperator::Mod: op = L"%"; break;
case WfBinaryOperator::Shl: op = L"<<"; break;
case WfBinaryOperator::Shr: op = L">>"; break;
default:;
}
VisitBinaryExpression(node, op, (BinaryNeedConvert(result.type->GetTypeDescriptor()) ? result.type->GetTypeDescriptor() : nullptr), result.type.Obj());
}
return;
case WfBinaryOperator::EQ:
case WfBinaryOperator::NE:
{
if (firstResult.type->GetDecorator() == ITypeInfo::RawPtr || firstResult.type->GetDecorator() == ITypeInfo::SharedPtr)
{
auto td = mergedType->GetTypeDescriptor();
auto tdFirst = firstResult.type->GetTypeDescriptor();
auto tdSecond = secondResult.type->GetTypeDescriptor();
auto dFirst = firstResult.type->GetDecorator();
auto dSecond = secondResult.type->GetDecorator();
writer.WriteString(L"(");
if (td != tdFirst)
{
writer.WriteString(L"static_cast<");
writer.WriteString(config->ConvertType(tdFirst));
writer.WriteString(L"*>(");
}
Call(node->first);
if (dFirst == ITypeInfo::SharedPtr)
{
writer.WriteString(L".Obj()");
}
if (td != tdFirst)
{
writer.WriteString(L")");
}
if (node->op == WfBinaryOperator::EQ)
{
writer.WriteString(L" == ");
}
else
{
writer.WriteString(L" != ");
}
if (td != tdSecond)
{
writer.WriteString(L"static_cast<");
writer.WriteString(config->ConvertType(tdSecond));
writer.WriteString(L"*>(");
}
Call(node->second);
if (dSecond == ITypeInfo::SharedPtr)
{
writer.WriteString(L".Obj()");
}
if (td != tdSecond)
{
writer.WriteString(L")");
}
writer.WriteString(L")");
return;
}
}
case WfBinaryOperator::LT:
case WfBinaryOperator::GT:
case WfBinaryOperator::LE:
case WfBinaryOperator::GE:
{
const wchar_t* op = nullptr;
switch (node->op)
{
case WfBinaryOperator::LT: op = L"<"; break;
case WfBinaryOperator::GT: op = L">"; break;
case WfBinaryOperator::LE: op = L"<="; break;
case WfBinaryOperator::GE: op = L">="; break;
case WfBinaryOperator::EQ: op = L"=="; break;
case WfBinaryOperator::NE: op = L"!="; break;
default:;
}
VisitBinaryExpression(node, op, nullptr, mergedType.Obj());
}
return;
case WfBinaryOperator::Xor:
case WfBinaryOperator::And:
case WfBinaryOperator::Or:
{
auto td = result.type->GetTypeDescriptor();
const wchar_t* op = nullptr;
if (td == description::GetTypeDescriptor<bool>())
{
switch (node->op)
{
case WfBinaryOperator::Xor: op = L"^"; break;
case WfBinaryOperator::And: op = L"&&"; break;
case WfBinaryOperator::Or: op = L"||"; break;
default:;
}
if (node->op != WfBinaryOperator::Xor)
{
td = nullptr;
}
}
else
{
switch (node->op)
{
case WfBinaryOperator::Xor: op = L"^"; break;
case WfBinaryOperator::And: op = L"&"; break;
case WfBinaryOperator::Or: op = L"|"; break;
default:;
}
if (!BinaryNeedConvert(td))
{
td = nullptr;
}
}
VisitBinaryExpression(node, op, td, result.type.Obj());
}
return;
default:;
}
}
}
void Visit(WfLetExpression* node)override
{
auto scope = config->manager->nodeScopes[node];
writer.WriteString(L"[&](");
FOREACH_INDEXER(Ptr<WfLetVariable>, letVar, index, node->variables)
{
if (index > 0)
{
writer.WriteString(L", ");
}
writer.WriteString(L"auto ");
writer.WriteString(config->ConvertName(letVar->name.value));
}
writer.WriteString(L"){ return ");
Call(node->expression);
writer.WriteString(L"; }(");
FOREACH_INDEXER(Ptr<WfLetVariable>, letVar, index, node->variables)
{
if (index > 0)
{
writer.WriteString(L", ");
}
auto symbol = scope->symbols[letVar->name.value][0];
Call(letVar->value, symbol->typeInfo.Obj());
}
writer.WriteString(L")");
}
void Visit(WfIfExpression* node)override
{
auto firstResult = config->manager->expressionResolvings[node->trueBranch.Obj()];
auto secondResult = config->manager->expressionResolvings[node->falseBranch.Obj()];
auto mergedType = GetMergedType(firstResult.type, secondResult.type);
writer.WriteString(L"(");
Call(node->condition);
writer.WriteString(L" ? ");
Call(node->trueBranch, mergedType.Obj());
writer.WriteString(L" : ");
Call(node->falseBranch, mergedType.Obj());
writer.WriteString(L")");
}
void Visit(WfRangeExpression* node)override
{
auto result = config->manager->expressionResolvings[node];
auto elementType = result.type->GetElementType()->GetGenericArgument(0);
writer.WriteString(L"::vl::__vwsn::Range(");
Call(node->begin, elementType);
if (node->beginBoundary == WfRangeBoundary::Exclusive)
{
writer.WriteString(L" + 1");
}
writer.WriteString(L", ");
Call(node->end, elementType);
if (node->endBoundary == WfRangeBoundary::Inclusive)
{
writer.WriteString(L" + 1");
}
writer.WriteString(L")");
}
void Visit(WfSetTestingExpression* node)override
{
if (auto range = node->collection.Cast<WfRangeExpression>())
{
auto resultElement = config->manager->expressionResolvings[node->element.Obj()];
auto resultBegin = config->manager->expressionResolvings[range->begin.Obj()];
auto resultEnd = config->manager->expressionResolvings[range->end.Obj()];
writer.WriteString(L"[&](auto __vwsn_1){ return ");
if (node->test == WfSetTesting::NotIn)
{
writer.WriteString(L"!");
}
writer.WriteString(L"(");
Call(range->begin);
writer.WriteString(range->beginBoundary == WfRangeBoundary::Inclusive ? L" <= " : L" < ");
writer.WriteString(L" __vwsn_1 && __vwsn_1");
writer.WriteString(range->endBoundary == WfRangeBoundary::Inclusive ? L" <= " : L" < ");
Call(range->end);
writer.WriteString(L"); }(");
Call(node->element, resultElement.type.Obj());
writer.WriteString(L")");
}
else
{
auto result = config->manager->expressionResolvings[node->collection.Obj()];
auto elementType = result.type->GetElementType()->GetGenericArgument(0);
if (node->test == WfSetTesting::NotIn)
{
writer.WriteString(L"(! ");
}
writer.WriteString(L"::vl::__vwsn::InSet(");
Call(node->element, elementType);
writer.WriteString(L", ");
Call(node->collection);
writer.WriteString(L")");
if (node->test == WfSetTesting::NotIn)
{
writer.WriteString(L")");
}
}
}
void Visit(WfConstructorExpression* node)override
{
auto result = config->manager->expressionResolvings[node];
auto td = result.type->GetTypeDescriptor();
if (node->arguments.Count() == 0)
{
if ((td->GetTypeDescriptorFlags() & TypeDescriptorFlags::StructType) != TypeDescriptorFlags::Undefined)
{
writer.WriteString(config->ConvertType(result.type.Obj()) + L"{}");
}
else
{
writer.WriteString(config->ConvertType(td) + L"::Create()");
}
}
else
{
if (result.type->GetTypeDescriptor() == description::GetTypeDescriptor<IValueList>())
{
auto elementType = result.type->GetElementType()->GetGenericArgument(0);
writer.WriteString(L"(::vl::__vwsn::CreateList()");
FOREACH(Ptr<WfConstructorArgument>, argument, node->arguments)
{
writer.WriteString(L".Add(");
Call(argument->key);
writer.WriteString(L")");
}
writer.WriteString(L").list");
}
else if (result.type->GetTypeDescriptor() == description::GetTypeDescriptor<IValueDictionary>())
{
auto keyType = result.type->GetElementType()->GetGenericArgument(0);
auto valueType = result.type->GetElementType()->GetGenericArgument(1);
writer.WriteString(L"(::vl::__vwsn::CreateDictionary()");
FOREACH(Ptr<WfConstructorArgument>, argument, node->arguments)
{
writer.WriteString(L".Add(");
Call(argument->key);
writer.WriteString(L", ");
Call(argument->value);
writer.WriteString(L")");
}
writer.WriteString(L").dictionary");
}
else
{
writer.WriteString(L"[&](){ ");
writer.WriteString(config->ConvertType(td));
writer.WriteString(L" __vwsn_temp__;");
FOREACH(Ptr<WfConstructorArgument>, argument, node->arguments)
{
writer.WriteString(L" __vwsn_temp__.");
writer.WriteString(argument->key.Cast<WfReferenceExpression>()->name.value);
writer.WriteString(L" = ");
Call(argument->value);
writer.WriteString(L";");
}
writer.WriteString(L" return __vwsn_temp__; }()");
}
}
}
void Visit(WfInferExpression* node)override
{
Call(node->expression);
}
void Visit(WfTypeCastingExpression* node)override
{
auto scope = config->manager->nodeScopes[node].Obj();
auto typeInfo = CreateTypeInfoFromType(scope, node->type);
bool strongCast = node->strategy == WfTypeCastingStrategy::Strong;
auto result = config->manager->expressionResolvings[node->expression.Obj()];
ConvertType(config, writer, result.type.Obj(), typeInfo.Obj(), [&]() {Call(node->expression); }, strongCast);
}
void Visit(WfTypeTestingExpression* node)override
{
auto result = config->manager->expressionResolvings[node->expression.Obj()];
Ptr<ITypeInfo> type;
if (node->type)
{
auto scope = config->manager->nodeScopes[node].Obj();
type = CreateTypeInfoFromType(scope, node->type);
}
switch (result.type->GetDecorator())
{
case ITypeInfo::RawPtr:
{
switch (node->test)
{
case WfTypeTesting::IsNull:
writer.WriteString(L"(");
Call(node->expression);
writer.WriteString(L" == nullptr)");
break;
case WfTypeTesting::IsNotNull:
writer.WriteString(L"(");
Call(node->expression);
writer.WriteString(L" != nullptr)");
break;
case WfTypeTesting::IsType:
case WfTypeTesting::IsNotType:
if (type->GetDecorator() != ITypeInfo::RawPtr)
{
writer.WriteString(node->test == WfTypeTesting::IsType ? L"false" : L"true");
}
else
{
writer.WriteString(L"(::vl::__vwsn::RawPtrCast<");
writer.WriteString(config->ConvertType(type->GetTypeDescriptor()));
writer.WriteString(L">(");
Call(node->expression);
writer.WriteString(L") ");
writer.WriteString(node->test == WfTypeTesting::IsType ? L"!=" : L"==");
writer.WriteString(L" nullptr)");
}
break;
}
}
break;
case ITypeInfo::SharedPtr:
{
if (result.type->GetElementType()->GetDecorator() == ITypeInfo::Generic)
{
auto toCode = [&]()
{
stream::MemoryStream stream;
{
stream::StreamWriter writer(stream);
WfPrint(node, WString::Empty, writer);
}
stream.SeekFromBegin(0);
{
stream::StreamReader reader(stream);
return reader.ReadToEnd();
}
};
if (config->IsSpecialGenericType(result.type.Obj()))
{
writer.WriteString(L"/* NOT SUPPORTS: testing against non-reference generic type: ");
writer.WriteString(toCode());
writer.WriteString(L" */ __vwsn_not_exists__");
return;
}
}
switch (node->test)
{
case WfTypeTesting::IsNull:
writer.WriteString(L"(! static_cast<bool>(");
Call(node->expression);
writer.WriteString(L"))");
break;
case WfTypeTesting::IsNotNull:
writer.WriteString(L"static_cast<bool>(");
Call(node->expression);
writer.WriteString(L")");
break;
case WfTypeTesting::IsType:
case WfTypeTesting::IsNotType:
if (type->GetDecorator() != ITypeInfo::SharedPtr)
{
writer.WriteString(node->test == WfTypeTesting::IsType ? L"false" : L"true");
}
else
{
writer.WriteString(L"(::vl::__vwsn::RawPtrCast<");
writer.WriteString(config->ConvertType(type->GetTypeDescriptor()));
writer.WriteString(L">(");
Call(node->expression);
writer.WriteString(L".Obj()) ");
writer.WriteString(node->test == WfTypeTesting::IsType ? L"!=" : L"==");
writer.WriteString(L" nullptr)");
}
break;
}
}
break;
case ITypeInfo::Nullable:
{
switch (node->test)
{
case WfTypeTesting::IsNull:
writer.WriteString(L"(! static_cast<bool>(");
Call(node->expression);
writer.WriteString(L"))");
break;
case WfTypeTesting::IsNotNull:
writer.WriteString(L"static_cast<bool>(");
Call(node->expression);
writer.WriteString(L")");
break;
case WfTypeTesting::IsType:
if (type->GetTypeDescriptor() == result.type->GetTypeDescriptor())
{
writer.WriteString(L"static_cast<bool>(");
Call(node->expression);
writer.WriteString(L")");
}
else
{
writer.WriteString(L"false");
}
break;
case WfTypeTesting::IsNotType:
if (type->GetTypeDescriptor() == result.type->GetTypeDescriptor())
{
writer.WriteString(L"false");
}
else
{
writer.WriteString(L"true");
}
break;
}
}
break;
case ITypeInfo::TypeDescriptor:
{
if (result.type->GetTypeDescriptor()->GetTypeDescriptorFlags() == TypeDescriptorFlags::Object)
{
switch (node->test)
{
case WfTypeTesting::IsNull:
Call(node->expression);
writer.WriteString(L".IsNull()");
break;
case WfTypeTesting::IsNotNull:
writer.WriteString(L"(! ");
Call(node->expression);
writer.WriteString(L".IsNull())");
break;
case WfTypeTesting::IsType:
case WfTypeTesting::IsNotType:
if ((type->GetTypeDescriptor()->GetTypeDescriptorFlags() & TypeDescriptorFlags::ReferenceType) != TypeDescriptorFlags::Undefined)
{
writer.WriteString(L"[&](){ auto __vwsn_temp__ = ");
Call(node->expression);
writer.WriteString(L"; return ");
if ((type->GetDecorator() == ITypeInfo::RawPtr) == (node->test == WfTypeTesting::IsType))
{
writer.WriteString(L"!");
}
writer.WriteString(L"__vwsn_temp__.GetSharedPtr() ");
writer.WriteString(node->test == WfTypeTesting::IsType ? L"&&" : L"||");
writer.WriteString(L" ::vl::__vwsn::RawPtrCast<");
writer.WriteString(config->ConvertType(type->GetTypeDescriptor()));
writer.WriteString(L">(__vwsn_temp__.GetRawPtr()) ");
writer.WriteString(node->test == WfTypeTesting::IsType ? L"!=" : L"==");
writer.WriteString(L" nullptr; }()");
}
else
{
writer.WriteString(L"(dynamic_cast<::vl::reflection::description::IValueType::TypedBox<");
writer.WriteString(config->ConvertType(type->GetTypeDescriptor()));
writer.WriteString(L">*>(");
Call(node->expression);
writer.WriteString(L".GetBoxedValue().Obj()) ");
writer.WriteString(node->test == WfTypeTesting::IsType ? L"!=" : L"==");
writer.WriteString(L" nullptr)");
}
break;
}
}
else if ((type->GetTypeDescriptor() == result.type->GetTypeDescriptor()) == (node->test == WfTypeTesting::IsType))
{
writer.WriteString(L"true");
}
else
{
writer.WriteString(L"false");
}
}
break;
default:;
}
}
void Visit(WfTypeOfTypeExpression* node)override
{
writer.WriteString(L"/* NOT SUPPORTS: typeof() */ __vwsn_not_exists__");
}
void Visit(WfTypeOfExpressionExpression* node)override
{
writer.WriteString(L"/* NOT SUPPORTS: type() */ __vwsn_not_exists__");
}
void Visit(WfAttachEventExpression* node)override
{
auto result = config->manager->expressionResolvings[node->event.Obj()];
if (CppExists(result.eventInfo))
{
WriteEventTemplate(CppGetAttachTemplate(result.eventInfo), result.eventInfo,
[&](IEventInfo*)
{
writer.WriteString(L"::vl::__vwsn::This(");
if (auto member = node->event.Cast<WfMemberExpression>())
{
Call(member->parent);
auto parentResult = config->manager->expressionResolvings[member->parent.Obj()];
if (parentResult.type->GetDecorator() == ITypeInfo::SharedPtr)
{
writer.WriteString(L".Obj()");
}
}
else
{
VisitThisExpression(node, result.eventInfo->GetOwnerTypeDescriptor());
}
writer.WriteString(L")");
return true;
},
[&](IEventInfo*)
{
Call(node->function);
return true;
},
[&](IEventInfo*, vint) {});
}
else
{
WriteNotExists(result.eventInfo);
}
}
void Visit(WfDetachEventExpression* node)override
{
auto result = config->manager->expressionResolvings[node->event.Obj()];
if (CppExists(result.eventInfo))
{
WriteEventTemplate(CppGetDetachTemplate(result.eventInfo), result.eventInfo,
[&](IEventInfo* eventInfo)
{
writer.WriteString(L"::vl::__vwsn::This(");
if (auto member = node->event.Cast<WfMemberExpression>())
{
Call(member->parent);
auto parentResult = config->manager->expressionResolvings[member->parent.Obj()];
if (parentResult.type->GetDecorator() == ITypeInfo::SharedPtr)
{
writer.WriteString(L".Obj()");
}
}
else
{
VisitThisExpression(node, eventInfo->GetOwnerTypeDescriptor());
}
writer.WriteString(L")");
return true;
},
[&](IEventInfo*)
{
Call(node->handler);
return true;
},
[&](IEventInfo*, vint) {});
}
else
{
WriteNotExists(result.eventInfo);
}
}
void Visit(WfObserveExpression* node)override
{
}
void Visit(WfCallExpression* node)override
{
auto thisCallback = [&](ITypeDescriptor* td)
{
writer.WriteString(L"::vl::__vwsn::This(");
if (auto member = node->function.Cast<WfMemberExpression>())
{
Call(member->parent);
auto parentResult = config->manager->expressionResolvings[member->parent.Obj()];
if (parentResult.type->GetDecorator() == ITypeInfo::SharedPtr)
{
writer.WriteString(L".Obj()");
}
}
else
{
VisitThisExpression(node, td);
}
writer.WriteString(L")");
return true;
};
auto argumentCallback = [&](IMethodInfo* methodInfo, ITypeInfo* typeInfo, vint index)
{
auto type = methodInfo
? methodInfo->GetParameter(index)->GetType()
: typeInfo->GetElementType()->GetGenericArgument(index + 1)
;
Call(node->arguments[index], type);
};
auto result = config->manager->expressionResolvings[node->function.Obj()];
if (result.methodInfo)
{
WriteMethodTemplate(CppGetInvokeTemplate(result.methodInfo), result.methodInfo,
[&](IMethodInfo* methodInfo) { return thisCallback(methodInfo->GetOwnerTypeDescriptor()); },
[&](IMethodInfo* methodInfo, vint index) { return argumentCallback(methodInfo, nullptr, index); },
useReturnValue);
return;
}
else if (result.eventInfo)
{
WriteEventTemplate(CppGetInvokeTemplate(result.eventInfo), result.eventInfo,
[&](IEventInfo* eventInfo) { return thisCallback(eventInfo->GetOwnerTypeDescriptor()); },
[&](IEventInfo*) { return false; },
[&](IEventInfo* eventInfo, vint index) { return argumentCallback(nullptr, eventInfo->GetHandlerType(), index); }
);
return;
}
else if (result.symbol)
{
if (auto funcDecl = result.symbol->creatorNode.Cast<WfFunctionDeclaration>())
{
if (result.symbol->ownerScope->ownerNode.Cast<WfNewInterfaceExpression>())
{
writer.WriteString(L"::vl::__vwsn::This(this)->");
writer.WriteString(config->ConvertName(result.symbol->name));
}
else if (result.symbol->ownerScope->functionConfig && result.symbol->ownerScope->functionConfig->lambda && result.symbol->name == funcDecl->name.value)
{
writer.WriteString(L"(*this)");
}
else
{
writer.WriteString(L"GLOBAL_NAME ");
writer.WriteString(config->ConvertName(result.symbol->name));
}
writer.WriteString(L"(");
for (vint i = 0; i < node->arguments.Count(); i++)
{
if (i > 0) writer.WriteString(L", ");
argumentCallback(nullptr, result.symbol->typeInfo.Obj(), i);
}
writer.WriteString(L")");
return;
}
}
Call(node->function);
writer.WriteString(L"(");
for (vint i = 0; i < node->arguments.Count(); i++)
{
if (i > 0) writer.WriteString(L", ");
argumentCallback(nullptr, result.type.Obj(), i);
}
writer.WriteString(L")");
}
void Visit(WfFunctionExpression* node)override
{
writer.WriteString(L"LAMBDA(::");
writer.WriteString(config->assemblyNamespace);
writer.WriteString(L"::");
writer.WriteString(config->lambdaExprs[node]);
writer.WriteString(L"(");
auto closureInfo = config->closureInfos[node];
WriteClosureArguments(closureInfo, node);
writer.WriteString(L"))");
}
void Visit(WfNewClassExpression* node)override
{
auto result = config->manager->expressionResolvings[node];
auto ctor = result.constructorInfo;
if (ctor->GetReturn()->GetDecorator() == ITypeInfo::SharedPtr)
{
writer.WriteString(L"::vl::Ptr<");
writer.WriteString(config->ConvertType(ctor->GetReturn()->GetTypeDescriptor()));
writer.WriteString(L">(");
}
WriteMethodTemplate(CppGetInvokeTemplate(ctor), ctor, [&](IMethodInfo*) { return false; },
[&](IMethodInfo*, vint index)
{
Call(node->arguments[index]);
}, useReturnValue);
if (ctor->GetReturn()->GetDecorator() == ITypeInfo::SharedPtr)
{
writer.WriteString(L")");
}
}
void Visit(WfNewInterfaceExpression* node)override
{
auto result = config->manager->expressionResolvings[node];
auto ctor = result.constructorInfo;
if (ctor->GetReturn()->GetDecorator() == ITypeInfo::SharedPtr)
{
writer.WriteString(L"::vl::Ptr<");
writer.WriteString(config->ConvertType(ctor->GetReturn()->GetTypeDescriptor()));
writer.WriteString(L">(");
}
else
{
writer.WriteString(L"static_cast<");
writer.WriteString(config->ConvertType(ctor->GetReturn()->GetTypeDescriptor()));
writer.WriteString(L"*>(");
}
writer.WriteString(L"new ::");
writer.WriteString(config->assemblyNamespace);
writer.WriteString(L"::");
writer.WriteString(config->classExprs[node]);
writer.WriteString(L"(");
auto closureInfo = config->closureInfos[node];
WriteClosureArguments(closureInfo, node);
writer.WriteString(L"))");
}
void Visit(WfVirtualExpression* node)override
{
Call(node->expandedExpression);
}
};
void GenerateExpression(WfCppConfig* config, stream::StreamWriter& writer, Ptr<WfExpression> node, reflection::description::ITypeInfo* expectedType, bool useReturnValue)
{
WfGenerateExpressionVisitor visitor(config, writer, useReturnValue);
if (useReturnValue)
{
auto result = config->manager->expressionResolvings[node.Obj()];
ITypeInfo* types[] = { result.type.Obj(), result.expectedType.Obj(), expectedType };
visitor.ConvertMultipleTypes(types, sizeof(types) / sizeof(*types), [&]()
{
node->Accept(&visitor);
});
}
else
{
node->Accept(&visitor);
}
}
}
}
}
/***********************************************************************
CPP\WFCPP_FILE.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace cppcodegen
{
using namespace collections;
void WfCppConfig::WritePushCompileOptions(stream::StreamWriter& writer)
{
writer.WriteLine(L"#if defined( _MSC_VER)");
writer.WriteLine(L"#pragma warning(push)");
writer.WriteLine(L"#pragma warning(disable:4250)");
writer.WriteLine(L"#elif defined(__GNUC__)");
writer.WriteLine(L"#pragma GCC diagnostic push");
writer.WriteLine(L"#pragma GCC diagnostic ignored \"-Wparentheses-equality\"");
writer.WriteLine(L"#elif defined(__clang__)");
writer.WriteLine(L"#pragma clang diagnostic push");
writer.WriteLine(L"#pragma clang diagnostic ignored \"-Wparentheses-equality\"");
writer.WriteLine(L"#endif");
}
void WfCppConfig::WritePopCompileOptions(stream::StreamWriter& writer)
{
writer.WriteLine(L"#if defined( _MSC_VER)");
writer.WriteLine(L"#pragma warning(pop)");
writer.WriteLine(L"#elif defined(__GNUC__)");
writer.WriteLine(L"#pragma GCC diagnostic pop");
writer.WriteLine(L"#elif defined(__clang__)");
writer.WriteLine(L"#pragma clang diagnostic pop");
writer.WriteLine(L"#endif");
}
void WfCppConfig::WriteCpp_PushMacros(stream::StreamWriter& writer)
{
writer.WriteString(L"#define GLOBAL_SYMBOL ");
writer.WriteString(L"::");
writer.WriteString(assemblyNamespace);
writer.WriteString(L"::");
writer.WriteString(assemblyName);
writer.WriteLine(L"::");
writer.WriteString(L"#define GLOBAL_NAME ");
writer.WriteString(L"::");
writer.WriteString(assemblyNamespace);
writer.WriteString(L"::");
writer.WriteString(assemblyName);
writer.WriteLine(L"::Instance().");
writer.WriteString(L"#define GLOBAL_OBJ ");
writer.WriteString(L"&::");
writer.WriteString(assemblyNamespace);
writer.WriteString(L"::");
writer.WriteString(assemblyName);
writer.WriteLine(L"::Instance()");
writer.WriteLine(L"#define USERIMPL(...)");
}
void WfCppConfig::WriteCpp_PopMacros(stream::StreamWriter& writer)
{
writer.WriteLine(L"#undef GLOBAL_SYMBOL");
writer.WriteLine(L"#undef GLOBAL_NAME");
writer.WriteLine(L"#undef GLOBAL_OBJ");
writer.WriteLine(L"#undef USERIMPL");
}
void WfCppConfig::WriteHeader(stream::StreamWriter& writer, bool multiFile)
{
WritePushCompileOptions(writer);
writer.WriteLine(L"");
{
Dictionary<WString, Ptr<WfExpression>> reversedLambdaExprs;
Dictionary<WString, Ptr<WfNewInterfaceExpression>> reversedClassExprs;
SortClosure(reversedLambdaExprs, reversedClassExprs);
if (reversedLambdaExprs.Count() + reversedClassExprs.Count() > 0)
{
writer.WriteString(L"namespace ");
writer.WriteLine(assemblyNamespace);
writer.WriteLine(L"{");
FOREACH(Ptr<WfExpression>, expr, reversedLambdaExprs.Values())
{
WriteHeader_ClosurePreDecl(writer, expr);
}
FOREACH(Ptr<WfNewInterfaceExpression>, expr, reversedClassExprs.Values())
{
WriteHeader_ClosurePreDecl(writer, expr);
}
writer.WriteLine(L"}");
writer.WriteLine(L"");
}
}
List<WString> nss;
if (enumDecls.Keys().Contains(nullptr))
{
FOREACH(Ptr<WfEnumDeclaration>, decl, enumDecls[nullptr])
{
WriteHeader_Enum(writer, decl, nss);
writer.WriteLine(L"");
}
}
if (structDecls.Keys().Contains(nullptr))
{
FOREACH(Ptr<WfStructDeclaration>, decl, structDecls[nullptr])
{
WriteHeader_Struct(writer, decl, nss);
writer.WriteLine(L"");
}
}
if (classDecls.Keys().Contains(nullptr))
{
FOREACH(Ptr<WfClassDeclaration>, decl, classDecls[nullptr])
{
WriteHeader_ClassPreDecl(writer, decl, nss);
}
writer.WriteLine(L"");
if (multiFile)
{
vint index = topLevelClassDeclsForFiles.Keys().IndexOf(L"");
if (index != -1)
{
FOREACH(Ptr<WfClassDeclaration>, decl, topLevelClassDeclsForFiles.GetByIndex(index))
{
WriteHeader_TopLevelClass(writer, decl, nss);
writer.WriteLine(L"");
}
}
}
else
{
FOREACH(Ptr<WfClassDeclaration>, decl, classDecls[nullptr])
{
WriteHeader_TopLevelClass(writer, decl, nss);
writer.WriteLine(L"");
}
}
}
WriteNamespaceEnd(writer, nss);
WriteHeader_Global(writer);
if (!multiFile)
{
if (manager->declarationTypes.Count() > 0)
{
writer.WriteLine(L"");
WriteHeader_Reflection(writer);
}
}
writer.WriteLine(L"");
WritePopCompileOptions(writer);
}
void WfCppConfig::WriteCpp(stream::StreamWriter& writer, bool multiFile)
{
WritePushCompileOptions(writer);
writer.WriteLine(L"");
WriteCpp_PushMacros(writer);
writer.WriteLine(L"");
WriteCpp_Global(writer);
writer.WriteLine(L"");
if (classDecls.Keys().Contains(nullptr))
{
List<WString> nss;
if (multiFile)
{
vint index = topLevelClassDeclsForFiles.Keys().IndexOf(L"");
if (index != -1)
{
FOREACH(Ptr<WfClassDeclaration>, decl, topLevelClassDeclsForFiles.GetByIndex(index))
{
WriteCpp_Class(writer, decl, nss);
}
}
}
else
{
FOREACH(Ptr<WfClassDeclaration>, decl, classDecls[nullptr])
{
WriteCpp_Class(writer, decl, nss);
}
}
WriteNamespaceEnd(writer, nss);
}
WriteCpp_PopMacros(writer);
if (manager->declarationTypes.Count() > 0)
{
writer.WriteLine(L"");
WriteCpp_Reflection(writer);
}
writer.WriteLine(L"");
WritePopCompileOptions(writer);
}
void WfCppConfig::WriteSubHeader(stream::StreamWriter& writer, const WString& fileName)
{
WritePushCompileOptions(writer);
writer.WriteLine(L"");
List<WString> nss;
FOREACH(Ptr<WfClassDeclaration>, decl, topLevelClassDeclsForFiles.Get(fileName))
{
WriteHeader_TopLevelClass(writer, decl, nss);
writer.WriteLine(L"");
}
WriteNamespaceEnd(writer, nss);
WritePopCompileOptions(writer);
}
void WfCppConfig::WriteSubCpp(stream::StreamWriter& writer, const WString& fileName)
{
WritePushCompileOptions(writer);
writer.WriteLine(L"");
WriteCpp_PushMacros(writer);
writer.WriteLine(L"");
List<WString> nss;
FOREACH(Ptr<WfClassDeclaration>, decl, topLevelClassDeclsForFiles.Get(fileName))
{
WriteCpp_Class(writer, decl, nss);
}
WriteNamespaceEnd(writer, nss);
WriteCpp_PopMacros(writer);
writer.WriteLine(L"");
WritePopCompileOptions(writer);
}
}
}
}
/***********************************************************************
CPP\WFCPP_GENERATECPPFILES.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace cppcodegen
{
using namespace collections;
using namespace stream;
using namespace filesystem;
/***********************************************************************
WfCppInput
***********************************************************************/
WfCppInput::WfCppInput(const WString& _assemblyName)
{
headerGuardPrefix = L"VCZH_WORKFLOW_COMPILER_GENERATED_";
assemblyName = _assemblyName;
assemblyNamespace = L"vl_workflow_global";
includeFileName = _assemblyName + L"Includes";
defaultFileName = _assemblyName;
}
/***********************************************************************
GenerateCppFiles
***********************************************************************/
template<typename TCallback>
WString GenerateToStream(const TCallback& callback)
{
MemoryStream stream;
{
StreamWriter writer(stream);
callback(writer);
}
stream.SeekFromBegin(0);
{
StreamReader reader(stream);
return reader.ReadToEnd();
}
}
void GenerateCppComment(StreamWriter& writer, const WString& comment)
{
writer.WriteLine(L"/***********************************************************************");
writer.WriteLine(L"!!!!!! DO NOT MODIFY !!!!!!");
writer.WriteLine(L"");
writer.WriteLine(comment);
writer.WriteLine(L"");
writer.WriteLine(L"This file is generated by Workflow compiler");
writer.WriteLine(L"https://github.com/vczh-libraries");
writer.WriteLine(L"***********************************************************************/");
}
Ptr<WfCppOutput> GenerateCppFiles(Ptr<WfCppInput> input, analyzer::WfLexicalScopeManager* manager)
{
WfCppConfig config(manager, input->assemblyName, input->assemblyNamespace);
auto output = MakePtr<WfCppOutput>();
bool multiFile = false;
switch (input->multiFile)
{
case WfCppMultiFile::Enabled:
multiFile = true;
break;
case WfCppMultiFile::Disabled:
multiFile = false;
break;
default:
multiFile = config.topLevelClassDeclsForFiles.Count() > 1;
}
output->cppFiles.Add(input->defaultFileName + L".h", GenerateToStream([&](StreamWriter& writer)
{
GenerateCppComment(writer, input->comment);
writer.WriteLine(L"");
writer.WriteLine(L"#ifndef " + input->headerGuardPrefix + wupper(input->defaultFileName));
writer.WriteLine(L"#define " + input->headerGuardPrefix + wupper(input->defaultFileName));
writer.WriteLine(L"");
FOREACH(WString, include, input->normalIncludes)
{
writer.WriteLine(L"#include \"" + include + L"\"");
}
if (input->reflectionIncludes.Count() > 0)
{
writer.WriteLine(L"#ifndef VCZH_DEBUG_NO_REFLECTION");
FOREACH(WString, include, input->reflectionIncludes)
{
writer.WriteLine(L"#include \"" + include + L"\"");
}
writer.WriteLine(L"#endif");
}
writer.WriteLine(L"");
config.WriteHeader(writer, multiFile);
writer.WriteLine(L"");
writer.WriteLine(L"#endif");
}));
output->cppFiles.Add(input->defaultFileName + L".cpp", GenerateToStream([&](StreamWriter& writer)
{
GenerateCppComment(writer, input->comment);
writer.WriteLine(L"");
if (multiFile)
{
writer.WriteLine(L"#include \"" + input->includeFileName + L".h\"");
}
else
{
writer.WriteLine(L"#include \"" + input->defaultFileName + L".h\"");
}
writer.WriteLine(L"");
config.WriteCpp(writer, multiFile);
}));
if (multiFile)
{
output->cppFiles.Add(input->includeFileName + L".h", GenerateToStream([&](StreamWriter& writer)
{
GenerateCppComment(writer, input->comment);
writer.WriteLine(L"");
writer.WriteLine(L"#ifndef " + input->headerGuardPrefix + wupper(input->includeFileName));
writer.WriteLine(L"#define " + input->headerGuardPrefix + wupper(input->includeFileName));
writer.WriteLine(L"");
writer.WriteLine(L"#include \"" + input->defaultFileName + L".h\"");
FOREACH(WString, fileName, config.topLevelClassDeclsForFiles.Keys())
{
if (fileName != L"")
{
writer.WriteLine(L"#include \"" + fileName + L".h\"");
}
}
if (config.manager->declarationTypes.Count() > 0)
{
writer.WriteLine(L"");
config.WriteHeader_Reflection(writer);
}
writer.WriteLine(L"");
writer.WriteLine(L"#endif");
}));
FOREACH(WString, fileName, config.topLevelClassDeclsForFiles.Keys())
{
if (fileName != L"")
{
output->cppFiles.Add(fileName + L".h", GenerateToStream([&](StreamWriter& writer)
{
GenerateCppComment(writer, input->comment);
writer.WriteLine(L"");
writer.WriteLine(L"#ifndef " + input->headerGuardPrefix + wupper(fileName));
writer.WriteLine(L"#define " + input->headerGuardPrefix + wupper(fileName));
writer.WriteLine(L"");
writer.WriteLine(L"#include \"" + input->defaultFileName + L".h\"");
{
List<Ptr<WfDeclaration>> decls;
CopyFrom(decls, config.topLevelClassDeclsForFiles[fileName]);
for (vint i = 0; i < decls.Count(); i++)
{
if (auto classDecl = decls[i].Cast<WfClassDeclaration>())
{
{
vint index = config.enumDecls.Keys().IndexOf(classDecl.Obj());
if (index != -1)
{
CopyFrom(decls, config.enumDecls.GetByIndex(index), true);
}
}
{
vint index = config.structDecls.Keys().IndexOf(classDecl.Obj());
if (index != -1)
{
CopyFrom(decls, config.structDecls.GetByIndex(index), true);
}
}
{
vint index = config.classDecls.Keys().IndexOf(classDecl.Obj());
if (index != -1)
{
CopyFrom(decls, config.classDecls.GetByIndex(index), true);
}
}
}
}
SortedList<WString> fileNames;
FOREACH(Ptr<WfDeclaration>, decl, decls)
{
vint index = config.declDependencies.Keys().IndexOf(decl.Obj());
if (index != -1)
{
FOREACH(Ptr<WfDeclaration>, declDep, config.declDependencies.GetByIndex(index))
{
WString fileName = config.declFiles[declDep.Obj()];
if (fileName != L"" && !fileNames.Contains(fileName))
{
fileNames.Add(fileName);
}
}
}
}
FOREACH(WString, fileName, fileNames)
{
writer.WriteLine(L"#include \"" + fileName + L".h\"");
}
}
writer.WriteLine(L"");
config.WriteSubHeader(writer, fileName);
writer.WriteLine(L"");
writer.WriteLine(L"#endif");
}));
output->cppFiles.Add(fileName + L".cpp", GenerateToStream([&](StreamWriter& writer)
{
GenerateCppComment(writer, input->comment);
writer.WriteLine(L"");
writer.WriteLine(L"#include \"" + input->includeFileName + L".h\"");
writer.WriteLine(L"");
config.WriteSubCpp(writer, fileName);
}));
}
}
}
return output;
}
/***********************************************************************
MergeCppFile
***********************************************************************/
WString RemoveSpacePrefix(const WString& s)
{
for (vint i = 0; i < s.Length(); i++)
{
if (s[i] != L' '&&s[i] != L'\t')
{
return s.Sub(i, s.Length() - i);
}
}
return WString::Empty;
}
const vint NORMAL = 0;
const vint WAIT_HEADER = 1;
const vint WAIT_OPEN = 2;
const vint WAIT_CLOSE = 3;
const vint UNUSED_USER_CONTENT = 4;
template<typename TCallback>
void ProcessCppContent(const WString& code, const TCallback& callback)
{
vint state = NORMAL;
vint counter = 0;
StringReader reader(code);
while (!reader.IsEnd())
{
auto line = reader.ReadLine();
if (reader.IsEnd() && line == L"")
{
break;
}
if (line == L"// UNUSED_USER_CONTENT:")
{
state = UNUSED_USER_CONTENT;
}
if (state == UNUSED_USER_CONTENT)
{
callback(state, state, line, line);
}
else
{
auto content = RemoveSpacePrefix(line);
auto previousState = state;
switch (state)
{
case NORMAL:
if (content.Length() > 9 && content.Sub(0, 9) == L"USERIMPL(")
{
state = WAIT_HEADER;
}
break;
case WAIT_HEADER:
state = WAIT_OPEN;
break;
case WAIT_OPEN:
if (content == L"{")
{
state = WAIT_CLOSE;
}
break;
case WAIT_CLOSE:
if (content == L"{")
{
counter++;
}
else if (content == L"}")
{
if (counter == 0)
{
state = NORMAL;
}
else
{
counter--;
}
}
break;
}
callback(previousState, state, line, content);
}
}
}
template<typename TCallback>
void SplitCppContent(const WString& code, Dictionary<WString, WString>& userContents, Dictionary<WString, WString>& userContentsFull, const TCallback& callback)
{
WString name;
WString userImpl;
WString userImplFull;
ProcessCppContent(code, [&](vint previousState, vint state, const WString& line, const WString& content)
{
if (state == UNUSED_USER_CONTENT)
{
callback(line);
}
else
{
if (previousState == NORMAL && state == WAIT_HEADER)
{
name = content;
userImpl = L"";
userImplFull = L"";
}
else if (previousState == WAIT_HEADER)
{
name += content;
}
else if (previousState == WAIT_CLOSE && state == WAIT_CLOSE)
{
userImpl += line + L"\r\n";
}
else if (previousState == WAIT_CLOSE && state == NORMAL)
{
userImplFull += L"//" + line + L"\r\n";
userContents.Add(name, userImpl);
userContentsFull.Add(name, userImplFull);
name = L"";
}
if (name != L"")
{
userImplFull += L"//" + line + L"\r\n";
}
}
});
}
WString MergeCppFileContent(const WString& dst, const WString& src)
{
Dictionary<WString, WString> userContents, userContentsFull;
WString unusedUserContent = GenerateToStream([&](StreamWriter& writer)
{
SplitCppContent(dst, userContents, userContentsFull, [&](const WString& line)
{
writer.WriteLine(line);
});
});
WString processedUnusedUserContent = GenerateToStream([&](StreamWriter& writer)
{
StringReader reader(unusedUserContent);
while (!reader.IsEnd())
{
auto line = reader.ReadLine();
if (line != L"// UNUSED_USER_CONTENT:")
{
if (INVLOC.StartsWith(line, L"//", Locale::None))
{
line = line.Right(line.Length() - 2);
}
writer.WriteLine(line);
}
}
});
SplitCppContent(processedUnusedUserContent, userContents, userContentsFull, [&](const WString& line) {});
return GenerateToStream([&](StreamWriter& writer)
{
WString name;
WString userImpl;
ProcessCppContent(src, [&](vint previousState, vint state, const WString& line, const WString& content)
{
if (previousState == NORMAL && state == WAIT_HEADER)
{
name = content;
userImpl = L"";
}
else if (previousState == WAIT_HEADER)
{
name += content;
}
else if (previousState == WAIT_CLOSE && state == WAIT_CLOSE)
{
userImpl += line + L"\r\n";
return;
}
else if (previousState == WAIT_CLOSE && state == NORMAL)
{
vint index = userContents.Keys().IndexOf(name);
if (index == -1)
{
writer.WriteString(userImpl);
}
else
{
writer.WriteString(userContents.Values()[index]);
userContentsFull.Remove(name);
}
}
writer.WriteLine(line);
});
if (userContentsFull.Count() > 0)
{
writer.WriteLine(L"// UNUSED_USER_CONTENT:");
FOREACH(WString, content, userContentsFull.Values())
{
writer.WriteString(content);
}
}
});
}
}
}
}
/***********************************************************************
CPP\WFCPP_STATEMENT.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace cppcodegen
{
using namespace collections;
using namespace reflection;
using namespace reflection::description;
using namespace analyzer;
class WfGenerateStatementVisitor : public Object, public WfStatement::IVisitor
{
public:
WfCppConfig* config;
Ptr<FunctionRecord> functionRecord;
stream::StreamWriter& writer;
WString prefixBlock;
WString prefix;
ITypeInfo* returnType;
WfGenerateStatementVisitor(WfCppConfig* _config, Ptr<FunctionRecord> _functionRecord, stream::StreamWriter& _writer, const WString& _prefixBlock, const WString& _prefix, ITypeInfo* _returnType)
:config(_config)
, functionRecord(_functionRecord)
, writer(_writer)
, prefixBlock(_prefixBlock)
, prefix(_prefix)
, returnType(_returnType)
{
}
void Call(Ptr<WfStatement> node, WString prefixDelta = WString(L"\t", false))
{
GenerateStatement(config, functionRecord, writer, node, prefix, prefixDelta, returnType);
}
void Visit(WfBreakStatement* node)override
{
writer.WriteString(prefix);
writer.WriteLine(L"break;");
}
void Visit(WfContinueStatement* node)override
{
writer.WriteString(prefix);
writer.WriteLine(L"continue;");
}
void Visit(WfReturnStatement* node)override
{
writer.WriteString(prefix);
if (node->expression)
{
writer.WriteString(L"return ");
GenerateExpression(config, writer, node->expression, returnType);
writer.WriteLine(L";");
}
else
{
writer.WriteLine(L"return;");
}
}
void Visit(WfDeleteStatement* node)override
{
writer.WriteString(prefix);
writer.WriteString(L"::vl::__vwsn::This(");
GenerateExpression(config, writer, node->expression, nullptr);
writer.WriteLine(L")->Dispose(true);");
}
void Visit(WfRaiseExceptionStatement* node)override
{
if (node->expression)
{
writer.WriteString(prefix);
writer.WriteString(L"throw ::vl::Exception(");
auto result = config->manager->expressionResolvings[node->expression.Obj()];
bool throwString = result.type->GetTypeDescriptor() == description::GetTypeDescriptor<WString>();
if (!throwString)
{
writer.WriteString(L"::vl::__vwsn::This(");
}
GenerateExpression(config, writer, node->expression, result.type.Obj());
if (!throwString)
{
writer.WriteString(L".Obj())->GetMessage()");
}
writer.WriteLine(L");");
}
else
{
writer.WriteString(prefix);
writer.WriteLine(L"throw;");
}
}
void Visit(WfIfStatement* node)override
{
writer.WriteString(prefix);
while (node)
{
writer.WriteString(L"if (");
if (node->type)
{
auto result = config->manager->expressionResolvings[node->expression.Obj()];
auto scope = config->manager->nodeScopes[node].Obj();
auto typeInfo = CreateTypeInfoFromType(scope, node->type);
writer.WriteString(L"auto ");
writer.WriteString(config->ConvertName(node->name.value));
writer.WriteString(L" = ");
ConvertType(config, writer, result.type.Obj(), typeInfo.Obj(), [&]() {GenerateExpression(config, writer, node->expression, nullptr); }, false);
}
else
{
GenerateExpression(config, writer, node->expression, TypeInfoRetriver<bool>::CreateTypeInfo().Obj());
}
writer.WriteLine(L")");
Call(node->trueBranch);
if (node->falseBranch)
{
writer.WriteString(prefix);
if (auto ifStat = node->falseBranch.Cast<WfIfStatement>())
{
writer.WriteString(L"else ");
node = ifStat.Obj();
continue;
}
else
{
writer.WriteLine(L"else");
Call(node->falseBranch);
}
}
break;
}
}
void Visit(WfWhileStatement* node)override
{
writer.WriteString(prefix);
writer.WriteString(L"while (");
GenerateExpression(config, writer, node->condition, TypeInfoRetriver<bool>::CreateTypeInfo().Obj());
writer.WriteLine(L")");
Call(node->statement);
}
void Visit(WfTryStatement* node)override
{
auto exName = L"__vwsne_" + itow(functionRecord->exprCounter++);
WString tryPrefix = prefix;
if (node->finallyStatement)
{
auto blockName = L"__vwsnb_" + itow(functionRecord->blockCounter++);
tryPrefix += L"\t";
writer.WriteString(prefix);
writer.WriteLine(L"{");
writer.WriteString(tryPrefix);
writer.WriteString(L"auto ");
writer.WriteString(blockName);
writer.WriteLine(L" = [&]()");
GenerateStatement(config, functionRecord, writer, node->finallyStatement, tryPrefix, WString(L"\t", false), returnType);
writer.WriteString(tryPrefix);
writer.WriteLine(L";");
writer.WriteString(tryPrefix);
writer.WriteString(L"::vl::__vwsn::RunOnExit<::vl::RemoveCVR<decltype(");
writer.WriteString(blockName);
writer.WriteString(L")>::Type> ");
writer.WriteString(blockName);
writer.WriteString(L"_dtor(&");
writer.WriteString(blockName);
writer.WriteLine(L");");
}
WString bodyPrefix = tryPrefix + L"\t";
writer.WriteString(tryPrefix);
writer.WriteLine(L"try");
writer.WriteString(tryPrefix);
writer.WriteLine(L"{");
GenerateStatement(config, functionRecord, writer, node->protectedStatement, bodyPrefix, WString(L"\t", false), returnType);
writer.WriteString(tryPrefix);
writer.WriteLine(L"}");
writer.WriteString(tryPrefix);
writer.WriteString(L"catch(const ::vl::Exception&");
if (node->catchStatement)
{
writer.WriteString(L" ");
writer.WriteString(exName);
}
writer.WriteLine(L")");
writer.WriteString(tryPrefix);
writer.WriteLine(L"{");
if (node->catchStatement)
{
writer.WriteString(bodyPrefix);
writer.WriteString(L"auto ");
writer.WriteString(config->ConvertName(node->name.value));
writer.WriteString(L" = ::vl::reflection::description::IValueException::Create(");
writer.WriteString(exName);
writer.WriteLine(L".Message());");
GenerateStatement(config, functionRecord, writer, node->catchStatement, bodyPrefix, WString(L"\t", false), returnType);
}
writer.WriteString(tryPrefix);
writer.WriteLine(L"}");
if (node->finallyStatement)
{
writer.WriteString(prefix);
writer.WriteLine(L"}");
}
}
void Visit(WfBlockStatement* node)override
{
writer.WriteString(prefixBlock);
writer.WriteLine(L"{");
FOREACH(Ptr<WfStatement>, statement, node->statements)
{
while (auto virtualStat = statement.Cast<WfVirtualStatement>())
{
statement = virtualStat->expandedStatement;
}
if (statement.Cast<WfBlockStatement>())
{
Call(statement);
}
else
{
Call(statement, WString::Empty);
}
}
writer.WriteString(prefixBlock);
writer.WriteLine(L"}");
}
void Visit(WfExpressionStatement* node)override
{
writer.WriteString(prefix);
GenerateExpression(config, writer, node->expression, nullptr, false);
writer.WriteLine(L";");
}
void Visit(WfVariableStatement* node)override
{
auto scope = config->manager->nodeScopes[node->variable.Obj()];
auto symbol = scope->symbols[node->variable->name.value][0].Obj();
writer.WriteString(prefix);
if (node->variable->expression)
{
writer.WriteString(L"auto");
}
else
{
writer.WriteString(config->ConvertType(symbol->typeInfo.Obj()));
}
writer.WriteString(L" ");
writer.WriteString(config->ConvertName(node->variable->name.value));
if (node->variable->expression)
{
writer.WriteString(L" = ");
GenerateExpression(config, writer, node->variable->expression, symbol->typeInfo.Obj());
}
writer.WriteLine(L";");
}
void Visit(WfVirtualStatement* node)override
{
node->expandedStatement->Accept(this);
}
void Visit(WfCoroutineStatement* node)override
{
CHECK_FAIL(L"WfGenerateStatementVisitor::Visit(WfCoroutineStatement*)#Internal error, All coroutine statements do not generate C++ code.");
}
};
void GenerateStatement(WfCppConfig* config, Ptr<FunctionRecord> functionRecord, stream::StreamWriter& writer, Ptr<WfStatement> node, const WString& prefix, const WString& prefixDelta, reflection::description::ITypeInfo* returnType)
{
WfGenerateStatementVisitor visitor(config, functionRecord, writer, prefix, prefix + prefixDelta, returnType);
node->Accept(&visitor);
}
}
}
}
/***********************************************************************
CPP\WFCPP_WRITECLASS.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace cppcodegen
{
using namespace collections;
using namespace reflection;
using namespace reflection::description;
void WfCppConfig::WriteHeader_ClassPreDecl(stream::StreamWriter& writer, Ptr<WfClassDeclaration> decl, const WString& name, const WString& prefix)
{
writer.WriteLine(prefix + L"class " + name + L";");
}
void WfCppConfig::WriteHeader_ClassPreDecl(stream::StreamWriter& writer, Ptr<WfClassDeclaration> decl, collections::List<WString>& nss)
{
auto td = manager->declarationTypes[decl.Obj()].Obj();
WString name;
auto prefix = WriteNamespace(writer, CppGetFullName(td), nss, name);
WriteHeader_ClassPreDecl(writer, decl, name, prefix);
}
class WriteHeader_Class_FindClassDeclVisitor
: public empty_visitor::DeclarationVisitor
{
public:
List<Ptr<WfClassDeclaration>>& unprocessed;
WriteHeader_Class_FindClassDeclVisitor(List<Ptr<WfClassDeclaration>>& _unprocessed)
:unprocessed(_unprocessed)
{
}
void Dispatch(WfVirtualDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, decl, node->expandedDeclarations)
{
decl->Accept(this);
}
}
void Visit(WfClassDeclaration* node)override
{
unprocessed.Add(node);
}
};
void WfCppConfig::WriteHeader_Class(stream::StreamWriter& writer, Ptr<WfClassDeclaration> decl, const WString& name, const WString& prefix)
{
auto td = manager->declarationTypes[decl.Obj()].Obj();
writer.WriteString(prefix + L"class " + name + L" : ");
switch (decl->kind)
{
case WfClassKind::Class:
{
vint count = td->GetBaseTypeDescriptorCount();
bool hasClassBase = Range<vint>(0, count)
.Any([=](vint index)
{
auto baseTd = td->GetBaseTypeDescriptor(index);
return baseTd->GetTypeDescriptorFlags() == TypeDescriptorFlags::Class
&& baseTd != description::GetTypeDescriptor<DescriptableObject>();
});
if (!hasClassBase)
{
writer.WriteString(L"public ::vl::Object, ");
}
for (vint i = 0; i < count; i++)
{
auto baseTd = td->GetBaseTypeDescriptor(i);
switch (baseTd->GetTypeDescriptorFlags())
{
case TypeDescriptorFlags::Class:
if (baseTd != description::GetTypeDescriptor<DescriptableObject>())
{
writer.WriteString(L"public " + ConvertType(baseTd) + L", ");
}
break;
case TypeDescriptorFlags::Interface:
writer.WriteString(L"public virtual " + ConvertType(baseTd) + L", ");
break;
default:;
}
}
}
break;
case WfClassKind::Interface:
{
vint count = td->GetBaseTypeDescriptorCount();
for (vint i = 0; i < count; i++)
{
writer.WriteString(L"public virtual " + ConvertType(td->GetBaseTypeDescriptor(i)) + L", ");
}
}
break;
}
writer.WriteLine(L"public ::vl::reflection::Description<" + name + L">");
writer.WriteLine(prefix + L"{");
List<Ptr<WfClassDeclaration>> unprocessed;
unprocessed.Add(decl);
FOREACH(Ptr<WfAttribute>, attribute, attributeEvaluator->GetAttributes(decl->attributes, L"cpp", L"Friend"))
{
auto td = UnboxValue<ITypeDescriptor*>(attributeEvaluator->GetAttributeValue(attribute));
auto scopeName = manager->typeNames[td];
if (scopeName->declarations.Count() == 0)
{
writer.WriteLine(prefix + L"\tfriend class " + ConvertType(td) + L";");
}
else
{
auto friendDecl = scopeName->declarations[0].Cast<WfClassDeclaration>();
unprocessed.Add(friendDecl);
}
}
auto declTypeName = ConvertType(manager->declarationTypes[decl.Obj()].Obj());
for (vint i = 0; i < unprocessed.Count(); i++)
{
auto current = unprocessed[i];
if (current != decl)
{
auto currentTypeName = ConvertType(manager->declarationTypes[current.Obj()].Obj());
bool isInternalClass = false;
if (currentTypeName.Length() > declTypeName.Length() + 2)
{
if (currentTypeName.Left(declTypeName.Length() + 2) == declTypeName + L"::")
{
isInternalClass = true;
}
}
if (!isInternalClass)
{
writer.WriteLine(prefix + L"\tfriend class " + currentTypeName + L";");
}
}
vint index = classClosures.Keys().IndexOf(current.Obj());
if (index != -1)
{
SortedList<WString> closureNames;
CopyFrom(
closureNames,
From(classClosures.GetByIndex(index))
.Select([&](Ptr<WfExpression> closure)
{
return (closure.Cast<WfNewInterfaceExpression>() ? L"class ::" : L"struct ::") +
assemblyNamespace +
L"::" +
closureInfos[closure.Obj()]->lambdaClassName;
})
);
FOREACH(WString, closureName, closureNames)
{
writer.WriteLine(prefix + L"\tfriend " + closureName + L";");
}
}
WriteHeader_Class_FindClassDeclVisitor visitor(unprocessed);
FOREACH(Ptr<WfDeclaration>, memberDecl, current->declarations)
{
memberDecl->Accept(&visitor);
}
}
writer.WriteLine(L"#ifndef VCZH_DEBUG_NO_REFLECTION");
writer.WriteLine(prefix + L"\tfriend struct ::vl::reflection::description::CustomTypeDescriptorSelector<" + name + L">;");
writer.WriteLine(L"#endif");
const vint PRIVATE = 0;
const vint PROTECTED = 1;
const vint PUBLIC = 2;
vint accessor = -1;
{
vint index = enumDecls.Keys().IndexOf(decl.Obj());
if (index != -1)
{
if (accessor != PUBLIC)
{
accessor = PUBLIC;
writer.WriteLine(prefix + L"public:");
}
FOREACH(Ptr<WfEnumDeclaration>, decl, enumDecls.GetByIndex(index))
{
WriteHeader_Enum(writer, decl, ConvertName(decl->name.value), prefix + L"\t");
writer.WriteLine(L"");
}
}
}
{
vint index = structDecls.Keys().IndexOf(decl.Obj());
if (index != -1)
{
if (accessor != PUBLIC)
{
accessor = PUBLIC;
writer.WriteLine(prefix + L"public:");
}
FOREACH(Ptr<WfStructDeclaration>, decl, structDecls.GetByIndex(index))
{
WriteHeader_Struct(writer, decl, ConvertName(decl->name.value), prefix + L"\t");
writer.WriteLine(L"");
}
}
}
{
vint index = classDecls.Keys().IndexOf(decl.Obj());
if (index != -1)
{
if (accessor != PUBLIC)
{
accessor = PUBLIC;
writer.WriteLine(prefix + L"public:");
}
FOREACH(Ptr<WfClassDeclaration>, decl, classDecls.GetByIndex(index))
{
WriteHeader_ClassPreDecl(writer, decl, ConvertName(decl->name.value), prefix + L"\t");
}
writer.WriteLine(L"");
FOREACH(Ptr<WfClassDeclaration>, decl, classDecls.GetByIndex(index))
{
WriteHeader_Class(writer, decl, ConvertName(decl->name.value), prefix + L"\t");
}
}
}
FOREACH(Ptr<WfDeclaration>, memberDecl, decl->declarations)
{
vint memberAccessor = PUBLIC;
if (attributeEvaluator->GetAttribute(memberDecl->attributes, L"cpp", L"Private"))
{
memberAccessor = PRIVATE;
}
else if (attributeEvaluator->GetAttribute(memberDecl->attributes, L"cpp", L"Protected"))
{
memberAccessor = PROTECTED;
}
if (accessor != memberAccessor)
{
accessor = memberAccessor;
switch (accessor)
{
case PRIVATE:
writer.WriteLine(prefix + L"private:");
break;
case PROTECTED:
writer.WriteLine(prefix + L"protected:");
break;
case PUBLIC:
writer.WriteLine(prefix + L"public:");
break;
}
}
GenerateClassMemberDecl(this, writer, ConvertName(decl->name.value), memberDecl, prefix + L"\t", false);
}
writer.WriteLine(prefix + L"};");
}
WString WfCppConfig::WriteHeader_Class(stream::StreamWriter& writer, Ptr<WfClassDeclaration> decl, collections::List<WString>& nss)
{
auto td = manager->declarationTypes[decl.Obj()].Obj();
WString name;
auto prefix = WriteNamespace(writer, CppGetFullName(td), nss, name);
WriteHeader_Class(writer, decl, name, prefix);
return prefix;
}
void WfCppConfig::WriteHeader_TopLevelClass(stream::StreamWriter& writer, Ptr<WfClassDeclaration> decl, collections::List<WString>& nss)
{
auto prefix = WriteHeader_Class(writer, decl, nss);
List<Ptr<WfClassDeclaration>> classes;
classes.Add(decl);
vint processed = 0;
while (processed < classes.Count())
{
auto current = classes[processed++];
{
vint index = enumDecls.Keys().IndexOf(current.Obj());
if (index != -1)
{
FOREACH(Ptr<WfEnumDeclaration>, enumDecl, enumDecls.GetByIndex(index))
{
auto td = manager->declarationTypes[enumDecl.Obj()].Obj();
WriteHeader_EnumOp(writer, enumDecl, ConvertType(td), prefix);
}
}
}
{
vint index = structDecls.Keys().IndexOf(current.Obj());
if (index != -1)
{
FOREACH(Ptr<WfStructDeclaration>, structDecl, structDecls.GetByIndex(index))
{
auto td = manager->declarationTypes[structDecl.Obj()].Obj();
WriteHeader_StructOp(writer, structDecl, ConvertType(td), prefix);
}
}
}
{
vint index = classDecls.Keys().IndexOf(current.Obj());
if (index != -1)
{
CopyFrom(classes, classDecls.GetByIndex(index), true);
}
}
}
}
bool WfCppConfig::WriteCpp_ClassMember(stream::StreamWriter& writer, Ptr<WfClassDeclaration> decl, Ptr<WfDeclaration> memberDecl, collections::List<WString>& nss)
{
List<WString> nss2;
GetClassNamespace(decl, nss2);
auto prefix = WriteNamespace(writer, nss, nss2);
auto td = manager->declarationTypes[decl.Obj()].Obj();
auto classFullName = CppGetFullName(td);
return GenerateClassMemberImpl(this, writer, GetClassBaseName(decl), ConvertName(decl->name.value), classFullName , memberDecl, prefix);
}
void WfCppConfig::WriteCpp_Class(stream::StreamWriter& writer, Ptr<WfClassDeclaration> decl, collections::List<WString>& nss)
{
List<Ptr<WfClassDeclaration>> classes;
classes.Add(decl);
vint processed = 0;
while (processed < classes.Count())
{
auto current = classes[processed++];
writer.WriteLine(L"/***********************************************************************");
writer.WriteLine(L"Class (" + CppGetFullName(manager->declarationTypes[current.Obj()].Obj()) + L")");
writer.WriteLine(L"***********************************************************************/");
writer.WriteLine(L"");
FOREACH(Ptr<WfDeclaration>, memberDecl, current->declarations)
{
if (WriteCpp_ClassMember(writer, current, memberDecl, nss))
{
writer.WriteLine(L"");
}
}
vint index = classDecls.Keys().IndexOf(current.Obj());
if (index != -1)
{
CopyFrom(classes, classDecls.GetByIndex(index), true);
}
}
}
}
}
}
/***********************************************************************
CPP\WFCPP_WRITEENUM.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace cppcodegen
{
using namespace collections;
void WfCppConfig::WriteHeader_Enum(stream::StreamWriter& writer, Ptr<WfEnumDeclaration> decl, const WString& name, const WString& prefix)
{
writer.WriteLine(prefix + L"enum class " + name + L" : vl::vuint64_t");
writer.WriteLine(prefix + L"{");
FOREACH(Ptr<WfEnumItem>, item, decl->items)
{
switch (item->kind)
{
case WfEnumItemKind::Constant:
writer.WriteLine(prefix + L"\t" + ConvertName(item->name.value) + L" = " + item->number.value + L"UL,");
break;
case WfEnumItemKind::Intersection:
writer.WriteString(prefix + L"\t" + ConvertName(item->name.value) + L" = ");
FOREACH_INDEXER(Ptr<WfEnumItemIntersection>, enumInt, index, item->intersections)
{
if (index > 0)
{
writer.WriteString(L" | ");
}
writer.WriteString(ConvertName(enumInt->name.value));
}
writer.WriteLine(L",");
break;
}
}
writer.WriteLine(prefix + L"};");
}
void WfCppConfig::WriteHeader_EnumOp(stream::StreamWriter& writer, Ptr<WfEnumDeclaration> decl, const WString& name, const WString& prefix)
{
const wchar_t* ops[] = { L"&", L"|" };
for (auto op : ops)
{
writer.WriteString(prefix);
writer.WriteString(L"inline ");
writer.WriteString(name);
writer.WriteString(L" operator");
writer.WriteString(op);
writer.WriteString(L" (");
writer.WriteString(name);
writer.WriteString(L" a, ");
writer.WriteString(name);
writer.WriteString(L" b) { return static_cast<");
writer.WriteString(name);
writer.WriteString(L">(static_cast<::vl::vuint64_t>(a) ");
writer.WriteString(op);
writer.WriteLine(L" static_cast<::vl::vuint64_t>(b)); }");
}
}
void WfCppConfig::WriteHeader_Enum(stream::StreamWriter& writer, Ptr<WfEnumDeclaration> decl, collections::List<WString>& nss)
{
auto td = manager->declarationTypes[decl.Obj()].Obj();
WString name;
auto prefix = WriteNamespace(writer, CppGetFullName(td), nss, name);
WriteHeader_Enum(writer, decl, name, prefix);
WriteHeader_EnumOp(writer, decl, name, prefix);
}
}
}
}
/***********************************************************************
CPP\WFCPP_WRITEFUNCTIONHEADER.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace cppcodegen
{
using namespace collections;
using namespace reflection::description;
ITypeInfo* WfCppConfig::WriteFunctionHeader(stream::StreamWriter& writer, ITypeInfo* typeInfo, collections::List<WString>& arguments, const WString& name, bool writeReturnType)
{
ITypeInfo* returnType = nullptr;
if (writeReturnType)
{
returnType = typeInfo->GetElementType()->GetGenericArgument(0);
writer.WriteString(ConvertType(returnType));
writer.WriteChar(L' ');
}
writer.WriteString(name);
writer.WriteString(L"(");
for (vint i = 0; i < arguments.Count(); i++)
{
if (i > 0)
{
writer.WriteString(L", ");
}
writer.WriteString(ConvertArgumentType(typeInfo->GetElementType()->GetGenericArgument(i + 1)));
writer.WriteChar(L' ');
writer.WriteString(ConvertName(arguments[i]));
}
writer.WriteString(L")");
return returnType;
}
ITypeInfo* WfCppConfig::WriteFunctionHeader(stream::StreamWriter& writer, Ptr<WfOrderedLambdaExpression> ordered, const WString& name, bool writeReturnType)
{
auto result = manager->expressionResolvings[ordered.Obj()];
auto typeInfo = result.type.Obj();
auto scope = manager->nodeScopes[ordered.Obj()].Obj();
List<WString> arguments;
CopyFrom(
arguments,
Range<vint>(0, scope->symbols.Count())
.Select([scope](vint index)
{
return scope->symbols.GetByIndex(index)[0]->name;
})
.OrderBy((vint(*)(const WString&, const WString&))&WString::Compare)
);
return WriteFunctionHeader(writer, typeInfo, arguments, name, writeReturnType);
}
ITypeInfo* WfCppConfig::WriteFunctionHeader(stream::StreamWriter& writer, Ptr<WfFunctionExpression> funcExpr, const WString& name, bool writeReturnType)
{
auto result = manager->expressionResolvings[funcExpr.Obj()];
auto typeInfo = result.type.Obj();
List<WString> arguments;
CopyFrom(
arguments,
From(funcExpr->function->arguments)
.Select([](Ptr<WfFunctionArgument> argument)
{
return argument->name.value;
})
);
return WriteFunctionHeader(writer, typeInfo, arguments, name, writeReturnType);
}
ITypeInfo* WfCppConfig::WriteFunctionHeader(stream::StreamWriter& writer, Ptr<WfFunctionDeclaration> decl, const WString& name, bool writeReturnType)
{
vint index1 = manager->declarationMemberInfos.Keys().IndexOf(decl.Obj());
vint index2 = manager->interfaceMethodImpls.Keys().IndexOf(decl.Obj());
auto methodInfo =
index1 != -1 ? dynamic_cast<IMethodInfo*>(manager->declarationMemberInfos.Values()[index1].Obj()) :
index2 != -1 ? manager->interfaceMethodImpls.Values()[index2] :
nullptr;
List<WString> arguments;
CopyFrom(
arguments,
From(decl->arguments)
.Select([](Ptr<WfFunctionArgument> argument)
{
return argument->name.value;
})
);
if (methodInfo)
{
return WriteFunctionHeader(writer, methodInfo, arguments, name, writeReturnType);
}
else
{
auto scope = manager->nodeScopes[decl.Obj()].Obj();
auto symbol = manager->GetDeclarationSymbol(scope, decl.Obj());
auto typeInfo = symbol->typeInfo.Obj();
return WriteFunctionHeader(writer, typeInfo, arguments, name, writeReturnType);
}
}
ITypeInfo* WfCppConfig::WriteFunctionHeader(stream::StreamWriter& writer, IMethodInfo* methodInfo, collections::List<WString>& arguments, const WString& name, bool writeReturnType)
{
ITypeInfo* returnType = nullptr;
if (writeReturnType)
{
returnType = methodInfo->GetReturn();
writer.WriteString(ConvertType(returnType));
writer.WriteChar(L' ');
}
writer.WriteString(name);
writer.WriteString(L"(");
vint count = methodInfo->GetParameterCount();
for (vint i = 0; i < count; i++)
{
if (i > 0)
{
writer.WriteString(L", ");
}
writer.WriteString(ConvertArgumentType(methodInfo->GetParameter(i)->GetType()));
writer.WriteChar(L' ');
if (arguments.Count() == 0)
{
writer.WriteString(ConvertName(methodInfo->GetParameter(i)->GetName()));
}
else
{
writer.WriteString(ConvertName(arguments[i]));
}
}
writer.WriteString(L")");
return returnType;
}
ITypeInfo* WfCppConfig::WriteFunctionHeader(stream::StreamWriter& writer, IMethodInfo* methodInfo, const WString& name, bool writeReturnType)
{
List<WString> arguments;
return WriteFunctionHeader(writer, methodInfo, arguments, name, writeReturnType);
}
}
}
}
/***********************************************************************
CPP\WFCPP_WRITEGLOBAL.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace cppcodegen
{
using namespace collections;
using namespace reflection;
using namespace reflection::description;
void WfCppConfig::SortClosure(Dictionary<WString, Ptr<WfExpression>>& reversedLambdaExprs, Dictionary<WString, Ptr<WfNewInterfaceExpression>>& reversedClassExprs)
{
CopyFrom(
reversedLambdaExprs,
From(lambdaExprs)
.Select([](Pair<Ptr<WfExpression>, WString> pair)
{
return Pair<WString, Ptr<WfExpression>>(pair.value, pair.key);
})
);
CopyFrom(
reversedClassExprs,
From(classExprs)
.Select([](Pair<Ptr<WfNewInterfaceExpression>, WString> pair)
{
return Pair<WString, Ptr<WfNewInterfaceExpression>>(pair.value, pair.key);
})
);
}
void WfCppConfig::WriteHeader_Global(stream::StreamWriter& writer)
{
Dictionary<WString, Ptr<WfExpression>> reversedLambdaExprs;
Dictionary<WString, Ptr<WfNewInterfaceExpression>> reversedClassExprs;
SortClosure(reversedLambdaExprs, reversedClassExprs);
writer.WriteLine(L"/***********************************************************************");
writer.WriteLine(L"Global Variables and Functions");
writer.WriteLine(L"***********************************************************************/");
writer.WriteLine(L"");
writer.WriteLine(L"namespace " + assemblyNamespace);
writer.WriteLine(L"{");
writer.WriteLine(L"\tclass " + assemblyName);
writer.WriteLine(L"\t{");
writer.WriteLine(L"\tpublic:");
if (varDecls.Count() > 0)
{
writer.WriteLine(L"");
FOREACH(Ptr<WfVariableDeclaration>, decl, varDecls)
{
auto scope = manager->nodeScopes[decl.Obj()].Obj();
auto symbol = scope->symbols[decl->name.value][0];
auto typeInfo = symbol->typeInfo;
writer.WriteString(L"\t\t" + ConvertType(typeInfo.Obj()) + L" " + ConvertName(decl->name.value));
auto defaultValue = DefaultValue(typeInfo.Obj());
if (defaultValue != L"")
{
writer.WriteString(L" = ");
writer.WriteString(defaultValue);
}
writer.WriteLine(L";");
}
}
if (funcDecls.Count() > 0)
{
writer.WriteLine(L"");
FOREACH(Ptr<WfFunctionDeclaration>, decl, funcDecls)
{
writer.WriteString(L"\t\t");
WriteFunctionHeader(writer, decl, ConvertName(decl->name.value), true);
writer.WriteLine(L";");
}
}
writer.WriteLine(L"");
writer.WriteLine(L"\t\tstatic " + assemblyName + L"& Instance();");
writer.WriteLine(L"\t};");
if (reversedLambdaExprs.Count() + reversedClassExprs.Count() > 0)
{
writer.WriteLine(L"");
writer.WriteLine(L"/***********************************************************************");
writer.WriteLine(L"Closures");
writer.WriteLine(L"***********************************************************************/");
FOREACH(Ptr<WfExpression>, expr, reversedLambdaExprs.Values())
{
writer.WriteLine(L"");
WriteHeader_LambdaExprDecl(writer, expr);
}
FOREACH(Ptr<WfNewInterfaceExpression>, expr, reversedClassExprs.Values())
{
writer.WriteLine(L"");
WriteHeader_ClassExprDecl(writer, expr);
}
}
writer.WriteLine(L"}");
}
void WfCppConfig::WriteCpp_Global(stream::StreamWriter& writer)
{
Dictionary<WString, Ptr<WfExpression>> reversedLambdaExprs;
Dictionary<WString, Ptr<WfNewInterfaceExpression>> reversedClassExprs;
SortClosure(reversedLambdaExprs, reversedClassExprs);
writer.WriteLine(L"/***********************************************************************");
writer.WriteLine(L"Global Variables");
writer.WriteLine(L"***********************************************************************/");
writer.WriteLine(L"");
WString storageName = assemblyNamespace + L"_" + assemblyName;
writer.WriteLine(L"BEGIN_GLOBAL_STORAGE_CLASS(" + storageName + L")");
writer.WriteLine(L"\t" + assemblyNamespace + L"::" + assemblyName + L" instance;");
writer.WriteLine(L"\tINITIALIZE_GLOBAL_STORAGE_CLASS");
if (varDecls.Count() > 0)
{
writer.WriteLine(L"");
FOREACH(Ptr<WfVariableDeclaration>, decl, varDecls)
{
auto scope = manager->nodeScopes[decl.Obj()].Obj();
auto symbol = scope->symbols[decl->name.value][0];
auto typeInfo = symbol->typeInfo;
if (decl->expression)
{
writer.WriteString(L"\t\tinstance." + ConvertName(decl->name.value) + L" = ");
GenerateExpression(this, writer, decl->expression, typeInfo.Obj());
writer.WriteLine(L";");
}
}
}
writer.WriteLine(L"\tFINALIZE_GLOBAL_STORAGE_CLASS");
if (varDecls.Count() > 0)
{
writer.WriteLine(L"");
FOREACH(Ptr<WfVariableDeclaration>, decl, varDecls)
{
auto scope = manager->nodeScopes[decl.Obj()].Obj();
auto symbol = scope->symbols[decl->name.value][0];
auto typeInfo = symbol->typeInfo;
switch (typeInfo->GetDecorator())
{
case ITypeInfo::RawPtr:
case ITypeInfo::SharedPtr:
writer.WriteLine(L"\t\tinstance." + ConvertName(decl->name.value) + L" = nullptr;");
break;
case ITypeInfo::Nullable:
writer.WriteString(L"\t\tinstance." + ConvertName(decl->name.value) + L" = ");
ConvertType(typeInfo.Obj());
writer.WriteLine(L"();");
break;
default:
if (typeInfo->GetTypeDescriptor() == description::GetTypeDescriptor<WString>())
{
writer.WriteLine(L"\t\tinstance." + ConvertName(decl->name.value) + L" = ::vl::WString::Empty;");
}
else if (typeInfo->GetTypeDescriptor() == description::GetTypeDescriptor<Value>())
{
writer.WriteLine(L"\t\tinstance." + ConvertName(decl->name.value) + L" = ::vl::reflection::description::Value();");
}
}
}
}
writer.WriteLine(L"END_GLOBAL_STORAGE_CLASS(" + storageName + L")");
writer.WriteLine(L"");
writer.WriteString(L"namespace ");
writer.WriteLine(assemblyNamespace);
writer.WriteLine(L"{");
writer.WriteLine(L"/***********************************************************************");
writer.WriteLine(L"Global Functions");
writer.WriteLine(L"***********************************************************************/");
FOREACH(Ptr<WfFunctionDeclaration>, decl, funcDecls)
{
writer.WriteLine(L"");
writer.WriteString(L"\t");
auto returnType = WriteFunctionHeader(writer, decl, assemblyName + L"::" + ConvertName(decl->name.value), true);
writer.WriteLine(L"");
WriteFunctionBody(writer, decl->statement, L"\t", returnType);
}
writer.WriteLine(L"");
writer.WriteLine(L"\t" + assemblyName + L"& " + assemblyName + L"::Instance()");
writer.WriteLine(L"\t{");
writer.WriteLine(L"\t\treturn Get" + storageName + L"().instance;");
writer.WriteLine(L"\t}");
if (reversedLambdaExprs.Count() + reversedClassExprs.Count() > 0)
{
writer.WriteLine(L"");
writer.WriteLine(L"/***********************************************************************");
writer.WriteLine(L"Closures");
writer.WriteLine(L"***********************************************************************/");
FOREACH(Ptr<WfExpression>, expr, reversedLambdaExprs.Values())
{
writer.WriteLine(L"");
writer.WriteLine(L"\t//-------------------------------------------------------------------");
writer.WriteLine(L"");
WriteCpp_LambdaExprImpl(writer, expr);
}
if (reversedClassExprs.Count() > 0)
{
writer.WriteLine(L"");
FOREACH(Ptr<WfNewInterfaceExpression>, expr, reversedClassExprs.Values())
{
writer.WriteLine(L"\t//-------------------------------------------------------------------");
writer.WriteLine(L"");
WriteCpp_ClassExprImpl(writer, expr);
}
}
}
writer.WriteLine(L"}");
}
}
}
}
/***********************************************************************
CPP\WFCPP_WRITELAMBDA.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace cppcodegen
{
using namespace collections;
using namespace parsing;
using namespace analyzer;
using namespace reflection;
using namespace reflection::description;
/***********************************************************************
WfCppConfig::CollectClosureInfo
***********************************************************************/
class WfCppCollectClassExprInfoVisitor : public empty_visitor::DeclarationVisitor
{
public:
WfCppConfig* config;
vint variableCount = 0;
Ptr<analyzer::WfLexicalCapture> capture;
WfCppCollectClassExprInfoVisitor(WfCppConfig* _config)
:config(_config)
{
}
void Visit(WfVariableDeclaration* node)override
{
variableCount++;
}
void Dispatch(WfVirtualDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, decl, node->expandedDeclarations)
{
decl->Accept(this);
}
}
void Execute(WfNewInterfaceExpression* node)
{
capture = config->manager->lambdaCaptures[node];
FOREACH(Ptr<WfDeclaration>, memberDecl, node->declarations)
{
memberDecl->Accept(this);
}
}
};
Ptr<WfCppConfig::ClosureInfo> WfCppConfig::CollectClosureInfo(Ptr<WfExpression> closure)
{
using SymbolPair = Pair<WString, Ptr<analyzer::WfLexicalSymbol>>;
auto info = MakePtr<ClosureInfo>();
WfLexicalScope* scope = nullptr;
if (auto ordered = closure.Cast<WfOrderedLambdaExpression>())
{
// stable symbol order by sorting them by name
CopyFrom(
info->symbols,
From(manager->lambdaCaptures[ordered.Obj()]->symbols)
.Select([](Ptr<WfLexicalSymbol> symbol)
{
return SymbolPair(symbol->name, symbol);
})
);
scope = manager->nodeScopes[ordered.Obj()].Obj();
}
else if (auto funcExpr = closure.Cast<WfFunctionExpression>())
{
// stable symbol order by sorting them by name
CopyFrom(
info->symbols,
From(manager->lambdaCaptures[funcExpr->function.Obj()]->symbols)
.Select([](Ptr<WfLexicalSymbol> symbol)
{
return SymbolPair(symbol->name, symbol);
})
);
scope = manager->nodeScopes[funcExpr->function.Obj()].Obj();
}
else if (auto classExpr = closure.Cast<WfNewInterfaceExpression>())
{
WfCppCollectClassExprInfoVisitor visitor(this);
visitor.Execute(classExpr.Obj());
if (visitor.capture)
{
// stable symbol order by sorting them by name
CopyFrom(
info->symbols,
From(visitor.capture->symbols)
.Skip(visitor.variableCount)
.Select([](Ptr<WfLexicalSymbol> symbol)
{
return SymbolPair(symbol->name, symbol);
})
);
CopyFrom(
info->ctorArgumentSymbols,
From(visitor.capture->ctorArgumentSymbols)
.Select([](Ptr<WfLexicalSymbol> symbol)
{
return SymbolPair(symbol->name, symbol);
})
);
}
scope = manager->nodeScopes[classExpr.Obj()].Obj();
}
Ptr<WfLexicalFunctionConfig> methodConfig;
while (scope)
{
if (scope->typeOfThisExpr)
{
if (methodConfig)
{
info->thisTypes.Add(scope->typeOfThisExpr);
if (!methodConfig->parentThisAccessable)
{
break;
}
methodConfig = nullptr;
}
}
if (scope->functionConfig)
{
if (scope->functionConfig->thisAccessable)
{
methodConfig = scope->functionConfig;
}
}
scope = scope->parentScope.Obj();
}
return info;
}
/***********************************************************************
WfCppConfig::WriteCpp
***********************************************************************/
void WfCppConfig::WriteHeader_ClosurePreDecl(stream::StreamWriter& writer, Ptr<WfExpression> closure)
{
auto info = closureInfos[closure.Obj()];
writer.WriteString(L"\t");
if (closure.Cast<WfNewInterfaceExpression>())
{
writer.WriteString(L"class ");
}
else
{
writer.WriteString(L"struct ");
}
writer.WriteString(info->lambdaClassName);
writer.WriteLine(L";");
}
void WfCppConfig::WriteHeader_LambdaExprDecl(stream::StreamWriter& writer, Ptr<WfExpression> lambda)
{
if (auto ordered = lambda.Cast<WfOrderedLambdaExpression>())
{
auto name = lambdaExprs[lambda.Obj()];
writer.WriteLine(L"\tstruct " + name);
writer.WriteLine(L"\t{");
if (WriteCpp_ClosureMembers(writer, lambda))
{
writer.WriteLine(L"");
}
writer.WriteString(L"\t\t");
WriteCpp_ClosureCtor(writer, lambda, name);
writer.WriteLine(L";");
writer.WriteLine(L"");
writer.WriteString(L"\t\t");
WriteFunctionHeader(writer, ordered, L"operator()", true);
writer.WriteLine(L" const;");
writer.WriteLine(L"\t};");
}
else if (auto funcExpr = lambda.Cast<WfFunctionExpression>())
{
auto name = lambdaExprs[lambda.Obj()];
writer.WriteLine(L"\tstruct " + name);
writer.WriteLine(L"\t{");
if (WriteCpp_ClosureMembers(writer, lambda))
{
writer.WriteLine(L"");
}
writer.WriteString(L"\t\t");
WriteCpp_ClosureCtor(writer, lambda, name);
writer.WriteLine(L";");
writer.WriteLine(L"");
writer.WriteString(L"\t\t");
WriteFunctionHeader(writer, funcExpr, L"operator()", true);
writer.WriteLine(L" const;");
writer.WriteLine(L"\t};");
}
}
void WfCppConfig::WriteHeader_ClassExprDecl(stream::StreamWriter& writer, Ptr<WfNewInterfaceExpression> lambda)
{
auto result = manager->expressionResolvings[lambda.Obj()];
auto td = result.constructorInfo->GetOwnerTypeDescriptor();
auto name = classExprs[lambda.Obj()];
writer.WriteLine(L"\tclass " + name + L" : public ::vl::Object, public virtual " + ConvertType(td));
writer.WriteLine(L"\t{");
writer.WriteLine(L"\tpublic:");
if (WriteCpp_ClosureMembers(writer, lambda))
{
writer.WriteLine(L"");
}
writer.WriteString(L"\t\t");
WriteCpp_ClosureCtor(writer, lambda, name);
writer.WriteLine(L";");
writer.WriteLine(L"");
FOREACH(Ptr<WfDeclaration>, memberDecl, lambda->declarations)
{
GenerateClassMemberDecl(this, writer, name, memberDecl, L"\t\t", true);
}
writer.WriteLine(L"\t};");
}
bool WfCppConfig::WriteCpp_ClosureMembers(stream::StreamWriter& writer, Ptr<WfExpression> closure)
{
auto info = closureInfos[closure.Obj()];
FOREACH(Ptr<WfLexicalSymbol>, symbol, info->symbols.Values())
{
writer.WriteString(L"\t\t");
writer.WriteString(ConvertType(symbol->typeInfo.Obj()));
writer.WriteString(L" ");
writer.WriteString(ConvertName(symbol->name));
writer.WriteLine(L";");
}
FOREACH_INDEXER(ITypeDescriptor*, thisType, index, info->thisTypes)
{
auto typeInfo = MakePtr<RawPtrTypeInfo>(MakePtr<TypeDescriptorTypeInfo>(thisType, TypeInfoHint::Normal));
writer.WriteString(L"\t\t");
writer.WriteString(ConvertType(typeInfo.Obj()));
writer.WriteString(L" ");
writer.WriteString(L"__vwsnthis_" + itow(index));
writer.WriteLine(L";");
}
return info->symbols.Count() + info->thisTypes.Count() > 0;
}
void WfCppConfig::WriteCpp_ClosureCtor(stream::StreamWriter& writer, Ptr<WfExpression> closure, const WString& name)
{
auto info = closureInfos[closure.Obj()];
writer.WriteString(name);
writer.WriteString(L"(");
vint argumentIndex = 0;
FOREACH_INDEXER(Ptr<WfLexicalSymbol>, symbol, index, From(info->symbols.Values()).Concat(info->ctorArgumentSymbols.Values()))
{
if (argumentIndex++ > 0)
{
writer.WriteString(L", ");
}
writer.WriteString(ConvertType(symbol->typeInfo.Obj()));
writer.WriteString(L" __vwsnctor_");
writer.WriteString(ConvertName(symbol->name));
}
FOREACH_INDEXER(ITypeDescriptor*, thisType, index, info->thisTypes)
{
auto typeInfo = MakePtr<RawPtrTypeInfo>(MakePtr<TypeDescriptorTypeInfo>(thisType, TypeInfoHint::Normal));
if (argumentIndex++ > 0)
{
writer.WriteString(L", ");
}
writer.WriteString(ConvertType(typeInfo.Obj()));
writer.WriteString(L" __vwsnctorthis_" + itow(index));
}
writer.WriteString(L")");
}
void WfCppConfig::WriteCpp_ClosureCtorInitList(stream::StreamWriter& writer, Ptr<WfExpression> closure)
{
auto info = closureInfos[closure.Obj()];
FOREACH_INDEXER(Ptr<WfLexicalSymbol>, symbol, index, info->symbols.Values())
{
if (index > 0)
{
writer.WriteString(L"\t\t, ");
}
else
{
writer.WriteString(L"\t\t:");
}
writer.WriteString(ConvertName(symbol->name));
writer.WriteString(L"(__vwsnctor_");
writer.WriteString(ConvertName(symbol->name));
writer.WriteLine(L")");
}
FOREACH_INDEXER(ITypeDescriptor*, thisType, index, info->thisTypes)
{
if (index > 0 || info->symbols.Count() > 0)
{
writer.WriteString(L"\t\t, ");
}
else
{
writer.WriteString(L"\t\t:");
}
writer.WriteString(L"__vwsnthis_" + itow(index));
writer.WriteString(L"(__vwsnctorthis_" + itow(index));
writer.WriteLine(L")");
}
}
void WfCppConfig::WriteCpp_LambdaExprImpl(stream::StreamWriter& writer, Ptr<WfExpression> lambda)
{
if (auto ordered = lambda.Cast<WfOrderedLambdaExpression>())
{
auto name = lambdaExprs[lambda.Obj()];
writer.WriteString(L"\t");
WriteCpp_ClosureCtor(writer, lambda, name + L"::" + name);
writer.WriteLine(L"");
WriteCpp_ClosureCtorInitList(writer, lambda);
writer.WriteLine(L"\t{");
writer.WriteLine(L"\t}");
writer.WriteLine(L"");
writer.WriteString(L"\t");
auto returnType = WriteFunctionHeader(writer, ordered, name + L"::operator()", true);
writer.WriteLine(L" const");
writer.WriteLine(L"\t{");
WriteFunctionBody(writer, ordered->body, L"\t\t", returnType);
writer.WriteLine(L"\t}");
}
else if (auto funcExpr = lambda.Cast<WfFunctionExpression>())
{
auto name = lambdaExprs[lambda.Obj()];
writer.WriteString(L"\t");
WriteCpp_ClosureCtor(writer, lambda, name + L"::" + name);
writer.WriteLine(L"");
WriteCpp_ClosureCtorInitList(writer, lambda);
writer.WriteLine(L"\t{");
writer.WriteLine(L"\t}");
writer.WriteLine(L"");
writer.WriteString(L"\t");
auto returnType = WriteFunctionHeader(writer, funcExpr, name + L"::operator()", true);
writer.WriteLine(L" const");
WriteFunctionBody(writer, funcExpr->function->statement, L"\t", returnType);
}
}
class WriteCpp_ClassExprImpl_InitFieldVisitor
: public empty_visitor::DeclarationVisitor
{
public:
WfCppConfig* config;
stream::StreamWriter& writer;
WriteCpp_ClassExprImpl_InitFieldVisitor(WfCppConfig* _config, stream::StreamWriter& _writer)
:config(_config)
, writer(_writer)
{
}
void Dispatch(WfVirtualDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, decl, node->expandedDeclarations)
{
decl->Accept(this);
}
}
void Visit(WfVariableDeclaration* node)override
{
if (node->expression)
{
auto scope = config->manager->nodeScopes[node].Obj();
auto symbol = scope->symbols[node->name.value][0];
auto typeInfo = symbol->typeInfo;
writer.WriteString(L"\t\tthis->");
writer.WriteString(config->ConvertName(node->name.value));
writer.WriteString(L" = ");
GenerateExpression(config, writer, node->expression, typeInfo.Obj());
writer.WriteLine(L";");
}
}
};
void WfCppConfig::WriteCpp_ClassExprImpl(stream::StreamWriter& writer, Ptr<WfNewInterfaceExpression> lambda)
{
auto name = classExprs[lambda.Obj()];
writer.WriteString(L"\t");
WriteCpp_ClosureCtor(writer, lambda, name + L"::" + name);
writer.WriteLine(L"");
WriteCpp_ClosureCtorInitList(writer, lambda);
writer.WriteLine(L"\t{");
{
WriteCpp_ClassExprImpl_InitFieldVisitor visitor(this, writer);
FOREACH(Ptr<WfDeclaration>, memberDecl, lambda->declarations)
{
memberDecl->Accept(&visitor);
}
}
writer.WriteLine(L"\t}");
writer.WriteLine(L"");
WString classFullName = L"::" + assemblyNamespace + L"::" + name;
FOREACH(Ptr<WfDeclaration>, memberDecl, lambda->declarations)
{
if (GenerateClassMemberImpl(this, writer, name, name, classFullName, memberDecl, L"\t"))
{
writer.WriteLine(L"");
}
}
}
}
}
}
/***********************************************************************
CPP\WFCPP_WRITEREFLECTION.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace cppcodegen
{
using namespace collections;
using namespace reflection;
using namespace reflection::description;
void LoadTypes(WfCppConfig* config, List<ITypeDescriptor*>& tds)
{
CopyFrom(
tds,
From(config->manager->declarationTypes.Values())
.OrderBy([](Ptr<ITypeDescriptor> a, Ptr<ITypeDescriptor> b)
{
return WString::Compare(a->GetTypeName(), b->GetTypeName());
})
.Select([](Ptr<ITypeDescriptor> td)
{
return td.Obj();
})
);
}
void WfCppConfig::WriteHeader_Reflection(stream::StreamWriter& writer)
{
writer.WriteLine(L"/***********************************************************************");
writer.WriteLine(L"Reflection");
writer.WriteLine(L"***********************************************************************/");
writer.WriteLine(L"");
List<ITypeDescriptor*> tds;
LoadTypes(this, tds);
writer.WriteLine(L"namespace vl");
writer.WriteLine(L"{");
writer.WriteLine(L"\tnamespace reflection");
writer.WriteLine(L"\t{");
writer.WriteLine(L"\t\tnamespace description");
writer.WriteLine(L"\t\t{");
writer.WriteLine(L"#ifndef VCZH_DEBUG_NO_REFLECTION");
FOREACH(ITypeDescriptor*, td, tds)
{
writer.WriteString(L"\t\t\tDECL_TYPE_INFO(");
writer.WriteString(ConvertType(td));
writer.WriteLine(L")");
}
List<ITypeDescriptor*> tdInterfaces;
CopyFrom(
tdInterfaces,
From(tds)
.Where([](ITypeDescriptor* td)
{
return td->GetTypeDescriptorFlags() == TypeDescriptorFlags::Interface;
})
);
{
vint processed = 0;
while (processed < tdInterfaces.Count())
{
vint count = tdInterfaces.Count();
for (vint i = processed; i < count; i++)
{
auto td = tdInterfaces[i];
if (Range<vint>(0, td->GetBaseTypeDescriptorCount())
.All([&](vint baseIndex)
{
return tdInterfaces.IndexOf(td->GetBaseTypeDescriptor(baseIndex)) < processed;
}))
{
tdInterfaces.RemoveAt(i);
tdInterfaces.Insert(processed++, td);
}
}
}
}
if (tdInterfaces.Count() > 0)
{
FOREACH(ITypeDescriptor*, td, tdInterfaces)
{
List<ITypeDescriptor*> baseTds;
CopyFrom(
baseTds,
Range<vint>(0, td->GetBaseTypeDescriptorCount())
.Select([&](vint index)
{
return td->GetBaseTypeDescriptor(index);
})
.Where([&](ITypeDescriptor* baseTd)
{
return baseTd->GetTypeDescriptorFlags() != TypeDescriptorFlags::IDescriptable;
})
);
writer.WriteLine(L"");
if (baseTds.Count() > 0)
{
writer.WriteString(L"\t\t\tBEGIN_INTERFACE_PROXY_SHAREDPTR(");
writer.WriteString(ConvertType(td));
FOREACH(ITypeDescriptor*, baseTd, baseTds)
{
writer.WriteString(L", ");
writer.WriteString(ConvertType(baseTd));
}
writer.WriteLine(L")");
}
else
{
writer.WriteString(L"\t\t\tBEGIN_INTERFACE_PROXY_NOPARENT_SHAREDPTR(");
writer.WriteString(ConvertType(td));
writer.WriteLine(L")");
}
vint methodGroupCount = td->GetMethodGroupCount();
for (vint i = 0; i < methodGroupCount; i++)
{
auto methodGroup = td->GetMethodGroup(i);
vint methodCount = methodGroup->GetMethodCount();
for (vint j = 0; j < methodCount; j++)
{
auto methodInfo = methodGroup->GetMethod(j);
if (!methodInfo->IsStatic())
{
writer.WriteString(L"\t\t\t\t");
WriteFunctionHeader(writer, methodInfo, ConvertName(methodInfo->GetName()), true);
writer.WriteLine(L" override");
writer.WriteLine(L"\t\t\t\t{");
if (methodInfo->GetReturn()->GetTypeDescriptor() == description::GetTypeDescriptor<void>())
{
writer.WriteString(L"\t\t\t\t\tINVOKE_INTERFACE_PROXY");
}
else
{
writer.WriteString(L"\t\t\t\t\tINVOKEGET_INTERFACE_PROXY");
}
if (methodInfo->GetParameterCount() > 0)
{
writer.WriteString(L"(");
writer.WriteString(ConvertName(methodInfo->GetName()));
vint parameterCount = methodInfo->GetParameterCount();
for (vint k = 0; k < parameterCount; k++)
{
writer.WriteString(L", ");
writer.WriteString(ConvertName(methodInfo->GetParameter(k)->GetName()));
}
writer.WriteLine(L");");
}
else
{
writer.WriteString(L"_NOPARAMS(");
writer.WriteString(ConvertName(methodInfo->GetName()));
writer.WriteLine(L");");
}
writer.WriteLine(L"\t\t\t\t}");
}
}
}
writer.WriteString(L"\t\t\tEND_INTERFACE_PROXY(");
writer.WriteString(ConvertType(td));
writer.WriteLine(L")");
}
}
writer.WriteLine(L"#endif");
writer.WriteLine(L"");
writer.WriteString(L"\t\t\textern bool Load");
writer.WriteString(assemblyName);
writer.WriteLine(L"Types();");
writer.WriteLine(L"\t\t}");
writer.WriteLine(L"\t}");
writer.WriteLine(L"}");
}
void WfCppConfig::WriteCpp_Reflection(stream::StreamWriter& writer)
{
writer.WriteLine(L"/***********************************************************************");
writer.WriteLine(L"Reflection");
writer.WriteLine(L"***********************************************************************/");
writer.WriteLine(L"");
List<ITypeDescriptor*> tds;
LoadTypes(this, tds);
writer.WriteLine(L"namespace vl");
writer.WriteLine(L"{");
writer.WriteLine(L"\tnamespace reflection");
writer.WriteLine(L"\t{");
writer.WriteLine(L"\t\tnamespace description");
writer.WriteLine(L"\t\t{");
writer.WriteLine(L"#ifndef VCZH_DEBUG_NO_REFLECTION");
FOREACH(ITypeDescriptor*, td, tds)
{
writer.WriteString(L"\t\t\tIMPL_CPP_TYPE_INFO(");
WString type = ConvertType(td);
if (type.Length() > 2 && type.Sub(0, 2) == L"::")
{
type = type.Sub(2, type.Length() - 2);
}
writer.WriteString(type);
writer.WriteLine(L")");
}
writer.WriteLine(L"");
writer.WriteLine(L"#define _ ,");
FOREACH(ITypeDescriptor*, td, tds)
{
switch (td->GetTypeDescriptorFlags())
{
case TypeDescriptorFlags::NormalEnum:
case TypeDescriptorFlags::FlagEnum:
{
writer.WriteString(L"\t\t\tBEGIN_ENUM_ITEM");
if (td->GetTypeDescriptorFlags() == TypeDescriptorFlags::FlagEnum)
{
writer.WriteString(L"_MERGABLE");
}
writer.WriteString(L"(");
writer.WriteString(ConvertType(td));
writer.WriteLine(L")");
auto enumType = td->GetEnumType();
vint count = enumType->GetItemCount();
for (vint i = 0; i < count; i++)
{
writer.WriteString(L"\t\t\t\tENUM_CLASS_ITEM(");
writer.WriteString(ConvertName(enumType->GetItemName(i)));
writer.WriteLine(L")");
}
writer.WriteString(L"\t\t\tEND_ENUM_ITEM(");
writer.WriteString(ConvertType(td));
writer.WriteLine(L")");
}
break;
case TypeDescriptorFlags::Struct:
{
writer.WriteString(L"\t\t\tBEGIN_STRUCT_MEMBER(");
writer.WriteString(ConvertType(td));
writer.WriteLine(L")");
vint count = td->GetPropertyCount();
for (vint i = 0; i < count; i++)
{
writer.WriteString(L"\t\t\t\tSTRUCT_MEMBER(");
writer.WriteString(ConvertName(td->GetProperty(i)->GetName()));
writer.WriteLine(L")");
}
writer.WriteString(L"\t\t\tEND_STRUCT_MEMBER(");
writer.WriteString(ConvertType(td));
writer.WriteLine(L")");
}
break;
case TypeDescriptorFlags::Interface:
case TypeDescriptorFlags::Class:
{
if (td->GetTypeDescriptorFlags() == TypeDescriptorFlags::Interface)
{
writer.WriteString(L"\t\t\tBEGIN_INTERFACE_MEMBER(");
}
else
{
writer.WriteString(L"\t\t\tBEGIN_CLASS_MEMBER(");
}
writer.WriteString(ConvertType(td));
writer.WriteLine(L")");
if (td->GetTypeDescriptorFlags() == TypeDescriptorFlags::Class)
{
auto methodGroup = td->GetConstructorGroup();
vint methodCount = methodGroup->GetMethodCount();
for (vint j = 0; j < methodCount; j++)
{
auto methodInfo = methodGroup->GetMethod(j);
vint parameterCount = methodInfo->GetParameterCount();
writer.WriteString(L"\t\t\t\tCLASS_MEMBER_CONSTRUCTOR(");
writer.WriteString(ConvertType(methodInfo->GetReturn()));
writer.WriteString(L"(");
for (vint k = 0; k < parameterCount; k++)
{
if (k > 0)
{
writer.WriteString(L", ");
}
writer.WriteString(ConvertArgumentType(methodInfo->GetParameter(k)->GetType()));
}
writer.WriteString(L")");
if (parameterCount > 0)
{
writer.WriteString(L", {");
for (vint k = 0; k < parameterCount; k++)
{
if (k > 0)
{
writer.WriteString(L" _");
}
writer.WriteString(L" L\"");
writer.WriteString(ConvertName(methodInfo->GetParameter(k)->GetName()));
writer.WriteString(L"\"");
}
writer.WriteLine(L" })");
}
else
{
writer.WriteLine(L", NO_PARAMETER)");
}
}
}
vint methodGroupCount = td->GetMethodGroupCount();
for (vint i = 0; i < methodGroupCount; i++)
{
auto methodGroup = td->GetMethodGroup(i);
vint methodCount = methodGroup->GetMethodCount();
for (vint j = 0; j < methodCount; j++)
{
auto methodInfo = methodGroup->GetMethod(j);
if (methodInfo->IsStatic())
{
writer.WriteString(L"\t\t\t\tCLASS_MEMBER_STATIC_METHOD");
}
else
{
writer.WriteString(L"\t\t\t\tCLASS_MEMBER_METHOD");
}
if (methodCount > 1)
{
writer.WriteString(L"_OVERLOAD");
}
writer.WriteString(L"(");
writer.WriteString(ConvertName(methodInfo->GetName()));
vint parameterCount = methodInfo->GetParameterCount();
if (parameterCount > 0)
{
writer.WriteString(L", {");
for (vint k = 0; k < parameterCount; k++)
{
if (k > 0)
{
writer.WriteString(L" _");
}
writer.WriteString(L" L\"");
writer.WriteString(ConvertName(methodInfo->GetParameter(k)->GetName()));
writer.WriteString(L"\"");
}
writer.WriteString(L" }");
}
else
{
writer.WriteString(L", NO_PARAMETER");
}
if (methodCount > 1)
{
writer.WriteString(L", ");
auto typeDecorator = methodInfo->IsStatic() ? WString(L"(*)", false) : L"(" + ConvertType(td) + L"::*)";
writer.WriteString(ConvertFunctionType(methodInfo, typeDecorator));
}
writer.WriteLine(L")");
}
}
vint eventCount = td->GetEventCount();
for (vint i = 0; i < eventCount; i++)
{
auto eventInfo = td->GetEvent(i);
writer.WriteString(L"\t\t\t\tCLASS_MEMBER_EVENT(");
writer.WriteString(ConvertName(eventInfo->GetName()));
writer.WriteLine(L")");
}
vint propertyCount = td->GetPropertyCount();
for (vint i = 0; i < propertyCount; i++)
{
auto propertyInfo = td->GetProperty(i);
if (auto getter = propertyInfo->GetGetter())
{
if (auto eventInfo = propertyInfo->GetValueChangedEvent())
{
if (auto setter = propertyInfo->GetSetter())
{
writer.WriteString(L"\t\t\t\tCLASS_MEMBER_PROPERTY_EVENT(");
writer.WriteString(ConvertName(propertyInfo->GetName()));
writer.WriteString(L", ");
writer.WriteString(ConvertName(getter->GetName()));
writer.WriteString(L", ");
writer.WriteString(ConvertName(setter->GetName()));
writer.WriteString(L", ");
writer.WriteString(ConvertName(eventInfo->GetName()));
writer.WriteLine(L")");
}
else
{
writer.WriteString(L"\t\t\t\tCLASS_MEMBER_PROPERTY_EVENT_READONLY(");
writer.WriteString(ConvertName(propertyInfo->GetName()));
writer.WriteString(L", ");
writer.WriteString(ConvertName(getter->GetName()));
writer.WriteString(L", ");
writer.WriteString(ConvertName(eventInfo->GetName()));
writer.WriteLine(L")");
}
}
else
{
if (auto setter = propertyInfo->GetSetter())
{
writer.WriteString(L"\t\t\t\tCLASS_MEMBER_PROPERTY(");
writer.WriteString(ConvertName(propertyInfo->GetName()));
writer.WriteString(L", ");
writer.WriteString(ConvertName(getter->GetName()));
writer.WriteString(L", ");
writer.WriteString(ConvertName(setter->GetName()));
writer.WriteLine(L")");
}
else
{
writer.WriteString(L"\t\t\t\tCLASS_MEMBER_PROPERTY_READONLY(");
writer.WriteString(ConvertName(propertyInfo->GetName()));
writer.WriteString(L", ");
writer.WriteString(ConvertName(getter->GetName()));
writer.WriteLine(L")");
}
}
}
else
{
writer.WriteString(L"\t\t\t\tCLASS_MEMBER_FIELD(");
writer.WriteString(ConvertName(propertyInfo->GetName()));
writer.WriteLine(L")");
}
}
if (td->GetTypeDescriptorFlags() == TypeDescriptorFlags::Interface)
{
writer.WriteString(L"\t\t\tEND_INTERFACE_MEMBER(");
}
else
{
writer.WriteString(L"\t\t\tEND_CLASS_MEMBER(");
}
writer.WriteString(ConvertType(td));
writer.WriteLine(L")");
}
break;
default:;
}
writer.WriteLine(L"");
}
writer.WriteLine(L"#undef _");
writer.WriteString(L"\t\t\tclass ");
writer.WriteString(assemblyName);
writer.WriteLine(L"TypeLoader : public Object, public ITypeLoader");
writer.WriteLine(L"\t\t\t{");
writer.WriteLine(L"\t\t\tpublic:");
writer.WriteLine(L"\t\t\t\tvoid Load(ITypeManager* manager)");
writer.WriteLine(L"\t\t\t\t{");
FOREACH(ITypeDescriptor*, td, tds)
{
writer.WriteString(L"\t\t\t\t\tADD_TYPE_INFO(");
writer.WriteString(ConvertType(td));
writer.WriteLine(L")");
}
writer.WriteLine(L"\t\t\t\t}");
writer.WriteLine(L"");
writer.WriteLine(L"\t\t\t\tvoid Unload(ITypeManager* manager)");
writer.WriteLine(L"\t\t\t\t{");
writer.WriteLine(L"\t\t\t\t}");
writer.WriteLine(L"\t\t\t};");
writer.WriteLine(L"#endif");
writer.WriteLine(L"");
writer.WriteString(L"\t\t\tbool Load");
writer.WriteString(assemblyName);
writer.WriteLine(L"Types()");
writer.WriteLine(L"\t\t\t{");
writer.WriteLine(L"#ifndef VCZH_DEBUG_NO_REFLECTION");
writer.WriteLine(L"\t\t\t\tif (auto manager = GetGlobalTypeManager())");
writer.WriteLine(L"\t\t\t\t{");
writer.WriteString(L"\t\t\t\t\treturn manager->AddTypeLoader(MakePtr<");
writer.WriteString(assemblyName);
writer.WriteLine(L"TypeLoader>());");
writer.WriteLine(L"\t\t\t\t}");
writer.WriteLine(L"#endif");
writer.WriteLine(L"\t\t\t\treturn false;");
writer.WriteLine(L"\t\t\t}");
writer.WriteLine(L"\t\t}");
writer.WriteLine(L"\t}");
writer.WriteLine(L"}");
}
}
}
}
/***********************************************************************
CPP\WFCPP_WRITESTRUCT.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace cppcodegen
{
using namespace collections;
void WfCppConfig::WriteHeader_Struct(stream::StreamWriter& writer, Ptr<WfStructDeclaration> decl, const WString& name, const WString& prefix)
{
auto td = manager->declarationTypes[decl.Obj()].Obj();
writer.WriteLine(prefix + L"struct " + name);
writer.WriteLine(prefix + L"{");
FOREACH(Ptr<WfStructMember>, member, decl->members)
{
auto prop = td->GetPropertyByName(member->name.value, false);
auto defaultValue = DefaultValue(prop->GetReturn());
if (defaultValue != L"")
{
defaultValue = L" = " + defaultValue;
}
writer.WriteLine(prefix + L"\t" + ConvertType(prop->GetReturn()) + L" " + ConvertName(member->name.value) + defaultValue + L";");
}
writer.WriteLine(prefix + L"};");
}
void WfCppConfig::WriteHeader_StructOp(stream::StreamWriter& writer, Ptr<WfStructDeclaration> decl, const WString& name, const WString& prefix)
{
using opt = Tuple<const wchar_t*, const wchar_t*, const wchar_t*>;
opt ops[] = {
opt(L"==", L"false", L"true"),
opt(L"!=", L"true", L"false")
};
for (auto op : ops)
{
writer.WriteString(prefix);
writer.WriteString(L"inline bool operator");
writer.WriteString(op.f0);
writer.WriteString(L" (const ");
writer.WriteString(name);
writer.WriteString(L"& a, const ");
writer.WriteString(name);
writer.WriteLine(L"& b)");
writer.WriteString(prefix);
writer.WriteLine(L"{");
FOREACH(Ptr<WfStructMember>, member, decl->members)
{
writer.WriteString(prefix);
writer.WriteString(L"\tif (a.");
writer.WriteString(ConvertName(member->name.value));
writer.WriteString(L" != b.");
writer.WriteString(ConvertName(member->name.value));
writer.WriteString(L") return ");
writer.WriteString(op.f1);
writer.WriteLine(L";");
}
writer.WriteString(prefix);
writer.WriteString(L"\treturn ");
writer.WriteString(op.f2);
writer.WriteLine(L";");
writer.WriteString(prefix);
writer.WriteLine(L"}");
}
}
void WfCppConfig::WriteHeader_Struct(stream::StreamWriter& writer, Ptr<WfStructDeclaration> decl, collections::List<WString>& nss)
{
auto td = manager->declarationTypes[decl.Obj()].Obj();
WString name;
auto prefix = WriteNamespace(writer, CppGetFullName(td), nss, name);
WriteHeader_Struct(writer, decl, name, prefix);
WriteHeader_StructOp(writer, decl, name, prefix);
}
}
}
}
/***********************************************************************
EMITTER\WFEMITTER.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace emitter
{
using namespace parsing;
using namespace reflection::description;
using namespace analyzer;
using namespace runtime;
/***********************************************************************
WfAttributeEvaluator
***********************************************************************/
WfAttributeEvaluator::WfAttributeEvaluator(analyzer::WfLexicalScopeManager* _manager)
:manager(_manager)
{
}
Ptr<WfAttribute> WfAttributeEvaluator::GetAttribute(collections::List<Ptr<WfAttribute>>& atts, const WString& category, const WString& name)
{
return From(GetAttributes(atts, category, name)).First(nullptr);
}
collections::LazyList<Ptr<WfAttribute>> WfAttributeEvaluator::GetAttributes(collections::List<Ptr<WfAttribute>>& atts, const WString& category, const WString& name)
{
return From(atts)
.Where([=](Ptr<WfAttribute> att)
{
return att->category.value == category && att->name.value == name;
});
}
Value WfAttributeEvaluator::GetAttributeValue(Ptr<WfAttribute> att)
{
if (!att->value)
{
return Value();
}
{
vint index = attributeValues.Keys().IndexOf(att.Obj());
if (index != -1)
{
return attributeValues.Values()[index];
}
}
if (!attributeAssembly)
{
attributeAssembly = MakePtr<WfAssembly>();
auto func = MakePtr<WfAssemblyFunction>();
func->name = L"<get-attribute-value>";
func->firstInstruction = 0;
vint index = attributeAssembly->functions.Add(func);
attributeAssembly->functionByName.Add(func->name, index);
}
attributeAssembly->insBeforeCodegen = MakePtr<WfInstructionDebugInfo>();
attributeAssembly->insAfterCodegen = MakePtr<WfInstructionDebugInfo>();
attributeAssembly->instructions.Clear();
WfCodegenContext context(attributeAssembly, manager);
{
auto recorderBefore = new ParsingGeneratedLocationRecorder(context.nodePositionsBeforeCodegen);
auto recorderAfter = new ParsingGeneratedLocationRecorder(context.nodePositionsAfterCodegen);
auto recorderOriginal = new ParsingOriginalLocationRecorder(recorderBefore);
auto recorderMultiple = new ParsingMultiplePrintNodeRecorder;
recorderMultiple->AddRecorder(recorderOriginal);
recorderMultiple->AddRecorder(recorderAfter);
stream::MemoryStream memoryStream;
{
stream::StreamWriter streamWriter(memoryStream);
ParsingWriter parsingWriter(streamWriter, recorderMultiple);
WfPrint(att->value, L"", parsingWriter);
}
}
auto typeInfo = manager->attributes[{att->category.value, att->name.value}];
GenerateExpressionInstructions(context, att->value, typeInfo);
attributeAssembly->instructions.Add(WfInstruction::Return());
if (!attributeGlobalContext)
{
attributeGlobalContext = MakePtr<WfRuntimeGlobalContext>(attributeAssembly);
}
auto func = LoadFunction<Value()>(attributeGlobalContext, L"<get-attribute-value>");
auto value = func();
attributeValues.Add(att, value);
return func();
}
/***********************************************************************
WfCodegenFunctionContext
***********************************************************************/
WfCodegenFunctionContext::WfCodegenFunctionContext()
{
scopeContextStack.Add(new WfCodegenScopeContext);
}
Ptr<WfCodegenScopeContext> WfCodegenFunctionContext::GetCurrentScopeContext()
{
return scopeContextStack[scopeContextStack.Count() - 1];
}
Ptr<WfCodegenScopeContext> WfCodegenFunctionContext::GetCurrentScopeContext(WfCodegenScopeType type)
{
for (vint i = scopeContextStack.Count() - 1; i >= 0; i--)
{
auto context = scopeContextStack[i];
if (context->type == type)
{
return context;
}
}
return 0;
}
Ptr<WfCodegenScopeContext> WfCodegenFunctionContext::PushScopeContext(WfCodegenScopeType type)
{
auto context = MakePtr<WfCodegenScopeContext>();
context->type = type;
scopeContextStack.Add(context);
return context;
}
void WfCodegenFunctionContext::PopScopeContext()
{
scopeContextStack.RemoveAt(scopeContextStack.Count() - 1);
}
/***********************************************************************
WfCodegenContext
***********************************************************************/
WfCodegenContext::WfCodegenContext(Ptr<runtime::WfAssembly> _assembly, analyzer::WfLexicalScopeManager* _manager)
:assembly(_assembly)
, manager(_manager)
{
}
vint WfCodegenContext::AddInstruction(parsing::ParsingTreeCustomBase* node, const runtime::WfInstruction& ins)
{
auto index = assembly->instructions.Add(ins);
if (node)
{
assembly->insBeforeCodegen->instructionCodeMapping.Add(nodePositionsBeforeCodegen[node]);
assembly->insAfterCodegen->instructionCodeMapping.Add(nodePositionsAfterCodegen[node]);
}
else
{
parsing::ParsingTextRange range;
assembly->insBeforeCodegen->instructionCodeMapping.Add(range);
assembly->insAfterCodegen->instructionCodeMapping.Add(range);
}
return index;
}
void WfCodegenContext::AddExitInstruction(parsing::ParsingTreeCustomBase* node, const runtime::WfInstruction& ins)
{
auto context = functionContext->GetCurrentScopeContext();
context->exitInstructions.Add(ins);
context->instructionCodeMappingBeforeCodegen.Add(nodePositionsBeforeCodegen[node]);
context->instructionCodeMappingAfterCodegen.Add(nodePositionsAfterCodegen[node]);
}
void WfCodegenContext::ApplyExitInstructions(Ptr<WfCodegenScopeContext> scopeContext)
{
if (scopeContext->exitInstructions.Count() > 0)
{
CopyFrom(assembly->instructions, scopeContext->exitInstructions, true);
CopyFrom(assembly->insBeforeCodegen->instructionCodeMapping, scopeContext->instructionCodeMappingBeforeCodegen, true);
CopyFrom(assembly->insAfterCodegen->instructionCodeMapping, scopeContext->instructionCodeMappingAfterCodegen, true);
}
}
vint WfCodegenContext::GetThisStackCount(analyzer::WfLexicalScope* scope)
{
vint count = 0;
Ptr<WfLexicalFunctionConfig> firstConfig, methodConfig;
while (scope)
{
if (scope->typeOfThisExpr)
{
if (methodConfig)
{
count++;
if (!methodConfig->parentThisAccessable)
{
break;
}
methodConfig = nullptr;
}
}
if (scope->functionConfig)
{
if (!firstConfig)
{
vint index = thisStackCounts.Keys().IndexOf(scope->functionConfig.Obj());
if (index == -1)
{
firstConfig = scope->functionConfig;
}
else
{
return thisStackCounts.Values()[index];
}
}
if (scope->functionConfig->thisAccessable)
{
methodConfig = scope->functionConfig;
}
}
scope = scope->parentScope.Obj();
}
if (firstConfig)
{
thisStackCounts.Add(firstConfig, count);
}
return count;
}
}
}
}
/***********************************************************************
EMITTER\WFEMITTER_ASSEMBLY.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace emitter
{
using namespace parsing;
using namespace reflection::description;
using namespace analyzer;
using namespace runtime;
using namespace typeimpl;
typedef WfInstruction Ins;
#define INSTRUCTION(X) context.AddInstruction(node, X)
/***********************************************************************
GenerateTypeCastInstructions
***********************************************************************/
void GenerateTypeCastInstructions(WfCodegenContext& context, Ptr<reflection::description::ITypeInfo> expectedType, bool strongCast, WfExpression* node)
{
if (expectedType->GetTypeDescriptor() != GetTypeDescriptor<Value>())
{
if (strongCast)
{
switch (expectedType->GetDecorator())
{
case ITypeInfo::RawPtr:
INSTRUCTION(Ins::ConvertToType(Value::RawPtr, expectedType->GetTypeDescriptor()));
break;
case ITypeInfo::SharedPtr:
INSTRUCTION(Ins::ConvertToType(Value::SharedPtr, expectedType->GetTypeDescriptor()));
break;
case ITypeInfo::Nullable:
case ITypeInfo::TypeDescriptor:
case ITypeInfo::Generic:
INSTRUCTION(Ins::ConvertToType(Value::BoxedValue, expectedType->GetTypeDescriptor()));
break;
}
}
else
{
switch (expectedType->GetDecorator())
{
case ITypeInfo::RawPtr:
INSTRUCTION(Ins::TryConvertToType(Value::RawPtr, expectedType->GetTypeDescriptor()));
break;
case ITypeInfo::SharedPtr:
INSTRUCTION(Ins::TryConvertToType(Value::SharedPtr, expectedType->GetTypeDescriptor()));
break;
case ITypeInfo::Nullable:
case ITypeInfo::TypeDescriptor:
case ITypeInfo::Generic:
INSTRUCTION(Ins::TryConvertToType(Value::BoxedValue, expectedType->GetTypeDescriptor()));
break;
}
}
}
}
/***********************************************************************
GetInstructionTypeArgument
***********************************************************************/
void GenerateTypeTestingInstructions(WfCodegenContext& context, Ptr<reflection::description::ITypeInfo> expectedType, WfExpression* node)
{
if (expectedType->GetTypeDescriptor() != GetTypeDescriptor<Value>())
{
switch (expectedType->GetDecorator())
{
case ITypeInfo::RawPtr:
INSTRUCTION(Ins::TestType(Value::RawPtr, expectedType->GetTypeDescriptor()));
break;
case ITypeInfo::SharedPtr:
INSTRUCTION(Ins::TestType(Value::SharedPtr, expectedType->GetTypeDescriptor()));
break;
case ITypeInfo::Nullable:
case ITypeInfo::TypeDescriptor:
case ITypeInfo::Generic:
INSTRUCTION(Ins::TestType(Value::BoxedValue, expectedType->GetTypeDescriptor()));
break;
}
}
else
{
INSTRUCTION(Ins::Pop());
INSTRUCTION(Ins::LoadValue(BoxValue(true)));
}
}
/***********************************************************************
GenerateTypeCastInstructions
***********************************************************************/
runtime::WfInsType GetInstructionTypeArgument(Ptr<reflection::description::ITypeInfo> expectedType)
{
auto td = expectedType->GetTypeDescriptor();
if (td == GetTypeDescriptor<bool>()) return WfInsType::Bool;
if (td == GetTypeDescriptor<vint8_t>()) return WfInsType::I1;
if (td == GetTypeDescriptor<vint16_t>()) return WfInsType::I2;
if (td == GetTypeDescriptor<vint32_t>()) return WfInsType::I4;
if (td == GetTypeDescriptor<vint64_t>()) return WfInsType::I8;
if (td == GetTypeDescriptor<vuint8_t>()) return WfInsType::U1;
if (td == GetTypeDescriptor<vuint16_t>()) return WfInsType::U2;
if (td == GetTypeDescriptor<vuint32_t>()) return WfInsType::U4;
if (td == GetTypeDescriptor<vuint64_t>()) return WfInsType::U8;
if (td == GetTypeDescriptor<float>()) return WfInsType::F4;
if (td == GetTypeDescriptor<double>()) return WfInsType::F8;
if (td == GetTypeDescriptor<WString>()) return WfInsType::String;
return WfInsType::Unknown;
}
/***********************************************************************
GenerateAssembly
***********************************************************************/
Ptr<runtime::WfAssembly> GenerateAssembly(analyzer::WfLexicalScopeManager* manager)
{
auto assembly = MakePtr<WfAssembly>();
assembly->insBeforeCodegen = new WfInstructionDebugInfo;
assembly->insAfterCodegen = new WfInstructionDebugInfo;
WfCodegenContext context(assembly, manager);
FOREACH_INDEXER(Ptr<WfModule>, module, index, manager->GetModules())
{
auto codeBeforeCodegen = manager->GetModuleCodes()[index];
auto recorderBefore = new ParsingGeneratedLocationRecorder(context.nodePositionsBeforeCodegen);
auto recorderAfter = new ParsingGeneratedLocationRecorder(context.nodePositionsAfterCodegen);
auto recorderOriginal = new ParsingOriginalLocationRecorder(recorderBefore);
auto recorderMultiple = new ParsingMultiplePrintNodeRecorder;
recorderMultiple->AddRecorder(recorderOriginal);
recorderMultiple->AddRecorder(recorderAfter);
stream::MemoryStream memoryStream;
{
stream::StreamWriter streamWriter(memoryStream);
ParsingWriter parsingWriter(streamWriter, recorderMultiple, index);
WfPrint(module, L"", parsingWriter);
}
memoryStream.SeekFromBegin(0);
auto codeAfterCodegen = stream::StreamReader(memoryStream).ReadToEnd();
assembly->insBeforeCodegen->moduleCodes.Add(codeBeforeCodegen);
assembly->insAfterCodegen->moduleCodes.Add(codeAfterCodegen);
}
if (manager->declarationTypes.Count() > 0)
{
assembly->typeImpl = new WfTypeImpl;
FOREACH(Ptr<ITypeDescriptor>, td, manager->declarationTypes.Values())
{
if (auto tdClass = td.Cast<WfClass>())
{
assembly->typeImpl->classes.Add(tdClass);
}
else if (auto tdInterface = td.Cast<WfInterface>())
{
assembly->typeImpl->interfaces.Add(tdInterface);
}
else if (auto tdStruct = td.Cast<WfStruct>())
{
assembly->typeImpl->structs.Add(tdStruct);
}
else if (auto tdEnum = td.Cast<WfEnum>())
{
assembly->typeImpl->enums.Add(tdEnum);
}
}
}
FOREACH(Ptr<WfModule>, module, manager->GetModules())
{
FOREACH(Ptr<WfDeclaration>, decl, module->declarations)
{
GenerateGlobalDeclarationMetadata(context, decl);
}
}
{
auto meta = MakePtr<WfAssemblyFunction>();
meta->name = L"<initialize>";
vint functionIndex = assembly->functions.Add(meta);
assembly->functionByName.Add(meta->name, functionIndex);
auto functionContext = MakePtr<WfCodegenFunctionContext>();
functionContext->function = meta;
context.functionContext = functionContext;
meta->firstInstruction = assembly->instructions.Count();
FOREACH(Ptr<WfModule>, module, manager->GetModules())
{
FOREACH(Ptr<WfDeclaration>, decl, module->declarations)
{
GenerateInitializeInstructions(context, decl);
}
}
// define node for INSTRUCTION
parsing::ParsingTreeCustomBase* node = nullptr;
INSTRUCTION(Ins::LoadValue(Value()));
INSTRUCTION(Ins::Return());
meta->lastInstruction = assembly->instructions.Count() - 1;
context.functionContext = 0;
GenerateClosureInstructions(context, functionContext);
}
FOREACH(Ptr<WfModule>, module, manager->GetModules())
{
FOREACH(Ptr<WfDeclaration>, decl, module->declarations)
{
GenerateDeclarationInstructions(context, decl);
}
}
assembly->Initialize();
return assembly;
}
#undef INSTRUCTION
/***********************************************************************
Compile
***********************************************************************/
Ptr<runtime::WfAssembly> Compile(Ptr<parsing::tabling::ParsingTable> table, analyzer::WfLexicalScopeManager* manager, collections::List<WString>& moduleCodes, collections::List<Ptr<parsing::ParsingError>>& errors)
{
manager->Clear(true, true);
FOREACH(WString, code, moduleCodes)
{
manager->AddModule(code);
}
if (manager->errors.Count() > 0)
{
CopyFrom(errors, manager->errors);
return 0;
}
manager->Rebuild(true);
if (manager->errors.Count() > 0)
{
CopyFrom(errors, manager->errors);
return 0;
}
return GenerateAssembly(manager);
}
Ptr<runtime::WfAssembly> Compile(Ptr<parsing::tabling::ParsingTable> table, collections::List<WString>& moduleCodes, collections::List<Ptr<parsing::ParsingError>>& errors)
{
WfLexicalScopeManager manager(table);
return Compile(table, &manager, moduleCodes, errors);
}
}
}
}
/***********************************************************************
EMITTER\WFEMITTER_DECLARATION.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace emitter
{
using namespace collections;
using namespace parsing;
using namespace reflection::description;
using namespace analyzer;
using namespace runtime;
using namespace typeimpl;
typedef WfInstruction Ins;
#define INSTRUCTION(X) context.AddInstruction(node, X)
/***********************************************************************
GenerateInstructions(Initialize)
***********************************************************************/
class GenerateInitializeInstructionsVisitor : public Object, public WfDeclaration::IVisitor
{
public:
WfCodegenContext& context;
GenerateInitializeInstructionsVisitor(WfCodegenContext& _context)
:context(_context)
{
}
void Visit(WfNamespaceDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, decl, node->declarations)
{
GenerateInitializeInstructions(context, decl);
}
}
void Visit(WfFunctionDeclaration* node)override
{
}
void Visit(WfVariableDeclaration* node)override
{
auto scope = context.manager->nodeScopes[node].Obj();
auto symbol = scope->symbols[node->name.value][0];
vint variableIndex = context.globalVariables[symbol.Obj()];
GenerateExpressionInstructions(context, node->expression);
INSTRUCTION(Ins::StoreGlobalVar(variableIndex));
}
void Visit(WfEventDeclaration* node)override
{
}
void Visit(WfPropertyDeclaration* node)override
{
}
void Visit(WfConstructorDeclaration* node)override
{
}
void Visit(WfDestructorDeclaration* node)override
{
}
void Visit(WfClassDeclaration* node)override
{
}
void Visit(WfEnumDeclaration* node)override
{
}
void Visit(WfStructDeclaration* node)override
{
}
void Visit(WfVirtualDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, decl, node->expandedDeclarations)
{
decl->Accept(this);
}
}
};
void GenerateInitializeInstructions(WfCodegenContext& context, Ptr<WfDeclaration> declaration)
{
GenerateInitializeInstructionsVisitor visitor(context);
declaration->Accept(&visitor);
}
/***********************************************************************
GenerateInstructions(Declaration)
***********************************************************************/
Ptr<WfCodegenFunctionContext> GenerateFunctionInstructions_Prolog(WfCodegenContext& context, WfLexicalScope* scope, Ptr<WfAssemblyFunction> meta, Ptr<ITypeInfo> returnType, Ptr<WfLexicalSymbol> recursiveLambdaSymbol, const List<Ptr<WfLexicalSymbol>>& argumentSymbols, const List<Ptr<WfLexicalSymbol>>& capturedSymbols, ParsingTreeCustomBase* node)
{
auto functionContext = MakePtr<WfCodegenFunctionContext>();
functionContext->function = meta;
context.functionContext = functionContext;
{
FOREACH_INDEXER(Ptr<WfLexicalSymbol>, argumentSymbol, index, argumentSymbols)
{
functionContext->arguments.Add(argumentSymbol.Obj(), index);
}
FOREACH_INDEXER(Ptr<WfLexicalSymbol>, capturedSymbol, index, capturedSymbols)
{
functionContext->capturedVariables.Add(capturedSymbol.Obj(), index);
}
}
if (recursiveLambdaSymbol)
{
vint variableIndex = meta->argumentNames.Count() + meta->localVariableNames.Add(L"<recursive-lambda>" + recursiveLambdaSymbol->name);
functionContext->localVariables.Add(recursiveLambdaSymbol.Obj(), variableIndex);
}
meta->firstInstruction = context.assembly->instructions.Count();
if (recursiveLambdaSymbol)
{
INSTRUCTION(Ins::LoadClosureContext());
INSTRUCTION(Ins::LoadFunction(context.assembly->functions.IndexOf(meta.Obj())));
INSTRUCTION(Ins::CreateClosure());
INSTRUCTION(Ins::StoreLocalVar(functionContext->localVariables[recursiveLambdaSymbol.Obj()]));
}
return functionContext;
}
void GenerateFunctionInstructions_Epilog(WfCodegenContext& context, WfLexicalScope* scope, Ptr<WfAssemblyFunction> meta, Ptr<ITypeInfo> returnType, Ptr<WfLexicalSymbol> recursiveLambdaSymbol, const List<Ptr<WfLexicalSymbol>>& argumentSymbols, const List<Ptr<WfLexicalSymbol>>& capturedSymbols, Ptr<WfCodegenFunctionContext> functionContext, ParsingTreeCustomBase* node)
{
Value result;
if (returnType->GetDecorator() == ITypeInfo::TypeDescriptor)
{
if (auto vt = returnType->GetTypeDescriptor()->GetValueType())
{
result = vt->CreateDefault();
}
}
INSTRUCTION(Ins::LoadValue(Value()));
INSTRUCTION(Ins::Return());
meta->lastInstruction = context.assembly->instructions.Count() - 1;
context.functionContext = 0;
GenerateClosureInstructions(context, functionContext);
}
void GenerateFunctionInstructions(WfCodegenContext& context, WfLexicalScope* scope, Ptr<WfAssemblyFunction> meta, Ptr<ITypeInfo> returnType, Ptr<WfLexicalSymbol> recursiveLambdaSymbol, const List<Ptr<WfLexicalSymbol>>& argumentSymbols, const List<Ptr<WfLexicalSymbol>>& capturedSymbols, Ptr<WfStatement> statementBody, ParsingTreeCustomBase* node)
{
auto functionContext = GenerateFunctionInstructions_Prolog(context, scope, meta, returnType, recursiveLambdaSymbol, argumentSymbols, capturedSymbols, node);
GenerateStatementInstructions(context, statementBody);
GenerateFunctionInstructions_Epilog(context, scope, meta, returnType, recursiveLambdaSymbol, argumentSymbols, capturedSymbols, functionContext, node);
}
void GenerateFunctionInstructions(WfCodegenContext& context, WfLexicalScope* scope, Ptr<WfAssemblyFunction> meta, Ptr<ITypeInfo> returnType, Ptr<WfLexicalSymbol> recursiveLambdaSymbol, const List<Ptr<WfLexicalSymbol>>& argumentSymbols, const List<Ptr<WfLexicalSymbol>>& capturedSymbols, Ptr<WfExpression> expressionBody, ParsingTreeCustomBase* node)
{
auto functionContext = GenerateFunctionInstructions_Prolog(context, scope, meta, returnType, recursiveLambdaSymbol, argumentSymbols, capturedSymbols, node);
GenerateExpressionInstructions(context, expressionBody);
INSTRUCTION(Ins::Return());
GenerateFunctionInstructions_Epilog(context, scope, meta, returnType, recursiveLambdaSymbol, argumentSymbols, capturedSymbols, functionContext, node);
}
void GenerateFunctionDeclarationInstructions(WfCodegenContext& context, WfFunctionDeclaration* node, WfLexicalScope* scope, Ptr<WfAssemblyFunction> meta, Ptr<WfLexicalSymbol> recursiveLambdaSymbol)
{
List<Ptr<WfLexicalSymbol>> argumentSymbols, capturedSymbols;
{
FOREACH(Ptr<WfFunctionArgument>, argument, node->arguments)
{
auto symbol = scope->symbols[argument->name.value][0];
argumentSymbols.Add(symbol);
}
vint index = context.manager->lambdaCaptures.Keys().IndexOf(node);
if (index != -1)
{
auto capture = context.manager->lambdaCaptures.Values()[index];
FOREACH(Ptr<WfLexicalSymbol>, symbol, capture->symbols)
{
capturedSymbols.Add(symbol);
}
}
}
auto returnType = CreateTypeInfoFromType(scope, node->returnType);
GenerateFunctionInstructions(context, scope, meta, returnType, recursiveLambdaSymbol, argumentSymbols, capturedSymbols, node->statement, node);
}
class GenerateClassMemberInstructionsVisitor : public Object, public WfDeclaration::IVisitor
{
public:
WfCodegenContext& context;
Ptr<WfClassDeclaration> classDecl;
GenerateClassMemberInstructionsVisitor(WfCodegenContext& _context, Ptr<WfClassDeclaration> _classDecl)
:context(_context)
, classDecl(_classDecl)
{
}
void Visit(WfNamespaceDeclaration* node)override
{
}
void Visit(WfFunctionDeclaration* node)override
{
if (node->classMember->kind == WfClassMemberKind::Static)
{
GenerateDeclarationInstructions(context, node);
}
else if (classDecl->kind == WfClassKind::Class)
{
GenerateDeclarationInstructions(context, node);
}
}
void Visit(WfVariableDeclaration* node)override
{
}
void Visit(WfEventDeclaration* node)override
{
}
void Visit(WfPropertyDeclaration* node)override
{
}
class InitializeFieldVisitor
: public empty_visitor::DeclarationVisitor
{
public:
WfCodegenContext& context;
InitializeFieldVisitor(WfCodegenContext& _context)
:context(_context)
{
}
void Dispatch(WfVirtualDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, decl, node->expandedDeclarations)
{
decl->Accept(this);
}
}
void Visit(WfVariableDeclaration* node)override
{
auto info = context.manager->declarationMemberInfos[node].Cast<WfField>().Obj();
GenerateExpressionInstructions(context, node->expression);
INSTRUCTION(Ins::LoadCapturedVar(0));
INSTRUCTION(Ins::SetProperty(info));
}
};
void Visit(WfConstructorDeclaration* node)override
{
auto meta = context.assembly->functions[context.constructors[node]];
auto functionContext = MakePtr<WfCodegenFunctionContext>();
functionContext->function = meta;
context.functionContext = functionContext;
meta->firstInstruction = context.assembly->instructions.Count();
auto scope = context.manager->nodeScopes[node].Obj();
{
FOREACH_INDEXER(Ptr<WfFunctionArgument>, argument, index, node->arguments)
{
auto symbol = scope->symbols[argument->name.value][0];
functionContext->arguments.Add(symbol.Obj(), index);
}
}
if (classDecl->baseTypes.Count() > 0)
{
auto td = scope->parentScope->typeOfThisExpr;
vint count = td->GetBaseTypeDescriptorCount();
for (vint i = 0; i < count; i++)
{
auto baseTd = td->GetBaseTypeDescriptor(i);
auto ctor = context.manager->baseConstructorCallResolvings[{node, baseTd}];
if (ctor.key)
{
FOREACH(Ptr<WfExpression>, argument, ctor.key->arguments)
{
GenerateExpressionInstructions(context, argument);
}
INSTRUCTION(Ins::LoadCapturedVar(0));
INSTRUCTION(Ins::InvokeBaseCtor(ctor.value, ctor.key->arguments.Count()));
}
else
{
INSTRUCTION(Ins::LoadCapturedVar(0));
INSTRUCTION(Ins::InvokeBaseCtor(ctor.value, 0));
}
INSTRUCTION(Ins::Pop());
}
}
{
InitializeFieldVisitor visitor(context);
FOREACH(Ptr<WfDeclaration>, memberDecl, classDecl->declarations)
{
memberDecl->Accept(&visitor);
}
}
GenerateStatementInstructions(context, node->statement);
INSTRUCTION(Ins::LoadValue(Value()));
INSTRUCTION(Ins::Return());
meta->lastInstruction = context.assembly->instructions.Count() - 1;
context.functionContext = 0;
GenerateClosureInstructions(context, functionContext);
}
void Visit(WfDestructorDeclaration* node)override
{
auto meta = context.assembly->functions[context.destructors[node]];
auto functionContext = MakePtr<WfCodegenFunctionContext>();
functionContext->function = meta;
context.functionContext = functionContext;
meta->firstInstruction = context.assembly->instructions.Count();
auto scope = context.manager->nodeScopes[node].Obj();
GenerateStatementInstructions(context, node->statement);
INSTRUCTION(Ins::LoadValue(Value()));
INSTRUCTION(Ins::Return());
meta->lastInstruction = context.assembly->instructions.Count() - 1;
context.functionContext = 0;
GenerateClosureInstructions(context, functionContext);
}
void Visit(WfClassDeclaration* node)override
{
GenerateDeclarationInstructions(context, node);
}
void Visit(WfEnumDeclaration* node)override
{
}
void Visit(WfStructDeclaration* node)override
{
}
void Visit(WfVirtualDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, decl, node->expandedDeclarations)
{
decl->Accept(this);
}
}
};
class GenerateDeclarationInstructionsVisitor : public Object, public WfDeclaration::IVisitor
{
public:
WfCodegenContext& context;
GenerateDeclarationInstructionsVisitor(WfCodegenContext& _context)
:context(_context)
{
}
void Visit(WfNamespaceDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, decl, node->declarations)
{
GenerateDeclarationInstructions(context, decl);
}
}
void Visit(WfFunctionDeclaration* node)override
{
auto scope = context.manager->nodeScopes[node].Obj();
auto symbol = context.manager->GetDeclarationSymbol(scope, node);
auto meta = context.assembly->functions[context.globalFunctions[symbol.Obj()]];
GenerateFunctionDeclarationInstructions(context, node, scope, meta, 0);
}
void Visit(WfVariableDeclaration* node)override
{
}
void Visit(WfEventDeclaration* node)override
{
}
void Visit(WfPropertyDeclaration* node)override
{
}
void Visit(WfConstructorDeclaration* node)override
{
}
void Visit(WfDestructorDeclaration* node)override
{
}
void Visit(WfClassDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, memberDecl, node->declarations)
{
GenerateClassMemberInstructionsVisitor visitor(context, node);
memberDecl->Accept(&visitor);
}
}
void Visit(WfEnumDeclaration* node)override
{
}
void Visit(WfStructDeclaration* node)override
{
}
void Visit(WfVirtualDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, decl, node->expandedDeclarations)
{
decl->Accept(this);
}
}
};
void GenerateDeclarationInstructions(WfCodegenContext& context, Ptr<WfDeclaration> declaration)
{
GenerateDeclarationInstructionsVisitor visitor(context);
declaration->Accept(&visitor);
}
/***********************************************************************
GenerateInstructions(Closure)
***********************************************************************/
void GenerateClosureInstructions_Function(WfCodegenContext& context, vint functionIndex, WfFunctionDeclaration* node, bool createInterface)
{
auto scope = context.manager->nodeScopes[node].Obj();
auto meta = context.assembly->functions[functionIndex];
GenerateFunctionDeclarationMetadata(context, node, meta);
Ptr<WfLexicalSymbol> recursiveLambdaSymbol;
if (!createInterface && node->name.value != L"")
{
recursiveLambdaSymbol = scope->symbols[node->name.value][0];
}
GenerateFunctionDeclarationInstructions(context, node, scope, meta, recursiveLambdaSymbol);
}
void GenerateClosureInstructions_Ordered(WfCodegenContext& context, vint functionIndex, WfOrderedLambdaExpression* node)
{
auto scope = context.manager->nodeScopes[node].Obj();
List<Ptr<WfLexicalSymbol>> argumentSymbols, capturedSymbols;
CopyFrom(
argumentSymbols,
Range<vint>(0, scope->symbols.Count())
.Select([scope](vint index)->Ptr<WfLexicalSymbol>{return scope->symbols.GetByIndex(index)[0];})
.OrderBy([](Ptr<WfLexicalSymbol> a, Ptr<WfLexicalSymbol> b)
{
vint aId = wtoi(a->name.Sub(1, a->name.Length() - 1));
vint bId = wtoi(b->name.Sub(1, a->name.Length() - 1));
return aId - bId;
})
);
auto meta = context.assembly->functions[functionIndex];
FOREACH(Ptr<WfLexicalSymbol>, symbol, argumentSymbols)
{
meta->argumentNames.Add(symbol->name);
}
{
auto capture = context.manager->lambdaCaptures.Get(node);
FOREACH(Ptr<WfLexicalSymbol>, symbol, capture->symbols)
{
meta->capturedVariableNames.Add(L"<captured>" + symbol->name);
capturedSymbols.Add(symbol);
}
vint count = context.GetThisStackCount(scope);
for (vint i = 0; i < count; i++)
{
meta->capturedVariableNames.Add(L"<captured-this>" + itow(i));
}
}
auto result = context.manager->expressionResolvings[node];
auto returnType = CopyTypeInfo(result.type->GetElementType()->GetGenericArgument(0));
GenerateFunctionInstructions(context, scope, meta, returnType, 0, argumentSymbols, capturedSymbols, node->body, node);
}
void GenerateClosureInstructions(WfCodegenContext& context, Ptr<WfCodegenFunctionContext> functionContext)
{
for (vint i = 0; i < functionContext->closuresToCodegen.Count(); i++)
{
vint functionIndex = functionContext->closuresToCodegen.Keys()[i];
auto closure = functionContext->closuresToCodegen.Values()[i];
if (closure.functionExpression)
{
GenerateClosureInstructions_Function(context, functionIndex, closure.functionExpression->function.Obj(), false);
}
else if (closure.orderedLambdaExpression)
{
GenerateClosureInstructions_Ordered(context, functionIndex, closure.orderedLambdaExpression);
}
else if (closure.functionDeclaration)
{
GenerateClosureInstructions_Function(context, functionIndex, closure.functionDeclaration, true);
}
}
}
#undef INSTRUCTION
}
}
}
/***********************************************************************
EMITTER\WFEMITTER_EXPRESSION.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace emitter
{
using namespace collections;
using namespace parsing;
using namespace reflection;
using namespace reflection::description;
using namespace analyzer;
using namespace runtime;
typedef WfInstruction Ins;
#define INSTRUCTION(X) context.AddInstruction(node, X)
/***********************************************************************
GenerateInstructions(Expression)
***********************************************************************/
class GenerateExpressionInstructionsVisitor
: public Object
, public WfExpression::IVisitor
{
public:
WfCodegenContext& context;
GenerateExpressionInstructionsVisitor(WfCodegenContext& _context)
:context(_context)
{
}
static void GenerateLoadSymbolInstructions(WfCodegenContext& context, WfLexicalSymbol* symbol, parsing::ParsingTreeCustomBase* node)
{
vint index = -1;
if ((index = context.globalFunctions.Keys().IndexOf(symbol)) != -1)
{
vint functionIndex = context.globalFunctions.Values()[index];
INSTRUCTION(Ins::CreateClosureContext(0));
INSTRUCTION(Ins::LoadFunction(functionIndex));
INSTRUCTION(Ins::CreateClosure());
}
else if ((index = context.globalVariables.Keys().IndexOf(symbol)) != -1)
{
vint variableIndex = context.globalVariables.Values()[index];
INSTRUCTION(Ins::LoadGlobalVar(variableIndex));
}
else if ((index = context.functionContext->capturedVariables.Keys().IndexOf(symbol)) != -1)
{
vint variableIndex = context.functionContext->capturedVariables.Values()[index];
INSTRUCTION(Ins::LoadCapturedVar(variableIndex));
}
else if ((index = context.functionContext->localVariables.Keys().IndexOf(symbol)) != -1)
{
vint variableIndex = context.functionContext->localVariables.Values()[index];
INSTRUCTION(Ins::LoadLocalVar(variableIndex));
}
else if ((index = context.functionContext->arguments.Keys().IndexOf(symbol)) != -1)
{
vint variableIndex = context.functionContext->arguments.Values()[index];
INSTRUCTION(Ins::LoadLocalVar(variableIndex));
}
else if ((index = context.closureFunctions.Keys().IndexOf(symbol)) != -1)
{
vint functionIndex = context.closureFunctions.Values()[index];
INSTRUCTION(Ins::LoadClosureContext());
INSTRUCTION(Ins::LoadFunction(functionIndex));
INSTRUCTION(Ins::CreateClosure());
}
else
{
CHECK_FAIL(L"GenerateExpressionInstructionsVisitor::GenerateLoadSymbolInstructions(WfCodegenContext&, WfLexicalSymbol*, ParsingTreeCustomBase*)#Internal error, cannot find any record of this symbol.");
}
}
static vint PushCapturedThisValues(WfCodegenContext& context, WfLexicalScope* lambdaScopeParent, ParsingTreeCustomBase* node)
{
auto scope = lambdaScopeParent;
while (scope)
{
if (scope->functionConfig)
{
vint parentThisCount = context.GetThisStackCount(scope);
if (scope->functionConfig->lambda)
{
auto capture = context.manager->lambdaCaptures[scope->ownerNode.Obj()];
vint captureCount = capture->symbols.Count();
for (vint i = 0; i < parentThisCount; i++)
{
INSTRUCTION(Ins::LoadCapturedVar(captureCount + i));
}
}
else if (parentThisCount > 0)
{
CHECK_ERROR(parentThisCount == 1, L"GenerateExpressionInstructionsVisitor::PushCapturedThisValues(WfCodegenContext&, WfLexicalScope*, ParsingTreeCustomBase*)#Internal error, wrong parentThisCount value.");
INSTRUCTION(Ins::LoadCapturedVar(0));
}
return parentThisCount;
}
scope = scope->parentScope.Obj();
}
return 0;
}
static vint AddClosure(WfCodegenContext& context, WfCodegenLambdaContext lc, const Func<WString(vint)>& getName)
{
auto meta = MakePtr<WfAssemblyFunction>();
vint functionIndex = context.assembly->functions.Add(meta);
meta->name = getName(functionIndex);
context.assembly->functionByName.Add(meta->name, functionIndex);
context.functionContext->closuresToCodegen.Add(functionIndex, lc);
return functionIndex;
}
void VisitReferenceExpression(WfExpression* node, const WString& name)
{
auto result = context.manager->expressionResolvings[node];
if (result.symbol)
{
GenerateLoadSymbolInstructions(context, result.symbol.Obj(), node);
}
else if (result.methodInfo)
{
if (result.methodInfo->IsStatic())
{
INSTRUCTION(Ins::LoadValue(Value()));
}
else
{
VisitThisExpression(node, result.methodInfo->GetOwnerTypeDescriptor());
}
INSTRUCTION(Ins::LoadMethodClosure(result.methodInfo));
}
else if (result.propertyInfo)
{
if (auto getter = result.propertyInfo->GetGetter())
{
VisitThisExpression(node, getter->GetOwnerTypeDescriptor());
INSTRUCTION(Ins::InvokeMethod(getter, 0));
}
else
{
VisitThisExpression(node, result.propertyInfo->GetOwnerTypeDescriptor());
INSTRUCTION(Ins::GetProperty(result.propertyInfo));
}
}
else
{
if ((result.type->GetTypeDescriptor()->GetTypeDescriptorFlags() & TypeDescriptorFlags::EnumType) != TypeDescriptorFlags::Undefined)
{
auto enumType = result.type->GetTypeDescriptor()->GetEnumType();
vint index = enumType->IndexOfItem(name);
if (index != -1)
{
auto intValue = enumType->GetItemValue(index);
INSTRUCTION(Ins::LoadValue(enumType->ToEnum(intValue)));
return;
}
}
CHECK_FAIL(L"GenerateExpressionInstructionsVisitor::VisitReferenceExpression(WfExpression*, const WString&)#Internal error, cannot find any record of this expression.");
}
}
void VisitThisExpression(WfExpression* node, ITypeDescriptor* td)
{
auto scope = context.manager->nodeScopes[node].Obj();
vint count = context.GetThisStackCount(scope);
vint offset = 0;
Ptr<WfLexicalCapture> capture;
Ptr<WfLexicalFunctionConfig> lastConfig;
while (scope)
{
if (scope->typeOfThisExpr)
{
if (scope->typeOfThisExpr->CanConvertTo(td))
{
if (capture)
{
INSTRUCTION(Ins::LoadCapturedVar(capture->symbols.Count() + count - offset - 1));
}
else
{
INSTRUCTION(Ins::LoadCapturedVar(0));
}
return;
}
else
{
offset++;
}
if (lastConfig)
{
if (!lastConfig->parentThisAccessable)
{
break;
}
}
}
if (scope->functionConfig)
{
lastConfig = scope->functionConfig;
if (!capture)
{
vint index = context.manager->lambdaCaptures.Keys().IndexOf(scope->ownerNode.Obj());
if (index != -1)
{
capture = context.manager->lambdaCaptures.Values()[index];
}
}
}
scope = scope->parentScope.Obj();
}
CHECK_FAIL(L"GenerateExpressionInstructionsVisitor::VisitThisExpression(WfExpression*, ITypeDescriptor*)#Internal error, cannot find any record of the this value.");
}
void Visit(WfThisExpression* node)override
{
auto scope = context.manager->nodeScopes[node].Obj();
while (scope)
{
if (scope->functionConfig)
{
if (scope->functionConfig->thisAccessable)
{
if (scope->functionConfig->lambda)
{
auto capture = context.manager->lambdaCaptures[scope->ownerNode.Obj()];
auto count = context.GetThisStackCount(scope);
INSTRUCTION(Ins::LoadCapturedVar(capture->symbols.Count() + count - 1));
}
else
{
INSTRUCTION(Ins::LoadCapturedVar(0));
}
return;
}
CHECK_FAIL(L"GenerateExpressionInstructionsVisitor::Visit(WfThisExpression*)#Internal error, this expression is illegal here.");
}
scope = scope->parentScope.Obj();
}
CHECK_FAIL(L"GenerateExpressionInstructionsVisitor::Visit(WfThisExpression*)#Internal error, this expression is illegal here.");
}
void Visit(WfTopQualifiedExpression* node)override
{
VisitReferenceExpression(node, node->name.value);
}
void Visit(WfReferenceExpression* node)override
{
VisitReferenceExpression(node, node->name.value);
}
void Visit(WfOrderedNameExpression* node)override
{
VisitReferenceExpression(node, node->name.value);
}
void Visit(WfOrderedLambdaExpression* node)override
{
auto scope = context.manager->nodeScopes[node].Obj();
WfCodegenLambdaContext lc;
lc.orderedLambdaExpression = node;
auto functionIndex = AddClosure(context, lc, [=](vint index)
{
return L"<lambda:(" + itow(index) + L")> in " + context.functionContext->function->name;
});
auto capture = context.manager->lambdaCaptures.Get(node);
FOREACH(Ptr<WfLexicalSymbol>, symbol, capture->symbols)
{
GenerateLoadSymbolInstructions(context, symbol.Obj(), node);
}
vint thisCount = PushCapturedThisValues(context, scope->parentScope.Obj(), node);
INSTRUCTION(Ins::CreateClosureContext(capture->symbols.Count() + thisCount));
INSTRUCTION(Ins::LoadFunction(functionIndex));
INSTRUCTION(Ins::CreateClosure());
}
void Visit(WfMemberExpression* node)override
{
auto result = context.manager->expressionResolvings[node];
if (result.propertyInfo)
{
GenerateExpressionInstructions(context, node->parent);
if (result.propertyInfo->GetGetter())
{
INSTRUCTION(Ins::InvokeMethod(result.propertyInfo->GetGetter(), 0));
}
else
{
INSTRUCTION(Ins::GetProperty(result.propertyInfo));
}
}
else
{
GenerateExpressionInstructions(context, node->parent);
INSTRUCTION(Ins::LoadMethodClosure(result.methodInfo));
}
}
void Visit(WfChildExpression* node)override
{
VisitReferenceExpression(node, node->name.value);
}
void Visit(WfLiteralExpression* node)override
{
switch (node->value)
{
case WfLiteralValue::Null:
INSTRUCTION(Ins::LoadValue(Value()));
break;
case WfLiteralValue::True:
INSTRUCTION(Ins::LoadValue(BoxValue(true)));
break;
case WfLiteralValue::False:
INSTRUCTION(Ins::LoadValue(BoxValue(false)));
break;
}
}
void Visit(WfFloatingExpression* node)override
{
INSTRUCTION(Ins::LoadValue(BoxValue(wtof(node->value.value))));
}
void Visit(WfIntegerExpression* node)override
{
auto result = context.manager->expressionResolvings[node];
auto td = result.type->GetTypeDescriptor();
if (td == description::GetTypeDescriptor<vint32_t>())
{
INSTRUCTION(Ins::LoadValue(BoxValue((vint32_t)wtoi(node->value.value))));
}
else if (td == description::GetTypeDescriptor<vuint32_t>())
{
INSTRUCTION(Ins::LoadValue(BoxValue((vuint32_t)wtou(node->value.value))));
}
else if (td == description::GetTypeDescriptor<vint64_t>())
{
INSTRUCTION(Ins::LoadValue(BoxValue((vint64_t)wtoi64(node->value.value))));
}
else if (td == description::GetTypeDescriptor<vuint64_t>())
{
INSTRUCTION(Ins::LoadValue(BoxValue((vuint64_t)wtou64(node->value.value))));
}
else
{
CHECK_FAIL(L"GenerateExpressionInstructionsVisitor::Visit(WfIntegerExpression*)#Internal error, unknown integer type.");
}
}
void Visit(WfStringExpression* node)override
{
INSTRUCTION(Ins::LoadValue(BoxValue(node->value.value)));
}
void Visit(WfUnaryExpression* node)override
{
auto type = GenerateExpressionInstructions(context, node->operand);
switch (node->op)
{
case WfUnaryOperator::Not:
INSTRUCTION(Ins::OpNot(GetInstructionTypeArgument(type)));
break;
case WfUnaryOperator::Positive:
INSTRUCTION(Ins::OpPositive(GetInstructionTypeArgument(type)));
break;
case WfUnaryOperator::Negative:
INSTRUCTION(Ins::OpNegative(GetInstructionTypeArgument(type)));
break;
}
}
void Visit(WfBinaryExpression* node)override
{
if (node->op == WfBinaryOperator::Assign)
{
if (auto binary = node->first.Cast<WfBinaryExpression>())
{
auto result = context.manager->expressionResolvings[binary->first.Obj()];
auto containerType = result.expectedType ? result.expectedType : result.type;
auto methodInfo = containerType->GetTypeDescriptor()->GetMethodGroupByName(L"Set", true)->GetMethod(0);
GenerateExpressionInstructions(context, binary->second);
INSTRUCTION(Ins::Duplicate(0));
GenerateExpressionInstructions(context, node->second);
GenerateExpressionInstructions(context, binary->first);
INSTRUCTION(Ins::InvokeMethod(methodInfo, 2));
INSTRUCTION(Ins::Pop());
}
else if (auto member = node->first.Cast<WfMemberExpression>())
{
auto result = context.manager->expressionResolvings[member.Obj()];
if (auto methodInfo = result.propertyInfo->GetSetter())
{
GenerateExpressionInstructions(context, node->second);
INSTRUCTION(Ins::Duplicate(0));
GenerateExpressionInstructions(context, member->parent);
INSTRUCTION(Ins::InvokeMethod(methodInfo, 1));
INSTRUCTION(Ins::Pop());
}
else
{
GenerateExpressionInstructions(context, node->second);
INSTRUCTION(Ins::Duplicate(0));
GenerateExpressionInstructions(context, member->parent);
INSTRUCTION(Ins::SetProperty(result.propertyInfo));
}
}
else
{
GenerateExpressionInstructions(context, node->second);
INSTRUCTION(Ins::Duplicate(0));
auto result = context.manager->expressionResolvings[node->first.Obj()];
vint index = -1;
if ((index = context.globalVariables.Keys().IndexOf(result.symbol.Obj())) != -1)
{
vint variableIndex = context.globalVariables.Values()[index];
INSTRUCTION(Ins::StoreGlobalVar(variableIndex));
}
else if ((index = context.functionContext->localVariables.Keys().IndexOf(result.symbol.Obj())) != -1)
{
vint variableIndex = context.functionContext->localVariables.Values()[index];
INSTRUCTION(Ins::StoreLocalVar(variableIndex));
}
else if ((index = context.functionContext->capturedVariables.Keys().IndexOf(result.symbol.Obj())) != -1)
{
vint variableIndex = context.functionContext->capturedVariables.Values()[index];
INSTRUCTION(Ins::StoreCapturedVar(variableIndex));
}
else if (result.propertyInfo)
{
if (auto setter = result.propertyInfo->GetSetter())
{
VisitThisExpression(node, setter->GetOwnerTypeDescriptor());
INSTRUCTION(Ins::InvokeMethod(setter, 1));
INSTRUCTION(Ins::Pop());
}
else
{
VisitThisExpression(node, result.propertyInfo->GetOwnerTypeDescriptor());
INSTRUCTION(Ins::SetProperty(result.propertyInfo));
}
}
else
{
CHECK_FAIL(L"GenerateExpressionInstructionsVisitor::Visit(WfBinaryExpression*)#Internal error, cannot find any record of this assignable symbol.");
}
}
}
else if (node->op == WfBinaryOperator::Index)
{
auto result = context.manager->expressionResolvings[node->first.Obj()];
auto containerType = result.expectedType ? result.expectedType : result.type;
auto methodInfo = containerType->GetTypeDescriptor()->GetMethodGroupByName(L"Get", true)->GetMethod(0);
GenerateExpressionInstructions(context, node->second);
GenerateExpressionInstructions(context, node->first);
INSTRUCTION(Ins::InvokeMethod(methodInfo, 1));
}
else if (node->op == WfBinaryOperator::Union)
{
auto type = context.manager->expressionResolvings[node].type;
if (type->GetTypeDescriptor() == description::GetTypeDescriptor<WString>())
{
GenerateExpressionInstructions(context, node->first, type);
GenerateExpressionInstructions(context, node->second, type);
INSTRUCTION(Ins::OpConcat());
}
else
{
GenerateExpressionInstructions(context, node->first, type);
INSTRUCTION(Ins::ConvertToType(Value::BoxedValue, description::GetTypeDescriptor<vuint64_t>()));
GenerateExpressionInstructions(context, node->second, type);
INSTRUCTION(Ins::ConvertToType(Value::BoxedValue, description::GetTypeDescriptor<vuint64_t>()));
INSTRUCTION(Ins::OpAnd(WfInsType::U8));
INSTRUCTION(Ins::ConvertToType(Value::BoxedValue, type->GetTypeDescriptor()));
}
}
else if (node->op == WfBinaryOperator::Intersect)
{
auto type = context.manager->expressionResolvings[node].type;
GenerateExpressionInstructions(context, node->first, type);
INSTRUCTION(Ins::ConvertToType(Value::BoxedValue, description::GetTypeDescriptor<vuint64_t>()));
GenerateExpressionInstructions(context, node->second, type);
INSTRUCTION(Ins::ConvertToType(Value::BoxedValue, description::GetTypeDescriptor<vuint64_t>()));
INSTRUCTION(Ins::OpOr(WfInsType::U8));
INSTRUCTION(Ins::ConvertToType(Value::BoxedValue, type->GetTypeDescriptor()));
}
else if (node->op == WfBinaryOperator::FailedThen)
{
auto result = context.manager->expressionResolvings[node];
vint trapInstruction = INSTRUCTION(Ins::InstallTry(-1));
GenerateExpressionInstructions(context, node->first, result.type);
INSTRUCTION(Ins::UninstallTry(1));
vint finishInstruction = INSTRUCTION(Ins::Jump(-1));
context.assembly->instructions[trapInstruction].indexParameter = context.assembly->instructions.Count();
GenerateExpressionInstructions(context, node->second, result.type);
context.assembly->instructions[finishInstruction].indexParameter = context.assembly->instructions.Count();
}
else
{
Ptr<ITypeInfo> mergedType;
switch (node->op)
{
case WfBinaryOperator::Exp:
case WfBinaryOperator::Add:
case WfBinaryOperator::Sub:
case WfBinaryOperator::Mul:
case WfBinaryOperator::Div:
case WfBinaryOperator::Mod:
case WfBinaryOperator::Shl:
case WfBinaryOperator::Shr:
{
auto result = context.manager->expressionResolvings[node];
mergedType = result.type;
}
break;
default:
{
auto firstResult = context.manager->expressionResolvings[node->first.Obj()];
auto secondResult = context.manager->expressionResolvings[node->second.Obj()];
auto firstType = firstResult.expectedType ? firstResult.expectedType : firstResult.type;
auto secondType = secondResult.expectedType ? secondResult.expectedType : secondResult.type;
if (node->op == WfBinaryOperator::EQ || node->op == WfBinaryOperator::NE)
{
if (firstType->GetDecorator() == ITypeInfo::RawPtr || firstType->GetDecorator() == ITypeInfo::SharedPtr)
{
GenerateExpressionInstructions(context, node->first);
GenerateExpressionInstructions(context, node->second);
INSTRUCTION(Ins::CompareReference());
if (node->op == WfBinaryOperator::NE)
{
INSTRUCTION(Ins::OpNot(WfInsType::Bool));
}
return;
}
}
mergedType = GetMergedType(firstType, secondType);
if (node->op == WfBinaryOperator::EQ || node->op == WfBinaryOperator::NE)
{
switch (mergedType->GetTypeDescriptor()->GetTypeDescriptorFlags())
{
case TypeDescriptorFlags::Object:
case TypeDescriptorFlags::Struct:
GenerateExpressionInstructions(context, node->first);
GenerateExpressionInstructions(context, node->second);
INSTRUCTION(Ins::CompareValue());
if (node->op == WfBinaryOperator::NE)
{
INSTRUCTION(Ins::OpNot(WfInsType::Bool));
}
return;
case TypeDescriptorFlags::FlagEnum:
case TypeDescriptorFlags::NormalEnum:
GenerateExpressionInstructions(context, node->first);
INSTRUCTION(Ins::ConvertToType(Value::BoxedValue, description::GetTypeDescriptor<vuint64_t>()));
GenerateExpressionInstructions(context, node->second);
INSTRUCTION(Ins::ConvertToType(Value::BoxedValue, description::GetTypeDescriptor<vuint64_t>()));
INSTRUCTION(Ins::CompareLiteral(WfInsType::U8));
if (node->op == WfBinaryOperator::NE)
{
INSTRUCTION(Ins::OpNE());
}
else
{
INSTRUCTION(Ins::OpEQ());
}
return;
default:;
}
}
}
}
GenerateExpressionInstructions(context, node->first, mergedType);
GenerateExpressionInstructions(context, node->second, mergedType);
switch (node->op)
{
case WfBinaryOperator::Exp:
INSTRUCTION(Ins::OpExp(GetInstructionTypeArgument(mergedType)));
break;
case WfBinaryOperator::Add:
INSTRUCTION(Ins::OpAdd(GetInstructionTypeArgument(mergedType)));
break;
case WfBinaryOperator::Sub:
INSTRUCTION(Ins::OpSub(GetInstructionTypeArgument(mergedType)));
break;
case WfBinaryOperator::Mul:
INSTRUCTION(Ins::OpMul(GetInstructionTypeArgument(mergedType)));
break;
case WfBinaryOperator::Div:
INSTRUCTION(Ins::OpDiv(GetInstructionTypeArgument(mergedType)));
break;
case WfBinaryOperator::Mod:
INSTRUCTION(Ins::OpMod(GetInstructionTypeArgument(mergedType)));
break;
case WfBinaryOperator::Shl:
INSTRUCTION(Ins::OpShl(GetInstructionTypeArgument(mergedType)));
break;
case WfBinaryOperator::Shr:
INSTRUCTION(Ins::OpShr(GetInstructionTypeArgument(mergedType)));
break;
case WfBinaryOperator::LT:
INSTRUCTION(Ins::CompareLiteral(GetInstructionTypeArgument(mergedType)));
INSTRUCTION(Ins::OpLT());
break;
case WfBinaryOperator::GT:
INSTRUCTION(Ins::CompareLiteral(GetInstructionTypeArgument(mergedType)));
INSTRUCTION(Ins::OpGT());
break;
case WfBinaryOperator::LE:
INSTRUCTION(Ins::CompareLiteral(GetInstructionTypeArgument(mergedType)));
INSTRUCTION(Ins::OpLE());
break;
case WfBinaryOperator::GE:
INSTRUCTION(Ins::CompareLiteral(GetInstructionTypeArgument(mergedType)));
INSTRUCTION(Ins::OpGE());
break;
case WfBinaryOperator::EQ:
INSTRUCTION(Ins::CompareLiteral(GetInstructionTypeArgument(mergedType)));
INSTRUCTION(Ins::OpEQ());
break;
case WfBinaryOperator::NE:
INSTRUCTION(Ins::CompareLiteral(GetInstructionTypeArgument(mergedType)));
INSTRUCTION(Ins::OpNE());
break;
case WfBinaryOperator::Xor:
INSTRUCTION(Ins::OpXor(GetInstructionTypeArgument(mergedType)));
break;
case WfBinaryOperator::And:
INSTRUCTION(Ins::OpAnd(GetInstructionTypeArgument(mergedType)));
break;
case WfBinaryOperator::Or:
INSTRUCTION(Ins::OpOr(GetInstructionTypeArgument(mergedType)));
break;
default:;
}
}
}
void Visit(WfLetExpression* node)override
{
auto scope = context.manager->nodeScopes[node].Obj();
Array<vint> variableIndices(node->variables.Count());
auto function = context.functionContext->function;
FOREACH_INDEXER(Ptr<WfLetVariable>, var, index, node->variables)
{
auto symbol = scope->symbols[var->name.value][0];
vint variableIndex = function->argumentNames.Count() + function->localVariableNames.Add(L"<let>" + var->name.value);
context.functionContext->localVariables.Add(symbol.Obj(), variableIndex);
variableIndices[index] = variableIndex;
GenerateExpressionInstructions(context, var->value);
INSTRUCTION(Ins::StoreLocalVar(variableIndex));
}
GenerateExpressionInstructions(context, node->expression);
FOREACH_INDEXER(Ptr<WfLetVariable>, var, index, node->variables)
{
INSTRUCTION(Ins::LoadValue(Value()));
INSTRUCTION(Ins::StoreLocalVar(variableIndices[index]));
}
}
void Visit(WfIfExpression* node)override
{
auto result = context.manager->expressionResolvings[node];
GenerateExpressionInstructions(context, node->condition);
vint fillTrueIndex = INSTRUCTION(Ins::JumpIf(-1));
GenerateExpressionInstructions(context, node->falseBranch, result.type);
vint fillEndIndex = INSTRUCTION(Ins::Jump(-1));
context.assembly->instructions[fillTrueIndex].indexParameter = context.assembly->instructions.Count();
GenerateExpressionInstructions(context, node->trueBranch, result.type);
context.assembly->instructions[fillEndIndex].indexParameter = context.assembly->instructions.Count();
}
void Visit(WfRangeExpression* node)override
{
auto result = context.manager->expressionResolvings[node];
auto elementType = result.type->GetElementType()->GetGenericArgument(0);
auto type = GetInstructionTypeArgument(elementType);
GenerateExpressionInstructions(context, node->begin, elementType);
if (node->beginBoundary == WfRangeBoundary::Exclusive)
{
INSTRUCTION(Ins::LoadValue(BoxValue<vint>(1)));
INSTRUCTION(Ins::OpAdd(type));
}
GenerateExpressionInstructions(context, node->end, elementType);
if (node->endBoundary == WfRangeBoundary::Exclusive)
{
INSTRUCTION(Ins::LoadValue(BoxValue<vint>(1)));
INSTRUCTION(Ins::OpSub(type));
}
INSTRUCTION(Ins::CreateRange(type));
}
void Visit(WfSetTestingExpression* node)override
{
if (auto range = node->collection.Cast<WfRangeExpression>())
{
auto resultElement = context.manager->expressionResolvings[node->element.Obj()];
auto resultBegin = context.manager->expressionResolvings[range->begin.Obj()];
auto resultEnd = context.manager->expressionResolvings[range->end.Obj()];
auto typeElement = resultElement.expectedType ? resultElement.expectedType : resultElement.type;
auto typeBegin = resultBegin.expectedType ? resultBegin.expectedType : resultBegin.type;
auto typeEnd = resultEnd.expectedType ? resultEnd.expectedType : resultEnd.type;
auto typeLeft = GetMergedType(typeElement, typeBegin);
auto typeRight = GetMergedType(typeElement, typeEnd);
auto function = context.functionContext->function;
vint index = function->argumentNames.Count() + function->localVariableNames.Add(L"<anonymous-range-test>");
GenerateExpressionInstructions(context, node->element);
INSTRUCTION(Ins::StoreLocalVar(index));
INSTRUCTION(Ins::LoadLocalVar(index));
if (!IsSameType(typeElement.Obj(), typeLeft.Obj()))
{
GenerateTypeCastInstructions(context, typeLeft, true, node);
}
GenerateExpressionInstructions(context, range->begin, typeLeft);
INSTRUCTION(Ins::CompareLiteral(GetInstructionTypeArgument(typeLeft)));
if (range->beginBoundary == WfRangeBoundary::Exclusive)
{
INSTRUCTION(Ins::OpGT());
}
else
{
INSTRUCTION(Ins::OpGE());
}
INSTRUCTION(Ins::LoadLocalVar(index));
if (!IsSameType(typeElement.Obj(), typeRight.Obj()))
{
GenerateTypeCastInstructions(context, typeRight, true, node);
}
GenerateExpressionInstructions(context, range->end, typeRight);
INSTRUCTION(Ins::CompareLiteral(GetInstructionTypeArgument(typeRight)));
if (range->endBoundary == WfRangeBoundary::Exclusive)
{
INSTRUCTION(Ins::OpLT());
}
else
{
INSTRUCTION(Ins::OpLE());
}
INSTRUCTION(Ins::OpAnd(WfInsType::Bool));
if (node->test == WfSetTesting::NotIn)
{
INSTRUCTION(Ins::OpNot(WfInsType::Bool));
}
INSTRUCTION(Ins::LoadValue(Value()));
INSTRUCTION(Ins::StoreLocalVar(index));
}
else
{
auto result = context.manager->expressionResolvings[node->collection.Obj()];
auto type = result.expectedType ? result.expectedType : result.type;
GenerateExpressionInstructions(context, node->element);
GenerateExpressionInstructions(context, node->collection);
auto tdList = description::GetTypeDescriptor<IValueReadonlyList>();
if (result.type->GetTypeDescriptor()->CanConvertTo(tdList))
{
auto method = tdList->GetMethodGroupByName(L"Contains", true)->GetMethod(0);
INSTRUCTION(Ins::InvokeMethod(method, 1));
}
else
{
INSTRUCTION(Ins::TestElementInSet());
}
if (node->test == WfSetTesting::NotIn)
{
INSTRUCTION(Ins::OpNot(WfInsType::Bool));
}
}
}
void Visit(WfConstructorExpression* node)override
{
auto result = context.manager->expressionResolvings[node];
if (result.type->GetTypeDescriptor()->GetTypeDescriptorFlags() == TypeDescriptorFlags::Struct)
{
auto td = result.type->GetTypeDescriptor();
INSTRUCTION(Ins::CreateStruct(Value::BoxedValue, td));
FOREACH(Ptr<WfConstructorArgument>, argument, node->arguments)
{
auto prop = td->GetPropertyByName(argument->key.Cast<WfReferenceExpression>()->name.value, true);
GenerateExpressionInstructions(context, argument->value, CopyTypeInfo(prop->GetReturn()));
INSTRUCTION(Ins::UpdateProperty(prop));
}
}
else if (result.type->GetTypeDescriptor() == description::GetTypeDescriptor<IValueEnumerable>()
|| result.type->GetTypeDescriptor() == description::GetTypeDescriptor<IValueReadonlyList>()
|| result.type->GetTypeDescriptor() == description::GetTypeDescriptor<IValueList>())
{
Ptr<ITypeInfo> keyType = CopyTypeInfo(result.type->GetElementType()->GetGenericArgument(0));
FOREACH(Ptr<WfConstructorArgument>, argument, From(node->arguments).Reverse())
{
GenerateExpressionInstructions(context, argument->key, keyType);
}
INSTRUCTION(Ins::CreateArray(node->arguments.Count()));
}
else
{
Ptr<ITypeInfo> keyType = CopyTypeInfo(result.type->GetElementType()->GetGenericArgument(0));
Ptr<ITypeInfo> valueType = CopyTypeInfo(result.type->GetElementType()->GetGenericArgument(1));
FOREACH(Ptr<WfConstructorArgument>, argument, From(node->arguments).Reverse())
{
GenerateExpressionInstructions(context, argument->key, keyType);
GenerateExpressionInstructions(context, argument->value, valueType);
}
INSTRUCTION(Ins::CreateMap(node->arguments.Count() * 2));
}
}
void Visit(WfInferExpression* node)override
{
GenerateExpressionInstructions(context, node->expression);
}
void Visit(WfTypeCastingExpression* node)override
{
if (node->strategy == WfTypeCastingStrategy::Strong)
{
auto result = context.manager->expressionResolvings[node];
GenerateExpressionInstructions(context, node->expression, result.type);
}
else
{
auto scope = context.manager->nodeScopes[node].Obj();
auto type = CreateTypeInfoFromType(scope, node->type);
GenerateExpressionInstructions(context, node->expression);
GenerateTypeCastInstructions(context, type, false, node);
}
}
void Visit(WfTypeTestingExpression* node)override
{
switch (node->test)
{
case WfTypeTesting::IsNull:
GenerateExpressionInstructions(context, node->expression);
INSTRUCTION(Ins::LoadValue(Value()));
INSTRUCTION(Ins::CompareReference());
break;
case WfTypeTesting::IsNotNull:
GenerateExpressionInstructions(context, node->expression);
INSTRUCTION(Ins::LoadValue(Value()));
INSTRUCTION(Ins::CompareReference());
INSTRUCTION(Ins::OpNot(WfInsType::Bool));
break;
case WfTypeTesting::IsType:
{
auto scope = context.manager->nodeScopes[node].Obj();
auto type = CreateTypeInfoFromType(scope, node->type);
GenerateExpressionInstructions(context, node->expression);
GenerateTypeTestingInstructions(context, type, node);
}
break;
case WfTypeTesting::IsNotType:
{
auto scope = context.manager->nodeScopes[node].Obj();
auto type = CreateTypeInfoFromType(scope, node->type);
GenerateExpressionInstructions(context, node->expression);
GenerateTypeTestingInstructions(context, type, node);
INSTRUCTION(Ins::OpNot(WfInsType::Bool));
}
break;
}
}
void Visit(WfTypeOfTypeExpression* node)override
{
auto scope = context.manager->nodeScopes[node].Obj();
auto type = CreateTypeInfoFromType(scope, node->type);
auto value = Value::From(type->GetTypeDescriptor());
INSTRUCTION(Ins::LoadValue(value));
}
void Visit(WfTypeOfExpressionExpression* node)override
{
GenerateExpressionInstructions(context, node->expression);
INSTRUCTION(Ins::GetType());
}
void Visit(WfAttachEventExpression* node)override
{
auto result = context.manager->expressionResolvings[node->event.Obj()];
if (auto member = node->event.Cast<WfMemberExpression>())
{
GenerateExpressionInstructions(context, member->parent);
}
else
{
VisitThisExpression(node, result.eventInfo->GetOwnerTypeDescriptor());
}
GenerateExpressionInstructions(context, node->function);
INSTRUCTION(Ins::AttachEvent(result.eventInfo));
}
void Visit(WfDetachEventExpression* node)override
{
auto result = context.manager->expressionResolvings[node->event.Obj()];
if (auto member = node->event.Cast<WfMemberExpression>())
{
GenerateExpressionInstructions(context, member->parent);
}
else
{
VisitThisExpression(node, result.eventInfo->GetOwnerTypeDescriptor());
}
GenerateExpressionInstructions(context, node->handler);
INSTRUCTION(Ins::DetachEvent(result.eventInfo));
}
void Visit(WfObserveExpression* node)override
{
}
void Visit(WfCallExpression* node)override
{
FOREACH(Ptr<WfExpression>, argument, node->arguments)
{
GenerateExpressionInstructions(context, argument);
}
auto result = context.manager->expressionResolvings[node->function.Obj()];
if (result.methodInfo)
{
if (result.methodInfo->IsStatic())
{
INSTRUCTION(Ins::LoadValue(Value()));
}
else if (auto member = node->function.Cast<WfMemberExpression>())
{
GenerateExpressionInstructions(context, member->parent);
}
else
{
VisitThisExpression(node, result.methodInfo->GetOwnerTypeDescriptor());
}
INSTRUCTION(Ins::InvokeMethod(result.methodInfo, node->arguments.Count()));
return;
}
else if (result.eventInfo)
{
if(auto member = node->function.Cast<WfMemberExpression>())
{
GenerateExpressionInstructions(context, member->parent);
}
else
{
VisitThisExpression(node, result.eventInfo->GetOwnerTypeDescriptor());
}
INSTRUCTION(Ins::InvokeEvent(result.eventInfo, node->arguments.Count()));
return;
}
else if (result.symbol)
{
if (result.symbol->creatorNode.Cast<WfFunctionDeclaration>())
{
if (result.symbol->ownerScope->ownerNode.Cast<WfNewInterfaceExpression>())
{
vint functionIndex = context.closureFunctions[result.symbol.Obj()];
INSTRUCTION(Ins::InvokeWithContext(functionIndex, node->arguments.Count()));
return;
}
else
{
vint index = context.globalFunctions.Keys().IndexOf(result.symbol.Obj());
if (index != -1)
{
vint functionIndex = context.globalFunctions.Values()[index];
INSTRUCTION(Ins::Invoke(functionIndex, node->arguments.Count()));
return;
}
}
}
}
GenerateExpressionInstructions(context, node->function);
INSTRUCTION(Ins::InvokeProxy(node->arguments.Count()));
}
static void VisitFunction(WfCodegenContext& context, WfFunctionDeclaration* node, WfCodegenLambdaContext lc, const Func<WString(vint)>& getName)
{
auto scope = context.manager->nodeScopes[node].Obj();
bool inNewInterfaceExpr = scope->parentScope && scope->parentScope->ownerNode.Cast<WfNewInterfaceExpression>();
auto functionIndex = AddClosure(context, lc, getName);
if (inNewInterfaceExpr)
{
INSTRUCTION(Ins::LoadFunction(functionIndex));
}
else
{
auto capture = context.manager->lambdaCaptures.Get(node);
FOREACH(Ptr<WfLexicalSymbol>, symbol, capture->symbols)
{
GenerateLoadSymbolInstructions(context, symbol.Obj(), node);
}
vint thisCount = PushCapturedThisValues(context, scope->parentScope.Obj(), node);
INSTRUCTION(Ins::CreateClosureContext(capture->symbols.Count() + thisCount));
INSTRUCTION(Ins::LoadFunction(functionIndex));
INSTRUCTION(Ins::CreateClosure());
}
}
void Visit(WfFunctionExpression* node)override
{
WfCodegenLambdaContext lc;
lc.functionExpression = node;
VisitFunction(context, node->function.Obj(), lc, [=](vint index)
{
return L"<lambda:" + node->function->name.value + L"(" + itow(index) + L")> in " + context.functionContext->function->name;
});
}
class NewInterfaceExpressionVisitor : public empty_visitor::DeclarationVisitor
{
public:
WfCodegenContext& context;
vint variableCount = 0;
List<Ptr<WfLexicalSymbol>> variableSymbols;
List<Ptr<WfFunctionDeclaration>> closureFunctions;
List<Ptr<WfFunctionDeclaration>> overrideFunctions;
WfFunctionDeclaration* firstFunction = nullptr;
NewInterfaceExpressionVisitor(WfCodegenContext& _context)
:context(_context)
{
}
void Dispatch(WfVirtualDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, decl, node->expandedDeclarations)
{
decl->Accept(this);
}
}
void Visit(WfFunctionDeclaration* node)override
{
if (!firstFunction)
{
firstFunction = node;
}
if (node->classMember->kind == WfClassMemberKind::Normal)
{
closureFunctions.Add(node);
}
else
{
overrideFunctions.Add(node);
}
}
void Visit(WfVariableDeclaration* node)override
{
variableCount++;
}
void Execute(WfNewInterfaceExpression* node)
{
FOREACH(Ptr<WfDeclaration>, memberDecl, node->declarations)
{
memberDecl->Accept(this);
}
if (firstFunction != nullptr && variableCount > 0)
{
auto capture = context.manager->lambdaCaptures.Get(firstFunction);
CopyFrom(variableSymbols, From(capture->symbols).Take(variableCount));
}
}
};
void Visit(WfNewClassExpression* node)override
{
auto result = context.manager->expressionResolvings[node];
FOREACH(Ptr<WfExpression>, argument, node->arguments)
{
GenerateExpressionInstructions(context, argument);
}
INSTRUCTION(Ins::LoadValue(Value()));
INSTRUCTION(Ins::InvokeMethod(result.constructorInfo, node->arguments.Count()));
}
void Visit(WfNewInterfaceExpression* node)override
{
auto result = context.manager->expressionResolvings[node];
NewInterfaceExpressionVisitor declVisitor(context);
declVisitor.Execute(node);
if (declVisitor.firstFunction != nullptr)
{
for (vint i = 0; i < declVisitor.variableCount; i++)
{
auto var = declVisitor.variableSymbols[i]->creatorNode.Cast<WfVariableDeclaration>();
GenerateExpressionInstructions(context, var->expression);
}
auto capture = context.manager->lambdaCaptures.Get(declVisitor.firstFunction);
for (vint i = declVisitor.variableCount; i < capture->symbols.Count(); i++)
{
GenerateLoadSymbolInstructions(context, capture->symbols[i].Obj(), node);
}
auto scope = context.manager->nodeScopes[node].Obj();
vint thisCount = PushCapturedThisValues(context, scope, node);
INSTRUCTION(Ins::LoadValue(Value()));
INSTRUCTION(Ins::CreateClosureContext(capture->symbols.Count() + thisCount + 1));
FOREACH(Ptr<WfFunctionDeclaration>, func, declVisitor.closureFunctions)
{
WfCodegenLambdaContext lc;
lc.functionDeclaration = func.Obj();
auto functionIndex = AddClosure(context, lc, [=](vint index)
{
return L"<method:" + func->name.value + L"<" + result.type->GetTypeDescriptor()->GetTypeName() + L">(" + itow(index) + L")> in " + context.functionContext->function->name;
});
auto scope = context.manager->nodeScopes[func.Obj()].Obj();
auto symbol = context.manager->GetDeclarationSymbol(scope, func.Obj());
context.closureFunctions.Add(symbol.Obj(), functionIndex);
}
FOREACH(Ptr<WfFunctionDeclaration>, func, declVisitor.overrideFunctions)
{
auto methodInfo = context.manager->interfaceMethodImpls[func.Obj()];
INSTRUCTION(Ins::LoadMethodInfo(methodInfo));
WfCodegenLambdaContext lc;
lc.functionDeclaration = func.Obj();
VisitFunction(context, func.Obj(), lc, [=, &declVisitor](vint index)
{
return L"<method:" + func->name.value + L"<" + result.type->GetTypeDescriptor()->GetTypeName() + L">(" + itow(index + declVisitor.closureFunctions.Count()) + L")> in " + context.functionContext->function->name;
});
}
}
INSTRUCTION(Ins::CreateInterface(result.constructorInfo, declVisitor.overrideFunctions.Count() * 2));
}
void Visit(WfVirtualExpression* node)override
{
GenerateExpressionInstructions(context, node->expandedExpression);
}
};
#undef INSTRUCTION
Ptr<reflection::description::ITypeInfo> GenerateExpressionInstructions(WfCodegenContext& context, Ptr<WfExpression> expression, Ptr<reflection::description::ITypeInfo> expectedType)
{
GenerateExpressionInstructionsVisitor visitor(context);
expression->Accept(&visitor);
auto result = context.manager->expressionResolvings[expression.Obj()];
auto type = result.type;
if (result.expectedType && !IsSameType(type.Obj(), result.expectedType.Obj()))
{
type = result.expectedType;
GenerateTypeCastInstructions(context, type, true, expression.Obj());
}
if (expectedType && !IsSameType(type.Obj(), expectedType.Obj()))
{
type = expectedType;
GenerateTypeCastInstructions(context, type, true, expression.Obj());
}
return type;
}
}
}
}
/***********************************************************************
EMITTER\WFEMITTER_METADATA.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace emitter
{
using namespace collections;
using namespace reflection::description;
using namespace analyzer;
using namespace runtime;
using namespace typeimpl;
/***********************************************************************
GenerateGlobalDeclarationMetadata
***********************************************************************/
void GenerateFunctionDeclarationMetadata(WfCodegenContext& context, WfFunctionDeclaration* node, Ptr<WfAssemblyFunction> meta)
{
FOREACH(Ptr<WfFunctionArgument>, argument, node->arguments)
{
meta->argumentNames.Add(argument->name.value);
}
{
vint index = context.manager->lambdaCaptures.Keys().IndexOf(node);
if (index != -1)
{
auto capture = context.manager->lambdaCaptures.Values()[index];
FOREACH(Ptr<WfLexicalSymbol>, symbol, capture->symbols)
{
meta->capturedVariableNames.Add(L"<captured>" + symbol->name);
}
}
auto scope = context.manager->nodeScopes[node];
vint count = context.GetThisStackCount(scope.Obj());
for (vint i = 0; i < count; i++)
{
meta->capturedVariableNames.Add(L"<captured-this>" + itow(i));
}
}
}
class GenerateGlobalClassMemberMetadataVisitor : public Object, public WfDeclaration::IVisitor
{
public:
WfCodegenContext& context;
WString namePrefix;
Ptr<WfClassDeclaration> classDecl;
GenerateGlobalClassMemberMetadataVisitor(WfCodegenContext& _context, const WString& _namePrefix, Ptr<WfClassDeclaration> _classDecl)
:context(_context)
, namePrefix(_namePrefix)
, classDecl(_classDecl)
{
}
void Visit(WfNamespaceDeclaration* node)override
{
}
void Visit(WfFunctionDeclaration* node)override
{
if (node->classMember->kind == WfClassMemberKind::Static)
{
GenerateGlobalDeclarationMetadata(context, node, namePrefix);
auto scope = context.manager->nodeScopes[node].Obj();
auto symbol = context.manager->GetDeclarationSymbol(scope, node);
auto index = context.globalFunctions[symbol.Obj()];
auto info = context.manager->declarationMemberInfos[node].Cast<WfStaticMethod>();
info->functionIndex = index;
}
else if (classDecl->kind == WfClassKind::Class)
{
GenerateGlobalDeclarationMetadata(context, node, namePrefix);
auto scope = context.manager->nodeScopes[node].Obj();
auto symbol = context.manager->GetDeclarationSymbol(scope, node);
auto index = context.globalFunctions[symbol.Obj()];
auto info = context.manager->declarationMemberInfos[node].Cast<WfClassMethod>();
info->functionIndex = index;
}
}
void Visit(WfVariableDeclaration* node)override
{
}
void Visit(WfEventDeclaration* node)override
{
}
void Visit(WfPropertyDeclaration* node)override
{
}
void Visit(WfConstructorDeclaration* node)override
{
auto meta = MakePtr<WfAssemblyFunction>();
meta->name = namePrefix + L"#ctor";
FOREACH(Ptr<WfFunctionArgument>, argument, node->arguments)
{
meta->argumentNames.Add(argument->name.value);
}
meta->capturedVariableNames.Add(L"<captured-this>0");
vint index = context.assembly->functions.Add(meta);
context.assembly->functionByName.Add(meta->name, index);
context.constructors.Add(node, index);
auto info = context.manager->declarationMemberInfos[node].Cast<WfClassConstructor>();
info->functionIndex = index;
}
void Visit(WfDestructorDeclaration* node)override
{
auto meta = MakePtr<WfAssemblyFunction>();
meta->name = namePrefix + L"#dtor";
meta->capturedVariableNames.Add(L"<captured-this>0");
vint index = context.assembly->functions.Add(meta);
context.assembly->functionByName.Add(meta->name, index);
context.destructors.Add(node, index);
auto info = context.manager->declarationTypes[classDecl.Obj()].Cast<WfClass>();
info->destructorFunctionIndex = index;
}
void Visit(WfClassDeclaration* node)override
{
GenerateGlobalDeclarationMetadata(context, node, namePrefix);
}
void Visit(WfEnumDeclaration* node)override
{
}
void Visit(WfStructDeclaration* node)override
{
}
void Visit(WfVirtualDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, decl, node->expandedDeclarations)
{
decl->Accept(this);
}
}
};
class GenerateGlobalDeclarationMetadataVisitor : public Object, public WfDeclaration::IVisitor
{
public:
WfCodegenContext& context;
WString namePrefix;
GenerateGlobalDeclarationMetadataVisitor(WfCodegenContext& _context, const WString& _namePrefix)
:context(_context)
, namePrefix(_namePrefix)
{
}
void Visit(WfNamespaceDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, decl, node->declarations)
{
GenerateGlobalDeclarationMetadata(context, decl, namePrefix + node->name.value + L"::");
}
}
void Visit(WfFunctionDeclaration* node)override
{
auto meta = MakePtr<WfAssemblyFunction>();
meta->name = namePrefix + node->name.value;
GenerateFunctionDeclarationMetadata(context, node, meta);
vint index = context.assembly->functions.Add(meta);
context.assembly->functionByName.Add(meta->name, index);
auto scope = context.manager->nodeScopes[node].Obj();
auto symbol = context.manager->GetDeclarationSymbol(scope, node);
context.globalFunctions.Add(symbol.Obj(), index);
}
void Visit(WfVariableDeclaration* node)override
{
vint index = context.assembly->variableNames.Add(namePrefix + node->name.value);
auto scope = context.manager->nodeScopes[node].Obj();
auto symbol = scope->symbols[node->name.value][0];
context.globalVariables.Add(symbol.Obj(), index);
}
void Visit(WfEventDeclaration* node)override
{
}
void Visit(WfPropertyDeclaration* node)override
{
}
void Visit(WfConstructorDeclaration* node)override
{
}
void Visit(WfDestructorDeclaration* node)override
{
}
void Visit(WfClassDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, memberDecl, node->declarations)
{
GenerateGlobalClassMemberMetadataVisitor visitor(context, namePrefix + node->name.value + L"::", node);
memberDecl->Accept(&visitor);
}
}
void Visit(WfEnumDeclaration* node)override
{
}
void Visit(WfStructDeclaration* node)override
{
}
void Visit(WfVirtualDeclaration* node)override
{
FOREACH(Ptr<WfDeclaration>, decl, node->expandedDeclarations)
{
decl->Accept(this);
}
}
};
void GenerateGlobalDeclarationMetadata(WfCodegenContext& context, Ptr<WfDeclaration> declaration, const WString& namePrefix)
{
GenerateGlobalDeclarationMetadataVisitor visitor(context, namePrefix);
declaration->Accept(&visitor);
}
}
}
}
/***********************************************************************
EMITTER\WFEMITTER_STATEMENT.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace emitter
{
using namespace collections;
using namespace reflection;
using namespace reflection::description;
using namespace analyzer;
using namespace runtime;
typedef WfInstruction Ins;
#define INSTRUCTION(X) context.AddInstruction(node, X)
#define EXIT_CODE(X) context.AddExitInstruction(node, X)
/***********************************************************************
GenerateInstructions(Statement)
***********************************************************************/
class GenerateStatementInstructionsVisitor : public Object, public WfStatement::IVisitor
{
public:
WfCodegenContext& context;
GenerateStatementInstructionsVisitor(WfCodegenContext& _context)
:context(_context)
{
}
void ApplyExitCode(Ptr<WfCodegenScopeContext> scopeContext)
{
context.ApplyExitInstructions(scopeContext);
if (scopeContext->exitStatement)
{
GenerateStatementInstructions(context, scopeContext->exitStatement);
}
}
void ApplyCurrentScopeExitCode()
{
auto scopeContext = context.functionContext->GetCurrentScopeContext();
ApplyExitCode(scopeContext);
}
void InlineScopeExitCode(WfCodegenScopeType untilScopeType, bool exclusive)
{
vint index = context.functionContext->scopeContextStack.Count() - 1;
while (index >= 0)
{
auto scopeContext = context.functionContext->scopeContextStack[index];
if (exclusive && scopeContext->type == untilScopeType) break;
ApplyExitCode(scopeContext);
if (!exclusive && scopeContext->type == untilScopeType) break;
index--;
}
}
void Visit(WfBreakStatement* node)override
{
InlineScopeExitCode(WfCodegenScopeType::Loop, false);
context.functionContext->GetCurrentScopeContext(WfCodegenScopeType::Loop)->breakInstructions.Add(INSTRUCTION(Ins::Jump(-1)));
}
void Visit(WfContinueStatement* node)override
{
InlineScopeExitCode(WfCodegenScopeType::Loop, true);
context.functionContext->GetCurrentScopeContext(WfCodegenScopeType::Loop)->continueInstructions.Add(INSTRUCTION(Ins::Jump(-1)));
}
void Visit(WfReturnStatement* node)override
{
InlineScopeExitCode(WfCodegenScopeType::Function, false);
if (node->expression)
{
GenerateExpressionInstructions(context, node->expression);
}
else
{
INSTRUCTION(Ins::LoadValue(Value()));
}
INSTRUCTION(Ins::Return());
}
void Visit(WfDeleteStatement* node)override
{
GenerateExpressionInstructions(context, node->expression);
INSTRUCTION(Ins::DeleteRawPtr());
}
void Visit(WfRaiseExceptionStatement* node)override
{
if (node->expression)
{
GenerateExpressionInstructions(context, node->expression);
}
else
{
auto scope = context.manager->nodeScopes[node];
while (scope)
{
if (auto tryCatch = scope->ownerNode.Cast<WfTryStatement>())
{
if (tryCatch->name.value != L"")
{
auto symbol = scope->symbols[tryCatch->name.value][0].Obj();
vint index = context.functionContext->localVariables[symbol];
INSTRUCTION(Ins::LoadLocalVar(index));
break;
}
}
scope = scope->parentScope;
}
}
INSTRUCTION(Ins::RaiseException());
}
void Visit(WfIfStatement* node)override
{
vint variableIndex = -1;
GenerateExpressionInstructions(context, node->expression);
if (node->name.value != L"")
{
auto scope = context.manager->nodeScopes[node];
auto symbol = scope->symbols[node->name.value][0];
auto function = context.functionContext->function;
variableIndex = function->argumentNames.Count() + function->localVariableNames.Add(L"<if>" + node->name.value);
context.functionContext->localVariables.Add(symbol.Obj(), variableIndex);
GenerateTypeCastInstructions(context, symbol->typeInfo, false, node->expression.Obj());
INSTRUCTION(Ins::StoreLocalVar(variableIndex));
INSTRUCTION(Ins::LoadLocalVar(variableIndex));
INSTRUCTION(Ins::LoadValue(Value()));
INSTRUCTION(Ins::CompareReference());
}
else
{
INSTRUCTION(Ins::OpNot(WfInsType::Bool));
}
vint fillElseIndex = INSTRUCTION(Ins::JumpIf(-1));
GenerateStatementInstructions(context, node->trueBranch);
if (variableIndex != -1)
{
INSTRUCTION(Ins::LoadValue(Value()));
INSTRUCTION(Ins::StoreLocalVar(variableIndex));
}
vint fillEndIndex = INSTRUCTION(Ins::Jump(-1));
context.assembly->instructions[fillElseIndex].indexParameter = context.assembly->instructions.Count();
if (node->falseBranch)
{
GenerateStatementInstructions(context, node->falseBranch);
}
context.assembly->instructions[fillEndIndex].indexParameter = context.assembly->instructions.Count();
}
void Visit(WfWhileStatement* node)override
{
vint continueLabelIndex = -1;
vint breakLabelIndex = -1;
vint loopLabelIndex = -1;
auto loopContext = context.functionContext->PushScopeContext(WfCodegenScopeType::Loop);
loopLabelIndex = context.assembly->instructions.Count();
continueLabelIndex = context.assembly->instructions.Count();
GenerateExpressionInstructions(context, node->condition);
INSTRUCTION(Ins::OpNot(WfInsType::Bool));
loopContext->breakInstructions.Add(INSTRUCTION(Ins::JumpIf(-1)));
GenerateStatementInstructions(context, node->statement);
INSTRUCTION(Ins::Jump(loopLabelIndex));
breakLabelIndex = context.assembly->instructions.Count();
FOREACH(vint, index, loopContext->continueInstructions)
{
context.assembly->instructions[index].indexParameter = continueLabelIndex;
}
FOREACH(vint, index, loopContext->breakInstructions)
{
context.assembly->instructions[index].indexParameter = breakLabelIndex;
}
context.functionContext->PopScopeContext();
}
Pair<int, int> GenerateTryProtected(WfStatement* node, Ptr<WfStatement> protectedStatement, Ptr<WfStatement> finallyStatement)
{
auto catchContext = context.functionContext->PushScopeContext(WfCodegenScopeType::TryCatch);
EXIT_CODE(Ins::UninstallTry(0));
catchContext->exitStatement = finallyStatement;
vint trap = INSTRUCTION(Ins::InstallTry(-1));
GenerateStatementInstructions(context, protectedStatement);
context.functionContext->PopScopeContext();
INSTRUCTION(Ins::UninstallTry(0));
vint finish = INSTRUCTION(Ins::Jump(-1));
return{ trap,finish };
}
vint GenerateExceptionVariable(WfTryStatement* node)
{
WfLexicalSymbol* exceptionSymbol = nullptr;
WString exceptionName;
if (node->catchStatement)
{
auto scope = context.manager->nodeScopes[node].Obj();
exceptionSymbol = scope->symbols[node->name.value][0].Obj();
exceptionName = L"<catch>" + node->name.value;
}
else
{
exceptionName = L"<try-finally-exception>";
}
auto function = context.functionContext->function;
vint variableIndex = function->argumentNames.Count() + function->localVariableNames.Add(L"<catch>" + node->name.value);
if (exceptionSymbol)
{
context.functionContext->localVariables.Add(exceptionSymbol, variableIndex);
}
return variableIndex;
}
void GenerateTrap(WfTryStatement* node, vint variableIndex, Pair<int, int> trap)
{
context.assembly->instructions[trap.key].indexParameter = context.assembly->instructions.Count();
INSTRUCTION(Ins::LoadException());
INSTRUCTION(Ins::StoreLocalVar(variableIndex));
}
void GenerateFinallyAndRaise(WfTryStatement* node, vint variableIndex)
{
GenerateStatementInstructions(context, node->finallyStatement);
INSTRUCTION(Ins::LoadLocalVar(variableIndex));
INSTRUCTION(Ins::RaiseException());
}
void Visit(WfTryStatement* node)override
{
// try
auto trap1 = GenerateTryProtected(node, node->protectedStatement, node->finallyStatement);
Pair<int, int> trap2 = { -1,-1 };
auto variableIndex = GenerateExceptionVariable(node);
// catch
{
GenerateTrap(node, variableIndex, trap1);
if (node->catchStatement)
{
if (node->finallyStatement)
{
trap2 = GenerateTryProtected(node, node->catchStatement, node->finallyStatement);
GenerateTrap(node, variableIndex, trap2);
GenerateFinallyAndRaise(node, variableIndex);
}
else
{
GenerateStatementInstructions(context, node->catchStatement);
}
}
else
{
GenerateFinallyAndRaise(node, variableIndex);
}
}
// finally
context.assembly->instructions[trap1.value].indexParameter = context.assembly->instructions.Count();
if (trap2.value != -1)
{
context.assembly->instructions[trap2.value].indexParameter = context.assembly->instructions.Count();
}
if (node->finallyStatement)
{
GenerateStatementInstructions(context, node->finallyStatement);
}
}
void Visit(WfBlockStatement* node)override
{
FOREACH(Ptr<WfStatement>, statement, node->statements)
{
GenerateStatementInstructions(context, statement);
}
}
void Visit(WfExpressionStatement* node)override
{
GenerateExpressionInstructions(context, node->expression);
INSTRUCTION(Ins::Pop());
}
void Visit(WfVariableStatement* node)override
{
auto manager = context.manager;
auto scope = manager->nodeScopes[node->variable.Obj()];
auto symbol = scope->symbols[node->variable->name.value][0].Obj();
auto function = context.functionContext->function;
vint index = function->argumentNames.Count() + function->localVariableNames.Add(node->variable->name.value);
context.functionContext->localVariables.Add(symbol, index);
GenerateExpressionInstructions(context, node->variable->expression);
INSTRUCTION(Ins::StoreLocalVar(index));
}
void Visit(WfVirtualStatement* node)override
{
GenerateStatementInstructions(context, node->expandedStatement);
}
void Visit(WfCoroutineStatement* node)override
{
CHECK_FAIL(L"GenerateStatementInstructionsVisitor::Visit(WfCoroutineStatement*)#Internal error, All coroutine statements do not emit instructions.");
}
};
#undef EXIT_CODE
#undef INSTRUCTION
void GenerateStatementInstructions(WfCodegenContext& context, Ptr<WfStatement> statement)
{
GenerateStatementInstructionsVisitor visitor(context);
statement->Accept(&visitor);
}
}
}
}
/***********************************************************************
EXPRESSION\WFEXPRESSION.CPP
***********************************************************************/
namespace vl
{
namespace workflow
{
using namespace stream;
using namespace collections;
using namespace parsing;
/***********************************************************************
Unescaping Functions
***********************************************************************/
void SetDefaultClassMember(vl::collections::List<vl::Ptr<WfDeclaration>>& value, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
FOREACH(Ptr<WfDeclaration>, decl, value)
{
if (!decl->classMember)
{
decl->classMember = MakePtr<WfClassMember>();
decl->classMember->codeRange = decl->codeRange;
decl->classMember->kind = WfClassMemberKind::Normal;
}
}
}
void UnescapeStringInternal(vl::parsing::ParsingToken& value, bool formatString)
{
MemoryStream memoryStream;
{
WString input = formatString ? value.value.Sub(2, value.value.Length() - 3) : value.value.Sub(1, value.value.Length() - 2);
const wchar_t* reading = input.Buffer();
StreamWriter writer(memoryStream);
while (wchar_t c = *reading++)
{
if (c == L'\\')
{
switch (wchar_t e = *reading++)
{
case L'r':
writer.WriteChar('\r');
break;
case L'n':
writer.WriteChar('\n');
break;
case L't':
writer.WriteChar('\t');
break;
default:
writer.WriteChar(e);
}
}
else
{
writer.WriteChar(c);
}
}
}
memoryStream.SeekFromBegin(0);
{
StreamReader reader(memoryStream);
value.value = reader.ReadToEnd();
}
}
void UnescapeFormatString(vl::parsing::ParsingToken& value, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
UnescapeStringInternal(value, true);
}
void UnescapeString(vl::parsing::ParsingToken& value, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
UnescapeStringInternal(value, false);
}
void EscapeString(const WString& text, ParsingWriter& writer)
{
writer.WriteChar(L'\"');
const wchar_t* reading = text.Buffer();
while (wchar_t c = *reading++)
{
switch (c)
{
case '\r':
writer.WriteString(L"\\r");
break;
case '\n':
writer.WriteString(L"\\n");
break;
case '\t':
writer.WriteString(L"\\t");
break;
case '\"':
writer.WriteString(L"\\\"");
break;
case '\\':
writer.WriteString(L"\\\\");
break;
default:
writer.WriteChar(c);
}
}
writer.WriteChar(L'\"');
}
/***********************************************************************
Print (Type)
***********************************************************************/
class PrintTypeVisitor : public Object, public WfType::IVisitor
{
public:
WString indent;
ParsingWriter& writer;
PrintTypeVisitor(const WString& _indent, ParsingWriter& _writer)
:indent(_indent), writer(_writer)
{
}
void Visit(WfPredefinedType* node)override
{
writer.BeforePrint(node);
switch (node->name)
{
case WfPredefinedTypeName::Void:
writer.WriteString(L"void");
break;
case WfPredefinedTypeName::Object:
writer.WriteString(L"object");
break;
case WfPredefinedTypeName::Interface:
writer.WriteString(L"interface");
break;
case WfPredefinedTypeName::Int:
writer.WriteString(L"int");
break;
case WfPredefinedTypeName::UInt:
writer.WriteString(L"uint");
break;
case WfPredefinedTypeName::Float:
writer.WriteString(L"float");
break;
case WfPredefinedTypeName::Double:
writer.WriteString(L"double");
break;
case WfPredefinedTypeName::String:
writer.WriteString(L"string");
break;
case WfPredefinedTypeName::Char:
writer.WriteString(L"char");
break;
case WfPredefinedTypeName::Bool:
writer.WriteString(L"bool");
break;
}
writer.AfterPrint(node);
}
void Visit(WfTopQualifiedType* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"::" + node->name.value);
writer.AfterPrint(node);
}
void Visit(WfReferenceType* node)override
{
writer.BeforePrint(node);
writer.WriteString(node->name.value);
writer.AfterPrint(node);
}
void Visit(WfRawPointerType* node)override
{
writer.BeforePrint(node);
WfPrint(node->element, indent, writer);
writer.WriteString(L"*");
writer.AfterPrint(node);
}
void Visit(WfSharedPointerType* node)override
{
writer.BeforePrint(node);
WfPrint(node->element, indent, writer);
writer.WriteString(L"^");
writer.AfterPrint(node);
}
void Visit(WfNullableType* node)override
{
writer.BeforePrint(node);
WfPrint(node->element, indent, writer);
writer.WriteString(L"?");
writer.AfterPrint(node);
}
void Visit(WfEnumerableType* node)override
{
writer.BeforePrint(node);
WfPrint(node->element, indent, writer);
writer.WriteString(L"{}");
writer.AfterPrint(node);
}
void Visit(WfMapType* node)override
{
writer.BeforePrint(node);
if (node->writability == WfMapWritability::Readonly)
{
writer.WriteString(L"const ");
}
WfPrint(node->value, indent, writer);
writer.WriteString(L"[");
if (node->key)
{
WfPrint(node->key, indent, writer);
}
writer.WriteString(L"]");
writer.AfterPrint(node);
}
void Visit(WfFunctionType* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"(func ");
writer.WriteString(L"(");
FOREACH_INDEXER(Ptr<WfType>, type, index, node->arguments)
{
if (index > 0)
{
writer.WriteString(L", ");
}
WfPrint(type, indent, writer);
}
writer.WriteString(L")");
writer.WriteString(L" : (");
WfPrint(node->result, indent, writer);
writer.WriteString(L"))");
writer.AfterPrint(node);
}
void Visit(WfChildType* node)override
{
writer.BeforePrint(node);
WfPrint(node->parent, indent, writer);
writer.WriteString(L"::");
writer.WriteString(node->name.value);
writer.AfterPrint(node);
}
};
/***********************************************************************
Print (Expression)
***********************************************************************/
class PrintExpressionVisitor
: public Object
, public WfExpression::IVisitor
, public WfVirtualExpression::IVisitor
{
public:
WString indent;
ParsingWriter& writer;
PrintExpressionVisitor(const WString& _indent, ParsingWriter& _writer)
:indent(_indent), writer(_writer)
{
}
void Visit(WfThisExpression* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"this");
writer.AfterPrint(node);
}
void Visit(WfTopQualifiedExpression* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"::");
writer.WriteString(node->name.value);
writer.AfterPrint(node);
}
void Visit(WfReferenceExpression* node)override
{
writer.BeforePrint(node);
writer.WriteString(node->name.value);
writer.AfterPrint(node);
}
void Visit(WfOrderedNameExpression* node)override
{
writer.BeforePrint(node);
writer.WriteString(node->name.value);
writer.AfterPrint(node);
}
void Visit(WfOrderedLambdaExpression* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"[");
WfPrint(node->body, indent, writer);
writer.WriteString(L"]");
writer.AfterPrint(node);
}
void Visit(WfMemberExpression* node)override
{
writer.BeforePrint(node);
WfPrint(node->parent, indent, writer);
writer.WriteString(L".");
writer.WriteString(node->name.value);
writer.AfterPrint(node);
}
void Visit(WfChildExpression* node)override
{
writer.BeforePrint(node);
WfPrint(node->parent, indent, writer);
writer.WriteString(L"::");
writer.WriteString(node->name.value);
writer.AfterPrint(node);
}
void Visit(WfLiteralExpression* node)override
{
writer.BeforePrint(node);
switch (node->value)
{
case WfLiteralValue::Null:
writer.WriteString(L"null");
break;
case WfLiteralValue::True:
writer.WriteString(L"true");
break;
case WfLiteralValue::False:
writer.WriteString(L"false");
break;
}
writer.AfterPrint(node);
}
void Visit(WfFloatingExpression* node)override
{
writer.BeforePrint(node);
writer.WriteString(node->value.value);
writer.AfterPrint(node);
}
void Visit(WfIntegerExpression* node)override
{
writer.BeforePrint(node);
writer.WriteString(node->value.value);
writer.AfterPrint(node);
}
void Visit(WfStringExpression* node)override
{
writer.BeforePrint(node);
EscapeString(node->value.value, writer);
writer.AfterPrint(node);
}
void Visit(WfUnaryExpression* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"(");
switch (node->op)
{
case WfUnaryOperator::Positive:
writer.WriteString(L"+");
break;
case WfUnaryOperator::Negative:
writer.WriteString(L"-");
break;
case WfUnaryOperator::Not:
writer.WriteString(L"!");
break;
}
WfPrint(node->operand, indent, writer);
writer.WriteString(L")");
writer.AfterPrint(node);
}
void Visit(WfBinaryExpression* node)override
{
writer.BeforePrint(node);
if (node->op == WfBinaryOperator::Index)
{
WfPrint(node->first, indent, writer);
writer.WriteString(L"[");
WfPrint(node->second, indent, writer);
writer.WriteString(L"]");
}
else
{
writer.WriteString(L"(");
WfPrint(node->first, indent, writer);
switch (node->op)
{
case WfBinaryOperator::Assign:
writer.WriteString(L" = ");
break;
case WfBinaryOperator::Union:
writer.WriteString(L" & ");
break;
case WfBinaryOperator::Intersect:
writer.WriteString(L" | ");
break;
case WfBinaryOperator::FailedThen:
writer.WriteString(L" ?? ");
break;
case WfBinaryOperator::Exp:
writer.WriteString(L" ^ ");
break;
case WfBinaryOperator::Add:
writer.WriteString(L" + ");
break;
case WfBinaryOperator::Sub:
writer.WriteString(L" - ");
break;
case WfBinaryOperator::Mul:
writer.WriteString(L" * ");
break;
case WfBinaryOperator::Div:
writer.WriteString(L" / ");
break;
case WfBinaryOperator::Mod:
writer.WriteString(L" % ");
break;
case WfBinaryOperator::Shl:
writer.WriteString(L" shl ");
break;
case WfBinaryOperator::Shr:
writer.WriteString(L" shr ");
break;
case WfBinaryOperator::LT:
writer.WriteString(L" < ");
break;
case WfBinaryOperator::GT:
writer.WriteString(L" > ");
break;
case WfBinaryOperator::LE:
writer.WriteString(L" <= ");
break;
case WfBinaryOperator::GE:
writer.WriteString(L" >= ");
break;
case WfBinaryOperator::EQ:
writer.WriteString(L" == ");
break;
case WfBinaryOperator::NE:
writer.WriteString(L" != ");
break;
case WfBinaryOperator::Xor:
writer.WriteString(L" xor ");
break;
case WfBinaryOperator::And:
writer.WriteString(L" and ");
break;
case WfBinaryOperator::Or:
writer.WriteString(L" or ");
break;
default:;
}
WfPrint(node->second, indent, writer);
writer.WriteString(L")");
}
writer.AfterPrint(node);
}
void Visit(WfLetExpression* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"let ");
FOREACH_INDEXER(Ptr<WfLetVariable>, var, index, node->variables)
{
if (index > 0)
{
writer.WriteString(L", ");
}
writer.WriteString(var->name.value);
writer.WriteString(L" = ");
WfPrint(var->value, indent, writer);
}
writer.WriteString(L" in (");
WfPrint(node->expression, indent, writer);
writer.WriteString(L")");
writer.AfterPrint(node);
}
void Visit(WfIfExpression* node)override
{
writer.BeforePrint(node);
WfPrint(node->condition, indent, writer);
writer.WriteString(L" ? ");
WfPrint(node->trueBranch, indent, writer);
writer.WriteString(L" : ");
WfPrint(node->falseBranch, indent, writer);
writer.AfterPrint(node);
}
void Visit(WfRangeExpression* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"range ");
writer.WriteString(node->beginBoundary == WfRangeBoundary::Exclusive ? L"(" : L"[");
WfPrint(node->begin, indent, writer);
writer.WriteString(L", ");
WfPrint(node->end, indent, writer);
writer.WriteString(node->endBoundary == WfRangeBoundary::Exclusive ? L")" : L"]");
writer.AfterPrint(node);
}
void Visit(WfSetTestingExpression* node)override
{
writer.BeforePrint(node);
WfPrint(node->element, indent, writer);
if (node->test == WfSetTesting::NotIn)
{
writer.WriteString(L" not");
}
writer.WriteString(L" in ");
WfPrint(node->collection, indent, writer);
writer.AfterPrint(node);
}
void Visit(WfConstructorExpression* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"{");
FOREACH_INDEXER(Ptr<WfConstructorArgument>, argument, index, node->arguments)
{
if (index > 0)
{
writer.WriteString(L" ");
}
WfPrint(argument->key, indent, writer);
if (argument->value)
{
writer.WriteString(L" : ");
WfPrint(argument->value, indent, writer);
}
}
writer.WriteString(L"}");
writer.AfterPrint(node);
}
void Visit(WfInferExpression* node)override
{
writer.BeforePrint(node);
WfPrint(node->expression, indent, writer);
writer.WriteString(L" of (");
WfPrint(node->type, indent, writer);
writer.WriteString(L")");
writer.AfterPrint(node);
}
void Visit(WfTypeCastingExpression* node)override
{
writer.BeforePrint(node);
if (node->strategy == WfTypeCastingStrategy::Strong)
{
writer.WriteString(L"(cast (");
WfPrint(node->type, indent, writer);
writer.WriteString(L") ");
WfPrint(node->expression, indent, writer);
writer.WriteString(L")");
}
else
{
writer.WriteString(L"(");
WfPrint(node->expression, indent, writer);
writer.WriteString(L" as (");
WfPrint(node->type, indent, writer);
writer.WriteString(L"))");
}
writer.AfterPrint(node);
}
void Visit(WfTypeTestingExpression* node)override
{
writer.BeforePrint(node);
WfPrint(node->expression, indent, writer);
switch (node->test)
{
case WfTypeTesting::IsType:
writer.WriteString(L" is (");
WfPrint(node->type, indent, writer);
writer.WriteString(L")");
break;
case WfTypeTesting::IsNotType:
writer.WriteString(L" is not (");
WfPrint(node->type, indent, writer);
writer.WriteString(L")");
break;
case WfTypeTesting::IsNull:
writer.WriteString(L" is null");
break;
case WfTypeTesting::IsNotNull:
writer.WriteString(L" is not null");
break;
}
writer.AfterPrint(node);
}
void Visit(WfTypeOfTypeExpression* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"typeof(");
WfPrint(node->type, indent, writer);
writer.WriteString(L")");
writer.AfterPrint(node);
}
void Visit(WfTypeOfExpressionExpression* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"type(");
WfPrint(node->expression, indent, writer);
writer.WriteString(L")");
writer.AfterPrint(node);
}
void Visit(WfAttachEventExpression* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"attach(");
WfPrint(node->event, indent, writer);
writer.WriteString(L", ");
WfPrint(node->function, indent, writer);
writer.WriteString(L")");
writer.AfterPrint(node);
}
void Visit(WfDetachEventExpression* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"detach(");
WfPrint(node->event, indent, writer);
writer.WriteString(L", ");
WfPrint(node->handler, indent, writer);
writer.WriteString(L")");
writer.AfterPrint(node);
}
void Visit(WfObserveExpression* node)override
{
writer.BeforePrint(node);
WfPrint(node->parent, indent, writer);
writer.WriteString(L".observe");
if (node->observeType == WfObserveType::ExtendedObserve)
{
writer.WriteString(L" as ");
writer.WriteString(node->name.value);
}
writer.WriteString(L"(");
WfPrint(node->expression, indent, writer);
if (node->events.Count() > 0)
{
writer.WriteString(L" on ");
FOREACH_INDEXER(Ptr<WfExpression>, argument, index, node->events)
{
if (index > 0)
{
writer.WriteString(L", ");
}
WfPrint(argument, indent, writer);
}
}
writer.WriteString(L")");
writer.AfterPrint(node);
}
void Visit(WfCallExpression* node)override
{
writer.BeforePrint(node);
WfPrint(node->function, indent, writer);
writer.WriteString(L"(");
FOREACH_INDEXER(Ptr<WfExpression>, argument, index, node->arguments)
{
if (index > 0)
{
writer.WriteString(L", ");
}
WfPrint(argument, indent, writer);
}
writer.WriteString(L")");
writer.AfterPrint(node);
}
void Visit(WfFunctionExpression* node)override
{
writer.BeforePrint(node);
WfPrint(Ptr<WfDeclaration>(node->function), indent, writer);
writer.AfterPrint(node);
}
void Visit(WfNewClassExpression* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"new (");
WfPrint(node->type, indent, writer);
writer.WriteString(L")");
writer.WriteString(L"(");
FOREACH_INDEXER(Ptr<WfExpression>, argument, index, node->arguments)
{
if (index > 0)
{
writer.WriteString(L", ");
}
WfPrint(argument, indent, writer);
}
writer.WriteString(L")");
writer.AfterPrint(node);
}
void Visit(WfNewInterfaceExpression* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"new (");
WfPrint(node->type, indent, writer);
writer.WriteString(L")");
writer.WriteLine(L"");
writer.WriteString(indent);
writer.WriteLine(L"{");
FOREACH_INDEXER(Ptr<WfDeclaration>, decl, index, node->declarations)
{
if (index > 0)
{
writer.WriteLine(L"");
}
writer.WriteString(indent + L" ");
WfPrint(decl, indent + L" ", writer);
writer.WriteLine(L"");
}
writer.WriteString(indent);
writer.WriteString(L"}");
writer.AfterPrint(node);
}
void Visit(WfVirtualExpression* node)override
{
if (node->expandedExpression)
{
writer.BeforePrint(node);
WfPrint(node->expandedExpression, indent, writer);
writer.AfterPrint(node);
}
else
{
node->Accept((WfVirtualExpression::IVisitor*)this);
}
}
void Visit(WfBindExpression* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"bind(");
WfPrint(node->expression, indent, writer);
writer.WriteString(L")");
writer.AfterPrint(node);
}
void Visit(WfFormatExpression* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"$");
EscapeString(node->value.value, writer);
writer.AfterPrint(node);
}
void Visit(WfNewCoroutineExpression* node)override
{
writer.BeforePrint(node);
if (node->name.value == L"")
{
writer.WriteLine(L"$coroutine");
}
else
{
writer.WriteString(L"$coroutine(");
writer.WriteString(node->name.value);
writer.WriteLine(L")");
}
writer.WriteString(indent);
WfPrint(node->statement, indent, writer);
writer.AfterPrint(node);
}
void Visit(WfMixinCastExpression* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"new (");
WfPrint(node->type, indent, writer);
writer.WriteString(L")");
writer.WriteString(L"(using ");
WfPrint(node->expression, indent, writer);
writer.AfterPrint(node);
}
};
/***********************************************************************
Print (Statement)
***********************************************************************/
class PrintStatementVisitor
: public Object
, public WfStatement::IVisitor
, public WfVirtualStatement::IVisitor
, public WfCoroutineStatement::IVisitor
{
public:
WString indent;
ParsingWriter& writer;
PrintStatementVisitor(const WString& _indent, ParsingWriter& _writer)
:indent(_indent), writer(_writer)
{
}
void Visit(WfBreakStatement* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"break;");
writer.AfterPrint(node);
}
void Visit(WfContinueStatement* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"continue;");
writer.AfterPrint(node);
}
void Visit(WfReturnStatement* node)override
{
writer.BeforePrint(node);
if (node->expression)
{
writer.WriteString(L"return ");
WfPrint(node->expression, indent, writer);
writer.WriteString(L";");
}
else
{
writer.WriteString(L"return;");
}
writer.AfterPrint(node);
}
void Visit(WfDeleteStatement* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"delete ");
WfPrint(node->expression, indent, writer);
writer.WriteString(L";");
writer.AfterPrint(node);
}
void Visit(WfRaiseExceptionStatement* node)override
{
writer.BeforePrint(node);
if (node->expression)
{
writer.WriteString(L"raise ");
WfPrint(node->expression, indent, writer);
writer.WriteString(L";");
}
else
{
writer.WriteString(L"raise;");
}
writer.AfterPrint(node);
}
void Visit(WfIfStatement* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"if (");
if (node->type)
{
writer.WriteString(L"var ");
writer.WriteString(node->name.value);
writer.WriteString(L" : ");
WfPrint(node->type, indent, writer);
writer.WriteString(L" = ");
}
WfPrint(node->expression, indent, writer);
writer.WriteLine(L")");
writer.WriteString(indent);
WfPrint(node->trueBranch, indent, writer);
if (node->falseBranch)
{
writer.WriteLine(L"");
writer.WriteString(indent);
if (node->falseBranch.Cast<WfIfStatement>())
{
writer.WriteString(L"else ");
WfPrint(node->falseBranch, indent, writer);
}
else
{
writer.WriteLine(L"else");
writer.WriteString(indent);
WfPrint(node->falseBranch, indent, writer);
}
}
writer.AfterPrint(node);
}
void Visit(WfWhileStatement* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"while (");
WfPrint(node->condition, indent, writer);
writer.WriteLine(L")");
writer.WriteString(indent);
WfPrint(node->statement, indent, writer);
writer.AfterPrint(node);
}
void Visit(WfTryStatement* node)override
{
writer.BeforePrint(node);
writer.WriteLine(L"try");
writer.WriteString(indent);
WfPrint(node->protectedStatement, indent, writer);
if (node->catchStatement)
{
writer.WriteLine(L"");
writer.WriteString(indent);
writer.WriteString(L"catch (");
writer.WriteString(node->name.value);
writer.WriteLine(L")");
writer.WriteString(indent);
WfPrint(node->catchStatement, indent, writer);
}
if (node->finallyStatement)
{
writer.WriteLine(L"");
writer.WriteString(indent);
writer.WriteLine(L"finally");
writer.WriteString(indent);
WfPrint(node->finallyStatement, indent, writer);
}
writer.AfterPrint(node);
}
void Visit(WfBlockStatement* node)override
{
writer.BeforePrint(node);
writer.WriteLine(L"{");
FOREACH(Ptr<WfStatement>, statement, node->statements)
{
writer.WriteString(indent + L" ");
WfPrint(statement, indent + L" ", writer);
writer.WriteLine(L"");
}
writer.WriteString(indent);
writer.WriteString(L"}");
writer.AfterPrint(node);
}
void Visit(WfExpressionStatement* node)override
{
writer.BeforePrint(node);
WfPrint(node->expression, indent, writer);
writer.WriteString(L";");
writer.AfterPrint(node);
}
void Visit(WfVariableStatement* node)override
{
writer.BeforePrint(node);
WfPrint(Ptr<WfDeclaration>(node->variable), indent, writer);
writer.AfterPrint(node);
}
void Visit(WfVirtualStatement* node)override
{
if (node->expandedStatement)
{
writer.BeforePrint(node);
WfPrint(node->expandedStatement, indent, writer);
writer.AfterPrint(node);
}
else
{
node->Accept((WfVirtualStatement::IVisitor*)this);
}
}
void Visit(WfSwitchStatement* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"switch (");
WfPrint(node->expression, indent, writer);
writer.WriteLine(L")");
writer.WriteString(indent);
writer.WriteLine(L"{");
FOREACH(Ptr<WfSwitchCase>, switchCase, node->caseBranches)
{
writer.WriteString(indent);
writer.WriteString(L" case ");
WfPrint(switchCase->expression, indent, writer);
writer.WriteLine(L":");
writer.WriteString(indent + L" ");
WfPrint(switchCase->statement, indent + L" ", writer);
writer.WriteLine(L"");
}
if (node->defaultBranch)
{
writer.WriteString(indent);
writer.WriteLine(L" default:");
writer.WriteString(indent + L" ");
WfPrint(node->defaultBranch, indent + L" ", writer);
writer.WriteLine(L"");
}
writer.WriteString(indent);
writer.WriteString(L"}");
writer.AfterPrint(node);
}
void Visit(WfForEachStatement* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"for (");
writer.WriteString(node->name.value);
writer.WriteString(L" in ");
if (node->direction == WfForEachDirection::Reversed)
{
writer.WriteString(L"reversed ");
}
WfPrint(node->collection, indent, writer);
writer.WriteLine(L")");
writer.WriteString(indent);
WfPrint(node->statement, indent, writer);
writer.AfterPrint(node);
}
void Visit(WfCoProviderStatement* node)override
{
writer.BeforePrint(node);
if (node->name.value == L"")
{
writer.WriteString(L"$");
}
else
{
writer.WriteString(node->name.value);
writer.WriteString(L" ");
}
WfPrint(node->statement, indent, writer);
writer.AfterPrint(node);
}
void Visit(WfCoroutineStatement* node)override
{
node->Accept((WfCoroutineStatement::IVisitor*)this);
}
void Visit(WfCoPauseStatement* node)override
{
writer.BeforePrint(node);
if (node->statement)
{
writer.WriteLine(L"$pause");
writer.WriteString(indent);
WfPrint(node->statement, indent, writer);
}
else
{
writer.WriteString(L"$pause;");
}
writer.AfterPrint(node);
}
void Visit(WfCoOperatorStatement* node)override
{
if (node->varName.value != L"")
{
writer.WriteString(L"var ");
writer.WriteString(node->varName.value);
writer.WriteString(L" = ");
}
writer.WriteString(node->opName.value);
FOREACH_INDEXER(Ptr<WfExpression>, argument, index, node->arguments)
{
writer.WriteString(index == 0 ? L" " : L", ");
WfPrint(argument, indent, writer);
}
writer.WriteString(L";");
}
};
/***********************************************************************
Print (Declaration)
***********************************************************************/
class PrintDeclarationVisitor
: public Object
, public WfDeclaration::IVisitor
, public WfVirtualDeclaration::IVisitor
{
public:
WString indent;
ParsingWriter& writer;
PrintDeclarationVisitor(const WString& _indent, ParsingWriter& _writer)
:indent(_indent), writer(_writer)
{
}
void Visit(WfNamespaceDeclaration* node)override
{
writer.BeforePrint(node);
writer.WriteLine(L"namespace " + node->name.value);
writer.WriteString(indent);
writer.WriteLine(L"{");
FOREACH_INDEXER(Ptr<WfDeclaration>, decl, index, node->declarations)
{
if (index != 0)
{
writer.WriteLine(L"");
}
writer.WriteString(indent + L" ");
WfPrint(decl, indent + L" ", writer);
writer.WriteLine(L"");
}
writer.WriteString(indent);
writer.WriteString(L"}");
writer.AfterPrint(node);
}
void Visit(WfFunctionDeclaration* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"func ");
if (node->anonymity == WfFunctionAnonymity::Named)
{
writer.WriteString(node->name.value);
}
writer.WriteString(L"(");
FOREACH_INDEXER(Ptr<WfFunctionArgument>, argument, index, node->arguments)
{
if (index > 0)
{
writer.WriteString(L", ");
}
FOREACH(Ptr<WfAttribute>, attribute, argument->attributes)
{
WfPrint(attribute, indent, writer);
writer.WriteString(L" ");
}
writer.WriteString(argument->name.value);
writer.WriteString(L" : ");
WfPrint(argument->type, indent, writer);
}
writer.WriteString(L")");
writer.WriteString(L" : (");
WfPrint(node->returnType, indent, writer);
writer.WriteString(L")");
if (node->statement)
{
writer.WriteLine(L"");
writer.WriteString(indent);
WfPrint(node->statement, indent, writer);
}
else
{
writer.WriteString(L";");
}
writer.AfterPrint(node);
}
void Visit(WfVariableDeclaration* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"var ");
writer.WriteString(node->name.value);
if (node->type)
{
writer.WriteString(L" : ");
WfPrint(node->type, indent, writer);
}
writer.WriteString(L" = ");
WfPrint(node->expression, indent, writer);
writer.WriteString(L";");
writer.AfterPrint(node);
}
void Visit(WfEventDeclaration* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"event ");
writer.WriteString(node->name.value);
writer.WriteString(L"(");
FOREACH_INDEXER(Ptr<WfType>, type, index, node->arguments)
{
if (index != 0)
{
writer.WriteString(L", ");
}
WfPrint(type, indent, writer);
}
writer.WriteString(L");");
writer.AfterPrint(node);
}
void Visit(WfPropertyDeclaration* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"prop ");
writer.WriteString(node->name.value);
writer.WriteString(L" : ");
WfPrint(node->type, indent, writer);
writer.WriteString(L"{");
writer.WriteString(node->getter.value);
if (node->setter.value != L"")
{
writer.WriteString(L", ");
writer.WriteString(node->setter.value);
}
if (node->valueChangedEvent.value != L"")
{
writer.WriteString(L" : ");
writer.WriteString(node->valueChangedEvent.value);
}
writer.WriteString(L"}");
writer.AfterPrint(node);
}
void Visit(WfConstructorDeclaration* node)override
{
writer.BeforePrint(node);
if (node->constructorType == WfConstructorType::RawPtr)
{
writer.WriteString(L"new* ");
}
else
{
writer.WriteString(L"new ");
}
writer.WriteString(L"(");
FOREACH_INDEXER(Ptr<WfFunctionArgument>, argument, index, node->arguments)
{
if (index > 0)
{
writer.WriteString(L", ");
}
writer.WriteString(argument->name.value);
writer.WriteString(L" : ");
WfPrint(argument->type, indent, writer);
}
writer.WriteString(L")");
FOREACH_INDEXER(Ptr<WfBaseConstructorCall>, call, callIndex, node->baseConstructorCalls)
{
writer.WriteLine(L"");
writer.WriteString(indent + L" ");
if (callIndex == 0)
{
writer.WriteString(L":");
}
else
{
writer.WriteString(L",");
}
WfPrint(call->type, indent + L" ", writer);
writer.WriteString(L"(");
FOREACH_INDEXER(Ptr<WfExpression>, argument, argumentIndex, call->arguments)
{
if (argumentIndex != 0)
{
writer.WriteString(L", ");
}
WfPrint(argument, indent + L" ", writer);
}
writer.WriteString(L")");
}
writer.WriteLine(L"");
writer.WriteString(indent);
WfPrint(node->statement, indent, writer);
writer.AfterPrint(node);
}
void Visit(WfDestructorDeclaration* node)override
{
writer.BeforePrint(node);
writer.WriteLine(L"delete");
writer.WriteString(indent);
WfPrint(node->statement, indent, writer);
writer.AfterPrint(node);
}
void Visit(WfClassDeclaration* node)override
{
writer.BeforePrint(node);
switch (node->kind)
{
case WfClassKind::Class:
writer.WriteString(L"class ");
break;
case WfClassKind::Interface:
writer.WriteString(L"interface ");
break;
}
writer.WriteString(node->name.value);
if (node->constructorType == WfConstructorType::RawPtr)
{
writer.WriteString(L"*");
}
FOREACH_INDEXER(Ptr<WfType>, type, index, node->baseTypes)
{
if (index == 0)
{
writer.WriteString(L" : ");
}
else
{
writer.WriteString(L", ");
}
WfPrint(type, indent, writer);
}
writer.WriteLine(L"");
writer.WriteLine(indent + L"{");
FOREACH_INDEXER(Ptr<WfDeclaration>, decl, index, node->declarations)
{
if (index > 0)
{
writer.WriteLine(L"");
}
writer.WriteString(indent + L" ");
WfPrint(decl, indent + L" ", writer);
writer.WriteLine(L"");
}
writer.WriteString(indent + L"}");
writer.AfterPrint(node);
}
void Visit(WfEnumDeclaration* node)override
{
writer.BeforePrint(node);
switch (node->kind)
{
case WfEnumKind::Normal:
writer.WriteString(L"enum ");
break;
case WfEnumKind::Flag:
writer.WriteString(L"flagenum ");
break;
}
writer.WriteLine(node->name.value);
writer.WriteLine(indent + L"{");
auto newIndent = indent + L" ";
FOREACH(Ptr<WfEnumItem>, item, node->items)
{
FOREACH(Ptr<WfAttribute>, attribute, item->attributes)
{
writer.WriteString(newIndent);
WfPrint(attribute, newIndent, writer);
writer.WriteLine(L"");
}
writer.WriteString(newIndent);
writer.WriteString(item->name.value);
writer.WriteString(L" = ");
switch (item->kind)
{
case WfEnumItemKind::Constant:
writer.WriteString(item->number.value);
break;
case WfEnumItemKind::Intersection:
FOREACH_INDEXER(Ptr<WfEnumItemIntersection>, itemInt, index, item->intersections)
{
if (index != 0)writer.WriteString(L" | ");
writer.WriteString(itemInt->name.value);
}
break;
}
writer.WriteLine(L",");
}
writer.WriteString(indent + L"}");
writer.AfterPrint(node);
}
void Visit(WfStructDeclaration* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"struct ");
writer.WriteLine(node->name.value);
writer.WriteLine(indent + L"{");
auto newIndent = indent + L" ";
FOREACH(Ptr<WfStructMember>, member, node->members)
{
FOREACH(Ptr<WfAttribute>, attribute, member->attributes)
{
writer.WriteString(newIndent);
WfPrint(attribute, newIndent, writer);
writer.WriteLine(L"");
}
writer.WriteString(newIndent);
writer.WriteString(member->name.value);
writer.WriteString(L" : ");
WfPrint(member->type, newIndent, writer);
writer.WriteLine(L";");
}
writer.WriteString(indent + L"}");
writer.AfterPrint(node);
}
void Visit(WfVirtualDeclaration* node)override
{
if (node->expandedDeclarations.Count() > 0)
{
writer.BeforePrint(node);
FOREACH_INDEXER(Ptr<WfDeclaration>, decl, index, node->expandedDeclarations)
{
if (index > 0)
{
writer.WriteLine(L"");
writer.WriteString(indent);
}
WfPrint(decl, indent, writer);
if (index < node->expandedDeclarations.Count() - 1)
{
writer.WriteLine(L"");
}
}
writer.AfterPrint(node);
}
else
{
node->Accept(static_cast<WfVirtualDeclaration::IVisitor*>(this));
}
}
void Visit(WfAutoPropertyDeclaration* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"prop ");
writer.WriteString(node->name.value);
writer.WriteString(L" : ");
WfPrint(node->type, indent, writer);
if (node->expression)
{
writer.WriteString(L" = ");
WfPrint(node->expression, indent, writer);
}
writer.WriteString(L" {");
if (node->configConst == WfAPConst::Readonly)
{
if (node->configObserve == WfAPObserve::NotObservable)
{
writer.WriteString(L"const, not observe");
}
else
{
writer.WriteString(L"const");
}
}
else
{
if (node->configObserve == WfAPObserve::NotObservable)
{
writer.WriteString(L"not observe");
}
}
writer.WriteString(L"}");
writer.AfterPrint(node);
}
void Visit(WfCastResultInterfaceDeclaration* node)override
{
writer.BeforePrint(node);
writer.WriteString(L"$interface ");
writer.WriteString(node->name.value);
writer.WriteString(L" : ");
WfPrint(node->baseType, indent, writer);
writer.WriteString(L"<");
WfPrint(node->elementType, indent, writer);
writer.WriteString(L">;");
writer.AfterPrint(node);
}
};
/***********************************************************************
Print (Module)
***********************************************************************/
void WfPrint(Ptr<WfAttribute> node, const WString& indent, parsing::ParsingWriter& writer)
{
writer.BeforePrint(node.Obj());
writer.WriteString(L"@");
writer.WriteString(node->category.value);
writer.WriteString(L":");
writer.WriteString(node->name.value);
if (node->value)
{
writer.WriteString(L"(");
WfPrint(node->value, indent, writer);
writer.WriteString(L")");
}
writer.AfterPrint(node.Obj());
}
void WfPrint(Ptr<WfType> node, const WString& indent, parsing::ParsingWriter& writer)
{
PrintTypeVisitor visitor(indent, writer);
node->Accept(&visitor);
}
void WfPrint(Ptr<WfExpression> node, const WString& indent, parsing::ParsingWriter& writer)
{
PrintExpressionVisitor visitor(indent, writer);
node->Accept(&visitor);
}
void WfPrint(Ptr<WfStatement> node, const WString& indent, parsing::ParsingWriter& writer)
{
PrintStatementVisitor visitor(indent, writer);
node->Accept(&visitor);
}
void WfPrint(Ptr<WfDeclaration> node, const WString& indent, parsing::ParsingWriter& writer)
{
FOREACH(Ptr<WfAttribute>, attribute, node->attributes)
{
WfPrint(attribute, indent, writer);
writer.WriteLine(L"");
writer.WriteString(indent);
}
if (node->classMember)
{
switch (node->classMember->kind)
{
case WfClassMemberKind::Normal:
break;
case WfClassMemberKind::Static:
writer.WriteString(L"static ");
break;
case WfClassMemberKind::Override:
writer.WriteString(L"override ");
break;
}
}
PrintDeclarationVisitor visitor(indent, writer);
node->Accept(&visitor);
}
void WfPrint(Ptr<WfModule> node, const WString& indent, parsing::ParsingWriter& writer)
{
writer.WriteString(indent);
switch (node->moduleType)
{
case WfModuleType::Module:
writer.WriteLine(L"module " + node->name.value + L";");
break;
case WfModuleType::Unit:
writer.WriteLine(L"unit " + node->name.value + L";");
break;
}
FOREACH(Ptr<WfModuleUsingPath>, path, node->paths)
{
writer.WriteString(indent);
writer.WriteString(L"using ");
FOREACH_INDEXER(Ptr<WfModuleUsingItem>, item, index, path->items)
{
if (index > 0)
{
writer.WriteString(L"::");
}
FOREACH(Ptr<WfModuleUsingFragment>, fragment, item->fragments)
{
if (auto name = fragment.Cast<WfModuleUsingNameFragment>())
{
writer.WriteString(name->name.value);
}
else
{
writer.WriteString(L"*");
}
}
}
writer.WriteLine(L";");
}
FOREACH(Ptr<WfDeclaration>, decl, node->declarations)
{
writer.WriteLine(L"");
writer.WriteString(indent);
WfPrint(decl, indent, writer);
writer.WriteLine(L"");
}
}
/***********************************************************************
Print (Module)
***********************************************************************/
void WfPrint(Ptr<WfAttribute> node, const WString& indent, stream::TextWriter& writer)
{
ParsingWriter parsingWriter(writer);
WfPrint(node, indent, parsingWriter);
}
void WfPrint(Ptr<WfType> node, const WString& indent, stream::TextWriter& writer)
{
ParsingWriter parsingWriter(writer);
WfPrint(node, indent, parsingWriter);
}
void WfPrint(Ptr<WfExpression> node, const WString& indent, stream::TextWriter& writer)
{
ParsingWriter parsingWriter(writer);
WfPrint(node, indent, parsingWriter);
}
void WfPrint(Ptr<WfStatement> node, const WString& indent, stream::TextWriter& writer)
{
ParsingWriter parsingWriter(writer);
WfPrint(node, indent, parsingWriter);
}
void WfPrint(Ptr<WfDeclaration> node, const WString& indent, stream::TextWriter& writer)
{
ParsingWriter parsingWriter(writer);
WfPrint(node, indent, parsingWriter);
}
void WfPrint(Ptr<WfModule> node, const WString& indent, stream::TextWriter& writer)
{
ParsingWriter parsingWriter(writer);
WfPrint(node, indent, parsingWriter);
}
}
}
/***********************************************************************
EXPRESSION\WFEXPRESSION_AST.CPP
***********************************************************************/
/***********************************************************************
Vczh Library++ 3.0
Developer: Zihan Chen(vczh)
Parser::WfExpression.parser.txt
This file is generated by: Vczh Parser Generator
***********************************************************************/
namespace vl
{
namespace workflow
{
/***********************************************************************
Visitor Pattern Implementation
***********************************************************************/
void WfPredefinedType::Accept(WfType::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfTopQualifiedType::Accept(WfType::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfReferenceType::Accept(WfType::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfRawPointerType::Accept(WfType::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfSharedPointerType::Accept(WfType::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfNullableType::Accept(WfType::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfEnumerableType::Accept(WfType::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfMapType::Accept(WfType::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfFunctionType::Accept(WfType::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfChildType::Accept(WfType::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfNamespaceDeclaration::Accept(WfDeclaration::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfFunctionDeclaration::Accept(WfDeclaration::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfVariableDeclaration::Accept(WfDeclaration::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfEventDeclaration::Accept(WfDeclaration::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfPropertyDeclaration::Accept(WfDeclaration::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfConstructorDeclaration::Accept(WfDeclaration::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfDestructorDeclaration::Accept(WfDeclaration::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfClassDeclaration::Accept(WfDeclaration::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfEnumDeclaration::Accept(WfDeclaration::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfStructDeclaration::Accept(WfDeclaration::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfVirtualDeclaration::Accept(WfDeclaration::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfAutoPropertyDeclaration::Accept(WfVirtualDeclaration::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfCastResultInterfaceDeclaration::Accept(WfVirtualDeclaration::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfBreakStatement::Accept(WfStatement::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfContinueStatement::Accept(WfStatement::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfReturnStatement::Accept(WfStatement::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfDeleteStatement::Accept(WfStatement::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfRaiseExceptionStatement::Accept(WfStatement::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfIfStatement::Accept(WfStatement::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfWhileStatement::Accept(WfStatement::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfTryStatement::Accept(WfStatement::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfBlockStatement::Accept(WfStatement::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfVariableStatement::Accept(WfStatement::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfExpressionStatement::Accept(WfStatement::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfVirtualStatement::Accept(WfStatement::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfForEachStatement::Accept(WfVirtualStatement::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfSwitchStatement::Accept(WfVirtualStatement::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfCoProviderStatement::Accept(WfVirtualStatement::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfCoroutineStatement::Accept(WfStatement::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfCoPauseStatement::Accept(WfCoroutineStatement::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfCoOperatorStatement::Accept(WfCoroutineStatement::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfThisExpression::Accept(WfExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfTopQualifiedExpression::Accept(WfExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfReferenceExpression::Accept(WfExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfOrderedNameExpression::Accept(WfExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfOrderedLambdaExpression::Accept(WfExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfMemberExpression::Accept(WfExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfChildExpression::Accept(WfExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfLiteralExpression::Accept(WfExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfFloatingExpression::Accept(WfExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfIntegerExpression::Accept(WfExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfStringExpression::Accept(WfExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfUnaryExpression::Accept(WfExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfBinaryExpression::Accept(WfExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfLetExpression::Accept(WfExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfIfExpression::Accept(WfExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfRangeExpression::Accept(WfExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfSetTestingExpression::Accept(WfExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfConstructorExpression::Accept(WfExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfInferExpression::Accept(WfExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfTypeCastingExpression::Accept(WfExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfTypeTestingExpression::Accept(WfExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfTypeOfTypeExpression::Accept(WfExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfTypeOfExpressionExpression::Accept(WfExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfAttachEventExpression::Accept(WfExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfDetachEventExpression::Accept(WfExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfObserveExpression::Accept(WfExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfCallExpression::Accept(WfExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfFunctionExpression::Accept(WfExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfNewClassExpression::Accept(WfExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfNewInterfaceExpression::Accept(WfExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfVirtualExpression::Accept(WfExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfBindExpression::Accept(WfVirtualExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfFormatExpression::Accept(WfVirtualExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfNewCoroutineExpression::Accept(WfVirtualExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfMixinCastExpression::Accept(WfVirtualExpression::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfModuleUsingNameFragment::Accept(WfModuleUsingFragment::IVisitor* visitor)
{
visitor->Visit(this);
}
void WfModuleUsingWildCardFragment::Accept(WfModuleUsingFragment::IVisitor* visitor)
{
visitor->Visit(this);
}
}
}
namespace vl
{
namespace reflection
{
namespace description
{
#ifndef VCZH_DEBUG_NO_REFLECTION
using namespace vl::workflow;
#define PARSING_TOKEN_FIELD(NAME)\
CLASS_MEMBER_EXTERNALMETHOD_TEMPLATE(get_##NAME, NO_PARAMETER, vl::WString(ClassType::*)(), [](ClassType* node) { return node->NAME.value; }, L"*", L"*")\
CLASS_MEMBER_EXTERNALMETHOD_TEMPLATE(set_##NAME, { L"value" }, void(ClassType::*)(const vl::WString&), [](ClassType* node, const vl::WString& value) { node->NAME.value = value; }, L"*", L"*")\
CLASS_MEMBER_PROPERTY_REFERENCETEMPLATE(NAME, get_##NAME, set_##NAME, L"$This->$Name.value")\
IMPL_TYPE_INFO_RENAME(vl::workflow::WfClassMemberKind, workflow::WfClassMemberKind)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfClassMember, workflow::WfClassMember)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfType, workflow::WfType)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfExpression, workflow::WfExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfStatement, workflow::WfStatement)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfAttribute, workflow::WfAttribute)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfDeclaration, workflow::WfDeclaration)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfPredefinedTypeName, workflow::WfPredefinedTypeName)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfPredefinedType, workflow::WfPredefinedType)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfTopQualifiedType, workflow::WfTopQualifiedType)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfReferenceType, workflow::WfReferenceType)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfRawPointerType, workflow::WfRawPointerType)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfSharedPointerType, workflow::WfSharedPointerType)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfNullableType, workflow::WfNullableType)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfEnumerableType, workflow::WfEnumerableType)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfMapWritability, workflow::WfMapWritability)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfMapType, workflow::WfMapType)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfFunctionType, workflow::WfFunctionType)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfChildType, workflow::WfChildType)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfNamespaceDeclaration, workflow::WfNamespaceDeclaration)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfFunctionArgument, workflow::WfFunctionArgument)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfFunctionAnonymity, workflow::WfFunctionAnonymity)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfFunctionDeclaration, workflow::WfFunctionDeclaration)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfVariableDeclaration, workflow::WfVariableDeclaration)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfEventDeclaration, workflow::WfEventDeclaration)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfPropertyDeclaration, workflow::WfPropertyDeclaration)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfClassKind, workflow::WfClassKind)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfConstructorType, workflow::WfConstructorType)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfBaseConstructorCall, workflow::WfBaseConstructorCall)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfConstructorDeclaration, workflow::WfConstructorDeclaration)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfDestructorDeclaration, workflow::WfDestructorDeclaration)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfClassDeclaration, workflow::WfClassDeclaration)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfEnumKind, workflow::WfEnumKind)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfEnumItemKind, workflow::WfEnumItemKind)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfEnumItemIntersection, workflow::WfEnumItemIntersection)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfEnumItem, workflow::WfEnumItem)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfEnumDeclaration, workflow::WfEnumDeclaration)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfStructMember, workflow::WfStructMember)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfStructDeclaration, workflow::WfStructDeclaration)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfVirtualDeclaration, workflow::WfVirtualDeclaration)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfAPConst, workflow::WfAPConst)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfAPObserve, workflow::WfAPObserve)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfAutoPropertyDeclaration, workflow::WfAutoPropertyDeclaration)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfCastResultInterfaceDeclaration, workflow::WfCastResultInterfaceDeclaration)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfBreakStatement, workflow::WfBreakStatement)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfContinueStatement, workflow::WfContinueStatement)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfReturnStatement, workflow::WfReturnStatement)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfDeleteStatement, workflow::WfDeleteStatement)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfRaiseExceptionStatement, workflow::WfRaiseExceptionStatement)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfIfStatement, workflow::WfIfStatement)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfWhileStatement, workflow::WfWhileStatement)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfTryStatement, workflow::WfTryStatement)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfBlockStatement, workflow::WfBlockStatement)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfVariableStatement, workflow::WfVariableStatement)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfExpressionStatement, workflow::WfExpressionStatement)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfVirtualStatement, workflow::WfVirtualStatement)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfForEachDirection, workflow::WfForEachDirection)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfForEachStatement, workflow::WfForEachStatement)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfSwitchCase, workflow::WfSwitchCase)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfSwitchStatement, workflow::WfSwitchStatement)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfCoProviderStatement, workflow::WfCoProviderStatement)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfCoroutineStatement, workflow::WfCoroutineStatement)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfCoPauseStatement, workflow::WfCoPauseStatement)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfCoOperatorStatement, workflow::WfCoOperatorStatement)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfThisExpression, workflow::WfThisExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfTopQualifiedExpression, workflow::WfTopQualifiedExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfReferenceExpression, workflow::WfReferenceExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfOrderedNameExpression, workflow::WfOrderedNameExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfOrderedLambdaExpression, workflow::WfOrderedLambdaExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfMemberExpression, workflow::WfMemberExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfChildExpression, workflow::WfChildExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfLiteralValue, workflow::WfLiteralValue)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfLiteralExpression, workflow::WfLiteralExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfFloatingExpression, workflow::WfFloatingExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfIntegerExpression, workflow::WfIntegerExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfStringExpression, workflow::WfStringExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfUnaryOperator, workflow::WfUnaryOperator)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfUnaryExpression, workflow::WfUnaryExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfBinaryOperator, workflow::WfBinaryOperator)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfBinaryExpression, workflow::WfBinaryExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfLetVariable, workflow::WfLetVariable)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfLetExpression, workflow::WfLetExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfIfExpression, workflow::WfIfExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfRangeBoundary, workflow::WfRangeBoundary)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfRangeExpression, workflow::WfRangeExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfSetTesting, workflow::WfSetTesting)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfSetTestingExpression, workflow::WfSetTestingExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfConstructorArgument, workflow::WfConstructorArgument)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfConstructorExpression, workflow::WfConstructorExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfInferExpression, workflow::WfInferExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfTypeCastingStrategy, workflow::WfTypeCastingStrategy)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfTypeCastingExpression, workflow::WfTypeCastingExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfTypeTesting, workflow::WfTypeTesting)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfTypeTestingExpression, workflow::WfTypeTestingExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfTypeOfTypeExpression, workflow::WfTypeOfTypeExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfTypeOfExpressionExpression, workflow::WfTypeOfExpressionExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfAttachEventExpression, workflow::WfAttachEventExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfDetachEventExpression, workflow::WfDetachEventExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfObserveType, workflow::WfObserveType)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfObserveExpression, workflow::WfObserveExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfCallExpression, workflow::WfCallExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfFunctionExpression, workflow::WfFunctionExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfNewClassExpression, workflow::WfNewClassExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfNewInterfaceExpression, workflow::WfNewInterfaceExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfVirtualExpression, workflow::WfVirtualExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfBindExpression, workflow::WfBindExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfFormatExpression, workflow::WfFormatExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfNewCoroutineExpression, workflow::WfNewCoroutineExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfMixinCastExpression, workflow::WfMixinCastExpression)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfModuleUsingFragment, workflow::WfModuleUsingFragment)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfModuleUsingNameFragment, workflow::WfModuleUsingNameFragment)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfModuleUsingWildCardFragment, workflow::WfModuleUsingWildCardFragment)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfModuleUsingItem, workflow::WfModuleUsingItem)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfModuleUsingPath, workflow::WfModuleUsingPath)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfModuleType, workflow::WfModuleType)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfModule, workflow::WfModule)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfType::IVisitor, workflow::WfType::IVisitor)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfExpression::IVisitor, workflow::WfExpression::IVisitor)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfStatement::IVisitor, workflow::WfStatement::IVisitor)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfDeclaration::IVisitor, workflow::WfDeclaration::IVisitor)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfVirtualDeclaration::IVisitor, workflow::WfVirtualDeclaration::IVisitor)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfVirtualStatement::IVisitor, workflow::WfVirtualStatement::IVisitor)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfCoroutineStatement::IVisitor, workflow::WfCoroutineStatement::IVisitor)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfVirtualExpression::IVisitor, workflow::WfVirtualExpression::IVisitor)
IMPL_TYPE_INFO_RENAME(vl::workflow::WfModuleUsingFragment::IVisitor, workflow::WfModuleUsingFragment::IVisitor)
BEGIN_ENUM_ITEM(WfClassMemberKind)
ENUM_ITEM_NAMESPACE(WfClassMemberKind)
ENUM_NAMESPACE_ITEM(Static)
ENUM_NAMESPACE_ITEM(Override)
ENUM_NAMESPACE_ITEM(Normal)
END_ENUM_ITEM(WfClassMemberKind)
BEGIN_CLASS_MEMBER(WfClassMember)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfClassMember>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(kind)
END_CLASS_MEMBER(WfClassMember)
BEGIN_CLASS_MEMBER(WfType)
CLASS_MEMBER_METHOD_OVERLOAD(Accept, {L"visitor"}, void(WfType::*)(WfType::IVisitor* visitor))
END_CLASS_MEMBER(WfType)
BEGIN_CLASS_MEMBER(WfExpression)
CLASS_MEMBER_METHOD_OVERLOAD(Accept, {L"visitor"}, void(WfExpression::*)(WfExpression::IVisitor* visitor))
END_CLASS_MEMBER(WfExpression)
BEGIN_CLASS_MEMBER(WfStatement)
CLASS_MEMBER_METHOD_OVERLOAD(Accept, {L"visitor"}, void(WfStatement::*)(WfStatement::IVisitor* visitor))
END_CLASS_MEMBER(WfStatement)
BEGIN_CLASS_MEMBER(WfAttribute)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfAttribute>(), NO_PARAMETER)
PARSING_TOKEN_FIELD(category)
PARSING_TOKEN_FIELD(name)
CLASS_MEMBER_FIELD(value)
END_CLASS_MEMBER(WfAttribute)
BEGIN_CLASS_MEMBER(WfDeclaration)
CLASS_MEMBER_METHOD_OVERLOAD(Accept, {L"visitor"}, void(WfDeclaration::*)(WfDeclaration::IVisitor* visitor))
CLASS_MEMBER_FIELD(attributes)
PARSING_TOKEN_FIELD(name)
CLASS_MEMBER_FIELD(classMember)
END_CLASS_MEMBER(WfDeclaration)
BEGIN_ENUM_ITEM(WfPredefinedTypeName)
ENUM_ITEM_NAMESPACE(WfPredefinedTypeName)
ENUM_NAMESPACE_ITEM(Void)
ENUM_NAMESPACE_ITEM(Object)
ENUM_NAMESPACE_ITEM(Interface)
ENUM_NAMESPACE_ITEM(Int)
ENUM_NAMESPACE_ITEM(UInt)
ENUM_NAMESPACE_ITEM(Float)
ENUM_NAMESPACE_ITEM(Double)
ENUM_NAMESPACE_ITEM(String)
ENUM_NAMESPACE_ITEM(Char)
ENUM_NAMESPACE_ITEM(Bool)
END_ENUM_ITEM(WfPredefinedTypeName)
BEGIN_CLASS_MEMBER(WfPredefinedType)
CLASS_MEMBER_BASE(WfType)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfPredefinedType>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(name)
END_CLASS_MEMBER(WfPredefinedType)
BEGIN_CLASS_MEMBER(WfTopQualifiedType)
CLASS_MEMBER_BASE(WfType)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfTopQualifiedType>(), NO_PARAMETER)
PARSING_TOKEN_FIELD(name)
END_CLASS_MEMBER(WfTopQualifiedType)
BEGIN_CLASS_MEMBER(WfReferenceType)
CLASS_MEMBER_BASE(WfType)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfReferenceType>(), NO_PARAMETER)
PARSING_TOKEN_FIELD(name)
END_CLASS_MEMBER(WfReferenceType)
BEGIN_CLASS_MEMBER(WfRawPointerType)
CLASS_MEMBER_BASE(WfType)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfRawPointerType>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(element)
END_CLASS_MEMBER(WfRawPointerType)
BEGIN_CLASS_MEMBER(WfSharedPointerType)
CLASS_MEMBER_BASE(WfType)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfSharedPointerType>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(element)
END_CLASS_MEMBER(WfSharedPointerType)
BEGIN_CLASS_MEMBER(WfNullableType)
CLASS_MEMBER_BASE(WfType)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfNullableType>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(element)
END_CLASS_MEMBER(WfNullableType)
BEGIN_CLASS_MEMBER(WfEnumerableType)
CLASS_MEMBER_BASE(WfType)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfEnumerableType>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(element)
END_CLASS_MEMBER(WfEnumerableType)
BEGIN_ENUM_ITEM(WfMapWritability)
ENUM_ITEM_NAMESPACE(WfMapWritability)
ENUM_NAMESPACE_ITEM(Readonly)
ENUM_NAMESPACE_ITEM(Writable)
END_ENUM_ITEM(WfMapWritability)
BEGIN_CLASS_MEMBER(WfMapType)
CLASS_MEMBER_BASE(WfType)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfMapType>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(writability)
CLASS_MEMBER_FIELD(key)
CLASS_MEMBER_FIELD(value)
END_CLASS_MEMBER(WfMapType)
BEGIN_CLASS_MEMBER(WfFunctionType)
CLASS_MEMBER_BASE(WfType)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfFunctionType>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(result)
CLASS_MEMBER_FIELD(arguments)
END_CLASS_MEMBER(WfFunctionType)
BEGIN_CLASS_MEMBER(WfChildType)
CLASS_MEMBER_BASE(WfType)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfChildType>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(parent)
PARSING_TOKEN_FIELD(name)
END_CLASS_MEMBER(WfChildType)
BEGIN_CLASS_MEMBER(WfNamespaceDeclaration)
CLASS_MEMBER_BASE(WfDeclaration)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfNamespaceDeclaration>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(declarations)
END_CLASS_MEMBER(WfNamespaceDeclaration)
BEGIN_CLASS_MEMBER(WfFunctionArgument)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfFunctionArgument>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(attributes)
PARSING_TOKEN_FIELD(name)
CLASS_MEMBER_FIELD(type)
END_CLASS_MEMBER(WfFunctionArgument)
BEGIN_ENUM_ITEM(WfFunctionAnonymity)
ENUM_ITEM_NAMESPACE(WfFunctionAnonymity)
ENUM_NAMESPACE_ITEM(Named)
ENUM_NAMESPACE_ITEM(Anonymous)
END_ENUM_ITEM(WfFunctionAnonymity)
BEGIN_CLASS_MEMBER(WfFunctionDeclaration)
CLASS_MEMBER_BASE(WfDeclaration)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfFunctionDeclaration>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(anonymity)
CLASS_MEMBER_FIELD(arguments)
CLASS_MEMBER_FIELD(returnType)
CLASS_MEMBER_FIELD(statement)
END_CLASS_MEMBER(WfFunctionDeclaration)
BEGIN_CLASS_MEMBER(WfVariableDeclaration)
CLASS_MEMBER_BASE(WfDeclaration)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfVariableDeclaration>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(type)
CLASS_MEMBER_FIELD(expression)
END_CLASS_MEMBER(WfVariableDeclaration)
BEGIN_CLASS_MEMBER(WfEventDeclaration)
CLASS_MEMBER_BASE(WfDeclaration)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfEventDeclaration>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(arguments)
END_CLASS_MEMBER(WfEventDeclaration)
BEGIN_CLASS_MEMBER(WfPropertyDeclaration)
CLASS_MEMBER_BASE(WfDeclaration)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfPropertyDeclaration>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(type)
PARSING_TOKEN_FIELD(getter)
PARSING_TOKEN_FIELD(setter)
PARSING_TOKEN_FIELD(valueChangedEvent)
END_CLASS_MEMBER(WfPropertyDeclaration)
BEGIN_ENUM_ITEM(WfClassKind)
ENUM_ITEM_NAMESPACE(WfClassKind)
ENUM_NAMESPACE_ITEM(Class)
ENUM_NAMESPACE_ITEM(Interface)
END_ENUM_ITEM(WfClassKind)
BEGIN_ENUM_ITEM(WfConstructorType)
ENUM_ITEM_NAMESPACE(WfConstructorType)
ENUM_NAMESPACE_ITEM(Undefined)
ENUM_NAMESPACE_ITEM(SharedPtr)
ENUM_NAMESPACE_ITEM(RawPtr)
END_ENUM_ITEM(WfConstructorType)
BEGIN_CLASS_MEMBER(WfBaseConstructorCall)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfBaseConstructorCall>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(type)
CLASS_MEMBER_FIELD(arguments)
END_CLASS_MEMBER(WfBaseConstructorCall)
BEGIN_CLASS_MEMBER(WfConstructorDeclaration)
CLASS_MEMBER_BASE(WfDeclaration)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfConstructorDeclaration>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(constructorType)
CLASS_MEMBER_FIELD(baseConstructorCalls)
CLASS_MEMBER_FIELD(arguments)
CLASS_MEMBER_FIELD(statement)
END_CLASS_MEMBER(WfConstructorDeclaration)
BEGIN_CLASS_MEMBER(WfDestructorDeclaration)
CLASS_MEMBER_BASE(WfDeclaration)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfDestructorDeclaration>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(statement)
END_CLASS_MEMBER(WfDestructorDeclaration)
BEGIN_CLASS_MEMBER(WfClassDeclaration)
CLASS_MEMBER_BASE(WfDeclaration)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfClassDeclaration>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(kind)
CLASS_MEMBER_FIELD(constructorType)
CLASS_MEMBER_FIELD(baseTypes)
CLASS_MEMBER_FIELD(declarations)
END_CLASS_MEMBER(WfClassDeclaration)
BEGIN_ENUM_ITEM(WfEnumKind)
ENUM_ITEM_NAMESPACE(WfEnumKind)
ENUM_NAMESPACE_ITEM(Normal)
ENUM_NAMESPACE_ITEM(Flag)
END_ENUM_ITEM(WfEnumKind)
BEGIN_ENUM_ITEM(WfEnumItemKind)
ENUM_ITEM_NAMESPACE(WfEnumItemKind)
ENUM_NAMESPACE_ITEM(Constant)
ENUM_NAMESPACE_ITEM(Intersection)
END_ENUM_ITEM(WfEnumItemKind)
BEGIN_CLASS_MEMBER(WfEnumItemIntersection)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfEnumItemIntersection>(), NO_PARAMETER)
PARSING_TOKEN_FIELD(name)
END_CLASS_MEMBER(WfEnumItemIntersection)
BEGIN_CLASS_MEMBER(WfEnumItem)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfEnumItem>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(attributes)
PARSING_TOKEN_FIELD(name)
CLASS_MEMBER_FIELD(kind)
PARSING_TOKEN_FIELD(number)
CLASS_MEMBER_FIELD(intersections)
END_CLASS_MEMBER(WfEnumItem)
BEGIN_CLASS_MEMBER(WfEnumDeclaration)
CLASS_MEMBER_BASE(WfDeclaration)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfEnumDeclaration>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(kind)
CLASS_MEMBER_FIELD(items)
END_CLASS_MEMBER(WfEnumDeclaration)
BEGIN_CLASS_MEMBER(WfStructMember)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfStructMember>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(attributes)
PARSING_TOKEN_FIELD(name)
CLASS_MEMBER_FIELD(type)
END_CLASS_MEMBER(WfStructMember)
BEGIN_CLASS_MEMBER(WfStructDeclaration)
CLASS_MEMBER_BASE(WfDeclaration)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfStructDeclaration>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(members)
END_CLASS_MEMBER(WfStructDeclaration)
BEGIN_CLASS_MEMBER(WfVirtualDeclaration)
CLASS_MEMBER_BASE(WfDeclaration)
CLASS_MEMBER_METHOD_OVERLOAD(Accept, {L"visitor"}, void(WfVirtualDeclaration::*)(WfVirtualDeclaration::IVisitor* visitor))
CLASS_MEMBER_FIELD(expandedDeclarations)
END_CLASS_MEMBER(WfVirtualDeclaration)
BEGIN_ENUM_ITEM(WfAPConst)
ENUM_ITEM_NAMESPACE(WfAPConst)
ENUM_NAMESPACE_ITEM(Readonly)
ENUM_NAMESPACE_ITEM(Writable)
END_ENUM_ITEM(WfAPConst)
BEGIN_ENUM_ITEM(WfAPObserve)
ENUM_ITEM_NAMESPACE(WfAPObserve)
ENUM_NAMESPACE_ITEM(Observable)
ENUM_NAMESPACE_ITEM(NotObservable)
END_ENUM_ITEM(WfAPObserve)
BEGIN_CLASS_MEMBER(WfAutoPropertyDeclaration)
CLASS_MEMBER_BASE(WfVirtualDeclaration)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfAutoPropertyDeclaration>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(type)
CLASS_MEMBER_FIELD(configConst)
CLASS_MEMBER_FIELD(configObserve)
CLASS_MEMBER_FIELD(expression)
END_CLASS_MEMBER(WfAutoPropertyDeclaration)
BEGIN_CLASS_MEMBER(WfCastResultInterfaceDeclaration)
CLASS_MEMBER_BASE(WfVirtualDeclaration)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfCastResultInterfaceDeclaration>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(baseType)
CLASS_MEMBER_FIELD(elementType)
END_CLASS_MEMBER(WfCastResultInterfaceDeclaration)
BEGIN_CLASS_MEMBER(WfBreakStatement)
CLASS_MEMBER_BASE(WfStatement)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfBreakStatement>(), NO_PARAMETER)
END_CLASS_MEMBER(WfBreakStatement)
BEGIN_CLASS_MEMBER(WfContinueStatement)
CLASS_MEMBER_BASE(WfStatement)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfContinueStatement>(), NO_PARAMETER)
END_CLASS_MEMBER(WfContinueStatement)
BEGIN_CLASS_MEMBER(WfReturnStatement)
CLASS_MEMBER_BASE(WfStatement)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfReturnStatement>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(expression)
END_CLASS_MEMBER(WfReturnStatement)
BEGIN_CLASS_MEMBER(WfDeleteStatement)
CLASS_MEMBER_BASE(WfStatement)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfDeleteStatement>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(expression)
END_CLASS_MEMBER(WfDeleteStatement)
BEGIN_CLASS_MEMBER(WfRaiseExceptionStatement)
CLASS_MEMBER_BASE(WfStatement)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfRaiseExceptionStatement>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(expression)
END_CLASS_MEMBER(WfRaiseExceptionStatement)
BEGIN_CLASS_MEMBER(WfIfStatement)
CLASS_MEMBER_BASE(WfStatement)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfIfStatement>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(type)
PARSING_TOKEN_FIELD(name)
CLASS_MEMBER_FIELD(expression)
CLASS_MEMBER_FIELD(trueBranch)
CLASS_MEMBER_FIELD(falseBranch)
END_CLASS_MEMBER(WfIfStatement)
BEGIN_CLASS_MEMBER(WfWhileStatement)
CLASS_MEMBER_BASE(WfStatement)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfWhileStatement>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(condition)
CLASS_MEMBER_FIELD(statement)
END_CLASS_MEMBER(WfWhileStatement)
BEGIN_CLASS_MEMBER(WfTryStatement)
CLASS_MEMBER_BASE(WfStatement)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfTryStatement>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(protectedStatement)
PARSING_TOKEN_FIELD(name)
CLASS_MEMBER_FIELD(catchStatement)
CLASS_MEMBER_FIELD(finallyStatement)
END_CLASS_MEMBER(WfTryStatement)
BEGIN_CLASS_MEMBER(WfBlockStatement)
CLASS_MEMBER_BASE(WfStatement)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfBlockStatement>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(statements)
END_CLASS_MEMBER(WfBlockStatement)
BEGIN_CLASS_MEMBER(WfVariableStatement)
CLASS_MEMBER_BASE(WfStatement)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfVariableStatement>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(variable)
END_CLASS_MEMBER(WfVariableStatement)
BEGIN_CLASS_MEMBER(WfExpressionStatement)
CLASS_MEMBER_BASE(WfStatement)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfExpressionStatement>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(expression)
END_CLASS_MEMBER(WfExpressionStatement)
BEGIN_CLASS_MEMBER(WfVirtualStatement)
CLASS_MEMBER_BASE(WfStatement)
CLASS_MEMBER_METHOD_OVERLOAD(Accept, {L"visitor"}, void(WfVirtualStatement::*)(WfVirtualStatement::IVisitor* visitor))
CLASS_MEMBER_FIELD(expandedStatement)
END_CLASS_MEMBER(WfVirtualStatement)
BEGIN_ENUM_ITEM(WfForEachDirection)
ENUM_ITEM_NAMESPACE(WfForEachDirection)
ENUM_NAMESPACE_ITEM(Normal)
ENUM_NAMESPACE_ITEM(Reversed)
END_ENUM_ITEM(WfForEachDirection)
BEGIN_CLASS_MEMBER(WfForEachStatement)
CLASS_MEMBER_BASE(WfVirtualStatement)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfForEachStatement>(), NO_PARAMETER)
PARSING_TOKEN_FIELD(name)
CLASS_MEMBER_FIELD(direction)
CLASS_MEMBER_FIELD(collection)
CLASS_MEMBER_FIELD(statement)
END_CLASS_MEMBER(WfForEachStatement)
BEGIN_CLASS_MEMBER(WfSwitchCase)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfSwitchCase>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(expression)
CLASS_MEMBER_FIELD(statement)
END_CLASS_MEMBER(WfSwitchCase)
BEGIN_CLASS_MEMBER(WfSwitchStatement)
CLASS_MEMBER_BASE(WfVirtualStatement)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfSwitchStatement>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(expression)
CLASS_MEMBER_FIELD(caseBranches)
CLASS_MEMBER_FIELD(defaultBranch)
END_CLASS_MEMBER(WfSwitchStatement)
BEGIN_CLASS_MEMBER(WfCoProviderStatement)
CLASS_MEMBER_BASE(WfVirtualStatement)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfCoProviderStatement>(), NO_PARAMETER)
PARSING_TOKEN_FIELD(name)
CLASS_MEMBER_FIELD(statement)
END_CLASS_MEMBER(WfCoProviderStatement)
BEGIN_CLASS_MEMBER(WfCoroutineStatement)
CLASS_MEMBER_BASE(WfStatement)
CLASS_MEMBER_METHOD_OVERLOAD(Accept, {L"visitor"}, void(WfCoroutineStatement::*)(WfCoroutineStatement::IVisitor* visitor))
END_CLASS_MEMBER(WfCoroutineStatement)
BEGIN_CLASS_MEMBER(WfCoPauseStatement)
CLASS_MEMBER_BASE(WfCoroutineStatement)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfCoPauseStatement>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(statement)
END_CLASS_MEMBER(WfCoPauseStatement)
BEGIN_CLASS_MEMBER(WfCoOperatorStatement)
CLASS_MEMBER_BASE(WfCoroutineStatement)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfCoOperatorStatement>(), NO_PARAMETER)
PARSING_TOKEN_FIELD(varName)
PARSING_TOKEN_FIELD(opName)
CLASS_MEMBER_FIELD(arguments)
END_CLASS_MEMBER(WfCoOperatorStatement)
BEGIN_CLASS_MEMBER(WfThisExpression)
CLASS_MEMBER_BASE(WfExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfThisExpression>(), NO_PARAMETER)
END_CLASS_MEMBER(WfThisExpression)
BEGIN_CLASS_MEMBER(WfTopQualifiedExpression)
CLASS_MEMBER_BASE(WfExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfTopQualifiedExpression>(), NO_PARAMETER)
PARSING_TOKEN_FIELD(name)
END_CLASS_MEMBER(WfTopQualifiedExpression)
BEGIN_CLASS_MEMBER(WfReferenceExpression)
CLASS_MEMBER_BASE(WfExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfReferenceExpression>(), NO_PARAMETER)
PARSING_TOKEN_FIELD(name)
END_CLASS_MEMBER(WfReferenceExpression)
BEGIN_CLASS_MEMBER(WfOrderedNameExpression)
CLASS_MEMBER_BASE(WfExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfOrderedNameExpression>(), NO_PARAMETER)
PARSING_TOKEN_FIELD(name)
END_CLASS_MEMBER(WfOrderedNameExpression)
BEGIN_CLASS_MEMBER(WfOrderedLambdaExpression)
CLASS_MEMBER_BASE(WfExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfOrderedLambdaExpression>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(body)
END_CLASS_MEMBER(WfOrderedLambdaExpression)
BEGIN_CLASS_MEMBER(WfMemberExpression)
CLASS_MEMBER_BASE(WfExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfMemberExpression>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(parent)
PARSING_TOKEN_FIELD(name)
END_CLASS_MEMBER(WfMemberExpression)
BEGIN_CLASS_MEMBER(WfChildExpression)
CLASS_MEMBER_BASE(WfExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfChildExpression>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(parent)
PARSING_TOKEN_FIELD(name)
END_CLASS_MEMBER(WfChildExpression)
BEGIN_ENUM_ITEM(WfLiteralValue)
ENUM_ITEM_NAMESPACE(WfLiteralValue)
ENUM_NAMESPACE_ITEM(Null)
ENUM_NAMESPACE_ITEM(True)
ENUM_NAMESPACE_ITEM(False)
END_ENUM_ITEM(WfLiteralValue)
BEGIN_CLASS_MEMBER(WfLiteralExpression)
CLASS_MEMBER_BASE(WfExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfLiteralExpression>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(value)
END_CLASS_MEMBER(WfLiteralExpression)
BEGIN_CLASS_MEMBER(WfFloatingExpression)
CLASS_MEMBER_BASE(WfExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfFloatingExpression>(), NO_PARAMETER)
PARSING_TOKEN_FIELD(value)
END_CLASS_MEMBER(WfFloatingExpression)
BEGIN_CLASS_MEMBER(WfIntegerExpression)
CLASS_MEMBER_BASE(WfExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfIntegerExpression>(), NO_PARAMETER)
PARSING_TOKEN_FIELD(value)
END_CLASS_MEMBER(WfIntegerExpression)
BEGIN_CLASS_MEMBER(WfStringExpression)
CLASS_MEMBER_BASE(WfExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfStringExpression>(), NO_PARAMETER)
PARSING_TOKEN_FIELD(value)
END_CLASS_MEMBER(WfStringExpression)
BEGIN_ENUM_ITEM(WfUnaryOperator)
ENUM_ITEM_NAMESPACE(WfUnaryOperator)
ENUM_NAMESPACE_ITEM(Positive)
ENUM_NAMESPACE_ITEM(Negative)
ENUM_NAMESPACE_ITEM(Not)
END_ENUM_ITEM(WfUnaryOperator)
BEGIN_CLASS_MEMBER(WfUnaryExpression)
CLASS_MEMBER_BASE(WfExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfUnaryExpression>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(op)
CLASS_MEMBER_FIELD(operand)
END_CLASS_MEMBER(WfUnaryExpression)
BEGIN_ENUM_ITEM(WfBinaryOperator)
ENUM_ITEM_NAMESPACE(WfBinaryOperator)
ENUM_NAMESPACE_ITEM(Assign)
ENUM_NAMESPACE_ITEM(Index)
ENUM_NAMESPACE_ITEM(Union)
ENUM_NAMESPACE_ITEM(Intersect)
ENUM_NAMESPACE_ITEM(FailedThen)
ENUM_NAMESPACE_ITEM(Exp)
ENUM_NAMESPACE_ITEM(Add)
ENUM_NAMESPACE_ITEM(Sub)
ENUM_NAMESPACE_ITEM(Mul)
ENUM_NAMESPACE_ITEM(Div)
ENUM_NAMESPACE_ITEM(Mod)
ENUM_NAMESPACE_ITEM(Shl)
ENUM_NAMESPACE_ITEM(Shr)
ENUM_NAMESPACE_ITEM(LT)
ENUM_NAMESPACE_ITEM(GT)
ENUM_NAMESPACE_ITEM(LE)
ENUM_NAMESPACE_ITEM(GE)
ENUM_NAMESPACE_ITEM(EQ)
ENUM_NAMESPACE_ITEM(NE)
ENUM_NAMESPACE_ITEM(Xor)
ENUM_NAMESPACE_ITEM(And)
ENUM_NAMESPACE_ITEM(Or)
END_ENUM_ITEM(WfBinaryOperator)
BEGIN_CLASS_MEMBER(WfBinaryExpression)
CLASS_MEMBER_BASE(WfExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfBinaryExpression>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(op)
CLASS_MEMBER_FIELD(first)
CLASS_MEMBER_FIELD(second)
END_CLASS_MEMBER(WfBinaryExpression)
BEGIN_CLASS_MEMBER(WfLetVariable)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfLetVariable>(), NO_PARAMETER)
PARSING_TOKEN_FIELD(name)
CLASS_MEMBER_FIELD(value)
END_CLASS_MEMBER(WfLetVariable)
BEGIN_CLASS_MEMBER(WfLetExpression)
CLASS_MEMBER_BASE(WfExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfLetExpression>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(variables)
CLASS_MEMBER_FIELD(expression)
END_CLASS_MEMBER(WfLetExpression)
BEGIN_CLASS_MEMBER(WfIfExpression)
CLASS_MEMBER_BASE(WfExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfIfExpression>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(condition)
CLASS_MEMBER_FIELD(trueBranch)
CLASS_MEMBER_FIELD(falseBranch)
END_CLASS_MEMBER(WfIfExpression)
BEGIN_ENUM_ITEM(WfRangeBoundary)
ENUM_ITEM_NAMESPACE(WfRangeBoundary)
ENUM_NAMESPACE_ITEM(Inclusive)
ENUM_NAMESPACE_ITEM(Exclusive)
END_ENUM_ITEM(WfRangeBoundary)
BEGIN_CLASS_MEMBER(WfRangeExpression)
CLASS_MEMBER_BASE(WfExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfRangeExpression>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(begin)
CLASS_MEMBER_FIELD(beginBoundary)
CLASS_MEMBER_FIELD(end)
CLASS_MEMBER_FIELD(endBoundary)
END_CLASS_MEMBER(WfRangeExpression)
BEGIN_ENUM_ITEM(WfSetTesting)
ENUM_ITEM_NAMESPACE(WfSetTesting)
ENUM_NAMESPACE_ITEM(In)
ENUM_NAMESPACE_ITEM(NotIn)
END_ENUM_ITEM(WfSetTesting)
BEGIN_CLASS_MEMBER(WfSetTestingExpression)
CLASS_MEMBER_BASE(WfExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfSetTestingExpression>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(test)
CLASS_MEMBER_FIELD(element)
CLASS_MEMBER_FIELD(collection)
END_CLASS_MEMBER(WfSetTestingExpression)
BEGIN_CLASS_MEMBER(WfConstructorArgument)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfConstructorArgument>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(key)
CLASS_MEMBER_FIELD(value)
END_CLASS_MEMBER(WfConstructorArgument)
BEGIN_CLASS_MEMBER(WfConstructorExpression)
CLASS_MEMBER_BASE(WfExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfConstructorExpression>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(arguments)
END_CLASS_MEMBER(WfConstructorExpression)
BEGIN_CLASS_MEMBER(WfInferExpression)
CLASS_MEMBER_BASE(WfExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfInferExpression>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(expression)
CLASS_MEMBER_FIELD(type)
END_CLASS_MEMBER(WfInferExpression)
BEGIN_ENUM_ITEM(WfTypeCastingStrategy)
ENUM_ITEM_NAMESPACE(WfTypeCastingStrategy)
ENUM_NAMESPACE_ITEM(Strong)
ENUM_NAMESPACE_ITEM(Weak)
END_ENUM_ITEM(WfTypeCastingStrategy)
BEGIN_CLASS_MEMBER(WfTypeCastingExpression)
CLASS_MEMBER_BASE(WfExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfTypeCastingExpression>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(strategy)
CLASS_MEMBER_FIELD(expression)
CLASS_MEMBER_FIELD(type)
END_CLASS_MEMBER(WfTypeCastingExpression)
BEGIN_ENUM_ITEM(WfTypeTesting)
ENUM_ITEM_NAMESPACE(WfTypeTesting)
ENUM_NAMESPACE_ITEM(IsType)
ENUM_NAMESPACE_ITEM(IsNotType)
ENUM_NAMESPACE_ITEM(IsNull)
ENUM_NAMESPACE_ITEM(IsNotNull)
END_ENUM_ITEM(WfTypeTesting)
BEGIN_CLASS_MEMBER(WfTypeTestingExpression)
CLASS_MEMBER_BASE(WfExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfTypeTestingExpression>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(test)
CLASS_MEMBER_FIELD(expression)
CLASS_MEMBER_FIELD(type)
END_CLASS_MEMBER(WfTypeTestingExpression)
BEGIN_CLASS_MEMBER(WfTypeOfTypeExpression)
CLASS_MEMBER_BASE(WfExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfTypeOfTypeExpression>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(type)
END_CLASS_MEMBER(WfTypeOfTypeExpression)
BEGIN_CLASS_MEMBER(WfTypeOfExpressionExpression)
CLASS_MEMBER_BASE(WfExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfTypeOfExpressionExpression>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(expression)
END_CLASS_MEMBER(WfTypeOfExpressionExpression)
BEGIN_CLASS_MEMBER(WfAttachEventExpression)
CLASS_MEMBER_BASE(WfExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfAttachEventExpression>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(event)
CLASS_MEMBER_FIELD(function)
END_CLASS_MEMBER(WfAttachEventExpression)
BEGIN_CLASS_MEMBER(WfDetachEventExpression)
CLASS_MEMBER_BASE(WfExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfDetachEventExpression>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(event)
CLASS_MEMBER_FIELD(handler)
END_CLASS_MEMBER(WfDetachEventExpression)
BEGIN_ENUM_ITEM(WfObserveType)
ENUM_ITEM_NAMESPACE(WfObserveType)
ENUM_NAMESPACE_ITEM(SimpleObserve)
ENUM_NAMESPACE_ITEM(ExtendedObserve)
END_ENUM_ITEM(WfObserveType)
BEGIN_CLASS_MEMBER(WfObserveExpression)
CLASS_MEMBER_BASE(WfExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfObserveExpression>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(parent)
CLASS_MEMBER_FIELD(observeType)
PARSING_TOKEN_FIELD(name)
CLASS_MEMBER_FIELD(expression)
CLASS_MEMBER_FIELD(events)
END_CLASS_MEMBER(WfObserveExpression)
BEGIN_CLASS_MEMBER(WfCallExpression)
CLASS_MEMBER_BASE(WfExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfCallExpression>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(function)
CLASS_MEMBER_FIELD(arguments)
END_CLASS_MEMBER(WfCallExpression)
BEGIN_CLASS_MEMBER(WfFunctionExpression)
CLASS_MEMBER_BASE(WfExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfFunctionExpression>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(function)
END_CLASS_MEMBER(WfFunctionExpression)
BEGIN_CLASS_MEMBER(WfNewClassExpression)
CLASS_MEMBER_BASE(WfExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfNewClassExpression>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(type)
CLASS_MEMBER_FIELD(arguments)
END_CLASS_MEMBER(WfNewClassExpression)
BEGIN_CLASS_MEMBER(WfNewInterfaceExpression)
CLASS_MEMBER_BASE(WfExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfNewInterfaceExpression>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(type)
CLASS_MEMBER_FIELD(declarations)
END_CLASS_MEMBER(WfNewInterfaceExpression)
BEGIN_CLASS_MEMBER(WfVirtualExpression)
CLASS_MEMBER_BASE(WfExpression)
CLASS_MEMBER_METHOD_OVERLOAD(Accept, {L"visitor"}, void(WfVirtualExpression::*)(WfVirtualExpression::IVisitor* visitor))
CLASS_MEMBER_FIELD(expandedExpression)
END_CLASS_MEMBER(WfVirtualExpression)
BEGIN_CLASS_MEMBER(WfBindExpression)
CLASS_MEMBER_BASE(WfVirtualExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfBindExpression>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(expression)
END_CLASS_MEMBER(WfBindExpression)
BEGIN_CLASS_MEMBER(WfFormatExpression)
CLASS_MEMBER_BASE(WfVirtualExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfFormatExpression>(), NO_PARAMETER)
PARSING_TOKEN_FIELD(value)
END_CLASS_MEMBER(WfFormatExpression)
BEGIN_CLASS_MEMBER(WfNewCoroutineExpression)
CLASS_MEMBER_BASE(WfVirtualExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfNewCoroutineExpression>(), NO_PARAMETER)
PARSING_TOKEN_FIELD(name)
CLASS_MEMBER_FIELD(statement)
END_CLASS_MEMBER(WfNewCoroutineExpression)
BEGIN_CLASS_MEMBER(WfMixinCastExpression)
CLASS_MEMBER_BASE(WfVirtualExpression)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfMixinCastExpression>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(type)
CLASS_MEMBER_FIELD(expression)
END_CLASS_MEMBER(WfMixinCastExpression)
BEGIN_CLASS_MEMBER(WfModuleUsingFragment)
CLASS_MEMBER_METHOD_OVERLOAD(Accept, {L"visitor"}, void(WfModuleUsingFragment::*)(WfModuleUsingFragment::IVisitor* visitor))
END_CLASS_MEMBER(WfModuleUsingFragment)
BEGIN_CLASS_MEMBER(WfModuleUsingNameFragment)
CLASS_MEMBER_BASE(WfModuleUsingFragment)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfModuleUsingNameFragment>(), NO_PARAMETER)
PARSING_TOKEN_FIELD(name)
END_CLASS_MEMBER(WfModuleUsingNameFragment)
BEGIN_CLASS_MEMBER(WfModuleUsingWildCardFragment)
CLASS_MEMBER_BASE(WfModuleUsingFragment)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfModuleUsingWildCardFragment>(), NO_PARAMETER)
END_CLASS_MEMBER(WfModuleUsingWildCardFragment)
BEGIN_CLASS_MEMBER(WfModuleUsingItem)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfModuleUsingItem>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(fragments)
END_CLASS_MEMBER(WfModuleUsingItem)
BEGIN_CLASS_MEMBER(WfModuleUsingPath)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfModuleUsingPath>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(items)
END_CLASS_MEMBER(WfModuleUsingPath)
BEGIN_ENUM_ITEM(WfModuleType)
ENUM_ITEM_NAMESPACE(WfModuleType)
ENUM_NAMESPACE_ITEM(Module)
ENUM_NAMESPACE_ITEM(Unit)
END_ENUM_ITEM(WfModuleType)
BEGIN_CLASS_MEMBER(WfModule)
CLASS_MEMBER_CONSTRUCTOR(vl::Ptr<WfModule>(), NO_PARAMETER)
CLASS_MEMBER_FIELD(moduleType)
PARSING_TOKEN_FIELD(name)
CLASS_MEMBER_FIELD(paths)
CLASS_MEMBER_FIELD(declarations)
END_CLASS_MEMBER(WfModule)
BEGIN_INTERFACE_MEMBER(WfType::IVisitor)
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfType::IVisitor::*)(WfPredefinedType* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfType::IVisitor::*)(WfTopQualifiedType* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfType::IVisitor::*)(WfReferenceType* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfType::IVisitor::*)(WfRawPointerType* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfType::IVisitor::*)(WfSharedPointerType* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfType::IVisitor::*)(WfNullableType* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfType::IVisitor::*)(WfEnumerableType* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfType::IVisitor::*)(WfMapType* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfType::IVisitor::*)(WfFunctionType* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfType::IVisitor::*)(WfChildType* node))
END_INTERFACE_MEMBER(WfType)
BEGIN_INTERFACE_MEMBER(WfExpression::IVisitor)
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfThisExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfTopQualifiedExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfReferenceExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfOrderedNameExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfOrderedLambdaExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfMemberExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfChildExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfLiteralExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfFloatingExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfIntegerExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfStringExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfUnaryExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfBinaryExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfLetExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfIfExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfRangeExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfSetTestingExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfConstructorExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfInferExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfTypeCastingExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfTypeTestingExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfTypeOfTypeExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfTypeOfExpressionExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfAttachEventExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfDetachEventExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfObserveExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfCallExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfFunctionExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfNewClassExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfNewInterfaceExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfVirtualExpression* node))
END_INTERFACE_MEMBER(WfExpression)
BEGIN_INTERFACE_MEMBER(WfStatement::IVisitor)
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfStatement::IVisitor::*)(WfBreakStatement* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfStatement::IVisitor::*)(WfContinueStatement* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfStatement::IVisitor::*)(WfReturnStatement* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfStatement::IVisitor::*)(WfDeleteStatement* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfStatement::IVisitor::*)(WfRaiseExceptionStatement* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfStatement::IVisitor::*)(WfIfStatement* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfStatement::IVisitor::*)(WfWhileStatement* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfStatement::IVisitor::*)(WfTryStatement* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfStatement::IVisitor::*)(WfBlockStatement* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfStatement::IVisitor::*)(WfVariableStatement* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfStatement::IVisitor::*)(WfExpressionStatement* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfStatement::IVisitor::*)(WfVirtualStatement* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfStatement::IVisitor::*)(WfCoroutineStatement* node))
END_INTERFACE_MEMBER(WfStatement)
BEGIN_INTERFACE_MEMBER(WfDeclaration::IVisitor)
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfDeclaration::IVisitor::*)(WfNamespaceDeclaration* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfDeclaration::IVisitor::*)(WfFunctionDeclaration* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfDeclaration::IVisitor::*)(WfVariableDeclaration* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfDeclaration::IVisitor::*)(WfEventDeclaration* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfDeclaration::IVisitor::*)(WfPropertyDeclaration* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfDeclaration::IVisitor::*)(WfConstructorDeclaration* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfDeclaration::IVisitor::*)(WfDestructorDeclaration* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfDeclaration::IVisitor::*)(WfClassDeclaration* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfDeclaration::IVisitor::*)(WfEnumDeclaration* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfDeclaration::IVisitor::*)(WfStructDeclaration* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfDeclaration::IVisitor::*)(WfVirtualDeclaration* node))
END_INTERFACE_MEMBER(WfDeclaration)
BEGIN_INTERFACE_MEMBER(WfVirtualDeclaration::IVisitor)
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfVirtualDeclaration::IVisitor::*)(WfAutoPropertyDeclaration* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfVirtualDeclaration::IVisitor::*)(WfCastResultInterfaceDeclaration* node))
END_INTERFACE_MEMBER(WfVirtualDeclaration)
BEGIN_INTERFACE_MEMBER(WfVirtualStatement::IVisitor)
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfVirtualStatement::IVisitor::*)(WfForEachStatement* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfVirtualStatement::IVisitor::*)(WfSwitchStatement* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfVirtualStatement::IVisitor::*)(WfCoProviderStatement* node))
END_INTERFACE_MEMBER(WfVirtualStatement)
BEGIN_INTERFACE_MEMBER(WfCoroutineStatement::IVisitor)
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfCoroutineStatement::IVisitor::*)(WfCoPauseStatement* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfCoroutineStatement::IVisitor::*)(WfCoOperatorStatement* node))
END_INTERFACE_MEMBER(WfCoroutineStatement)
BEGIN_INTERFACE_MEMBER(WfVirtualExpression::IVisitor)
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfVirtualExpression::IVisitor::*)(WfBindExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfVirtualExpression::IVisitor::*)(WfFormatExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfVirtualExpression::IVisitor::*)(WfNewCoroutineExpression* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfVirtualExpression::IVisitor::*)(WfMixinCastExpression* node))
END_INTERFACE_MEMBER(WfVirtualExpression)
BEGIN_INTERFACE_MEMBER(WfModuleUsingFragment::IVisitor)
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfModuleUsingFragment::IVisitor::*)(WfModuleUsingNameFragment* node))
CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfModuleUsingFragment::IVisitor::*)(WfModuleUsingWildCardFragment* node))
END_INTERFACE_MEMBER(WfModuleUsingFragment)
#undef PARSING_TOKEN_FIELD
class WfTypeLoader : public vl::Object, public ITypeLoader
{
public:
void Load(ITypeManager* manager)
{
ADD_TYPE_INFO(vl::workflow::WfClassMemberKind)
ADD_TYPE_INFO(vl::workflow::WfClassMember)
ADD_TYPE_INFO(vl::workflow::WfType)
ADD_TYPE_INFO(vl::workflow::WfExpression)
ADD_TYPE_INFO(vl::workflow::WfStatement)
ADD_TYPE_INFO(vl::workflow::WfAttribute)
ADD_TYPE_INFO(vl::workflow::WfDeclaration)
ADD_TYPE_INFO(vl::workflow::WfPredefinedTypeName)
ADD_TYPE_INFO(vl::workflow::WfPredefinedType)
ADD_TYPE_INFO(vl::workflow::WfTopQualifiedType)
ADD_TYPE_INFO(vl::workflow::WfReferenceType)
ADD_TYPE_INFO(vl::workflow::WfRawPointerType)
ADD_TYPE_INFO(vl::workflow::WfSharedPointerType)
ADD_TYPE_INFO(vl::workflow::WfNullableType)
ADD_TYPE_INFO(vl::workflow::WfEnumerableType)
ADD_TYPE_INFO(vl::workflow::WfMapWritability)
ADD_TYPE_INFO(vl::workflow::WfMapType)
ADD_TYPE_INFO(vl::workflow::WfFunctionType)
ADD_TYPE_INFO(vl::workflow::WfChildType)
ADD_TYPE_INFO(vl::workflow::WfNamespaceDeclaration)
ADD_TYPE_INFO(vl::workflow::WfFunctionArgument)
ADD_TYPE_INFO(vl::workflow::WfFunctionAnonymity)
ADD_TYPE_INFO(vl::workflow::WfFunctionDeclaration)
ADD_TYPE_INFO(vl::workflow::WfVariableDeclaration)
ADD_TYPE_INFO(vl::workflow::WfEventDeclaration)
ADD_TYPE_INFO(vl::workflow::WfPropertyDeclaration)
ADD_TYPE_INFO(vl::workflow::WfClassKind)
ADD_TYPE_INFO(vl::workflow::WfConstructorType)
ADD_TYPE_INFO(vl::workflow::WfBaseConstructorCall)
ADD_TYPE_INFO(vl::workflow::WfConstructorDeclaration)
ADD_TYPE_INFO(vl::workflow::WfDestructorDeclaration)
ADD_TYPE_INFO(vl::workflow::WfClassDeclaration)
ADD_TYPE_INFO(vl::workflow::WfEnumKind)
ADD_TYPE_INFO(vl::workflow::WfEnumItemKind)
ADD_TYPE_INFO(vl::workflow::WfEnumItemIntersection)
ADD_TYPE_INFO(vl::workflow::WfEnumItem)
ADD_TYPE_INFO(vl::workflow::WfEnumDeclaration)
ADD_TYPE_INFO(vl::workflow::WfStructMember)
ADD_TYPE_INFO(vl::workflow::WfStructDeclaration)
ADD_TYPE_INFO(vl::workflow::WfVirtualDeclaration)
ADD_TYPE_INFO(vl::workflow::WfAPConst)
ADD_TYPE_INFO(vl::workflow::WfAPObserve)
ADD_TYPE_INFO(vl::workflow::WfAutoPropertyDeclaration)
ADD_TYPE_INFO(vl::workflow::WfCastResultInterfaceDeclaration)
ADD_TYPE_INFO(vl::workflow::WfBreakStatement)
ADD_TYPE_INFO(vl::workflow::WfContinueStatement)
ADD_TYPE_INFO(vl::workflow::WfReturnStatement)
ADD_TYPE_INFO(vl::workflow::WfDeleteStatement)
ADD_TYPE_INFO(vl::workflow::WfRaiseExceptionStatement)
ADD_TYPE_INFO(vl::workflow::WfIfStatement)
ADD_TYPE_INFO(vl::workflow::WfWhileStatement)
ADD_TYPE_INFO(vl::workflow::WfTryStatement)
ADD_TYPE_INFO(vl::workflow::WfBlockStatement)
ADD_TYPE_INFO(vl::workflow::WfVariableStatement)
ADD_TYPE_INFO(vl::workflow::WfExpressionStatement)
ADD_TYPE_INFO(vl::workflow::WfVirtualStatement)
ADD_TYPE_INFO(vl::workflow::WfForEachDirection)
ADD_TYPE_INFO(vl::workflow::WfForEachStatement)
ADD_TYPE_INFO(vl::workflow::WfSwitchCase)
ADD_TYPE_INFO(vl::workflow::WfSwitchStatement)
ADD_TYPE_INFO(vl::workflow::WfCoProviderStatement)
ADD_TYPE_INFO(vl::workflow::WfCoroutineStatement)
ADD_TYPE_INFO(vl::workflow::WfCoPauseStatement)
ADD_TYPE_INFO(vl::workflow::WfCoOperatorStatement)
ADD_TYPE_INFO(vl::workflow::WfThisExpression)
ADD_TYPE_INFO(vl::workflow::WfTopQualifiedExpression)
ADD_TYPE_INFO(vl::workflow::WfReferenceExpression)
ADD_TYPE_INFO(vl::workflow::WfOrderedNameExpression)
ADD_TYPE_INFO(vl::workflow::WfOrderedLambdaExpression)
ADD_TYPE_INFO(vl::workflow::WfMemberExpression)
ADD_TYPE_INFO(vl::workflow::WfChildExpression)
ADD_TYPE_INFO(vl::workflow::WfLiteralValue)
ADD_TYPE_INFO(vl::workflow::WfLiteralExpression)
ADD_TYPE_INFO(vl::workflow::WfFloatingExpression)
ADD_TYPE_INFO(vl::workflow::WfIntegerExpression)
ADD_TYPE_INFO(vl::workflow::WfStringExpression)
ADD_TYPE_INFO(vl::workflow::WfUnaryOperator)
ADD_TYPE_INFO(vl::workflow::WfUnaryExpression)
ADD_TYPE_INFO(vl::workflow::WfBinaryOperator)
ADD_TYPE_INFO(vl::workflow::WfBinaryExpression)
ADD_TYPE_INFO(vl::workflow::WfLetVariable)
ADD_TYPE_INFO(vl::workflow::WfLetExpression)
ADD_TYPE_INFO(vl::workflow::WfIfExpression)
ADD_TYPE_INFO(vl::workflow::WfRangeBoundary)
ADD_TYPE_INFO(vl::workflow::WfRangeExpression)
ADD_TYPE_INFO(vl::workflow::WfSetTesting)
ADD_TYPE_INFO(vl::workflow::WfSetTestingExpression)
ADD_TYPE_INFO(vl::workflow::WfConstructorArgument)
ADD_TYPE_INFO(vl::workflow::WfConstructorExpression)
ADD_TYPE_INFO(vl::workflow::WfInferExpression)
ADD_TYPE_INFO(vl::workflow::WfTypeCastingStrategy)
ADD_TYPE_INFO(vl::workflow::WfTypeCastingExpression)
ADD_TYPE_INFO(vl::workflow::WfTypeTesting)
ADD_TYPE_INFO(vl::workflow::WfTypeTestingExpression)
ADD_TYPE_INFO(vl::workflow::WfTypeOfTypeExpression)
ADD_TYPE_INFO(vl::workflow::WfTypeOfExpressionExpression)
ADD_TYPE_INFO(vl::workflow::WfAttachEventExpression)
ADD_TYPE_INFO(vl::workflow::WfDetachEventExpression)
ADD_TYPE_INFO(vl::workflow::WfObserveType)
ADD_TYPE_INFO(vl::workflow::WfObserveExpression)
ADD_TYPE_INFO(vl::workflow::WfCallExpression)
ADD_TYPE_INFO(vl::workflow::WfFunctionExpression)
ADD_TYPE_INFO(vl::workflow::WfNewClassExpression)
ADD_TYPE_INFO(vl::workflow::WfNewInterfaceExpression)
ADD_TYPE_INFO(vl::workflow::WfVirtualExpression)
ADD_TYPE_INFO(vl::workflow::WfBindExpression)
ADD_TYPE_INFO(vl::workflow::WfFormatExpression)
ADD_TYPE_INFO(vl::workflow::WfNewCoroutineExpression)
ADD_TYPE_INFO(vl::workflow::WfMixinCastExpression)
ADD_TYPE_INFO(vl::workflow::WfModuleUsingFragment)
ADD_TYPE_INFO(vl::workflow::WfModuleUsingNameFragment)
ADD_TYPE_INFO(vl::workflow::WfModuleUsingWildCardFragment)
ADD_TYPE_INFO(vl::workflow::WfModuleUsingItem)
ADD_TYPE_INFO(vl::workflow::WfModuleUsingPath)
ADD_TYPE_INFO(vl::workflow::WfModuleType)
ADD_TYPE_INFO(vl::workflow::WfModule)
ADD_TYPE_INFO(vl::workflow::WfType::IVisitor)
ADD_TYPE_INFO(vl::workflow::WfExpression::IVisitor)
ADD_TYPE_INFO(vl::workflow::WfStatement::IVisitor)
ADD_TYPE_INFO(vl::workflow::WfDeclaration::IVisitor)
ADD_TYPE_INFO(vl::workflow::WfVirtualDeclaration::IVisitor)
ADD_TYPE_INFO(vl::workflow::WfVirtualStatement::IVisitor)
ADD_TYPE_INFO(vl::workflow::WfCoroutineStatement::IVisitor)
ADD_TYPE_INFO(vl::workflow::WfVirtualExpression::IVisitor)
ADD_TYPE_INFO(vl::workflow::WfModuleUsingFragment::IVisitor)
}
void Unload(ITypeManager* manager)
{
}
};
#endif
bool WfLoadTypes()
{
#ifndef VCZH_DEBUG_NO_REFLECTION
ITypeManager* manager=GetGlobalTypeManager();
if(manager)
{
Ptr<ITypeLoader> loader=new WfTypeLoader;
return manager->AddTypeLoader(loader);
}
#endif
return false;
}
}
}
}
/***********************************************************************
EXPRESSION\WFEXPRESSION_COPY.CPP
***********************************************************************/
/***********************************************************************
Vczh Library++ 3.0
Developer: Zihan Chen(vczh)
Parser::WfExpression.parser.txt
This file is generated by: Vczh Parser Generator
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace copy_visitor
{
/***********************************************************************
TypeVisitor
***********************************************************************/
// CopyFields ----------------------------------------
void TypeVisitor::CopyFields(WfPredefinedType* from, WfPredefinedType* to)
{
to->name = from->name;
CopyFields(static_cast<WfType*>(from), static_cast<WfType*>(to));
}
void TypeVisitor::CopyFields(WfType* from, WfType* to)
{
to->codeRange = from->codeRange;
}
void TypeVisitor::CopyFields(WfTopQualifiedType* from, WfTopQualifiedType* to)
{
to->name.codeRange = from->name.codeRange;
to->name.tokenIndex = from->name.tokenIndex;
to->name.value = from->name.value;
CopyFields(static_cast<WfType*>(from), static_cast<WfType*>(to));
}
void TypeVisitor::CopyFields(WfReferenceType* from, WfReferenceType* to)
{
to->name.codeRange = from->name.codeRange;
to->name.tokenIndex = from->name.tokenIndex;
to->name.value = from->name.value;
CopyFields(static_cast<WfType*>(from), static_cast<WfType*>(to));
}
void TypeVisitor::CopyFields(WfRawPointerType* from, WfRawPointerType* to)
{
to->element = CreateField(from->element);
CopyFields(static_cast<WfType*>(from), static_cast<WfType*>(to));
}
void TypeVisitor::CopyFields(WfSharedPointerType* from, WfSharedPointerType* to)
{
to->element = CreateField(from->element);
CopyFields(static_cast<WfType*>(from), static_cast<WfType*>(to));
}
void TypeVisitor::CopyFields(WfNullableType* from, WfNullableType* to)
{
to->element = CreateField(from->element);
CopyFields(static_cast<WfType*>(from), static_cast<WfType*>(to));
}
void TypeVisitor::CopyFields(WfEnumerableType* from, WfEnumerableType* to)
{
to->element = CreateField(from->element);
CopyFields(static_cast<WfType*>(from), static_cast<WfType*>(to));
}
void TypeVisitor::CopyFields(WfMapType* from, WfMapType* to)
{
to->writability = from->writability;
to->key = CreateField(from->key);
to->value = CreateField(from->value);
CopyFields(static_cast<WfType*>(from), static_cast<WfType*>(to));
}
void TypeVisitor::CopyFields(WfFunctionType* from, WfFunctionType* to)
{
to->result = CreateField(from->result);
FOREACH(vl::Ptr<WfType>, listItem, from->arguments)
{
to->arguments.Add(CreateField(listItem));
}
CopyFields(static_cast<WfType*>(from), static_cast<WfType*>(to));
}
void TypeVisitor::CopyFields(WfChildType* from, WfChildType* to)
{
to->parent = CreateField(from->parent);
to->name.codeRange = from->name.codeRange;
to->name.tokenIndex = from->name.tokenIndex;
to->name.value = from->name.value;
CopyFields(static_cast<WfType*>(from), static_cast<WfType*>(to));
}
// Visitor Members -----------------------------------
void TypeVisitor::Visit(WfPredefinedType* node)
{
auto newNode = vl::MakePtr<WfPredefinedType>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void TypeVisitor::Visit(WfTopQualifiedType* node)
{
auto newNode = vl::MakePtr<WfTopQualifiedType>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void TypeVisitor::Visit(WfReferenceType* node)
{
auto newNode = vl::MakePtr<WfReferenceType>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void TypeVisitor::Visit(WfRawPointerType* node)
{
auto newNode = vl::MakePtr<WfRawPointerType>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void TypeVisitor::Visit(WfSharedPointerType* node)
{
auto newNode = vl::MakePtr<WfSharedPointerType>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void TypeVisitor::Visit(WfNullableType* node)
{
auto newNode = vl::MakePtr<WfNullableType>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void TypeVisitor::Visit(WfEnumerableType* node)
{
auto newNode = vl::MakePtr<WfEnumerableType>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void TypeVisitor::Visit(WfMapType* node)
{
auto newNode = vl::MakePtr<WfMapType>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void TypeVisitor::Visit(WfFunctionType* node)
{
auto newNode = vl::MakePtr<WfFunctionType>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void TypeVisitor::Visit(WfChildType* node)
{
auto newNode = vl::MakePtr<WfChildType>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
/***********************************************************************
ExpressionVisitor
***********************************************************************/
// CopyFields ----------------------------------------
void ExpressionVisitor::CopyFields(WfThisExpression* from, WfThisExpression* to)
{
CopyFields(static_cast<WfExpression*>(from), static_cast<WfExpression*>(to));
}
void ExpressionVisitor::CopyFields(WfExpression* from, WfExpression* to)
{
to->codeRange = from->codeRange;
}
void ExpressionVisitor::CopyFields(WfTopQualifiedExpression* from, WfTopQualifiedExpression* to)
{
to->name.codeRange = from->name.codeRange;
to->name.tokenIndex = from->name.tokenIndex;
to->name.value = from->name.value;
CopyFields(static_cast<WfExpression*>(from), static_cast<WfExpression*>(to));
}
void ExpressionVisitor::CopyFields(WfReferenceExpression* from, WfReferenceExpression* to)
{
to->name.codeRange = from->name.codeRange;
to->name.tokenIndex = from->name.tokenIndex;
to->name.value = from->name.value;
CopyFields(static_cast<WfExpression*>(from), static_cast<WfExpression*>(to));
}
void ExpressionVisitor::CopyFields(WfOrderedNameExpression* from, WfOrderedNameExpression* to)
{
to->name.codeRange = from->name.codeRange;
to->name.tokenIndex = from->name.tokenIndex;
to->name.value = from->name.value;
CopyFields(static_cast<WfExpression*>(from), static_cast<WfExpression*>(to));
}
void ExpressionVisitor::CopyFields(WfOrderedLambdaExpression* from, WfOrderedLambdaExpression* to)
{
to->body = CreateField(from->body);
CopyFields(static_cast<WfExpression*>(from), static_cast<WfExpression*>(to));
}
void ExpressionVisitor::CopyFields(WfMemberExpression* from, WfMemberExpression* to)
{
to->parent = CreateField(from->parent);
to->name.codeRange = from->name.codeRange;
to->name.tokenIndex = from->name.tokenIndex;
to->name.value = from->name.value;
CopyFields(static_cast<WfExpression*>(from), static_cast<WfExpression*>(to));
}
void ExpressionVisitor::CopyFields(WfChildExpression* from, WfChildExpression* to)
{
to->parent = CreateField(from->parent);
to->name.codeRange = from->name.codeRange;
to->name.tokenIndex = from->name.tokenIndex;
to->name.value = from->name.value;
CopyFields(static_cast<WfExpression*>(from), static_cast<WfExpression*>(to));
}
void ExpressionVisitor::CopyFields(WfLiteralExpression* from, WfLiteralExpression* to)
{
to->value = from->value;
CopyFields(static_cast<WfExpression*>(from), static_cast<WfExpression*>(to));
}
void ExpressionVisitor::CopyFields(WfFloatingExpression* from, WfFloatingExpression* to)
{
to->value.codeRange = from->value.codeRange;
to->value.tokenIndex = from->value.tokenIndex;
to->value.value = from->value.value;
CopyFields(static_cast<WfExpression*>(from), static_cast<WfExpression*>(to));
}
void ExpressionVisitor::CopyFields(WfIntegerExpression* from, WfIntegerExpression* to)
{
to->value.codeRange = from->value.codeRange;
to->value.tokenIndex = from->value.tokenIndex;
to->value.value = from->value.value;
CopyFields(static_cast<WfExpression*>(from), static_cast<WfExpression*>(to));
}
void ExpressionVisitor::CopyFields(WfStringExpression* from, WfStringExpression* to)
{
to->value.codeRange = from->value.codeRange;
to->value.tokenIndex = from->value.tokenIndex;
to->value.value = from->value.value;
CopyFields(static_cast<WfExpression*>(from), static_cast<WfExpression*>(to));
}
void ExpressionVisitor::CopyFields(WfUnaryExpression* from, WfUnaryExpression* to)
{
to->op = from->op;
to->operand = CreateField(from->operand);
CopyFields(static_cast<WfExpression*>(from), static_cast<WfExpression*>(to));
}
void ExpressionVisitor::CopyFields(WfBinaryExpression* from, WfBinaryExpression* to)
{
to->op = from->op;
to->first = CreateField(from->first);
to->second = CreateField(from->second);
CopyFields(static_cast<WfExpression*>(from), static_cast<WfExpression*>(to));
}
void ExpressionVisitor::CopyFields(WfLetExpression* from, WfLetExpression* to)
{
FOREACH(vl::Ptr<WfLetVariable>, listItem, from->variables)
{
to->variables.Add(CreateField(listItem));
}
to->expression = CreateField(from->expression);
CopyFields(static_cast<WfExpression*>(from), static_cast<WfExpression*>(to));
}
void ExpressionVisitor::CopyFields(WfLetVariable* from, WfLetVariable* to)
{
to->name.codeRange = from->name.codeRange;
to->name.tokenIndex = from->name.tokenIndex;
to->name.value = from->name.value;
to->value = CreateField(from->value);
to->codeRange = from->codeRange;
}
void ExpressionVisitor::CopyFields(WfIfExpression* from, WfIfExpression* to)
{
to->condition = CreateField(from->condition);
to->trueBranch = CreateField(from->trueBranch);
to->falseBranch = CreateField(from->falseBranch);
CopyFields(static_cast<WfExpression*>(from), static_cast<WfExpression*>(to));
}
void ExpressionVisitor::CopyFields(WfRangeExpression* from, WfRangeExpression* to)
{
to->begin = CreateField(from->begin);
to->beginBoundary = from->beginBoundary;
to->end = CreateField(from->end);
to->endBoundary = from->endBoundary;
CopyFields(static_cast<WfExpression*>(from), static_cast<WfExpression*>(to));
}
void ExpressionVisitor::CopyFields(WfSetTestingExpression* from, WfSetTestingExpression* to)
{
to->test = from->test;
to->element = CreateField(from->element);
to->collection = CreateField(from->collection);
CopyFields(static_cast<WfExpression*>(from), static_cast<WfExpression*>(to));
}
void ExpressionVisitor::CopyFields(WfConstructorExpression* from, WfConstructorExpression* to)
{
FOREACH(vl::Ptr<WfConstructorArgument>, listItem, from->arguments)
{
to->arguments.Add(CreateField(listItem));
}
CopyFields(static_cast<WfExpression*>(from), static_cast<WfExpression*>(to));
}
void ExpressionVisitor::CopyFields(WfConstructorArgument* from, WfConstructorArgument* to)
{
to->key = CreateField(from->key);
to->value = CreateField(from->value);
to->codeRange = from->codeRange;
}
void ExpressionVisitor::CopyFields(WfInferExpression* from, WfInferExpression* to)
{
to->expression = CreateField(from->expression);
to->type = CreateField(from->type);
CopyFields(static_cast<WfExpression*>(from), static_cast<WfExpression*>(to));
}
void ExpressionVisitor::CopyFields(WfTypeCastingExpression* from, WfTypeCastingExpression* to)
{
to->strategy = from->strategy;
to->expression = CreateField(from->expression);
to->type = CreateField(from->type);
CopyFields(static_cast<WfExpression*>(from), static_cast<WfExpression*>(to));
}
void ExpressionVisitor::CopyFields(WfTypeTestingExpression* from, WfTypeTestingExpression* to)
{
to->test = from->test;
to->expression = CreateField(from->expression);
to->type = CreateField(from->type);
CopyFields(static_cast<WfExpression*>(from), static_cast<WfExpression*>(to));
}
void ExpressionVisitor::CopyFields(WfTypeOfTypeExpression* from, WfTypeOfTypeExpression* to)
{
to->type = CreateField(from->type);
CopyFields(static_cast<WfExpression*>(from), static_cast<WfExpression*>(to));
}
void ExpressionVisitor::CopyFields(WfTypeOfExpressionExpression* from, WfTypeOfExpressionExpression* to)
{
to->expression = CreateField(from->expression);
CopyFields(static_cast<WfExpression*>(from), static_cast<WfExpression*>(to));
}
void ExpressionVisitor::CopyFields(WfAttachEventExpression* from, WfAttachEventExpression* to)
{
to->event = CreateField(from->event);
to->function = CreateField(from->function);
CopyFields(static_cast<WfExpression*>(from), static_cast<WfExpression*>(to));
}
void ExpressionVisitor::CopyFields(WfDetachEventExpression* from, WfDetachEventExpression* to)
{
to->event = CreateField(from->event);
to->handler = CreateField(from->handler);
CopyFields(static_cast<WfExpression*>(from), static_cast<WfExpression*>(to));
}
void ExpressionVisitor::CopyFields(WfObserveExpression* from, WfObserveExpression* to)
{
to->parent = CreateField(from->parent);
to->observeType = from->observeType;
to->name.codeRange = from->name.codeRange;
to->name.tokenIndex = from->name.tokenIndex;
to->name.value = from->name.value;
to->expression = CreateField(from->expression);
FOREACH(vl::Ptr<WfExpression>, listItem, from->events)
{
to->events.Add(CreateField(listItem));
}
CopyFields(static_cast<WfExpression*>(from), static_cast<WfExpression*>(to));
}
void ExpressionVisitor::CopyFields(WfCallExpression* from, WfCallExpression* to)
{
to->function = CreateField(from->function);
FOREACH(vl::Ptr<WfExpression>, listItem, from->arguments)
{
to->arguments.Add(CreateField(listItem));
}
CopyFields(static_cast<WfExpression*>(from), static_cast<WfExpression*>(to));
}
void ExpressionVisitor::CopyFields(WfFunctionExpression* from, WfFunctionExpression* to)
{
to->function = CreateField(from->function);
CopyFields(static_cast<WfExpression*>(from), static_cast<WfExpression*>(to));
}
void ExpressionVisitor::CopyFields(WfFunctionDeclaration* from, WfFunctionDeclaration* to)
{
to->anonymity = from->anonymity;
FOREACH(vl::Ptr<WfFunctionArgument>, listItem, from->arguments)
{
to->arguments.Add(CreateField(listItem));
}
to->returnType = CreateField(from->returnType);
to->statement = CreateField(from->statement);
CopyFields(static_cast<WfDeclaration*>(from), static_cast<WfDeclaration*>(to));
}
void ExpressionVisitor::CopyFields(WfDeclaration* from, WfDeclaration* to)
{
FOREACH(vl::Ptr<WfAttribute>, listItem, from->attributes)
{
to->attributes.Add(CreateField(listItem));
}
to->name.codeRange = from->name.codeRange;
to->name.tokenIndex = from->name.tokenIndex;
to->name.value = from->name.value;
to->classMember = CreateField(from->classMember);
to->codeRange = from->codeRange;
}
void ExpressionVisitor::CopyFields(WfAttribute* from, WfAttribute* to)
{
to->category.codeRange = from->category.codeRange;
to->category.tokenIndex = from->category.tokenIndex;
to->category.value = from->category.value;
to->name.codeRange = from->name.codeRange;
to->name.tokenIndex = from->name.tokenIndex;
to->name.value = from->name.value;
to->value = CreateField(from->value);
to->codeRange = from->codeRange;
}
void ExpressionVisitor::CopyFields(WfClassMember* from, WfClassMember* to)
{
to->kind = from->kind;
to->codeRange = from->codeRange;
}
void ExpressionVisitor::CopyFields(WfFunctionArgument* from, WfFunctionArgument* to)
{
FOREACH(vl::Ptr<WfAttribute>, listItem, from->attributes)
{
to->attributes.Add(CreateField(listItem));
}
to->name.codeRange = from->name.codeRange;
to->name.tokenIndex = from->name.tokenIndex;
to->name.value = from->name.value;
to->type = CreateField(from->type);
to->codeRange = from->codeRange;
}
void ExpressionVisitor::CopyFields(WfNewClassExpression* from, WfNewClassExpression* to)
{
to->type = CreateField(from->type);
FOREACH(vl::Ptr<WfExpression>, listItem, from->arguments)
{
to->arguments.Add(CreateField(listItem));
}
CopyFields(static_cast<WfExpression*>(from), static_cast<WfExpression*>(to));
}
void ExpressionVisitor::CopyFields(WfNewInterfaceExpression* from, WfNewInterfaceExpression* to)
{
to->type = CreateField(from->type);
FOREACH(vl::Ptr<WfDeclaration>, listItem, from->declarations)
{
to->declarations.Add(CreateField(listItem));
}
CopyFields(static_cast<WfExpression*>(from), static_cast<WfExpression*>(to));
}
// CreateField ---------------------------------------
vl::Ptr<WfLetVariable> ExpressionVisitor::CreateField(vl::Ptr<WfLetVariable> from)
{
if (!from) return nullptr;
auto to = vl::MakePtr<WfLetVariable>();
CopyFields(from.Obj(), to.Obj());
return to;
}
vl::Ptr<WfConstructorArgument> ExpressionVisitor::CreateField(vl::Ptr<WfConstructorArgument> from)
{
if (!from) return nullptr;
auto to = vl::MakePtr<WfConstructorArgument>();
CopyFields(from.Obj(), to.Obj());
return to;
}
vl::Ptr<WfFunctionDeclaration> ExpressionVisitor::CreateField(vl::Ptr<WfFunctionDeclaration> from)
{
if (!from) return nullptr;
auto to = vl::MakePtr<WfFunctionDeclaration>();
CopyFields(from.Obj(), to.Obj());
return to;
}
vl::Ptr<WfAttribute> ExpressionVisitor::CreateField(vl::Ptr<WfAttribute> from)
{
if (!from) return nullptr;
auto to = vl::MakePtr<WfAttribute>();
CopyFields(from.Obj(), to.Obj());
return to;
}
vl::Ptr<WfClassMember> ExpressionVisitor::CreateField(vl::Ptr<WfClassMember> from)
{
if (!from) return nullptr;
auto to = vl::MakePtr<WfClassMember>();
CopyFields(from.Obj(), to.Obj());
return to;
}
vl::Ptr<WfFunctionArgument> ExpressionVisitor::CreateField(vl::Ptr<WfFunctionArgument> from)
{
if (!from) return nullptr;
auto to = vl::MakePtr<WfFunctionArgument>();
CopyFields(from.Obj(), to.Obj());
return to;
}
// Visitor Members -----------------------------------
void ExpressionVisitor::Visit(WfThisExpression* node)
{
auto newNode = vl::MakePtr<WfThisExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void ExpressionVisitor::Visit(WfTopQualifiedExpression* node)
{
auto newNode = vl::MakePtr<WfTopQualifiedExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void ExpressionVisitor::Visit(WfReferenceExpression* node)
{
auto newNode = vl::MakePtr<WfReferenceExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void ExpressionVisitor::Visit(WfOrderedNameExpression* node)
{
auto newNode = vl::MakePtr<WfOrderedNameExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void ExpressionVisitor::Visit(WfOrderedLambdaExpression* node)
{
auto newNode = vl::MakePtr<WfOrderedLambdaExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void ExpressionVisitor::Visit(WfMemberExpression* node)
{
auto newNode = vl::MakePtr<WfMemberExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void ExpressionVisitor::Visit(WfChildExpression* node)
{
auto newNode = vl::MakePtr<WfChildExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void ExpressionVisitor::Visit(WfLiteralExpression* node)
{
auto newNode = vl::MakePtr<WfLiteralExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void ExpressionVisitor::Visit(WfFloatingExpression* node)
{
auto newNode = vl::MakePtr<WfFloatingExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void ExpressionVisitor::Visit(WfIntegerExpression* node)
{
auto newNode = vl::MakePtr<WfIntegerExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void ExpressionVisitor::Visit(WfStringExpression* node)
{
auto newNode = vl::MakePtr<WfStringExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void ExpressionVisitor::Visit(WfUnaryExpression* node)
{
auto newNode = vl::MakePtr<WfUnaryExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void ExpressionVisitor::Visit(WfBinaryExpression* node)
{
auto newNode = vl::MakePtr<WfBinaryExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void ExpressionVisitor::Visit(WfLetExpression* node)
{
auto newNode = vl::MakePtr<WfLetExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void ExpressionVisitor::Visit(WfIfExpression* node)
{
auto newNode = vl::MakePtr<WfIfExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void ExpressionVisitor::Visit(WfRangeExpression* node)
{
auto newNode = vl::MakePtr<WfRangeExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void ExpressionVisitor::Visit(WfSetTestingExpression* node)
{
auto newNode = vl::MakePtr<WfSetTestingExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void ExpressionVisitor::Visit(WfConstructorExpression* node)
{
auto newNode = vl::MakePtr<WfConstructorExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void ExpressionVisitor::Visit(WfInferExpression* node)
{
auto newNode = vl::MakePtr<WfInferExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void ExpressionVisitor::Visit(WfTypeCastingExpression* node)
{
auto newNode = vl::MakePtr<WfTypeCastingExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void ExpressionVisitor::Visit(WfTypeTestingExpression* node)
{
auto newNode = vl::MakePtr<WfTypeTestingExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void ExpressionVisitor::Visit(WfTypeOfTypeExpression* node)
{
auto newNode = vl::MakePtr<WfTypeOfTypeExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void ExpressionVisitor::Visit(WfTypeOfExpressionExpression* node)
{
auto newNode = vl::MakePtr<WfTypeOfExpressionExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void ExpressionVisitor::Visit(WfAttachEventExpression* node)
{
auto newNode = vl::MakePtr<WfAttachEventExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void ExpressionVisitor::Visit(WfDetachEventExpression* node)
{
auto newNode = vl::MakePtr<WfDetachEventExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void ExpressionVisitor::Visit(WfObserveExpression* node)
{
auto newNode = vl::MakePtr<WfObserveExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void ExpressionVisitor::Visit(WfCallExpression* node)
{
auto newNode = vl::MakePtr<WfCallExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void ExpressionVisitor::Visit(WfFunctionExpression* node)
{
auto newNode = vl::MakePtr<WfFunctionExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void ExpressionVisitor::Visit(WfNewClassExpression* node)
{
auto newNode = vl::MakePtr<WfNewClassExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void ExpressionVisitor::Visit(WfNewInterfaceExpression* node)
{
auto newNode = vl::MakePtr<WfNewInterfaceExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void ExpressionVisitor::Visit(WfVirtualExpression* node)
{
this->result = Dispatch(node);
}
/***********************************************************************
StatementVisitor
***********************************************************************/
// CopyFields ----------------------------------------
void StatementVisitor::CopyFields(WfBreakStatement* from, WfBreakStatement* to)
{
CopyFields(static_cast<WfStatement*>(from), static_cast<WfStatement*>(to));
}
void StatementVisitor::CopyFields(WfStatement* from, WfStatement* to)
{
to->codeRange = from->codeRange;
}
void StatementVisitor::CopyFields(WfContinueStatement* from, WfContinueStatement* to)
{
CopyFields(static_cast<WfStatement*>(from), static_cast<WfStatement*>(to));
}
void StatementVisitor::CopyFields(WfReturnStatement* from, WfReturnStatement* to)
{
to->expression = CreateField(from->expression);
CopyFields(static_cast<WfStatement*>(from), static_cast<WfStatement*>(to));
}
void StatementVisitor::CopyFields(WfDeleteStatement* from, WfDeleteStatement* to)
{
to->expression = CreateField(from->expression);
CopyFields(static_cast<WfStatement*>(from), static_cast<WfStatement*>(to));
}
void StatementVisitor::CopyFields(WfRaiseExceptionStatement* from, WfRaiseExceptionStatement* to)
{
to->expression = CreateField(from->expression);
CopyFields(static_cast<WfStatement*>(from), static_cast<WfStatement*>(to));
}
void StatementVisitor::CopyFields(WfIfStatement* from, WfIfStatement* to)
{
to->type = CreateField(from->type);
to->name.codeRange = from->name.codeRange;
to->name.tokenIndex = from->name.tokenIndex;
to->name.value = from->name.value;
to->expression = CreateField(from->expression);
to->trueBranch = CreateField(from->trueBranch);
to->falseBranch = CreateField(from->falseBranch);
CopyFields(static_cast<WfStatement*>(from), static_cast<WfStatement*>(to));
}
void StatementVisitor::CopyFields(WfWhileStatement* from, WfWhileStatement* to)
{
to->condition = CreateField(from->condition);
to->statement = CreateField(from->statement);
CopyFields(static_cast<WfStatement*>(from), static_cast<WfStatement*>(to));
}
void StatementVisitor::CopyFields(WfTryStatement* from, WfTryStatement* to)
{
to->protectedStatement = CreateField(from->protectedStatement);
to->name.codeRange = from->name.codeRange;
to->name.tokenIndex = from->name.tokenIndex;
to->name.value = from->name.value;
to->catchStatement = CreateField(from->catchStatement);
to->finallyStatement = CreateField(from->finallyStatement);
CopyFields(static_cast<WfStatement*>(from), static_cast<WfStatement*>(to));
}
void StatementVisitor::CopyFields(WfBlockStatement* from, WfBlockStatement* to)
{
FOREACH(vl::Ptr<WfStatement>, listItem, from->statements)
{
to->statements.Add(CreateField(listItem));
}
CopyFields(static_cast<WfStatement*>(from), static_cast<WfStatement*>(to));
}
void StatementVisitor::CopyFields(WfVariableStatement* from, WfVariableStatement* to)
{
to->variable = CreateField(from->variable);
CopyFields(static_cast<WfStatement*>(from), static_cast<WfStatement*>(to));
}
void StatementVisitor::CopyFields(WfVariableDeclaration* from, WfVariableDeclaration* to)
{
to->type = CreateField(from->type);
to->expression = CreateField(from->expression);
CopyFields(static_cast<WfDeclaration*>(from), static_cast<WfDeclaration*>(to));
}
void StatementVisitor::CopyFields(WfDeclaration* from, WfDeclaration* to)
{
FOREACH(vl::Ptr<WfAttribute>, listItem, from->attributes)
{
to->attributes.Add(CreateField(listItem));
}
to->name.codeRange = from->name.codeRange;
to->name.tokenIndex = from->name.tokenIndex;
to->name.value = from->name.value;
to->classMember = CreateField(from->classMember);
to->codeRange = from->codeRange;
}
void StatementVisitor::CopyFields(WfAttribute* from, WfAttribute* to)
{
to->category.codeRange = from->category.codeRange;
to->category.tokenIndex = from->category.tokenIndex;
to->category.value = from->category.value;
to->name.codeRange = from->name.codeRange;
to->name.tokenIndex = from->name.tokenIndex;
to->name.value = from->name.value;
to->value = CreateField(from->value);
to->codeRange = from->codeRange;
}
void StatementVisitor::CopyFields(WfClassMember* from, WfClassMember* to)
{
to->kind = from->kind;
to->codeRange = from->codeRange;
}
void StatementVisitor::CopyFields(WfExpressionStatement* from, WfExpressionStatement* to)
{
to->expression = CreateField(from->expression);
CopyFields(static_cast<WfStatement*>(from), static_cast<WfStatement*>(to));
}
// CreateField ---------------------------------------
vl::Ptr<WfVariableDeclaration> StatementVisitor::CreateField(vl::Ptr<WfVariableDeclaration> from)
{
if (!from) return nullptr;
auto to = vl::MakePtr<WfVariableDeclaration>();
CopyFields(from.Obj(), to.Obj());
return to;
}
vl::Ptr<WfAttribute> StatementVisitor::CreateField(vl::Ptr<WfAttribute> from)
{
if (!from) return nullptr;
auto to = vl::MakePtr<WfAttribute>();
CopyFields(from.Obj(), to.Obj());
return to;
}
vl::Ptr<WfClassMember> StatementVisitor::CreateField(vl::Ptr<WfClassMember> from)
{
if (!from) return nullptr;
auto to = vl::MakePtr<WfClassMember>();
CopyFields(from.Obj(), to.Obj());
return to;
}
// Visitor Members -----------------------------------
void StatementVisitor::Visit(WfBreakStatement* node)
{
auto newNode = vl::MakePtr<WfBreakStatement>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void StatementVisitor::Visit(WfContinueStatement* node)
{
auto newNode = vl::MakePtr<WfContinueStatement>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void StatementVisitor::Visit(WfReturnStatement* node)
{
auto newNode = vl::MakePtr<WfReturnStatement>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void StatementVisitor::Visit(WfDeleteStatement* node)
{
auto newNode = vl::MakePtr<WfDeleteStatement>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void StatementVisitor::Visit(WfRaiseExceptionStatement* node)
{
auto newNode = vl::MakePtr<WfRaiseExceptionStatement>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void StatementVisitor::Visit(WfIfStatement* node)
{
auto newNode = vl::MakePtr<WfIfStatement>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void StatementVisitor::Visit(WfWhileStatement* node)
{
auto newNode = vl::MakePtr<WfWhileStatement>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void StatementVisitor::Visit(WfTryStatement* node)
{
auto newNode = vl::MakePtr<WfTryStatement>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void StatementVisitor::Visit(WfBlockStatement* node)
{
auto newNode = vl::MakePtr<WfBlockStatement>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void StatementVisitor::Visit(WfVariableStatement* node)
{
auto newNode = vl::MakePtr<WfVariableStatement>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void StatementVisitor::Visit(WfExpressionStatement* node)
{
auto newNode = vl::MakePtr<WfExpressionStatement>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void StatementVisitor::Visit(WfVirtualStatement* node)
{
this->result = Dispatch(node);
}
void StatementVisitor::Visit(WfCoroutineStatement* node)
{
this->result = Dispatch(node);
}
/***********************************************************************
DeclarationVisitor
***********************************************************************/
// CopyFields ----------------------------------------
void DeclarationVisitor::CopyFields(WfNamespaceDeclaration* from, WfNamespaceDeclaration* to)
{
FOREACH(vl::Ptr<WfDeclaration>, listItem, from->declarations)
{
to->declarations.Add(CreateField(listItem));
}
CopyFields(static_cast<WfDeclaration*>(from), static_cast<WfDeclaration*>(to));
}
void DeclarationVisitor::CopyFields(WfDeclaration* from, WfDeclaration* to)
{
FOREACH(vl::Ptr<WfAttribute>, listItem, from->attributes)
{
to->attributes.Add(CreateField(listItem));
}
to->name.codeRange = from->name.codeRange;
to->name.tokenIndex = from->name.tokenIndex;
to->name.value = from->name.value;
to->classMember = CreateField(from->classMember);
to->codeRange = from->codeRange;
}
void DeclarationVisitor::CopyFields(WfAttribute* from, WfAttribute* to)
{
to->category.codeRange = from->category.codeRange;
to->category.tokenIndex = from->category.tokenIndex;
to->category.value = from->category.value;
to->name.codeRange = from->name.codeRange;
to->name.tokenIndex = from->name.tokenIndex;
to->name.value = from->name.value;
to->value = CreateField(from->value);
to->codeRange = from->codeRange;
}
void DeclarationVisitor::CopyFields(WfClassMember* from, WfClassMember* to)
{
to->kind = from->kind;
to->codeRange = from->codeRange;
}
void DeclarationVisitor::CopyFields(WfFunctionDeclaration* from, WfFunctionDeclaration* to)
{
to->anonymity = from->anonymity;
FOREACH(vl::Ptr<WfFunctionArgument>, listItem, from->arguments)
{
to->arguments.Add(CreateField(listItem));
}
to->returnType = CreateField(from->returnType);
to->statement = CreateField(from->statement);
CopyFields(static_cast<WfDeclaration*>(from), static_cast<WfDeclaration*>(to));
}
void DeclarationVisitor::CopyFields(WfFunctionArgument* from, WfFunctionArgument* to)
{
FOREACH(vl::Ptr<WfAttribute>, listItem, from->attributes)
{
to->attributes.Add(CreateField(listItem));
}
to->name.codeRange = from->name.codeRange;
to->name.tokenIndex = from->name.tokenIndex;
to->name.value = from->name.value;
to->type = CreateField(from->type);
to->codeRange = from->codeRange;
}
void DeclarationVisitor::CopyFields(WfVariableDeclaration* from, WfVariableDeclaration* to)
{
to->type = CreateField(from->type);
to->expression = CreateField(from->expression);
CopyFields(static_cast<WfDeclaration*>(from), static_cast<WfDeclaration*>(to));
}
void DeclarationVisitor::CopyFields(WfEventDeclaration* from, WfEventDeclaration* to)
{
FOREACH(vl::Ptr<WfType>, listItem, from->arguments)
{
to->arguments.Add(CreateField(listItem));
}
CopyFields(static_cast<WfDeclaration*>(from), static_cast<WfDeclaration*>(to));
}
void DeclarationVisitor::CopyFields(WfPropertyDeclaration* from, WfPropertyDeclaration* to)
{
to->type = CreateField(from->type);
to->getter.codeRange = from->getter.codeRange;
to->getter.tokenIndex = from->getter.tokenIndex;
to->getter.value = from->getter.value;
to->setter.codeRange = from->setter.codeRange;
to->setter.tokenIndex = from->setter.tokenIndex;
to->setter.value = from->setter.value;
to->valueChangedEvent.codeRange = from->valueChangedEvent.codeRange;
to->valueChangedEvent.tokenIndex = from->valueChangedEvent.tokenIndex;
to->valueChangedEvent.value = from->valueChangedEvent.value;
CopyFields(static_cast<WfDeclaration*>(from), static_cast<WfDeclaration*>(to));
}
void DeclarationVisitor::CopyFields(WfConstructorDeclaration* from, WfConstructorDeclaration* to)
{
to->constructorType = from->constructorType;
FOREACH(vl::Ptr<WfBaseConstructorCall>, listItem, from->baseConstructorCalls)
{
to->baseConstructorCalls.Add(CreateField(listItem));
}
FOREACH(vl::Ptr<WfFunctionArgument>, listItem, from->arguments)
{
to->arguments.Add(CreateField(listItem));
}
to->statement = CreateField(from->statement);
CopyFields(static_cast<WfDeclaration*>(from), static_cast<WfDeclaration*>(to));
}
void DeclarationVisitor::CopyFields(WfBaseConstructorCall* from, WfBaseConstructorCall* to)
{
to->type = CreateField(from->type);
FOREACH(vl::Ptr<WfExpression>, listItem, from->arguments)
{
to->arguments.Add(CreateField(listItem));
}
to->codeRange = from->codeRange;
}
void DeclarationVisitor::CopyFields(WfDestructorDeclaration* from, WfDestructorDeclaration* to)
{
to->statement = CreateField(from->statement);
CopyFields(static_cast<WfDeclaration*>(from), static_cast<WfDeclaration*>(to));
}
void DeclarationVisitor::CopyFields(WfClassDeclaration* from, WfClassDeclaration* to)
{
to->kind = from->kind;
to->constructorType = from->constructorType;
FOREACH(vl::Ptr<WfType>, listItem, from->baseTypes)
{
to->baseTypes.Add(CreateField(listItem));
}
FOREACH(vl::Ptr<WfDeclaration>, listItem, from->declarations)
{
to->declarations.Add(CreateField(listItem));
}
CopyFields(static_cast<WfDeclaration*>(from), static_cast<WfDeclaration*>(to));
}
void DeclarationVisitor::CopyFields(WfEnumDeclaration* from, WfEnumDeclaration* to)
{
to->kind = from->kind;
FOREACH(vl::Ptr<WfEnumItem>, listItem, from->items)
{
to->items.Add(CreateField(listItem));
}
CopyFields(static_cast<WfDeclaration*>(from), static_cast<WfDeclaration*>(to));
}
void DeclarationVisitor::CopyFields(WfEnumItem* from, WfEnumItem* to)
{
FOREACH(vl::Ptr<WfAttribute>, listItem, from->attributes)
{
to->attributes.Add(CreateField(listItem));
}
to->name.codeRange = from->name.codeRange;
to->name.tokenIndex = from->name.tokenIndex;
to->name.value = from->name.value;
to->kind = from->kind;
to->number.codeRange = from->number.codeRange;
to->number.tokenIndex = from->number.tokenIndex;
to->number.value = from->number.value;
FOREACH(vl::Ptr<WfEnumItemIntersection>, listItem, from->intersections)
{
to->intersections.Add(CreateField(listItem));
}
to->codeRange = from->codeRange;
}
void DeclarationVisitor::CopyFields(WfEnumItemIntersection* from, WfEnumItemIntersection* to)
{
to->name.codeRange = from->name.codeRange;
to->name.tokenIndex = from->name.tokenIndex;
to->name.value = from->name.value;
to->codeRange = from->codeRange;
}
void DeclarationVisitor::CopyFields(WfStructDeclaration* from, WfStructDeclaration* to)
{
FOREACH(vl::Ptr<WfStructMember>, listItem, from->members)
{
to->members.Add(CreateField(listItem));
}
CopyFields(static_cast<WfDeclaration*>(from), static_cast<WfDeclaration*>(to));
}
void DeclarationVisitor::CopyFields(WfStructMember* from, WfStructMember* to)
{
FOREACH(vl::Ptr<WfAttribute>, listItem, from->attributes)
{
to->attributes.Add(CreateField(listItem));
}
to->name.codeRange = from->name.codeRange;
to->name.tokenIndex = from->name.tokenIndex;
to->name.value = from->name.value;
to->type = CreateField(from->type);
to->codeRange = from->codeRange;
}
// CreateField ---------------------------------------
vl::Ptr<WfAttribute> DeclarationVisitor::CreateField(vl::Ptr<WfAttribute> from)
{
if (!from) return nullptr;
auto to = vl::MakePtr<WfAttribute>();
CopyFields(from.Obj(), to.Obj());
return to;
}
vl::Ptr<WfClassMember> DeclarationVisitor::CreateField(vl::Ptr<WfClassMember> from)
{
if (!from) return nullptr;
auto to = vl::MakePtr<WfClassMember>();
CopyFields(from.Obj(), to.Obj());
return to;
}
vl::Ptr<WfFunctionArgument> DeclarationVisitor::CreateField(vl::Ptr<WfFunctionArgument> from)
{
if (!from) return nullptr;
auto to = vl::MakePtr<WfFunctionArgument>();
CopyFields(from.Obj(), to.Obj());
return to;
}
vl::Ptr<WfBaseConstructorCall> DeclarationVisitor::CreateField(vl::Ptr<WfBaseConstructorCall> from)
{
if (!from) return nullptr;
auto to = vl::MakePtr<WfBaseConstructorCall>();
CopyFields(from.Obj(), to.Obj());
return to;
}
vl::Ptr<WfEnumItem> DeclarationVisitor::CreateField(vl::Ptr<WfEnumItem> from)
{
if (!from) return nullptr;
auto to = vl::MakePtr<WfEnumItem>();
CopyFields(from.Obj(), to.Obj());
return to;
}
vl::Ptr<WfEnumItemIntersection> DeclarationVisitor::CreateField(vl::Ptr<WfEnumItemIntersection> from)
{
if (!from) return nullptr;
auto to = vl::MakePtr<WfEnumItemIntersection>();
CopyFields(from.Obj(), to.Obj());
return to;
}
vl::Ptr<WfStructMember> DeclarationVisitor::CreateField(vl::Ptr<WfStructMember> from)
{
if (!from) return nullptr;
auto to = vl::MakePtr<WfStructMember>();
CopyFields(from.Obj(), to.Obj());
return to;
}
// Visitor Members -----------------------------------
void DeclarationVisitor::Visit(WfNamespaceDeclaration* node)
{
auto newNode = vl::MakePtr<WfNamespaceDeclaration>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void DeclarationVisitor::Visit(WfFunctionDeclaration* node)
{
auto newNode = vl::MakePtr<WfFunctionDeclaration>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void DeclarationVisitor::Visit(WfVariableDeclaration* node)
{
auto newNode = vl::MakePtr<WfVariableDeclaration>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void DeclarationVisitor::Visit(WfEventDeclaration* node)
{
auto newNode = vl::MakePtr<WfEventDeclaration>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void DeclarationVisitor::Visit(WfPropertyDeclaration* node)
{
auto newNode = vl::MakePtr<WfPropertyDeclaration>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void DeclarationVisitor::Visit(WfConstructorDeclaration* node)
{
auto newNode = vl::MakePtr<WfConstructorDeclaration>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void DeclarationVisitor::Visit(WfDestructorDeclaration* node)
{
auto newNode = vl::MakePtr<WfDestructorDeclaration>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void DeclarationVisitor::Visit(WfClassDeclaration* node)
{
auto newNode = vl::MakePtr<WfClassDeclaration>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void DeclarationVisitor::Visit(WfEnumDeclaration* node)
{
auto newNode = vl::MakePtr<WfEnumDeclaration>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void DeclarationVisitor::Visit(WfStructDeclaration* node)
{
auto newNode = vl::MakePtr<WfStructDeclaration>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void DeclarationVisitor::Visit(WfVirtualDeclaration* node)
{
this->result = Dispatch(node);
}
/***********************************************************************
VirtualDeclarationVisitor
***********************************************************************/
// CopyFields ----------------------------------------
void VirtualDeclarationVisitor::CopyFields(WfAutoPropertyDeclaration* from, WfAutoPropertyDeclaration* to)
{
to->type = CreateField(from->type);
to->configConst = from->configConst;
to->configObserve = from->configObserve;
to->expression = CreateField(from->expression);
CopyFields(static_cast<WfVirtualDeclaration*>(from), static_cast<WfVirtualDeclaration*>(to));
}
void VirtualDeclarationVisitor::CopyFields(WfVirtualDeclaration* from, WfVirtualDeclaration* to)
{
FOREACH(vl::Ptr<WfDeclaration>, listItem, from->expandedDeclarations)
{
to->expandedDeclarations.Add(CreateField(listItem));
}
CopyFields(static_cast<WfDeclaration*>(from), static_cast<WfDeclaration*>(to));
}
void VirtualDeclarationVisitor::CopyFields(WfDeclaration* from, WfDeclaration* to)
{
FOREACH(vl::Ptr<WfAttribute>, listItem, from->attributes)
{
to->attributes.Add(CreateField(listItem));
}
to->name.codeRange = from->name.codeRange;
to->name.tokenIndex = from->name.tokenIndex;
to->name.value = from->name.value;
to->classMember = CreateField(from->classMember);
to->codeRange = from->codeRange;
}
void VirtualDeclarationVisitor::CopyFields(WfAttribute* from, WfAttribute* to)
{
to->category.codeRange = from->category.codeRange;
to->category.tokenIndex = from->category.tokenIndex;
to->category.value = from->category.value;
to->name.codeRange = from->name.codeRange;
to->name.tokenIndex = from->name.tokenIndex;
to->name.value = from->name.value;
to->value = CreateField(from->value);
to->codeRange = from->codeRange;
}
void VirtualDeclarationVisitor::CopyFields(WfClassMember* from, WfClassMember* to)
{
to->kind = from->kind;
to->codeRange = from->codeRange;
}
void VirtualDeclarationVisitor::CopyFields(WfCastResultInterfaceDeclaration* from, WfCastResultInterfaceDeclaration* to)
{
to->baseType = CreateField(from->baseType);
to->elementType = CreateField(from->elementType);
CopyFields(static_cast<WfVirtualDeclaration*>(from), static_cast<WfVirtualDeclaration*>(to));
}
// CreateField ---------------------------------------
vl::Ptr<WfAttribute> VirtualDeclarationVisitor::CreateField(vl::Ptr<WfAttribute> from)
{
if (!from) return nullptr;
auto to = vl::MakePtr<WfAttribute>();
CopyFields(from.Obj(), to.Obj());
return to;
}
vl::Ptr<WfClassMember> VirtualDeclarationVisitor::CreateField(vl::Ptr<WfClassMember> from)
{
if (!from) return nullptr;
auto to = vl::MakePtr<WfClassMember>();
CopyFields(from.Obj(), to.Obj());
return to;
}
// Visitor Members -----------------------------------
void VirtualDeclarationVisitor::Visit(WfAutoPropertyDeclaration* node)
{
auto newNode = vl::MakePtr<WfAutoPropertyDeclaration>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void VirtualDeclarationVisitor::Visit(WfCastResultInterfaceDeclaration* node)
{
auto newNode = vl::MakePtr<WfCastResultInterfaceDeclaration>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
/***********************************************************************
VirtualStatementVisitor
***********************************************************************/
// CopyFields ----------------------------------------
void VirtualStatementVisitor::CopyFields(WfForEachStatement* from, WfForEachStatement* to)
{
to->name.codeRange = from->name.codeRange;
to->name.tokenIndex = from->name.tokenIndex;
to->name.value = from->name.value;
to->direction = from->direction;
to->collection = CreateField(from->collection);
to->statement = CreateField(from->statement);
CopyFields(static_cast<WfVirtualStatement*>(from), static_cast<WfVirtualStatement*>(to));
}
void VirtualStatementVisitor::CopyFields(WfVirtualStatement* from, WfVirtualStatement* to)
{
to->expandedStatement = CreateField(from->expandedStatement);
CopyFields(static_cast<WfStatement*>(from), static_cast<WfStatement*>(to));
}
void VirtualStatementVisitor::CopyFields(WfStatement* from, WfStatement* to)
{
to->codeRange = from->codeRange;
}
void VirtualStatementVisitor::CopyFields(WfSwitchStatement* from, WfSwitchStatement* to)
{
to->expression = CreateField(from->expression);
FOREACH(vl::Ptr<WfSwitchCase>, listItem, from->caseBranches)
{
to->caseBranches.Add(CreateField(listItem));
}
to->defaultBranch = CreateField(from->defaultBranch);
CopyFields(static_cast<WfVirtualStatement*>(from), static_cast<WfVirtualStatement*>(to));
}
void VirtualStatementVisitor::CopyFields(WfSwitchCase* from, WfSwitchCase* to)
{
to->expression = CreateField(from->expression);
to->statement = CreateField(from->statement);
to->codeRange = from->codeRange;
}
void VirtualStatementVisitor::CopyFields(WfCoProviderStatement* from, WfCoProviderStatement* to)
{
to->name.codeRange = from->name.codeRange;
to->name.tokenIndex = from->name.tokenIndex;
to->name.value = from->name.value;
to->statement = CreateField(from->statement);
CopyFields(static_cast<WfVirtualStatement*>(from), static_cast<WfVirtualStatement*>(to));
}
// CreateField ---------------------------------------
vl::Ptr<WfSwitchCase> VirtualStatementVisitor::CreateField(vl::Ptr<WfSwitchCase> from)
{
if (!from) return nullptr;
auto to = vl::MakePtr<WfSwitchCase>();
CopyFields(from.Obj(), to.Obj());
return to;
}
// Visitor Members -----------------------------------
void VirtualStatementVisitor::Visit(WfForEachStatement* node)
{
auto newNode = vl::MakePtr<WfForEachStatement>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void VirtualStatementVisitor::Visit(WfSwitchStatement* node)
{
auto newNode = vl::MakePtr<WfSwitchStatement>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void VirtualStatementVisitor::Visit(WfCoProviderStatement* node)
{
auto newNode = vl::MakePtr<WfCoProviderStatement>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
/***********************************************************************
CoroutineStatementVisitor
***********************************************************************/
// CopyFields ----------------------------------------
void CoroutineStatementVisitor::CopyFields(WfCoPauseStatement* from, WfCoPauseStatement* to)
{
to->statement = CreateField(from->statement);
CopyFields(static_cast<WfCoroutineStatement*>(from), static_cast<WfCoroutineStatement*>(to));
}
void CoroutineStatementVisitor::CopyFields(WfCoroutineStatement* from, WfCoroutineStatement* to)
{
CopyFields(static_cast<WfStatement*>(from), static_cast<WfStatement*>(to));
}
void CoroutineStatementVisitor::CopyFields(WfStatement* from, WfStatement* to)
{
to->codeRange = from->codeRange;
}
void CoroutineStatementVisitor::CopyFields(WfCoOperatorStatement* from, WfCoOperatorStatement* to)
{
to->varName.codeRange = from->varName.codeRange;
to->varName.tokenIndex = from->varName.tokenIndex;
to->varName.value = from->varName.value;
to->opName.codeRange = from->opName.codeRange;
to->opName.tokenIndex = from->opName.tokenIndex;
to->opName.value = from->opName.value;
FOREACH(vl::Ptr<WfExpression>, listItem, from->arguments)
{
to->arguments.Add(CreateField(listItem));
}
CopyFields(static_cast<WfCoroutineStatement*>(from), static_cast<WfCoroutineStatement*>(to));
}
// Visitor Members -----------------------------------
void CoroutineStatementVisitor::Visit(WfCoPauseStatement* node)
{
auto newNode = vl::MakePtr<WfCoPauseStatement>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void CoroutineStatementVisitor::Visit(WfCoOperatorStatement* node)
{
auto newNode = vl::MakePtr<WfCoOperatorStatement>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
/***********************************************************************
VirtualExpressionVisitor
***********************************************************************/
// CopyFields ----------------------------------------
void VirtualExpressionVisitor::CopyFields(WfBindExpression* from, WfBindExpression* to)
{
to->expression = CreateField(from->expression);
CopyFields(static_cast<WfVirtualExpression*>(from), static_cast<WfVirtualExpression*>(to));
}
void VirtualExpressionVisitor::CopyFields(WfVirtualExpression* from, WfVirtualExpression* to)
{
to->expandedExpression = CreateField(from->expandedExpression);
CopyFields(static_cast<WfExpression*>(from), static_cast<WfExpression*>(to));
}
void VirtualExpressionVisitor::CopyFields(WfExpression* from, WfExpression* to)
{
to->codeRange = from->codeRange;
}
void VirtualExpressionVisitor::CopyFields(WfFormatExpression* from, WfFormatExpression* to)
{
to->value.codeRange = from->value.codeRange;
to->value.tokenIndex = from->value.tokenIndex;
to->value.value = from->value.value;
CopyFields(static_cast<WfVirtualExpression*>(from), static_cast<WfVirtualExpression*>(to));
}
void VirtualExpressionVisitor::CopyFields(WfNewCoroutineExpression* from, WfNewCoroutineExpression* to)
{
to->name.codeRange = from->name.codeRange;
to->name.tokenIndex = from->name.tokenIndex;
to->name.value = from->name.value;
to->statement = CreateField(from->statement);
CopyFields(static_cast<WfVirtualExpression*>(from), static_cast<WfVirtualExpression*>(to));
}
void VirtualExpressionVisitor::CopyFields(WfMixinCastExpression* from, WfMixinCastExpression* to)
{
to->type = CreateField(from->type);
to->expression = CreateField(from->expression);
CopyFields(static_cast<WfVirtualExpression*>(from), static_cast<WfVirtualExpression*>(to));
}
// Visitor Members -----------------------------------
void VirtualExpressionVisitor::Visit(WfBindExpression* node)
{
auto newNode = vl::MakePtr<WfBindExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void VirtualExpressionVisitor::Visit(WfFormatExpression* node)
{
auto newNode = vl::MakePtr<WfFormatExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void VirtualExpressionVisitor::Visit(WfNewCoroutineExpression* node)
{
auto newNode = vl::MakePtr<WfNewCoroutineExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void VirtualExpressionVisitor::Visit(WfMixinCastExpression* node)
{
auto newNode = vl::MakePtr<WfMixinCastExpression>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
/***********************************************************************
ModuleUsingFragmentVisitor
***********************************************************************/
// CopyFields ----------------------------------------
void ModuleUsingFragmentVisitor::CopyFields(WfModuleUsingNameFragment* from, WfModuleUsingNameFragment* to)
{
to->name.codeRange = from->name.codeRange;
to->name.tokenIndex = from->name.tokenIndex;
to->name.value = from->name.value;
CopyFields(static_cast<WfModuleUsingFragment*>(from), static_cast<WfModuleUsingFragment*>(to));
}
void ModuleUsingFragmentVisitor::CopyFields(WfModuleUsingFragment* from, WfModuleUsingFragment* to)
{
to->codeRange = from->codeRange;
}
void ModuleUsingFragmentVisitor::CopyFields(WfModuleUsingWildCardFragment* from, WfModuleUsingWildCardFragment* to)
{
CopyFields(static_cast<WfModuleUsingFragment*>(from), static_cast<WfModuleUsingFragment*>(to));
}
// Visitor Members -----------------------------------
void ModuleUsingFragmentVisitor::Visit(WfModuleUsingNameFragment* node)
{
auto newNode = vl::MakePtr<WfModuleUsingNameFragment>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
void ModuleUsingFragmentVisitor::Visit(WfModuleUsingWildCardFragment* node)
{
auto newNode = vl::MakePtr<WfModuleUsingWildCardFragment>();
CopyFields(node, newNode.Obj());
this->result = newNode;
}
/***********************************************************************
ModuleVisitor
***********************************************************************/
vl::Ptr<WfModule> ModuleVisitor::CreateField(vl::Ptr<WfModule> from)
{
auto to = vl::MakePtr<WfModule>();
CopyFields(from.Obj(), to.Obj());
return to;
}
// CopyFields ----------------------------------------
void ModuleVisitor::CopyFields(WfModule* from, WfModule* to)
{
to->moduleType = from->moduleType;
to->name.codeRange = from->name.codeRange;
to->name.tokenIndex = from->name.tokenIndex;
to->name.value = from->name.value;
FOREACH(vl::Ptr<WfModuleUsingPath>, listItem, from->paths)
{
to->paths.Add(CreateField(listItem));
}
FOREACH(vl::Ptr<WfDeclaration>, listItem, from->declarations)
{
to->declarations.Add(CreateField(listItem));
}
to->codeRange = from->codeRange;
}
void ModuleVisitor::CopyFields(WfModuleUsingPath* from, WfModuleUsingPath* to)
{
FOREACH(vl::Ptr<WfModuleUsingItem>, listItem, from->items)
{
to->items.Add(CreateField(listItem));
}
to->codeRange = from->codeRange;
}
void ModuleVisitor::CopyFields(WfModuleUsingItem* from, WfModuleUsingItem* to)
{
FOREACH(vl::Ptr<WfModuleUsingFragment>, listItem, from->fragments)
{
to->fragments.Add(CreateField(listItem));
}
to->codeRange = from->codeRange;
}
// CreateField ---------------------------------------
vl::Ptr<WfModuleUsingPath> ModuleVisitor::CreateField(vl::Ptr<WfModuleUsingPath> from)
{
if (!from) return nullptr;
auto to = vl::MakePtr<WfModuleUsingPath>();
CopyFields(from.Obj(), to.Obj());
return to;
}
vl::Ptr<WfModuleUsingItem> ModuleVisitor::CreateField(vl::Ptr<WfModuleUsingItem> from)
{
if (!from) return nullptr;
auto to = vl::MakePtr<WfModuleUsingItem>();
CopyFields(from.Obj(), to.Obj());
return to;
}
// CreateField (virtual) -----------------------------
vl::Ptr<WfType> ModuleVisitor::CreateField(vl::Ptr<WfType> from)
{
if (!from) return nullptr;
from->Accept(static_cast<TypeVisitor*>(this));
return this->result.Cast<WfType>();
}
vl::Ptr<WfExpression> ModuleVisitor::CreateField(vl::Ptr<WfExpression> from)
{
if (!from) return nullptr;
from->Accept(static_cast<ExpressionVisitor*>(this));
return this->result.Cast<WfExpression>();
}
vl::Ptr<WfStatement> ModuleVisitor::CreateField(vl::Ptr<WfStatement> from)
{
if (!from) return nullptr;
from->Accept(static_cast<StatementVisitor*>(this));
return this->result.Cast<WfStatement>();
}
vl::Ptr<WfDeclaration> ModuleVisitor::CreateField(vl::Ptr<WfDeclaration> from)
{
if (!from) return nullptr;
from->Accept(static_cast<DeclarationVisitor*>(this));
return this->result.Cast<WfDeclaration>();
}
vl::Ptr<WfModuleUsingFragment> ModuleVisitor::CreateField(vl::Ptr<WfModuleUsingFragment> from)
{
if (!from) return nullptr;
from->Accept(static_cast<ModuleUsingFragmentVisitor*>(this));
return this->result.Cast<WfModuleUsingFragment>();
}
// Dispatch (virtual) --------------------------------
vl::Ptr<vl::parsing::ParsingTreeCustomBase> ModuleVisitor::Dispatch(WfVirtualExpression* node)
{
node->Accept(static_cast<VirtualExpressionVisitor*>(this));
return this->result;
}
vl::Ptr<vl::parsing::ParsingTreeCustomBase> ModuleVisitor::Dispatch(WfVirtualStatement* node)
{
node->Accept(static_cast<VirtualStatementVisitor*>(this));
return this->result;
}
vl::Ptr<vl::parsing::ParsingTreeCustomBase> ModuleVisitor::Dispatch(WfCoroutineStatement* node)
{
node->Accept(static_cast<CoroutineStatementVisitor*>(this));
return this->result;
}
vl::Ptr<vl::parsing::ParsingTreeCustomBase> ModuleVisitor::Dispatch(WfVirtualDeclaration* node)
{
node->Accept(static_cast<VirtualDeclarationVisitor*>(this));
return this->result;
}
}
}
}
/***********************************************************************
EXPRESSION\WFEXPRESSION_EMPTY.CPP
***********************************************************************/
/***********************************************************************
Vczh Library++ 3.0
Developer: Zihan Chen(vczh)
Parser::WfExpression.parser.txt
This file is generated by: Vczh Parser Generator
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace empty_visitor
{
/***********************************************************************
TypeVisitor
***********************************************************************/
// Visitor Members -----------------------------------
void TypeVisitor::Visit(WfPredefinedType* node)
{
}
void TypeVisitor::Visit(WfTopQualifiedType* node)
{
}
void TypeVisitor::Visit(WfReferenceType* node)
{
}
void TypeVisitor::Visit(WfRawPointerType* node)
{
}
void TypeVisitor::Visit(WfSharedPointerType* node)
{
}
void TypeVisitor::Visit(WfNullableType* node)
{
}
void TypeVisitor::Visit(WfEnumerableType* node)
{
}
void TypeVisitor::Visit(WfMapType* node)
{
}
void TypeVisitor::Visit(WfFunctionType* node)
{
}
void TypeVisitor::Visit(WfChildType* node)
{
}
/***********************************************************************
ExpressionVisitor
***********************************************************************/
// Visitor Members -----------------------------------
void ExpressionVisitor::Visit(WfThisExpression* node)
{
}
void ExpressionVisitor::Visit(WfTopQualifiedExpression* node)
{
}
void ExpressionVisitor::Visit(WfReferenceExpression* node)
{
}
void ExpressionVisitor::Visit(WfOrderedNameExpression* node)
{
}
void ExpressionVisitor::Visit(WfOrderedLambdaExpression* node)
{
}
void ExpressionVisitor::Visit(WfMemberExpression* node)
{
}
void ExpressionVisitor::Visit(WfChildExpression* node)
{
}
void ExpressionVisitor::Visit(WfLiteralExpression* node)
{
}
void ExpressionVisitor::Visit(WfFloatingExpression* node)
{
}
void ExpressionVisitor::Visit(WfIntegerExpression* node)
{
}
void ExpressionVisitor::Visit(WfStringExpression* node)
{
}
void ExpressionVisitor::Visit(WfUnaryExpression* node)
{
}
void ExpressionVisitor::Visit(WfBinaryExpression* node)
{
}
void ExpressionVisitor::Visit(WfLetExpression* node)
{
}
void ExpressionVisitor::Visit(WfIfExpression* node)
{
}
void ExpressionVisitor::Visit(WfRangeExpression* node)
{
}
void ExpressionVisitor::Visit(WfSetTestingExpression* node)
{
}
void ExpressionVisitor::Visit(WfConstructorExpression* node)
{
}
void ExpressionVisitor::Visit(WfInferExpression* node)
{
}
void ExpressionVisitor::Visit(WfTypeCastingExpression* node)
{
}
void ExpressionVisitor::Visit(WfTypeTestingExpression* node)
{
}
void ExpressionVisitor::Visit(WfTypeOfTypeExpression* node)
{
}
void ExpressionVisitor::Visit(WfTypeOfExpressionExpression* node)
{
}
void ExpressionVisitor::Visit(WfAttachEventExpression* node)
{
}
void ExpressionVisitor::Visit(WfDetachEventExpression* node)
{
}
void ExpressionVisitor::Visit(WfObserveExpression* node)
{
}
void ExpressionVisitor::Visit(WfCallExpression* node)
{
}
void ExpressionVisitor::Visit(WfFunctionExpression* node)
{
}
void ExpressionVisitor::Visit(WfNewClassExpression* node)
{
}
void ExpressionVisitor::Visit(WfNewInterfaceExpression* node)
{
}
void ExpressionVisitor::Visit(WfVirtualExpression* node)
{
Dispatch(node);
}
/***********************************************************************
StatementVisitor
***********************************************************************/
// Visitor Members -----------------------------------
void StatementVisitor::Visit(WfBreakStatement* node)
{
}
void StatementVisitor::Visit(WfContinueStatement* node)
{
}
void StatementVisitor::Visit(WfReturnStatement* node)
{
}
void StatementVisitor::Visit(WfDeleteStatement* node)
{
}
void StatementVisitor::Visit(WfRaiseExceptionStatement* node)
{
}
void StatementVisitor::Visit(WfIfStatement* node)
{
}
void StatementVisitor::Visit(WfWhileStatement* node)
{
}
void StatementVisitor::Visit(WfTryStatement* node)
{
}
void StatementVisitor::Visit(WfBlockStatement* node)
{
}
void StatementVisitor::Visit(WfVariableStatement* node)
{
}
void StatementVisitor::Visit(WfExpressionStatement* node)
{
}
void StatementVisitor::Visit(WfVirtualStatement* node)
{
Dispatch(node);
}
void StatementVisitor::Visit(WfCoroutineStatement* node)
{
Dispatch(node);
}
/***********************************************************************
DeclarationVisitor
***********************************************************************/
// Visitor Members -----------------------------------
void DeclarationVisitor::Visit(WfNamespaceDeclaration* node)
{
}
void DeclarationVisitor::Visit(WfFunctionDeclaration* node)
{
}
void DeclarationVisitor::Visit(WfVariableDeclaration* node)
{
}
void DeclarationVisitor::Visit(WfEventDeclaration* node)
{
}
void DeclarationVisitor::Visit(WfPropertyDeclaration* node)
{
}
void DeclarationVisitor::Visit(WfConstructorDeclaration* node)
{
}
void DeclarationVisitor::Visit(WfDestructorDeclaration* node)
{
}
void DeclarationVisitor::Visit(WfClassDeclaration* node)
{
}
void DeclarationVisitor::Visit(WfEnumDeclaration* node)
{
}
void DeclarationVisitor::Visit(WfStructDeclaration* node)
{
}
void DeclarationVisitor::Visit(WfVirtualDeclaration* node)
{
Dispatch(node);
}
/***********************************************************************
VirtualDeclarationVisitor
***********************************************************************/
// Visitor Members -----------------------------------
void VirtualDeclarationVisitor::Visit(WfAutoPropertyDeclaration* node)
{
}
void VirtualDeclarationVisitor::Visit(WfCastResultInterfaceDeclaration* node)
{
}
/***********************************************************************
VirtualStatementVisitor
***********************************************************************/
// Visitor Members -----------------------------------
void VirtualStatementVisitor::Visit(WfForEachStatement* node)
{
}
void VirtualStatementVisitor::Visit(WfSwitchStatement* node)
{
}
void VirtualStatementVisitor::Visit(WfCoProviderStatement* node)
{
}
/***********************************************************************
CoroutineStatementVisitor
***********************************************************************/
// Visitor Members -----------------------------------
void CoroutineStatementVisitor::Visit(WfCoPauseStatement* node)
{
}
void CoroutineStatementVisitor::Visit(WfCoOperatorStatement* node)
{
}
/***********************************************************************
VirtualExpressionVisitor
***********************************************************************/
// Visitor Members -----------------------------------
void VirtualExpressionVisitor::Visit(WfBindExpression* node)
{
}
void VirtualExpressionVisitor::Visit(WfFormatExpression* node)
{
}
void VirtualExpressionVisitor::Visit(WfNewCoroutineExpression* node)
{
}
void VirtualExpressionVisitor::Visit(WfMixinCastExpression* node)
{
}
/***********************************************************************
ModuleUsingFragmentVisitor
***********************************************************************/
// Visitor Members -----------------------------------
void ModuleUsingFragmentVisitor::Visit(WfModuleUsingNameFragment* node)
{
}
void ModuleUsingFragmentVisitor::Visit(WfModuleUsingWildCardFragment* node)
{
}
}
}
}
/***********************************************************************
EXPRESSION\WFEXPRESSION_PARSER.CPP
***********************************************************************/
/***********************************************************************
Vczh Library++ 3.0
Developer: Zihan Chen(vczh)
Parser::WfExpression.parser.txt
This file is generated by: Vczh Parser Generator
***********************************************************************/
namespace vl
{
namespace workflow
{
/***********************************************************************
ParserText
***********************************************************************/
const wchar_t parserTextBuffer[] =
L"\r\n" L""
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L"// AST (Root Types)"
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L""
L"\r\n" L"enum ClassMemberKind"
L"\r\n" L"{"
L"\r\n" L"\tStatic,"
L"\r\n" L"\tOverride,"
L"\r\n" L"\tNormal,"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class ClassMember"
L"\r\n" L"{"
L"\r\n" L"\tClassMemberKind\t\t\tkind;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class Type"
L"\r\n" L"{"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class Expression"
L"\r\n" L"{"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class Statement"
L"\r\n" L"{"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class Attribute"
L"\r\n" L"{"
L"\r\n" L"\ttoken\t\t\t\t\tcategory;"
L"\r\n" L"\ttoken\t\t\t\t\tname;"
L"\r\n" L"\tExpression\t\t\t\tvalue;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class Declaration"
L"\r\n" L"{"
L"\r\n" L"\tAttribute[]\t\t\t\tattributes;"
L"\r\n" L"\ttoken\t\t\t\t\tname;"
L"\r\n" L"\tClassMember\t\t\t\tclassMember;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L"// AST (Types)"
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L""
L"\r\n" L"enum PredefinedTypeName"
L"\r\n" L"{"
L"\r\n" L"\tVoid,"
L"\r\n" L"\tObject,"
L"\r\n" L"\tInterface,"
L"\r\n" L"\tInt,"
L"\r\n" L"\tUInt,"
L"\r\n" L"\tFloat,"
L"\r\n" L"\tDouble,"
L"\r\n" L"\tString,"
L"\r\n" L"\tChar,"
L"\r\n" L"\tBool,"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class PredefinedType : Type"
L"\r\n" L"{"
L"\r\n" L"\tPredefinedTypeName\t\tname;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class TopQualifiedType : Type"
L"\r\n" L"{"
L"\r\n" L"\ttoken\t\t\t\t\tname;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class ReferenceType : Type"
L"\r\n" L"{"
L"\r\n" L"\ttoken\t\t\t\t\tname;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class RawPointerType : Type"
L"\r\n" L"{"
L"\r\n" L"\tType\t\t\t\t\telement;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class SharedPointerType : Type"
L"\r\n" L"{"
L"\r\n" L"\tType\t\t\t\t\telement;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class NullableType : Type"
L"\r\n" L"{"
L"\r\n" L"\tType\t\t\t\t\telement;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class EnumerableType : Type"
L"\r\n" L"{"
L"\r\n" L"\tType\t\t\t\t\telement;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"enum MapWritability"
L"\r\n" L"{"
L"\r\n" L"\tReadonly,"
L"\r\n" L"\tWritable,"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class MapType : Type"
L"\r\n" L"{"
L"\r\n" L"\tMapWritability\t\t\twritability;"
L"\r\n" L"\tType\t\t\t\t\tkey;"
L"\r\n" L"\tType\t\t\t\t\tvalue;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class FunctionType : Type"
L"\r\n" L"{"
L"\r\n" L"\tType\t\t\t\t\tresult;"
L"\r\n" L"\tType[]\t\t\t\t\targuments;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class ChildType : Type"
L"\r\n" L"{"
L"\r\n" L"\tType\t\t\t\t\tparent;"
L"\r\n" L"\ttoken\t\t\t\t\tname;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L"// AST (Declarations)"
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L""
L"\r\n" L"class NamespaceDeclaration : Declaration"
L"\r\n" L"{"
L"\r\n" L"\tDeclaration[]\t\t\tdeclarations;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class FunctionArgument"
L"\r\n" L"{"
L"\r\n" L"\tAttribute[]\t\t\t\tattributes;"
L"\r\n" L"\ttoken\t\t\t\t\tname;"
L"\r\n" L"\tType\t\t\t\t\ttype;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"enum FunctionAnonymity"
L"\r\n" L"{"
L"\r\n" L"\tNamed,"
L"\r\n" L"\tAnonymous,"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class FunctionDeclaration : Declaration"
L"\r\n" L"{"
L"\r\n" L"\tFunctionAnonymity\t\tanonymity;"
L"\r\n" L"\tFunctionArgument[]\t\targuments;"
L"\r\n" L"\tType\t\t\t\t\treturnType;"
L"\r\n" L"\tStatement\t\t\t\tstatement;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class VariableDeclaration : Declaration"
L"\r\n" L"{"
L"\r\n" L"\tType\t\t\t\t\ttype;"
L"\r\n" L"\tExpression\t\t\t\texpression;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class EventDeclaration : Declaration"
L"\r\n" L"{"
L"\r\n" L"\tType[]\t\t\t\t\targuments;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class PropertyDeclaration : Declaration"
L"\r\n" L"{"
L"\r\n" L"\tType\t\t\t\t\ttype;"
L"\r\n" L"\ttoken\t\t\t\t\tgetter;"
L"\r\n" L"\ttoken\t\t\t\t\tsetter;"
L"\r\n" L"\ttoken\t\t\t\t\tvalueChangedEvent;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"enum ClassKind"
L"\r\n" L"{"
L"\r\n" L"\tClass,"
L"\r\n" L"\tInterface,"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"enum ConstructorType"
L"\r\n" L"{"
L"\r\n" L"\tUndefined,"
L"\r\n" L"\tSharedPtr,"
L"\r\n" L"\tRawPtr,"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class BaseConstructorCall"
L"\r\n" L"{"
L"\r\n" L"\tType\t\t\t\t\ttype;"
L"\r\n" L"\tExpression[]\t\t\targuments;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class ConstructorDeclaration : Declaration"
L"\r\n" L"{"
L"\r\n" L"\tConstructorType\t\t\tconstructorType;"
L"\r\n" L"\tBaseConstructorCall[]\tbaseConstructorCalls;"
L"\r\n" L"\tFunctionArgument[]\t\targuments;"
L"\r\n" L"\tStatement\t\t\t\tstatement;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class DestructorDeclaration : Declaration"
L"\r\n" L"{"
L"\r\n" L"\tStatement\t\t\t\tstatement;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class ClassDeclaration : Declaration"
L"\r\n" L"{"
L"\r\n" L"\tClassKind\t\t\t\tkind;"
L"\r\n" L"\tConstructorType\t\t\tconstructorType;"
L"\r\n" L"\tType[]\t\t\t\t\tbaseTypes;"
L"\r\n" L"\tDeclaration[]\t\t\tdeclarations (SetDefaultClassMember);"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"enum EnumKind"
L"\r\n" L"{"
L"\r\n" L"\tNormal,"
L"\r\n" L"\tFlag,"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"enum EnumItemKind"
L"\r\n" L"{"
L"\r\n" L"\tConstant,"
L"\r\n" L"\tIntersection,"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class EnumItemIntersection"
L"\r\n" L"{"
L"\r\n" L"\ttoken\t\t\t\t\tname;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class EnumItem"
L"\r\n" L"{"
L"\r\n" L"\tAttribute[]\t\t\t\tattributes;"
L"\r\n" L"\ttoken\t\t\t\t\tname;"
L"\r\n" L"\tEnumItemKind\t\t\tkind;"
L"\r\n" L"\ttoken\t\t\t\t\tnumber;"
L"\r\n" L"\tEnumItemIntersection[]\tintersections;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class EnumDeclaration : Declaration"
L"\r\n" L"{"
L"\r\n" L"\tEnumKind\t\t\t\tkind;"
L"\r\n" L"\tEnumItem[]\t\t\t\titems;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class StructMember"
L"\r\n" L"{"
L"\r\n" L"\tAttribute[]\t\t\t\tattributes;"
L"\r\n" L"\ttoken\t\t\t\t\tname;"
L"\r\n" L"\tType\t\t\t\t\ttype;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class StructDeclaration : Declaration"
L"\r\n" L"{"
L"\r\n" L"\tStructMember[]\t\t\tmembers;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L"// AST (VirtualDeclarations)"
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L""
L"\r\n" L"class VirtualDeclaration : Declaration"
L"\r\n" L"{"
L"\r\n" L"\tDeclaration[]\t\t\texpandedDeclarations;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"enum APConst"
L"\r\n" L"{"
L"\r\n" L"\tReadonly,"
L"\r\n" L"\tWritable,"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"enum APObserve"
L"\r\n" L"{"
L"\r\n" L"\tObservable,"
L"\r\n" L"\tNotObservable,"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class AutoPropertyDeclaration : VirtualDeclaration"
L"\r\n" L"{"
L"\r\n" L"\tType\t\t\t\t\ttype;"
L"\r\n" L"\tAPConst\t\t\t\t\tconfigConst;"
L"\r\n" L"\tAPObserve\t\t\t\tconfigObserve;"
L"\r\n" L"\tExpression\t\t\t\texpression;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class CastResultInterfaceDeclaration : VirtualDeclaration"
L"\r\n" L"{"
L"\r\n" L"\tType\t\t\t\t\tbaseType;"
L"\r\n" L"\tType\t\t\t\t\telementType;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L"// AST (Statements)"
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L""
L"\r\n" L"class BreakStatement : Statement"
L"\r\n" L"{"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class ContinueStatement : Statement"
L"\r\n" L"{"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class ReturnStatement : Statement"
L"\r\n" L"{"
L"\r\n" L"\tExpression\t\t\t\texpression;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class DeleteStatement : Statement"
L"\r\n" L"{"
L"\r\n" L"\tExpression\t\t\t\texpression;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class RaiseExceptionStatement : Statement"
L"\r\n" L"{"
L"\r\n" L"\tExpression\t\t\t\texpression;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class IfStatement : Statement"
L"\r\n" L"{"
L"\r\n" L"\tType\t\t\t\t\ttype;"
L"\r\n" L"\ttoken\t\t\t\t\tname;"
L"\r\n" L"\tExpression\t\t\t\texpression;"
L"\r\n" L"\tStatement\t\t\t\ttrueBranch;"
L"\r\n" L"\tStatement\t\t\t\tfalseBranch;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class WhileStatement : Statement"
L"\r\n" L"{"
L"\r\n" L"\tExpression\t\t\t\tcondition;"
L"\r\n" L"\tStatement\t\t\t\tstatement;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class TryStatement : Statement"
L"\r\n" L"{"
L"\r\n" L"\tStatement\t\t\t\tprotectedStatement;"
L"\r\n" L"\ttoken\t\t\t\t\tname;"
L"\r\n" L"\tStatement\t\t\t\tcatchStatement;"
L"\r\n" L"\tStatement\t\t\t\tfinallyStatement;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class BlockStatement : Statement"
L"\r\n" L"{"
L"\r\n" L"\tStatement[]\t\t\t\tstatements;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class VariableStatement : Statement"
L"\r\n" L"{"
L"\r\n" L"\tVariableDeclaration\t\tvariable;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class ExpressionStatement : Statement"
L"\r\n" L"{"
L"\r\n" L"\tExpression\t\t\t\texpression;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L"// AST (VirtualStatements)"
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L""
L"\r\n" L"class VirtualStatement : Statement"
L"\r\n" L"{"
L"\r\n" L"\tStatement\t\t\t\texpandedStatement;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"enum ForEachDirection"
L"\r\n" L"{"
L"\r\n" L"\tNormal,"
L"\r\n" L"\tReversed,"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class ForEachStatement : VirtualStatement"
L"\r\n" L"{"
L"\r\n" L"\ttoken\t\t\t\t\tname;"
L"\r\n" L"\tForEachDirection\t\tdirection;"
L"\r\n" L"\tExpression\t\t\t\tcollection;"
L"\r\n" L"\tStatement\t\t\t\tstatement;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class SwitchCase"
L"\r\n" L"{"
L"\r\n" L"\tExpression\t\t\t\texpression;"
L"\r\n" L"\tStatement\t\t\t\tstatement;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class SwitchStatement : VirtualStatement"
L"\r\n" L"{"
L"\r\n" L"\tExpression\t\t\t\texpression;"
L"\r\n" L"\tSwitchCase[]\t\t\tcaseBranches;"
L"\r\n" L"\tStatement\t\t\t\tdefaultBranch;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class CoProviderStatement : VirtualStatement"
L"\r\n" L"{"
L"\r\n" L"\ttoken\t\t\t\t\tname;"
L"\r\n" L"\tStatement\t\t\t\tstatement;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L"// AST (CoroutineStatements)"
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L""
L"\r\n" L"class CoroutineStatement : Statement"
L"\r\n" L"{"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class CoPauseStatement : CoroutineStatement"
L"\r\n" L"{"
L"\r\n" L"\tStatement\t\t\t\tstatement;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class CoOperatorStatement : CoroutineStatement"
L"\r\n" L"{"
L"\r\n" L"\ttoken\t\t\t\t\tvarName;"
L"\r\n" L"\ttoken\t\t\t\t\topName;"
L"\r\n" L"\tExpression[]\t\t\targuments;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L"// AST (Expressions)"
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L""
L"\r\n" L"class ThisExpression : Expression"
L"\r\n" L"{"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class TopQualifiedExpression : Expression"
L"\r\n" L"{"
L"\r\n" L"\ttoken\t\t\t\t\tname;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class ReferenceExpression : Expression"
L"\r\n" L"{"
L"\r\n" L"\ttoken\t\t\t\t\tname;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class OrderedNameExpression : Expression"
L"\r\n" L"{"
L"\r\n" L"\ttoken\t\t\t\t\tname;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class OrderedLambdaExpression : Expression"
L"\r\n" L"{"
L"\r\n" L"\tExpression\t\t\t\tbody;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class MemberExpression : Expression"
L"\r\n" L"{"
L"\r\n" L"\tExpression\t\t\t\tparent;"
L"\r\n" L"\ttoken\t\t\t\t\tname;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class ChildExpression : Expression"
L"\r\n" L"{"
L"\r\n" L"\tExpression\t\t\t\tparent;"
L"\r\n" L"\ttoken\t\t\t\t\tname;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"enum LiteralValue"
L"\r\n" L"{"
L"\r\n" L"\tNull,"
L"\r\n" L"\tTrue,"
L"\r\n" L"\tFalse,"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class LiteralExpression : Expression"
L"\r\n" L"{"
L"\r\n" L"\tLiteralValue\t\t\tvalue;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class FloatingExpression : Expression"
L"\r\n" L"{"
L"\r\n" L"\ttoken\t\t\t\t\tvalue;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class IntegerExpression : Expression"
L"\r\n" L"{"
L"\r\n" L"\ttoken\t\t\t\t\tvalue;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class StringExpression : Expression"
L"\r\n" L"{"
L"\r\n" L"\ttoken\t\t\t\t\tvalue(UnescapeString);"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"enum UnaryOperator"
L"\r\n" L"{"
L"\r\n" L"\tPositive,"
L"\r\n" L"\tNegative,"
L"\r\n" L"\tNot,"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class UnaryExpression : Expression"
L"\r\n" L"{"
L"\r\n" L"\tUnaryOperator\t\t\top;"
L"\r\n" L"\tExpression\t\t\t\toperand;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"enum BinaryOperator"
L"\r\n" L"{"
L"\r\n" L"\tAssign,"
L"\r\n" L"\tIndex,"
L"\r\n" L"\tUnion,"
L"\r\n" L"\tIntersect,"
L"\r\n" L"\tFailedThen,"
L"\r\n" L"\tExp,"
L"\r\n" L"\tAdd,"
L"\r\n" L"\tSub,"
L"\r\n" L"\tMul,"
L"\r\n" L"\tDiv,"
L"\r\n" L"\tMod,"
L"\r\n" L"\tShl,"
L"\r\n" L"\tShr,"
L"\r\n" L"\tLT,"
L"\r\n" L"\tGT,"
L"\r\n" L"\tLE,"
L"\r\n" L"\tGE,"
L"\r\n" L"\tEQ,"
L"\r\n" L"\tNE,"
L"\r\n" L"\tXor,"
L"\r\n" L"\tAnd,"
L"\r\n" L"\tOr,"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class BinaryExpression : Expression"
L"\r\n" L"{"
L"\r\n" L"\tBinaryOperator\t\t\top;"
L"\r\n" L"\tExpression\t\t\t\tfirst;"
L"\r\n" L"\tExpression\t\t\t\tsecond;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class LetVariable"
L"\r\n" L"{"
L"\r\n" L"\ttoken\t\t\t\t\tname;"
L"\r\n" L"\tExpression\t\t\t\tvalue;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class LetExpression : Expression"
L"\r\n" L"{"
L"\r\n" L"\tLetVariable[]\t\t\tvariables;"
L"\r\n" L"\tExpression\t\t\t\texpression;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class IfExpression : Expression"
L"\r\n" L"{"
L"\r\n" L"\tExpression\t\t\t\tcondition;"
L"\r\n" L"\tExpression\t\t\t\ttrueBranch;"
L"\r\n" L"\tExpression\t\t\t\tfalseBranch;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"enum RangeBoundary"
L"\r\n" L"{"
L"\r\n" L"\tInclusive,"
L"\r\n" L"\tExclusive,"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class RangeExpression : Expression"
L"\r\n" L"{"
L"\r\n" L"\tExpression\t\t\t\tbegin;"
L"\r\n" L"\tRangeBoundary\t\t\tbeginBoundary;"
L"\r\n" L"\tExpression\t\t\t\tend;"
L"\r\n" L"\tRangeBoundary\t\t\tendBoundary;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"enum SetTesting"
L"\r\n" L"{"
L"\r\n" L"\tIn,"
L"\r\n" L"\tNotIn,"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class SetTestingExpression : Expression"
L"\r\n" L"{"
L"\r\n" L"\tSetTesting\t\t\t\ttest;"
L"\r\n" L"\tExpression\t\t\t\telement;"
L"\r\n" L"\tExpression\t\t\t\tcollection;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class ConstructorArgument"
L"\r\n" L"{"
L"\r\n" L"\tExpression\t\t\t\tkey;"
L"\r\n" L"\tExpression\t\t\t\tvalue;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class ConstructorExpression : Expression"
L"\r\n" L"{"
L"\r\n" L"\tConstructorArgument[]\targuments;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class InferExpression : Expression"
L"\r\n" L"{"
L"\r\n" L"\tExpression\t\t\t\texpression;"
L"\r\n" L"\tType\t\t\t\t\ttype;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"enum TypeCastingStrategy"
L"\r\n" L"{"
L"\r\n" L"\tStrong,"
L"\r\n" L"\tWeak,"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class TypeCastingExpression : Expression"
L"\r\n" L"{"
L"\r\n" L"\tTypeCastingStrategy\t\tstrategy;"
L"\r\n" L"\tExpression\t\t\t\texpression;"
L"\r\n" L"\tType\t\t\t\t\ttype;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"enum TypeTesting"
L"\r\n" L"{"
L"\r\n" L"\tIsType,"
L"\r\n" L"\tIsNotType,"
L"\r\n" L"\tIsNull,"
L"\r\n" L"\tIsNotNull,"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class TypeTestingExpression : Expression"
L"\r\n" L"{"
L"\r\n" L"\tTypeTesting\t\t\t\ttest;"
L"\r\n" L"\tExpression\t\t\t\texpression;"
L"\r\n" L"\tType\t\t\t\t\ttype;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class TypeOfTypeExpression : Expression"
L"\r\n" L"{"
L"\r\n" L"\tType\t\t\t\t\ttype;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class TypeOfExpressionExpression : Expression"
L"\r\n" L"{"
L"\r\n" L"\tExpression\t\t\t\texpression;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class AttachEventExpression : Expression"
L"\r\n" L"{"
L"\r\n" L"\tExpression\t\t\t\tevent;"
L"\r\n" L"\tExpression\t\t\t\tfunction;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class DetachEventExpression : Expression"
L"\r\n" L"{"
L"\r\n" L"\tExpression\t\t\t\tevent;"
L"\r\n" L"\tExpression\t\t\t\thandler;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"enum ObserveType"
L"\r\n" L"{"
L"\r\n" L"\tSimpleObserve,"
L"\r\n" L"\tExtendedObserve,"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class ObserveExpression : Expression"
L"\r\n" L"{"
L"\r\n" L"\tExpression\t\t\t\tparent;"
L"\r\n" L"\tObserveType\t\t\t\tobserveType;"
L"\r\n" L"\ttoken\t\t\t\t\tname;"
L"\r\n" L"\tExpression\t\t\t\texpression;"
L"\r\n" L"\tExpression[]\t\t\tevents;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class CallExpression : Expression"
L"\r\n" L"{"
L"\r\n" L"\tExpression\t\t\t\tfunction;"
L"\r\n" L"\tExpression[]\t\t\targuments;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class FunctionExpression : Expression"
L"\r\n" L"{"
L"\r\n" L"\tFunctionDeclaration\t\tfunction;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class NewClassExpression : Expression"
L"\r\n" L"{"
L"\r\n" L"\tType\t\t\t\t\ttype;"
L"\r\n" L"\tExpression[]\t\t\targuments;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class NewInterfaceExpression : Expression"
L"\r\n" L"{"
L"\r\n" L"\tType\t\t\t\t\ttype;"
L"\r\n" L"\tDeclaration[]\t\t\tdeclarations (SetDefaultClassMember);"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L"// AST (VirtualExpressions)"
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L""
L"\r\n" L"class VirtualExpression : Expression"
L"\r\n" L"{"
L"\r\n" L"\tExpression\t\t\t\texpandedExpression;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class BindExpression : VirtualExpression"
L"\r\n" L"{"
L"\r\n" L"\tExpression\t\t\t\texpression;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class FormatExpression : VirtualExpression"
L"\r\n" L"{"
L"\r\n" L"\ttoken\t\t\t\t\tvalue(UnescapeFormatString);"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class NewCoroutineExpression : VirtualExpression"
L"\r\n" L"{"
L"\r\n" L"\ttoken\t\t\t\t\tname;"
L"\r\n" L"\tStatement\t\t\t\tstatement;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class MixinCastExpression : VirtualExpression"
L"\r\n" L"{"
L"\r\n" L"\tType\t\t\t\t\ttype;"
L"\r\n" L"\tExpression\t\t\t\texpression;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L"// AST (Module)"
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L""
L"\r\n" L"class ModuleUsingFragment"
L"\r\n" L"{"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class ModuleUsingNameFragment : ModuleUsingFragment"
L"\r\n" L"{"
L"\r\n" L"\ttoken\t\t\t\t\tname;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class ModuleUsingWildCardFragment : ModuleUsingFragment"
L"\r\n" L"{"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class ModuleUsingItem"
L"\r\n" L"{"
L"\r\n" L"\tModuleUsingFragment[]\tfragments;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class ModuleUsingPath"
L"\r\n" L"{"
L"\r\n" L"\tModuleUsingItem[]\t\titems;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"enum ModuleType"
L"\r\n" L"{"
L"\r\n" L"\tModule,"
L"\r\n" L"\tUnit,"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"class Module"
L"\r\n" L"{"
L"\r\n" L"\tModuleType\t\t\t\tmoduleType;"
L"\r\n" L"\ttoken\t\t\t\t\tname;"
L"\r\n" L"\tModuleUsingPath[]\t\tpaths;"
L"\r\n" L"\tDeclaration[]\t\t\tdeclarations;"
L"\r\n" L"}"
L"\r\n" L""
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L"// Lexer"
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L""
L"\r\n" L"token EXP = \"/^\";"
L"\r\n" L"token ADD = \"/+\";"
L"\r\n" L"token SUB = \"-\";"
L"\r\n" L"token MUL = \"/*\";"
L"\r\n" L"token DIV = \"//\";"
L"\r\n" L"token MOD = \"%\";"
L"\r\n" L"token UNION = \"&\";"
L"\r\n" L"token INTERSECTION = \"/|\";"
L"\r\n" L"token LE = \"/</=\";"
L"\r\n" L"token GE = \"/>/=\";"
L"\r\n" L"token LT = \"/<\";"
L"\r\n" L"token GT = \"/>\";"
L"\r\n" L"token EQ = \"/=/=\";"
L"\r\n" L"token NE = \"/!/=\";"
L"\r\n" L"token ASSIGN = \"/=\";"
L"\r\n" L"token FAILED_THEN = \"/?/?\";"
L"\r\n" L"token QUESTION_MARK = \"/?\";"
L"\r\n" L"token SCOPE_DELIMITER = \"::\";"
L"\r\n" L"token COLON = \":\";"
L"\r\n" L"token SEMICOLON = \";\";"
L"\r\n" L"token COMMA = \",\";"
L"\r\n" L"token DOT = \".\";"
L"\r\n" L"token OPEN_ARRAY = \"/[\";"
L"\r\n" L"token CLOSE_ARRAY = \"/]\";"
L"\r\n" L"token OPEN_BRACE = \"/{\";"
L"\r\n" L"token CLOSE_BRACE = \"/}\";"
L"\r\n" L"token OPEN_BRACKET = \"/(\";"
L"\r\n" L"token CLOSE_BRACKET = \"/)\";"
L"\r\n" L"token AT = \"@\";"
L"\r\n" L""
L"\r\n" L"token TYPE_VOID = \"void\";"
L"\r\n" L"token TYPE_OBJECT = \"object\";"
L"\r\n" L"token TYPE_INTERFACE = \"interface\";"
L"\r\n" L"token TYPE_INT = \"int\";"
L"\r\n" L"token TYPE_UINT = \"uint\";"
L"\r\n" L"token TYPE_FLOAT = \"float\";"
L"\r\n" L"token TYPE_DOUBLE = \"double\";"
L"\r\n" L"token TYPE_STRING = \"string\";"
L"\r\n" L"token TYPE_CHAR = \"char\";"
L"\r\n" L"token TYPE_BOOL = \"bool\";"
L"\r\n" L""
L"\r\n" L"token KEYWORD_CONST = \"const\";"
L"\r\n" L"token KEYWORD_SHL = \"shl\";"
L"\r\n" L"token KEYWORD_SHR = \"shr\";"
L"\r\n" L"token KEYWORD_XOR = \"xor\";"
L"\r\n" L"token KEYWORD_AND = \"and\";"
L"\r\n" L"token KEYWORD_OR = \"or\";"
L"\r\n" L"token KEYWORD_NOT = \"not\";"
L"\r\n" L"token KEYWORD_NULL= \"null\";"
L"\r\n" L"token KEYWORD_THIS= \"this\";"
L"\r\n" L"token KEYWORD_TRUE= \"true\";"
L"\r\n" L"token KEYWORD_FALSE = \"false\";"
L"\r\n" L"token KEYWORD_LET = \"let\";"
L"\r\n" L"token KEYWORD_IN = \"in\";"
L"\r\n" L"token KEYWORD_RANGE = \"range\";"
L"\r\n" L"token KEYWORD_NEW = \"new\";"
L"\r\n" L"token KEYWORD_OF = \"of\";"
L"\r\n" L"token KEYWORD_AS = \"as\";"
L"\r\n" L"token KEYWORD_IS = \"is\";"
L"\r\n" L"token KEYWORD_CAST = \"cast\";"
L"\r\n" L"token KEYWORD_FUNC = \"func\";"
L"\r\n" L"token KEYWORD_TYPEOF = \"typeof\";"
L"\r\n" L"token KEYWORD_TYPE = \"type\";"
L"\r\n" L"token KEYWORD_BIND = \"bind\";"
L"\r\n" L"token KEYWORD_OBSERVE = \"observe\";"
L"\r\n" L"token KEYWORD_ON = \"on\";"
L"\r\n" L"token KEYWORD_ATTACH = \"attach\";"
L"\r\n" L"token KEYWORD_DETACH = \"detach\";"
L"\r\n" L"token KEYWORD_VAR = \"var\";"
L"\r\n" L"token KEYWORD_BREAK = \"break\";"
L"\r\n" L"token KEYWORD_CONTINUE = \"continue\";"
L"\r\n" L"token KEYWORD_RETURN = \"return\";"
L"\r\n" L"token KEYWORD_DELETE = \"delete\";"
L"\r\n" L"token KEYWORD_RAISE = \"raise\";"
L"\r\n" L"token KEYWORD_IF = \"if\";"
L"\r\n" L"token KEYWORD_ELSE = \"else\";"
L"\r\n" L"token KEYWORD_SWITCH = \"switch\";"
L"\r\n" L"token KEYWORD_CASE = \"case\";"
L"\r\n" L"token KEYWORD_DEFAULT = \"default\";"
L"\r\n" L"token KEYWORD_WHILE = \"while\";"
L"\r\n" L"token KEYWORD_FOR = \"for\";"
L"\r\n" L"token KEYWORD_REVERSED = \"reversed\";"
L"\r\n" L"token KEYWORD_TRY = \"try\";"
L"\r\n" L"token KEYWORD_CATCH = \"catch\";"
L"\r\n" L"token KEYWORD_FINALLY = \"finally\";"
L"\r\n" L"token KEYWORD_CLASS = \"class\";"
L"\r\n" L"token KEYWORD_ENUM = \"enum\";"
L"\r\n" L"token KEYWORD_FLAGENUM = \"flagenum\";"
L"\r\n" L"token KEYWORD_STRUCT = \"struct\";"
L"\r\n" L"token KEYWORD_PROP = \"prop\";"
L"\r\n" L"token KEYWORD_EVENT = \"event\";"
L"\r\n" L"token KEYWORD_STATIC = \"static\";"
L"\r\n" L"token KEYWORD_OVERRIDE = \"override\";"
L"\r\n" L"token KEYWORD_USING = \"using\";"
L"\r\n" L"token KEYWORD_NAMESPACE = \"namespace\";"
L"\r\n" L"token KEYWORD_MODULE = \"module\";"
L"\r\n" L"token KEYWORD_UNIT = \"unit\";"
L"\r\n" L""
L"\r\n" L"token COROUTINE_COROUTINE = \"/$coroutine\";"
L"\r\n" L"token COROUTINE_PAUSE = \"/$pause\";"
L"\r\n" L"token COROUTINE_INTERFACE = \"/$interface\";"
L"\r\n" L"token COROUTINE_OPERATOR = \"/$[A-Z]/w*\";"
L"\r\n" L"token COROUTINE_SIGN = \"/$\";"
L"\r\n" L""
L"\r\n" L"token NAME = \"[a-zA-Z_]/w*\";"
L"\r\n" L"token ORDERED_NAME = \"/$[0-9]*\";"
L"\r\n" L"token FLOAT = \"/d+./d+\";"
L"\r\n" L"token INTEGER = \"/d+\";"
L"\r\n" L"token STRING = \"\'([^\'\\\\]|\\\\\\.)*\'|\"\"([^\"\"\\\\]|\\\\\\.)*\"\"\";"
L"\r\n" L"token FORMATSTRING = \"/$(\'([^\'\\\\]|\\\\\\.)*\'|\"\"([^\"\"\\\\]|\\\\\\.)*\"\")\";"
L"\r\n" L""
L"\r\n" L"discardtoken SPACE = \"/s+\";"
L"\r\n" L"discardtoken COMMENT = \"///*([^*]|/*+[^//])*/*+//\";"
L"\r\n" L""
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L"// Rule (Type)"
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L""
L"\r\n" L"rule Type _Type"
L"\r\n" L"\t= \"void\" as PredefinedType with {name=\"Void\"}"
L"\r\n" L"\t= \"object\" as PredefinedType with {name=\"Object\"}"
L"\r\n" L"\t= \"interface\" as PredefinedType with {name=\"Interface\"}"
L"\r\n" L"\t= \"int\" as PredefinedType with {name=\"Int\"}"
L"\r\n" L"\t= \"uint\" as PredefinedType with {name=\"UInt\"}"
L"\r\n" L"\t= \"float\" as PredefinedType with {name=\"Float\"}"
L"\r\n" L"\t= \"double\" as PredefinedType with {name=\"Double\"}"
L"\r\n" L"\t= \"string\" as PredefinedType with {name=\"String\"}"
L"\r\n" L"\t= \"char\" as PredefinedType with {name=\"Char\"}"
L"\r\n" L"\t= \"bool\" as PredefinedType with {name=\"Bool\"}"
L"\r\n" L"\t= NAME : name as ReferenceType"
L"\r\n" L"\t= \"func\" \"(\" [_Type : arguments {\",\" _Type : arguments}] \")\" \":\" _Type : result as FunctionType"
L"\r\n" L"\t= _Type : element \"*\" as RawPointerType"
L"\r\n" L"\t= _Type : element \"^\" as SharedPointerType"
L"\r\n" L"\t= _Type : element \"?\" as NullableType"
L"\r\n" L"\t= _Type : element \"{\" \"}\" as EnumerableType"
L"\r\n" L"\t= _Type : value \"[\" [_Type : key] \"]\" as MapType with {writability=\"Writable\"}"
L"\r\n" L"\t= \"const\" _Type : value \"[\" [_Type : key] \"]\" as MapType with {writability=\"Readonly\"}"
L"\r\n" L"\t= _Type : parent \"::\" NAME : name as ChildType"
L"\r\n" L"\t= \"::\" NAME : name as TopQualifiedType"
L"\r\n" L"\t= \"(\" !_Type \")\""
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L"// Rule (Expression)"
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L""
L"\r\n" L"rule ConstructorArgument _CtorFragment"
L"\r\n" L"\t= _Expression : key [ \":\" _Expression : value] as ConstructorArgument"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule LetVariable _LetVariable"
L"\r\n" L"\t= NAME : name \"=\" _Expression : value as LetVariable"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule Expression _VirtualExpression"
L"\r\n" L"\t= FORMATSTRING : value as FormatExpression"
L"\r\n" L"\t= \"bind\" \"(\" _Expression : expression \")\" as BindExpression"
L"\r\n" L"\t= \"$coroutine\" [\"(\" NAME : name \")\"] _Block : statement as NewCoroutineExpression"
L"\r\n" L"\t= \"new\" _Type : type \"(\" \"using\" _Expression : expression \")\" as MixinCastExpression"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule Expression _ExpPrimitive"
L"\r\n" L"\t= \"null\" as LiteralExpression with {value = \"Null\"}"
L"\r\n" L"\t= \"true\" as LiteralExpression with {value = \"True\"}"
L"\r\n" L"\t= \"false\" as LiteralExpression with {value = \"False\"}"
L"\r\n" L"\t= INTEGER : value as IntegerExpression"
L"\r\n" L"\t= FLOAT : value as FloatingExpression"
L"\r\n" L"\t= STRING : value as StringExpression"
L"\r\n" L"\t= \"this\" as ThisExpression"
L"\r\n" L"\t= NAME : name as ReferenceExpression"
L"\r\n" L"\t= ORDERED_NAME : name as OrderedNameExpression"
L"\r\n" L"\t= \"(\" !_Expression \")\""
L"\r\n" L"\t= \"[\" _Expression : body \"]\" as OrderedLambdaExpression"
L"\r\n" L"\t= _Function : function as FunctionExpression"
L"\r\n" L"\t= \"let\" _LetVariable : variables {\",\" _LetVariable : variables} \"in\" \"(\" _Expression : expression \")\" as LetExpression"
L"\r\n" L"\t= \"range\""
L"\r\n" L"\t\t((\"(\" with {beginBoundary = \"Exclusive\"}) | (\"[\" with {beginBoundary = \"Inclusive\"}))"
L"\r\n" L"\t\t_Expression : begin \",\" _Expression : end"
L"\r\n" L"\t\t((\")\" with {endBoundary = \"Exclusive\"}) | (\"]\" with {endBoundary = \"Inclusive\"}))"
L"\r\n" L"\t\tas RangeExpression"
L"\r\n" L"\t= \"{\" {_CtorFragment : arguments} \"}\" as ConstructorExpression"
L"\r\n" L"\t= \"new\" _Type : type \"(\" [_Expression : arguments {\",\" _Expression : arguments}] \")\" as NewClassExpression"
L"\r\n" L"\t= \"new\" _Type : type \"{\" {_MemberDeclaration : declarations} \"}\" as NewInterfaceExpression"
L"\r\n" L"\t= _ExpPrimitive : parent \".\" \"observe\" \"(\" _Expression : expression [\"on\" _Expression : events {\",\" _Expression : events}]\")\" as ObserveExpression with {observeType = \"SimpleObserve\"}"
L"\r\n" L"\t= _ExpPrimitive : parent \".\" \"observe\" \"as\" NAME : name \"(\" _Expression : expression [\"on\" _Expression : events {\",\" _Expression : events}]\")\" as ObserveExpression with {observeType = \"ExtendedObserve\"}"
L"\r\n" L"\t= _ExpPrimitive : function \"(\" [_Expression : arguments {\",\" _Expression : arguments}] \")\" as CallExpression"
L"\r\n" L"\t= _ExpPrimitive : parent \".\" NAME : name as MemberExpression"
L"\r\n" L"\t= _ExpPrimitive : parent \"::\" NAME : name as ChildExpression"
L"\r\n" L"\t= _ExpPrimitive : first \"[\" _Expression : second \"]\" as BinaryExpression with {op = \"Index\"}"
L"\r\n" L"\t= _ExpPrimitive : element"
L"\r\n" L"\t\t((\"in\" with {test=\"In\"}) | (\"not\" \"in\" with {test=\"NotIn\"}))"
L"\r\n" L"\t\t_Expression : collection as SetTestingExpression"
L"\r\n" L"\t= _ExpPrimitive : expression \"of\" _Type : type as InferExpression"
L"\r\n" L"\t= _ExpPrimitive : expression"
L"\r\n" L"\t\t("
L"\r\n" L"\t\t\t("
L"\r\n" L"\t\t\t\t("
L"\r\n" L"\t\t\t\t\t(\"is\" with {test=\"IsType\"})"
L"\r\n" L"\t\t\t\t\t| (\"is\" \"not\" with {test=\"IsNotType\"})"
L"\r\n" L"\t\t\t\t) _Type : type as TypeTestingExpression"
L"\r\n" L"\t\t\t)"
L"\r\n" L"\t\t\t| (\"is\" \"null\" as TypeTestingExpression with {test=\"IsNull\"})"
L"\r\n" L"\t\t\t| (\"is\" \"not\" \"null\" as TypeTestingExpression with {test=\"IsNotNull\"})"
L"\r\n" L"\t\t)"
L"\r\n" L"\t= _ExpPrimitive : expression \"as\" _Type : type as TypeCastingExpression with {strategy = \"Weak\"}"
L"\r\n" L"\t= \"typeof\" \"(\" _Type : type \")\" as TypeOfTypeExpression"
L"\r\n" L"\t= \"type\" \"(\" _Expression : expression \")\" as TypeOfExpressionExpression"
L"\r\n" L"\t= \"attach\" \"(\" _Expression : event \",\" _Expression : function \")\" as AttachEventExpression"
L"\r\n" L"\t= \"detach\" \"(\" _Expression : event \",\" _Expression : handler \")\" as DetachEventExpression"
L"\r\n" L"\t= \"::\" NAME : name as TopQualifiedExpression"
L"\r\n" L"\t= !_VirtualExpression"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule Expression _Exp0"
L"\r\n" L"\t= !_ExpPrimitive"
L"\r\n" L"\t= \"+\" _Exp0 : operand as UnaryExpression with {op = \"Positive\"}"
L"\r\n" L"\t= \"-\" _Exp0 : operand as UnaryExpression with {op = \"Negative\"}"
L"\r\n" L"\t= \"not\" _Exp0 : operand as UnaryExpression with {op = \"Not\"}"
L"\r\n" L"\t= \"cast\" _Type : type _Exp0 : expression as TypeCastingExpression with {strategy = \"Strong\"}"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule Expression _Exp1"
L"\r\n" L"\t= !_Exp0"
L"\r\n" L"\t= _Exp1 : first \"^\" _Exp0 : second as BinaryExpression with {op = \"Exp\"}"
L"\r\n" L"\t;"
L"\r\n" L"rule Expression _Exp2"
L"\r\n" L"\t= !_Exp1"
L"\r\n" L"\t= _Exp2 : first \"*\" _Exp1 : second as BinaryExpression with {op = \"Mul\"}"
L"\r\n" L"\t= _Exp2 : first \"/\" _Exp1 : second as BinaryExpression with {op = \"Div\"}"
L"\r\n" L"\t= _Exp2 : first \"%\" _Exp1 : second as BinaryExpression with {op = \"Mod\"}"
L"\r\n" L"\t;"
L"\r\n" L"rule Expression _Exp3"
L"\r\n" L"\t= !_Exp2"
L"\r\n" L"\t= _Exp3 : first \"+\" _Exp2 : second as BinaryExpression with {op = \"Add\"}"
L"\r\n" L"\t= _Exp3 : first \"-\" _Exp2 : second as BinaryExpression with {op = \"Sub\"}"
L"\r\n" L"\t= _Exp3 : first \"&\" _Exp2 : second as BinaryExpression with {op = \"Union\"}"
L"\r\n" L"\t= _Exp3 : first \"|\" _Exp2 : second as BinaryExpression with {op = \"Intersect\"}"
L"\r\n" L"\t;"
L"\r\n" L"rule Expression _Exp4"
L"\r\n" L"\t= !_Exp3"
L"\r\n" L"\t= _Exp4 : first \"shl\" _Exp3 : second as BinaryExpression with {op = \"Shl\"}"
L"\r\n" L"\t= _Exp4 : first \"shr\" _Exp3 : second as BinaryExpression with {op = \"Shr\"}"
L"\r\n" L"\t;"
L"\r\n" L"rule Expression _Exp5"
L"\r\n" L"\t= !_Exp4"
L"\r\n" L"\t= _Exp5 : first \"<\" _Exp4 : second as BinaryExpression with {op = \"LT\"}"
L"\r\n" L"\t= _Exp5 : first \">\" _Exp4 : second as BinaryExpression with {op = \"GT\"}"
L"\r\n" L"\t= _Exp5 : first \"<=\" _Exp4 : second as BinaryExpression with {op = \"LE\"}"
L"\r\n" L"\t= _Exp5 : first \">=\" _Exp4 : second as BinaryExpression with {op = \"GE\"}"
L"\r\n" L"\t= _Exp5 : first \"==\" _Exp4 : second as BinaryExpression with {op = \"EQ\"}"
L"\r\n" L"\t= _Exp5 : first \"!=\" _Exp4 : second as BinaryExpression with {op = \"NE\"}"
L"\r\n" L"\t;"
L"\r\n" L"rule Expression _Exp6"
L"\r\n" L"\t= !_Exp5"
L"\r\n" L"\t= _Exp6 : first \"xor\" _Exp5 : second as BinaryExpression with {op = \"Xor\"}"
L"\r\n" L"\t;"
L"\r\n" L"rule Expression _Exp7"
L"\r\n" L"\t= !_Exp6"
L"\r\n" L"\t= _Exp7 : first \"and\" _Exp6 : second as BinaryExpression with {op = \"And\"}"
L"\r\n" L"\t;"
L"\r\n" L"rule Expression _Exp8"
L"\r\n" L"\t= !_Exp7"
L"\r\n" L"\t= _Exp8 : first \"or\" _Exp7 : second as BinaryExpression with {op = \"Or\"}"
L"\r\n" L"\t;"
L"\r\n" L"rule Expression _Exp9"
L"\r\n" L"\t= !_Exp8"
L"\r\n" L"\t= _Exp9 : first \"??\" _Exp8 : second as BinaryExpression with {op = \"FailedThen\"}"
L"\r\n" L"\t;"
L"\r\n" L"rule Expression _Exp10"
L"\r\n" L"\t= !_Exp9"
L"\r\n" L"\t= _Exp9 : condition \"?\" _Exp10 : trueBranch \":\" _Exp10 : falseBranch as IfExpression"
L"\r\n" L"\t;"
L"\r\n" L"rule Expression _Exp11"
L"\r\n" L"\t= !_Exp10"
L"\r\n" L"\t= _Exp10 : first \"=\" _Exp11 : second as BinaryExpression with {op = \"Assign\"}"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule Expression _Expression"
L"\r\n" L"\t= !_Exp11"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L"// Rule (Statement)"
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L""
L"\r\n" L"rule SwitchCase _SwitchCase"
L"\r\n" L"\t= \"case\" _Expression : expression \":\" _Block : statement as SwitchCase"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule Statement _Block"
L"\r\n" L"\t= \"{\" {_Statement : statements} \"}\" as BlockStatement"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule IfStatement _If"
L"\r\n" L"\t= \"if\" \"(\" [\"var\" NAME : name \":\" _Type : type \"=\"] _Expression : expression \")\" _Block : trueBranch [\"else\" (_Block : falseBranch | _If : falseBranch)] as IfStatement"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule Statement _VirtualStatement"
L"\r\n" L"\t= \"switch\" \"(\" _Expression : expression \")\" \"{\" {_SwitchCase : caseBranches} [\"default\" \":\" _Block : defaultBranch] \"}\" as SwitchStatement"
L"\r\n" L"\t= \"for\" \"(\" NAME : name "
L"\r\n" L"\t\t((\"in\" with {direction=\"Normal\"}) | (\"in\" \"reversed\" with {direction=\"Reversed\"}))"
L"\r\n" L"\t\t_Expression : collection \")\" _Block : statement as ForEachStatement"
L"\r\n" L"\t= [\"var\" NAME : varName \"=\"] COROUTINE_OPERATOR : opName [_Expression : arguments {\",\" _Expression : arguments}] \";\" as CoOperatorStatement"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule Statement _CoStatement"
L"\r\n" L"\t= \"$pause\" (\";\" | _Block : statement) as CoPauseStatement"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule Statement _CoProvider"
L"\r\n" L"\t= (\"$\" | COROUTINE_OPERATOR : name) _Block : statement as CoProviderStatement"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule Statement _Statement"
L"\r\n" L"\t= !_Block"
L"\r\n" L"\t= _Variable : variable as VariableStatement"
L"\r\n" L"\t= \"break\" \";\" as BreakStatement"
L"\r\n" L"\t= \"continue\" \";\" as ContinueStatement"
L"\r\n" L"\t= \"return\" [_Expression : expression] \";\" as ReturnStatement"
L"\r\n" L"\t= \"delete\" _Expression : expression \";\" as DeleteStatement"
L"\r\n" L"\t= \"raise\" [_Expression : expression] \";\" as RaiseExceptionStatement"
L"\r\n" L"\t= !_If"
L"\r\n" L"\t= \"while\" \"(\" _Expression : condition \")\" _Block : statement as WhileStatement"
L"\r\n" L"\t= \"try\" _Block : protectedStatement [\"catch\" \"(\" NAME : name \")\" _Block : catchStatement] [\"finally\" _Block : finallyStatement] as TryStatement"
L"\r\n" L"\t= _Expression : expression \";\" as ExpressionStatement"
L"\r\n" L"\t= !_VirtualStatement"
L"\r\n" L"\t= !_CoStatement"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L"// Rule (Declaration -- Basic)"
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L""
L"\r\n" L"rule Attribute _Attribute"
L"\r\n" L"\t= \"@\" NAME : category \":\" NAME : name [\"(\" _Expression : value \")\"] as Attribute"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule NamespaceDeclaration _Namespace"
L"\r\n" L"\t= \"namespace\" NAME : name \"{\" {_Declaration : declarations} \"}\" as NamespaceDeclaration"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule FunctionArgument _FunctionArgument"
L"\r\n" L"\t= {_Attribute : attributes} NAME : name \":\" _Type : type as FunctionArgument"
L"\r\n" L"\t;"
L"\r\n" L"rule FunctionDeclaration _Function"
L"\r\n" L"\t= \"func\" "
L"\r\n" L"\t\t("
L"\r\n" L"\t\t\t(NAME : name \"(\" with {anonymity=\"Named\"})"
L"\r\n" L"\t\t\t| (\"(\" with {anonymity=\"Anonymous\"})"
L"\r\n" L"\t\t)"
L"\r\n" L"\t\t[_FunctionArgument : arguments {\",\" _FunctionArgument : arguments}] \")\" \":\" _Type : returnType"
L"\r\n" L"\t\t(_Block : statement | _CoProvider : statement | \";\") as FunctionDeclaration"
L"\r\n" L"\t;"
L"\r\n" L"rule VariableDeclaration _Variable"
L"\r\n" L"\t= \"var\" NAME : name [\":\" _Type : type] \"=\" _Expression : expression \";\" as VariableDeclaration"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule EventDeclaration _Event"
L"\r\n" L"\t= \"event\" NAME : name \"(\" [_Type : arguments {\",\" _Type : arguments}] \")\" \";\" as EventDeclaration"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule PropertyDeclaration _Property"
L"\r\n" L"\t= \"prop\" NAME : name \":\" _Type : type \"{\" NAME : getter [\",\" NAME : setter] [\":\" NAME : valueChangedEvent] \"}\" as PropertyDeclaration"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule BaseConstructorCall _BaseConstructorCall"
L"\r\n" L"\t= _Type : type \"(\" [_Expression : arguments {\",\" _Expression : arguments}] \")\" as BaseConstructorCall"
L"\r\n" L"\t;"
L"\r\n" L"rule ConstructorDeclaration _Constructor"
L"\r\n" L"\t=\t("
L"\r\n" L"\t\t\t(\"new\" with {constructorType = \"SharedPtr\"})"
L"\r\n" L"\t\t\t| (\"new\" \"*\" with {constructorType = \"RawPtr\"})"
L"\r\n" L"\t\t)"
L"\r\n" L"\t\t\"(\" [_FunctionArgument : arguments {\",\" _FunctionArgument : arguments}] \")\""
L"\r\n" L"\t\t[\":\" _BaseConstructorCall : baseConstructorCalls {\",\" _BaseConstructorCall : baseConstructorCalls}]"
L"\r\n" L"\t\t_Block : statement as ConstructorDeclaration"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule DestructorDeclaration _Destructor"
L"\r\n" L"\t= \"delete\" _Block : statement as DestructorDeclaration"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule ClassDeclaration _ClassBody"
L"\r\n" L"\t= [\":\" _Type : baseTypes {\",\" _Type : baseTypes}] \"{\" {_MemberDeclaration : declarations} \"}\" as ClassDeclaration"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule ClassDeclaration _Class"
L"\r\n" L"\t= \"class\" NAME : name !_ClassBody with {kind = \"Class\"} with {constructorType = \"Undefined\"}"
L"\r\n" L"\t= \"interface\" NAME : name !_ClassBody with {kind = \"Interface\"} with {constructorType = \"SharedPtr\"}"
L"\r\n" L"\t= \"interface\" NAME : name \"*\" !_ClassBody with {kind = \"Interface\"} with {constructorType = \"RawPtr\"}"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule EnumItemIntersection _EnumItemInt"
L"\r\n" L"\t= NAME : name as EnumItemIntersection"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule EnumItem _EnumItemA"
L"\r\n" L"\t= {_Attribute : attributes} NAME : name \"=\" INTEGER : number \",\" as EnumItem with {kind = \"Constant\"}"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule EnumItem _EnumItemB"
L"\r\n" L"\t= {_Attribute : attributes} NAME : name \"=\" _EnumItemInt : intersections {\"|\" _EnumItemInt : intersections} \",\" as EnumItem with {kind = \"Intersection\"}"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule EnumDeclaration _Enum"
L"\r\n" L"\t= \"enum\" NAME : name \"{\" _EnumItemA : items {_EnumItemA : items} \"}\" as EnumDeclaration with {kind = \"Normal\"}"
L"\r\n" L"\t= \"flagenum\" NAME : name \"{\" _EnumItemA : items {_EnumItemA : items} {_EnumItemB : items} \"}\" as EnumDeclaration with {kind = \"Flag\"}"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule StructMember _StructMember"
L"\r\n" L"\t= {_Attribute : attributes} NAME : name \":\" _Type : type \";\" as StructMember"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule StructDeclaration _Struct"
L"\r\n" L"\t= \"struct\" NAME : name \"{\" {_StructMember : members} \"}\" as StructDeclaration"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule AutoPropertyDeclaration _APConfig"
L"\r\n" L"\t= \"{\" \"}\""
L"\r\n" L"\t\t\tas AutoPropertyDeclaration"
L"\r\n" L"\t\t\twith {configConst=\"Writable\"} with {configObserve=\"Observable\"}"
L"\r\n" L"\t= \"{\" \"const\" \"}\""
L"\r\n" L"\t\t\tas AutoPropertyDeclaration"
L"\r\n" L"\t\t\twith {configConst=\"Readonly\"} with {configObserve=\"Observable\"}"
L"\r\n" L"\t= \"{\" \"not\" \"observe\" \"}\""
L"\r\n" L"\t\t\tas AutoPropertyDeclaration"
L"\r\n" L"\t\t\twith {configConst=\"Writable\"} with {configObserve=\"NotObservable\"}"
L"\r\n" L"\t= \"{\" \"const\" \",\" \"not\" \"observe\" \"}\""
L"\r\n" L"\t\t\tas AutoPropertyDeclaration"
L"\r\n" L"\t\t\twith {configConst=\"Readonly\"} with {configObserve=\"NotObservable\"}"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule AutoPropertyDeclaration _AutoProperty"
L"\r\n" L"\t= \"prop\" NAME : name \":\" _Type : type [\"=\" _Expression : expression] !_APConfig"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule CastResultInterfaceDeclaration _CastResultInterface"
L"\r\n" L"\t= \"$interface\" NAME : name \":\" _Type : baseType \"<\" _Type : elementType \">\" \";\" as CastResultInterfaceDeclaration"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L"// Rule (Declaration -- Branches)"
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L""
L"\r\n" L"rule Declaration _SharedDeclarationBranch"
L"\r\n" L"\t= !_Namespace"
L"\r\n" L"\t= !_Variable"
L"\r\n" L"\t= !_Event"
L"\r\n" L"\t= !_Property"
L"\r\n" L"\t= !_Constructor"
L"\r\n" L"\t= !_Destructor"
L"\r\n" L"\t= !_Class"
L"\r\n" L"\t= !_Enum"
L"\r\n" L"\t= !_Struct"
L"\r\n" L"\t= !_CastResultInterface"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule Declaration _MemberDeclarationBranch"
L"\r\n" L"\t= !_Function"
L"\r\n" L"\t= !_AutoProperty"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule Declaration _Declaration"
L"\r\n" L"\t= {_Attribute : attributes} !_SharedDeclarationBranch"
L"\r\n" L"\t= {_Attribute : attributes} !_MemberDeclarationBranch"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule ClassMember _ClassMember"
L"\r\n" L"\t=\t\"static\" as ClassMember with {kind = \"Static\"}"
L"\r\n" L"\t=\t\"override\" as ClassMember with {kind = \"Override\"}"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"rule Declaration _MemberDeclaration"
L"\r\n" L"\t= {_Attribute : attributes} !_SharedDeclarationBranch"
L"\r\n" L"\t= {_Attribute : attributes} [_ClassMember : classMember] !_MemberDeclarationBranch"
L"\r\n" L"\t;"
L"\r\n" L""
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L"// Rule (Module)"
L"\r\n" L"//////////////////////////////////////////////////////////////////"
L"\r\n" L""
L"\r\n" L"rule ModuleUsingFragment _UsingFragment"
L"\r\n" L"\t= NAME : name as ModuleUsingNameFragment"
L"\r\n" L"\t= \"*\" as ModuleUsingWildCardFragment"
L"\r\n" L"\t;"
L"\r\n" L"rule ModuleUsingItem _UsingItem"
L"\r\n" L"\t= _UsingFragment : fragments {_UsingFragment : fragments} as ModuleUsingItem"
L"\r\n" L"\t;"
L"\r\n" L"rule ModuleUsingPath _UsingPath"
L"\r\n" L"\t= \"using\" _UsingItem : items {\"::\" _UsingItem : items} \";\" as ModuleUsingPath"
L"\r\n" L"\t;"
L"\r\n" L"rule Module _Module"
L"\r\n" L"\t= ("
L"\r\n" L"\t\t(\"module\" with {moduleType=\"Module\"})"
L"\r\n" L"\t\t| (\"unit\" with {moduleType=\"Unit\"})"
L"\r\n" L"\t\t) NAME : name \";\" {_UsingPath : paths} {_Declaration : declarations} as Module"
L"\r\n" L"\t;"
;
vl::WString WfGetParserTextBuffer()
{
return parserTextBuffer;
}
/***********************************************************************
SerializedTable
***********************************************************************/
const vint parserBufferLength = 164350; // 1865073 bytes before compressing
const vint parserBufferBlock = 1024;
const vint parserBufferRemain = 510;
const vint parserBufferRows = 161;
const char* parserBuffer[] = {
"\xFF\x00\x01\x82\x81\x80\x33\x82\x81\x0A\x06\x81\x88\x81\x81\x24\x38\x3B\x30\x63\x68\x05\x36\x35\x36\x34\x3B\x22\x78\x70\x32\x25\x33\x3B\x39\x35\x37\x6E\x7F\x62\x83\x92\x91\x05\x84\x00\x26\x8C\x8E\x92\x39\x32\x31\x3A\x3A\x65\x24\xA4\x97\x07\x94\x98\x87\x97\x6F\x50\x32\x2F\x30\x3D\x32\x38\x3A\x79\x44\x25\x23\x3C\x31\x32\x39\x30\x74\x1F\xA1\x92\x92\x93\x0B\x92\xA7\x01\xC2\x21\x33\x35\x33\x20\x91\x39\x74\x72\x35\x23\x34\x3F\x36\x39\x21\x61\x6C\x2C\x2C\xA2\x90\x0B\x92\xB3\x51\xE9\x2E\x26\xA9\x38\x8E\x8C\x8E\x1E\xA0\xA4\xBF\x7E\x07\x91\xBB\xB4\x6E\x64\x2E\xBB\x8D\x8A\xA7\xB9\xBB\x06\x80\xC2\x2C\x3F\x33\x33\x35\x29\x0F\xB0\xAD\x35\x84\x3F\xBE\xBA\x81\x42\x1B\xA1\x27\xC9\xC5\x33\xC4\x8B\x8E\x89\x80\xC0\xB2\xB3\xBC\xB8\xBF\x64\x9E\x27\x82\xD1\x80\xB0\xAC\x29\x1C\xF5\x2C\x34\x39\x26\x8A\x9E\x33\x10\xE5\x02\xA4\xA6\xA0\xA4\xD0\xA6\x0F\x27\xB9\xC5\xD8\x31\x34\x36\xBD\x19\xFC\xB1\xAB\xAC\xA1\x96\x82\xE3\x43\x3D\xFF\xD4\x29\x3D\x9F\xB8\xB4\x06\xD0\xC3\x25\xAD\x8B\xD9\xA3\xA3\x49\xF2\xA4\xAB\x07\x94\xED\xD2\xEA\x73\x4D\x16\xC2\x3E\x9B\xB8\xA8\x83\xE7\xD6\x8F\x3D\x98\xEE\xAC\xC4\xA4\x96\x8C\xCF\xE7\xB2\x86\xA8\x29\x30\x75\x54\xAF\xEA\xC2\xFC\xB3\xF3\x81\xE9\x79\x4B\x4E\x1D\x69\x24\x1E\x4F\x7E\xF1\x58\x6E\x7F\x53\xF5\x57\x59\x57\x56\x5D\x72\x11\x12\x1C\x67\x35\x17\x65\x63\x64\x56\x07\x4A\x86\xA5\x4E\x8A\x54\x57\x5E\x56\x75\x6D\x76\xC4\x72\x4B\x42\x41\x27\x96\x5E\x18\x56\x1F\x91\x8E\x65\x5F\xDA\x4C\x51\x07\x49\x33\x9D\x86\x46\x5A\x75\x25\x18\x83\x85\x73\x52\x07\x4A\x8F\x1D\xBB\x4F\x4A\x5A\x3A\x95\x6C\x8F\x76\xDD\x42\x42\x88\x76\xB7\x72\x4B\x6E\x41\x4F\x82\x5C\x19\x19\x30\x7B\x8D\x7C\x53\x27\x83\x47\x8A\x50\x2C\x90\x81\x8B\x50\xD7\x76\x61\x8E\x89\x27\x5B\x94\x94\x44\x12\x54\x46\x47\x8B\xC3\x73\x5F\x93\x40\x4F\x85\x1E\x1A\x85\x4B\xA2\x95\x88\x49\x08\x27\x49\x9D\x40\x72\x96\x89\x12\x62\x73\x54\x07\x4A\xA0\x7C\xB3\x9D\x1B\x9F\x96\x6D\x60\x4E\x1C\x54\x5C\x5D\x90\x49\x80\x43\x40\x61\x9F\x8B\x47\x52\x1B\x94\xCC\x4E\x74\x58\x74\x03\x50\x73\x44\x63\x75\xA4\x83\x5E\x02\x27\x64\xAC\x9D\x70\x9F\x63\x94\x4B\x7F\x02\x67\x7C\x9A\x52\x56\x8A\x8C\x50\x90\x06\x74\xA6\x10\x61\xB6\x6E\x17\x1B\xAB\xAA\xA3\x4C\xA6\x40\xD0\x46\x1E\x55\x11\x68\xB1\xA8\x84\x53\xBF\x81\x41\xB2\x57\x6D\x08\x5C\xAF\x9D\xBE\xB4\x71\x42\x11\x75\x2E\x1E\xA0\x48\x13\x95\x87\x90\x53\xAC\x81\x47\x78\xB5\xD6\xA4\x81\xAB\xA3\x23\x74\xA3\x42\xAD\xD5\x97\xBE\x1B\xB3\x73\x4C\x07\x4A\xBB\xD3\xA9\xB4\x89\xA6\x31\x64\x50\xBE\x41\xF7\x89\x16\x18\xBB\x48\x89\x4E\x74\x00\xFA\x86\xBE\x9A\x6E\x02\x6D\x66\x1A\x4F\xFC\xB2\x84\x8D\xC1\xAE\x67\x18\xC0\xAA\x30\x90\xB2\x49\x03\x27\x54\xC1\x40\x13\x54\x89\xC2\x4F\xBF\x03\x7F\xB8\xC4\x1D\x56\x06\x59\x19\x18\x97\xB5\xBA\xC1\x42\x35\x80\x0C\x11\x1A\x8B\xA1\x5A\xC4\x49\x07\x27\x41\xCD\x40\x4D\x21\x10\x1C\xBD\xF3\x49\x40\x76\x78\x6D\x24\x72\x1F\xCB\x23\x5D\xB0\x03\x79\x4D\x29\x18\x1E\x5A\xA6\x57\x40\xC5\x9B\x64\x46\x07\x4A\xD3\x34\xEF\x14\x1A\x6A\x26\xF2\x42\xD0\xD1\x52\xD4\xD5\x16\x47\xBA\x86\x17\x53\x19\xDB\x8E\x94\xC1\xD4\x53\xD3\x9B\xD6\x5A\x67\x08\xAD\x1B\x5C\x36\x46\x4D\xD9\x13\x59\xE6\xDC\xD7\x19\x4E\x21\x1B\x62\xD7\x61\x20\xD7\x96\xD8\x09\x4F\x90\xDD\xD9\x65\x27\xDA\xAF\x7D\x74\x28\x13\x5F\x06\x27\x48\xE4\xDA\xD6\x73\xD7\x1E\x6C\x19\x60\x72\x14\x18\xDE\x7A\xF2\xA2\x4C\xA1\x06\x58\xE5\xDF\x62\x73\x30\x11\x6F\xB8\xBD\xA2\x46\xBA\x40\xB4\x8E\x15\x1B\x1D\xD3\x53\x53\x1C\xD0\x22\x5C\x86\x42\xEB\xA6\xE8\xEE\x57\x1B\x43\xAE\x15\x18\xEB\xFF\x2E\xE3\x40\xEC\xA7\xCA\xAF\x69\x6C\xB8\xF7\xB3\x43\xBD\x4E\x2A\x65\x51\xC9\x38\xE4\x59\xCB\x40\x29\xCF\x12\x18\x55\x72\x14\x48\xED\xDB\x03\x6D\xDF\x12\xE4\x3E\x65\x14\x18\x13\x76\xE2\x14\x19\x18\xB8\xD9\x97\x42\x40\xD7\xC6\x8B\x44\x19\x9B\xF7\xEB\xD0\xB9\x22\x51\xA2\x40\x60\x3A\x5A\xF5\x1A\x19\x44\xA4\x19\xF0\xB7\x0C\x81\x4A\x4C\x4F\x3E\x40\x50\xEA\xC4\xFF\x14\x7A\x40\x6D\x62\x0B\x30\x29\x0C\x2A\x18\x23\x0D\x19\x70\x04\x44\x81\x64\x2F\x4D\x02\x2F\x49\x01\xBA\x5A\x7D\xB7\x11\x61\x33\x81\x22\x21\x01\xF7\x00\x0B\x37\x2A\x2B\x51\xF7\x76\x69\xFE\x00\x08\x35\x83\x5B\x26\x5A\x15\x82\x38\xFB\x7F\x16\x62\x83\x2D\x85\x84\xD9\x68\x85\x08\xA4\x20\x83\x80\x12\x84\x4A\x75\x12\x0E\x1B\x0E\x8C\x28\xCC\x43\x20\x73\x53\x14\x48\x15\x1C\x29\x28",
"\x5D\x78\x73\x79\x02\x29\x67\x14\x68\x06\x28\xED\x5D\x87\x83\x3E\x33\x87\x48\x46\x33\x20\xE3\x3C\x82\x26\xC9\x40\x00\x74\x08\x3C\x24\x23\xAB\x79\x74\xFF\x08\x89\x40\x4A\x8F\x40\xAE\x3F\x7D\x5D\xEF\x42\x20\x17\x90\x4C\x66\x9F\x63\x55\x54\x6A\x97\x0C\xCB\x11\x26\x35\xAA\x74\x83\x6C\x00\x13\x0A\x1C\xF4\x01\x23\x2B\x90\x57\x31\x01\x34\x09\x6F\x2B\x7F\x8A\x00\xBA\x72\x20\xAE\x74\x08\x4F\x51\x05\x0F\xB0\x29\x0C\x7E\xDA\x78\x75\x16\xD0\x3A\x90\x38\x0C\x96\x91\x90\x96\x7D\x73\x76\x83\x24\xE1\x42\x27\x5E\x54\x12\x0D\x1E\x7E\x83\x24\x02\x27\x26\x94\x81\x9B\x93\x5C\x62\x7A\x20\x81\x34\x59\x69\x68\x78\x76\x06\x27\x23\x97\x54\xBD\x27\x09\xFB\x45\x90\xEE\x3E\x82\x20\xCC\x74\x58\x97\xF4\x41\x7D\x99\x2E\x9B\x93\x21\x98\x29\x96\x85\x83\x61\xDF\x02\x25\x0B\xB5\x22\x90\x77\x57\x62\x21\xC8\x2C\x24\x65\x29\x67\x8A\x79\x0B\x61\x23\x34\xA3\x65\x64\x52\xA2\x77\x47\xD2\x89\x0F\x4F\x0D\x9C\x0D\x6B\xA7\x66\x20\x29\x76\x0A\x38\xF4\x04\x9C\x49\x92\x58\x00\xEA\x83\x9D\x58\x5E\x94\x2E\x40\x80\x07\x0A\xCA\x25\x48\x7C\x61\x64\x25\x6E\x03\x99\x21\x27\x4D\x23\x43\x11\x2F\x53\x35\x45\x95\x00\x27\x28\xA1\x40\x65\x0A\x4D\x63\x64\x48\xA0\x02\x22\xA0\x9A\x05\xAA\x68\x0B\x83\x3B\x4F\x06\x38\xA2\x19\x72\x5B\x84\x2A\x82\x26\x38\x02\xAC\x26\x4B\x30\x28\xA3\x81\x18\xA3\x0C\xF0\x27\x0E\x57\x79\x03\x2E\x8F\x81\x20\xA4\x2B\x2D\x27\x4B\x65\x08\x94\x83\x35\xA3\x2D\x8B\x2D\xA7\x49\x30\xA9\x2A\x99\xB0\x22\xA1\x06\x20\xAA\x1D\x61\x29\x46\xB6\x75\x21\xA2\x38\x3B\x7C\x7B\x7E\x70\x4D\x11\x4A\x2E\x54\x06\x30\xA8\x52\x3D\xA3\xA4\x8E\x06\xA9\x21\x6D\x61\x09\x52\xBB\x2B\xA9\xA0\x0D\xAC\x49\x20\x3C\x62\x40\x7F\x54\x37\x8E\x2D\x8D\x3C\x64\x22\x81\x40\x59\xAB\xAA\xFE\x7F\x26\xAB\xB4\x20\xAE\x1B\x62\xA1\x20\xB2\xA0\x24\x7E\x67\x0A\x44\x56\x57\xAE\x6C\xA4\x9D\x2A\xA9\xFD\x70\xAD\x98\x24\x4D\x85\x81\x2D\x83\x0C\x77\xA9\x0F\x19\x4E\x70\x7A\x8A\x3C\xAD\x7A\x7E\xA2\x42\x5B\xCC\xA1\xAE\x3B\x7C\x91\x20\x98\x65\x0D\x46\x61\x09\x2E\xED\x7F\x7B\x0E\x8F\xA3\x81\x64\x80\xBF\xAD\xFF\x50\xAB\x20\x50\xBA\xB2\x45\xAB\x8A\xAC\x00\x2C\xAF\xAF\x5C\xA1\xB3\xFF\x35\xA3\x21\x9B\xB6\x6C\x93\x22\x2D\xB7\x6B\x92\xBD\xAB\xD9\xA7\x92\x20\x40\x3A\x50\xFE\x09\x27\x3C\xA9\x14\x2A\xAF\x65\x91\x40\x67\x6C\x0E\xA4\x94\x02\x26\x28\xDA\x4C\x30\x68\x8B\x44\xB8\xC8\x13\x2D\x2A\x1E\x5E\x4B\x57\x61\x2C\x0C\xDA\x82\x25\xA6\xC1\xB8\xB7\x3F\x13\x90\x32\xB5\x2C\x2F\x59\x40\xA3\x20\x50\xF4\x7C\x50\x87\xA4\x24\xBC\x78\x27\xBD\x21\x82\x07\x24\xFA\x81\x24\x27\x39\x71\x39\x79\xCE\x9D\x2D\x42\x90\x6E\x20\xFF\xAD\x50\x48\x64\x08\x82\x49\x7B\xB8\x38\xAB\xA0\x27\xE8\x01\x24\x56\xD5\x9C\xB6\x40\x08\xCA\x84\x18\xEE\x71\x20\xC1\x2A\x29\xC2\xA9\x4E\x0F\x69\x82\x29\xB5\x64\xA4\x2C\xC2\x00\x02\x30\x61\x06\x36\x59\x0D\xC1\x20\xAA\x58\x3B\x9E\x74\x85\xCF\x7D\xFA\x1C\xBF\x59\xCD\xA6\x38\x74\x96\x4B\xC5\x0F\xF6\x9B\xB9\xCF\x45\xA6\x40\x1A\xAC\xA2\x30\xA4\x36\x20\x3F\xC9\x68\x6A\x73\x0A\x34\xD6\x2E\x32\x0E\xB0\x2A\x82\x69\xF0\x81\x21\xA9\xA2\xA3\xA6\xD3\xAC\x2B\x8F\x83\x21\xC9\xA9\x34\x0B\xC8\x45\xDE\x74\x92\x9F\x7F\xAA\x3B\x7A\xC1\x20\x18\xA2\x0F\x75\xD2\x82\x25\x29\xC2\x25\xCA\xA7\x29\x37\x6A\x5A\xC9\xC8\xD9\x1D\xCC\x44\x74\xA0\x00\x59\xE0\x37\xAC\x39\x33\x2E\xCC\x01\x28\xCF\x95\xEA\xC6\xC9\x45\x6D\xCF\x7F\x71\xDF\x5D\x19\x53\x47\x42\x32\xFF\x18\xCF\x00\x1A\xCC\x96\xEB\xC7\xC9\x3F\xEF\xCA\x29\x97\xA0\x01\x66\x9B\xBD\xB2\x32\x1F\xB7\xCE\xA3\x2E\xC5\x9A\xC4\xCC\xD0\x3F\xDC\xCD\xB2\x24\x5E\xB9\x40\x36\xB9\xA7\x07\xB8\x89\x39\x8F\x6F\x5A\xA8\x80\x04\xD4\xF1\xB5\x80\x00\x4F\x48\xD7\x6F\x4F\x5F\xBF\x81\x3F\xBE\x73\x27\x8E\xBF\x14\xBB\xA5\x3E\xE5\x1A\x95\x27\xAB\xCD\xD6\x4E\x89\x28\x38\x5F\xF4\x5D\xD6\x02\x37\xD5\x13\x96\x7F\xBD\x77\xA9\x75\x3A\x8F\xC0\x26\x89\x80\x02\xAB\x98\x95\xA9\xCA\x58\x8E\xD8\x78\x7F\x71\xC6\x81\x22\xCC\x2A\xF4\x58\xD9\xB3\xBA\x65\x3F\x6D\xD1\xDB\xAE\x49\x41\x21\x59\xE1\x33\x3C\xB4\x88\x5A\xDB\xAA\x7F\x7F\xAB\xCF\x48\xB1\x15\x49\xBE\x2B\x86\xD0\xBC\x00\x4F\xD3\x0F\xFF\x5E\x91\x20\xF7\x46\x40\xA8\xCA\x22\xDD\x68\x64\xDF\x3B\xF1\xC7\xDD\xB0\x82\x2B\x0D\x0B\xF9\xBD\x53\xE5\xC9\xE3\xC0\xA0\x2B\xE1\x80\x38\xA2\xBC\x81\xD1\xE2\x59\xED\xD2\x0F\x8A\xC0\x05\xE1\x79\x26\x3F\x08\xEA\x3C\x3C\xA4\x2E\x3E\x48\x8C\x3D\xD9\x93\x94\x44\xC6\x8B",
"\x05\xE5\x29\x23\xEF\x0F\x7A\x3E\x26\xE4\x39\x06\x58\xD9\x01\x3F\xBC\x4F\x69\x72\xE5\xEA\x9D\x43\xE6\xED\x36\xE4\xCA\x96\x23\x66\x83\x05\xEB\xA8\x72\x1C\xE7\xA6\x4E\xD9\x26\xFC\x3A\x3B\xE8\x74\x0A\xE4\x00\x29\xCC\x3E\x66\xC1\x69\xE6\xFB\x64\x42\xF9\x46\x52\x8C\x00\x29\x66\xC1\x95\xD4\x9D\x34\x9D\x49\xEB\x02\x47\x40\xEA\x1E\xF7\xE1\xCF\xE8\x3D\x41\xB2\xDB\xE8\xEA\x52\xF4\xE9\x82\x3A\xD0\xE6\x9F\xFB\xD9\xBB\x20\x52\x40\xCB\x97\x43\x01\x93\x3D\xE9\x20\x6B\x05\x0C\x4B\xD4\xBC\xEC\x1B\x5D\x49\xEF\xD9\x4D\xE4\x1D\x69\xB2\x20\xA1\x84\xAA\xBC\x87\x81\x22\xEB\x48\xBD\x45\x2F\x53\xE6\x0D\x52\xF3\xC7\x85\x2F\xE9\x77\x0D\x4D\x46\xDE\x95\xF2\x0F\x92\x89\x25\xDA\xAA\x90\xCB\x2E\x91\xE0\x03\xE4\xF8\xE1\x43\xFF\x51\xD0\x73\xDF\xD8\xB8\xE8\xDA\xBB\xB8\xCE\xE9\xF3\xF5\xB3\xF9\xEC\xA0\xE9\xD0\x01\x75\xF5\xC8\xF5\x9E\xE6\xF3\xBD\xA2\xF7\xDD\x79\xC2\x25\xDE\x87\xF1\x42\xA1\xB7\xFF\xF3\xE4\xD6\xF3\xB0\x4A\x29\xEF\x6D\xC0\xF9\x20\xDC\xCE\xFC\xF8\x97\xF1\xEC\xD4\xAB\x9F\x9F\xBB\xF9\xF6\x45\x85\x99\xF3\xDE\xB5\xCC\x29\x8C\xC1\x23\xF4\x51\xAF\xBA\xB5\xA7\xFD\x5E\x83\x3F\x5B\xF7\xFE\x47\xF8\x9D\x9C\xE3\x2E\xF3\xC0\x06\xB7\x09\x22\xDA\xA9\xCB\x97\xFD\x41\xD4\x4A\x9F\x55\x74\x07\xD3\x6D\x61\x09\x60\x40\xAC\x40\x00\x66\x27\x7D\xE8\x78\x5A\xEA\x76\x7A\x30\x1C\x79\x07\x89\x80\xC3\x70\x7F\xEE\x72\x7F\xAA\x3F\x7B\x64\x11\x81\x4A\x24\x44\xA1\x78\x7F\x36\x52\x10\x6A\x79\x81\xDD\x7C\x25\x13\x87\x6E\xDA\x7A\x62\x56\x72\x12\x1A\x8D\x7F\x03\x59\x26\x8C\x18\x5E\x09\x52\x10\x0C\x5B\x37\x24\x1B\x82\xF7\x77\x26\x04\x5D\x50\xCF\x25\x74\x03\x15\x74\x4C\x49\x17\x53\x26\x67\xFB\x70\x25\x02\x14\x29\x0B\x8C\x61\x0D\x8F\x64\x0F\x8A\x4C\x44\x85\x28\x74\x27\x6E\xF6\x7E\x7B\xF4\x73\x84\x70\x25\x84\x86\x2F\x3F\x8C\x71\x10\x40\x5C\x32\x96\x1C\x79\xC6\x7E\x84\x6D\x0E\x81\xB5\x5C\x70\x0E\x74\x85\x11\x46\x85\x4F\x87\x79\xD2\x75\x6A\x4C\x1F\x65\x00\x08\x51\x94\x2A\x36\x03\x89\x84\x3E\x56\x55\x64\x1E\x86\x70\x86\x28\x6A\x35\x58\x02\x1D\x42\x50\x4C\x28\x43\x14\x22\x9C\x78\x87\x68\x87\x28\x8A\x1E\x71\x20\x74\x60\x77\x8A\x27\x85\x8A\x36\x6B\x82\x5E\x84\x80\x86\x6A\x38\x73\x00\x0F\x5F\x86\x2E\x46\x64\x1F\x7A\x8D\x8A\x18\x5A\x6D\x28\xA1\x6F\x5B\x16\x73\x7D\x36\x6A\x19\x85\x84\x73\xC8\x3B\x49\x3C\x82\x10\x45\x7E\x7F\xFC\x46\x70\xFA\x5C\x27\x0D\x5C\x6D\xBC\x6B\x72\xD1\x5E\x72\x0F\x70\x2C\x45\x81\x8B\xE7\x63\x87\x4D\x6B\x7E\x4B\x8B\x74\x07\x70\x00\x14\x54\x81\x1D\x36\x81\x1B\x7D\x33\xEE\x69\x6D\xC1\x83\x8C\x0A\x70\x8A\x00\x01\x82\xC3\x55\x78\xC2\x85\x48\x25\x6C\x64\x00\x0A\x5A\x12\x60\x40\x0B\x60\x00\xB6\x28\x2B\x45\x4B\x2B\x07\x51\x83\x01\x13\x54\x6C\x05\x54\xC0\x8F\x8A\x00\x02\x2C\x3F\x35\x2C\x50\x7C\x8B\xBD\x7F\x06\x62\x11\x88\x2B\x4A\x6F\xEA\x84\x2C\x7D\x40\x77\xB3\x80\x00\x64\x02\x4E\xF2\x80\x46\xF4\x83\x2C\xEC\x88\x82\x74\x0D\x75\x5F\x74\x69\x10\x64\x4F\xFF\x8B\x8E\xF7\x82\x90\x8F\x87\x8B\xCA\x22\x10\xF5\x81\x90\x01\x87\x82\x01\x8E\x90\x5A\x40\x91\xCC\x2E\x2C\x85\x4B\x8D\x0D\x66\x90\x91\x4E\x61\xEF\x61\x8C\xEA\x8D\x2C\x15\x59\x8D\x59\x80\x00\x8E\x75\x8E\xE2\x54\x8F\x3D\x6E\x06\x89\x77\x21\xEE\x8E\x64\x75\x8C\x79\x2C\x91\x2E\x4A\x1F\x92\x8C\x1D\x90\xE7\x80\x71\xF1\x26\x93\xD8\x23\x7E\x16\x1E\x71\xE1\x5B\x76\x00\x20\x91\x2D\x92\x8B\xC4\x6F\x5C\x6E\x00\x12\x79\x0D\x06\x2C\x33\x78\xD1\x85\x94\x3D\x9A\x2E\x48\x97\x1C\xCF\x50\x94\x74\x0C\x79\x63\x79\x8E\x47\x9B\x8B\xD6\x82\x93\xD7\x64\x94\xAD\x26\x94\x3E\x9E\x06\xC4\x83\x56\xC6\x8C\x6E\xC8\x82\x84\x51\x93\x96\x53\x92\x2E\xCD\x89\x7F\x20\x82\x8A\x6D\x9E\x2D\x64\x94\x95\x5E\x94\x7A\x02\x1B\x11\xEC\x4A\x43\x86\x6B\x95\xE0\x28\x97\xD9\x79\x8F\x72\x7D\x8A\xDF\x49\x10\xE8\x25\x96\x39\x6C\x88\x01\x1B\x51\x65\x98\x46\x09\x17\x2F\x81\x93\x2F\x9B\x42\x7E\xB5\x89\x95\x90\x98\x2F\x77\x94\x99\x3D\x14\x89\xFF\x5C\x17\x45\x69\x99\xC3\x35\x30\xB9\x45\x80\x52\x75\x6F\xFB\x82\x2A\xF6\x29\x46\x01\x1A\x2F\xCF\x26\x7F\xB0\x1C\x06\x54\x11\x19\x9C\x51\x11\xA2\x9F\x49\xA4\x9F\x2C\xEE\x8F\x20\x65\x04\x9B\xD6\x26\x38\xED\x75\x8C\xAD\x96\x06\xD5\x8A\x97\x0B\x50\x92\x1B\x3C\x7B\x01\x30\x75\xB0\x91\x16\xB3\x97\x14\xBF\x95\x7F\xCA\x94\x9C\x68\x7E\x8C\xD0\x89\x9C\xF1\x73\x9C\xC5\x99\x7E\x01\x1C\x9B\xBE\x96\x9B\xC1\x98\x96\xDA\x95\x9D\x72\x9D\x9D\xAA\x46\x86\x36\x4C\x30",
"\x26\x4A\x9B\xD6\x88\x8D\x19\x6C\x84\x55\x8D\x9A\x6E\x0B\x9E\x85\x42\x94\xE7\x97\x4E\xCC\x3C\x30\x30\x1E\x30\x3F\x31\x8E\x09\x19\x92\xE6\x8C\x14\x7C\x81\x10\x2D\x4F\x31\xEC\x96\x9C\xD7\x88\x9C\x24\x13\xA0\x00\x05\xA0\x19\x31\x7E\xF9\x88\x74\xDC\x43\x25\x9C\x76\x7F\x1F\x3B\x4D\xD5\x44\x53\xD6\x94\x97\xD8\x95\x81\x17\x34\x25\x18\xA5\x32\x27\x90\xA0\xE2\x54\x90\x02\x1B\x32\x2D\x3C\x06\x30\x8F\x9F\x02\x14\x8E\x01\xA2\x13\xA9\x81\x10\x45\x75\x33\x37\x3B\x49\x7F\x76\x10\x37\xA1\x78\x50\x90\xA3\x32\x32\x10\x34\xA4\x2F\x23\xAD\xA2\x8F\x73\x17\x31\xA0\x00\x33\xA6\x33\xF4\x26\x7F\x77\x0C\x12\x0F\x12\x06\xBE\x1F\x94\x16\x9B\x33\x1C\x7A\x6A\x1B\xAC\x86\xCA\x88\x8E\x75\x64\x6B\x4F\x32\x10\xB8\x64\x83\x57\x76\x77\x45\x37\x34\x6E\x09\x34\xCF\x2C\x91\x32\x8E\x91\x18\x67\x41\x84\x72\x95\x00\x01\xA6\x48\x36\x65\x07\xAC\x9D\x09\xA5\x80\x62\x96\x97\x34\x36\x34\x6F\xA8\x15\x54\xA5\x9E\x00\x03\x94\x4D\x3B\xA5\x8B\x33\x25\xFF\x60\x00\x01\x77\x6E\x9C\x7E\x99\x3E\xA1\x37\x65\x0E\x8E\x6D\x0A\xA8\x86\x68\xA8\x81\xAA\xA1\x7C\xA7\x9D\x24\x10\xA9\x6D\xAA\xA8\x41\xA1\x10\x9E\x35\x38\x5E\x88\x47\x7F\x3C\x38\x68\x3A\x36\x52\x76\x06\x5F\x3B\x79\xA1\x5B\x56\x89\xA0\x38\x82\x34\x37\xB7\x54\x39\x17\x2A\x93\xB8\x1E\xA9\x8A\xAB\xAA\x84\x38\x06\x99\xA0\x00\x5C\x8D\x06\x9C\x7A\x89\x01\x19\x3E\x9D\x3F\x69\xD0\x72\x6D\x5F\x9E\x8B\x76\x8D\x43\x83\x22\x10\xBE\xAE\x39\x4A\x60\x85\xBC\x72\x85\x6B\x91\x28\xC7\xAD\xAB\xB7\x5F\xAB\xCB\xA7\x79\x83\xA5\xA8\x97\x7B\xAB\xD1\xA0\x00\xC9\xA0\xAC\x4E\x54\x71\x55\xA2\x5E\x66\xAD\xAB\xA7\x3C\x6F\x30\x69\x8F\x9A\x74\x7E\x32\x13\xAE\xDC\xA5\xAE\xE0\x1B\xA7\x1F\x86\x9E\xC2\x52\x13\xCC\x74\xAE\xB2\x32\x24\x45\x49\x42\x19\x6C\xAE\x60\x70\x61\xB8\x35\xAF\xED\xA7\xAF\xB4\x39\xAF\xF0\xA3\x86\xA1\x86\xA5\x24\x10\xB0\xB1\x36\x15\xF8\xA4\x24\xE7\xA9\x94\x01\x15\x98\x5E\xAD\x3A\xC1\x71\xB0\x6C\x60\x3C\x85\x47\xAD\x02\x12\x70\xC1\xAB\x22\xD4\x7F\x3A\xC8\xAD\x3B\x8D\x68\xB1\x05\x86\x9F\xF3\xA4\x12\x1A\xBD\xAB\xC6\x39\xA1\xF4\x25\xA4\xAB\x84\x68\x13\xB1\x46\xD9\x40\x00\x8C\x5E\x13\xD2\x3E\x5F\x80\xA7\x8D\x0D\x5C\x79\x26\xA1\x10\x35\xB1\x3D\xFA\xA1\x31\xEE\x8E\x9E\x6A\xA8\x9F\x49\x44\x3E\xCF\x36\xB3\x41\xB3\x1C\xB0\xA2\x13\x3D\xB4\xB3\x49\xB0\xB4\xAF\x9C\x7B\x6F\x01\xB5\x14\x16\x68\x4F\xBF\xB3\x37\xB5\x80\x96\xAD\xA5\x29\x81\x40\x47\x5E\xB3\xD8\x37\x3E\xDC\x3D\x33\xDF\x35\xB0\xDF\x5E\x6D\x52\x3B\xA3\x35\x8D\x7D\xE5\x39\x3D\xE8\x37\x5B\x68\xB3\x6A\x73\x98\xB0\x23\x10\x62\xF0\x37\x3E\xF3\x35\x3F\xF4\x2D\xB4\xAB\x23\x42\xA4\x54\x59\x1D\xB1\x93\xC4\xAA\x95\x80\xB1\x5B\xA5\x5C\xAC\xD9\x9D\x7B\xF3\x7F\xAC\x6B\xAE\x96\x00\x01\xB8\x82\x5F\xAD\x6E\x06\xA9\x0E\x3E\x10\xC9\x8F\xB7\x76\x72\xB9\x62\x89\xB6\x07\xB2\x5E\x5B\x9C\xB9\xE7\x66\xA9\x54\x18\xB9\x6C\x92\x42\x9B\xB8\xB8\x82\xB4\xB9\x26\xB0\xBA\x87\xB3\x59\x93\xB2\x57\x4F\xBE\xA2\x55\x1F\x83\x0E\x3A\x17\x0D\x57\xAA\xAE\x5A\x41\x06\x48\x40\x78\x0A\x40\x0C\x40\x2B\xED\x8D\x9E\x0A\xA3\x12\x5F\x84\x42\x9C\x5E\x30\x2B\xA1\x54\xDE\x65\x06\x67\x0A\x16\xF0\x97\x86\x01\x13\x41\xCA\xB5\x48\x0C\xAD\x42\xE4\x1F\xBC\x6E\x02\x04\xB4\x39\x17\x6C\x11\xBD\xE9\x93\xBD\xC9\xBB\xB4\x4A\x17\xA3\x03\x17\xA3\x15\x1A\x88\xB1\xAC\x7F\xC8\xB4\x41\x53\xBB\xB8\xE9\xBC\xBD\xD5\x2F\x3D\xA2\x4C\x62\x15\x6C\xBB\x1C\x4E\x41\x47\x6D\xB2\x3D\xAB\x50\x30\xBF\xB5\x5B\x90\x43\x27\x4A\x40\x73\xBC\x6A\x75\xB2\x5E\xD7\xBA\x41\xF3\x31\x43\x0A\x4D\xB7\xE1\xA0\xBE\xB0\x6A\xC0\x7D\x9B\x43\xC3\xB8\xA0\x44\xBC\x34\xC6\xA9\x10\x40\x42\x44\x44\x48\x4C\x05\x8E\x8E\x88\x51\x8F\xEA\x20\xAD\x1A\xCA\x46\x1C\xC7\x4C\x5E\x45\x80\x2E\xB2\x83\xFF\xB4\x77\xFF\x0C\xAB\x79\x47\xC2\xDF\x85\xC0\xE0\x54\x44\x73\x1F\xB4\x4B\x4D\x44\x64\x0F\x44\xFB\xB8\x8A\xFD\xB7\x8D\x2D\xC1\xA5\x6A\x4D\x53\x29\xC6\x92\xE2\x80\x00\xB4\xB7\xC3\x33\xBB\x46\x66\x49\x97\x72\xA0\x96\xEC\x76\xB4\x63\x43\xC4\x2D\x27\x96\x75\x59\x96\x18\x82\xC5\x5E\x74\xC5\x10\x2F\x3F\x2B\xC1\x10\x8B\x1B\x96\x3C\xBB\xC4\xC9\x5D\xB9\x74\xBF\xB9\xB7\x90\x70\x5C\xCC\x15\x75\x64\xB8\x0E\x85\xAC\x32\x19\xB2\x79\x49\x5C\x75\x6E\xB7\x9D\x4C\x9A\x73\xCD\x22\x75\xCE\x8C\x7E\xAC\x14\xEE\x8A\x47\x73\x48\x06\x75\x43\xB4\xC5\xB2\x12\x7F\xCB\x47\x74\x47\x5D\x14\x93\x77\x10\xCF\x24\x80\xCC\x47\x68\x06\x2C\x72\xC8\x52\xCF",
"\x95\x9B\x68\x00\xC7\x77\x4C\xBE\x8F\xCB\x90\x01\x89\xC0\x01\x16\x20\xB0\x15\x64\xDF\x90\x9C\xEB\xBD\x84\x79\x48\xC8\x91\xC0\x75\x4F\xBD\xAF\xDA\x34\x4F\xC7\xBB\xC9\xA9\xC2\x90\x84\xC4\xA7\x19\x25\xB1\x95\x47\x49\x6C\x0F\x48\x69\x0F\x91\x25\xBF\xC0\x3B\x98\x8B\x81\x4B\x48\xE4\x4A\xCB\xDA\x3E\xC0\x93\xAC\xA1\x28\xB8\xC7\xA1\x43\x4A\x50\x78\xB7\xC7\x78\x14\x9C\xCC\xC8\xAB\x91\x99\xAE\x42\x4A\xC6\x2A\x6F\xF4\x3B\x16\x62\x1C\xCC\x02\x99\xC6\x84\xA5\xCD\xDC\xC1\x80\x76\xC2\x12\x72\xCB\xCC\xC6\x2C\xAE\x1A\x1F\x06\x30\x1C\x15\xAD\xCB\x7D\x22\x80\x51\xB6\x45\x15\x56\x6E\xC1\xD9\x83\xCB\xD9\x8C\x7D\xF0\xC0\x00\xAF\x43\xCF\x45\xC9\x61\x91\x83\x75\x59\x19\x52\x6C\xB3\x12\x36\x8B\xCF\x28\xC0\x8E\xBD\xCC\xA7\x7D\xC2\x13\xB5\x46\x10\x0D\xDF\x4B\xA5\x99\x8D\x71\xAC\x80\xC7\x94\xCB\x19\xC9\x39\xC4\x47\x4B\x66\x01\x4C\xF5\x9C\xC7\xF7\x9F\x50\x28\x29\xD1\x65\x06\x4C\x33\xC5\x48\xF6\xCF\x9E\xEF\xC1\xD2\xF1\xC4\xD2\xF4\xC9\x61\x42\x96\xC3\x29\xDA\x25\x22\xDC\xD2\xFD\xC1\x31\xAD\xBD\xC8\xCC\x4C\x5F\xCF\x26\x5F\x06\x1C\xD3\xF8\x58\x9E\x11\xC1\x10\xCD\x42\x5F\x2A\xCF\xC3\x6E\x5F\x60\x75\xA3\x34\xD2\x42\x32\x19\xA7\x84\x27\x64\x87\x61\x9F\xB8\x76\xA0\x4F\x4C\xD5\x32\x56\xC2\x67\x58\xC3\x85\x75\x9A\xD4\xDA\x45\xD5\xD6\x4E\xC4\x14\xD3\xA7\xF7\xC2\xD5\x5C\xD4\xD5\xD4\x46\xD5\x71\x91\xAF\xCF\x88\xCC\x5F\xA2\x8D\x21\xAF\xD5\x6A\x8E\xD1\x27\xB3\x12\x4F\xBF\xD6\x00\x83\x77\xFF\xC2\xA1\x19\xAD\x23\xE0\x4A\x4D\xEB\x44\x4E\x4E\xD4\x6D\x50\xD1\xC5\xEB\xAD\xD7\xF0\x4F\xD7\x61\x17\xD5\x73\x67\x81\x5A\xD5\xD8\x88\x91\x4E\xF2\x45\x4E\xE7\x60\xC3\xAC\xC6\x69\x86\xAC\xD7\x8F\xDE\xD7\x91\xD6\xC6\x06\xC8\xC6\xD8\x48\x32\x90\xDC\x4E\x2E\x3B\x91\x86\xD5\xD9\xEE\x41\x8C\xF1\x42\xDA\x6C\x0C\x75\x33\xB5\xD9\xF4\x4E\xCC\x01\x18\x4F\xBE\x17\xD7\x17\x27\x9A\x03\x6C\x32\x2B\x40\xDB\xF7\x49\x4F\xC6\x2B\xC8\x86\x9F\x0F\x6E\x07\x12\x3B\x0C\xD3\x20\x87\x12\xC6\xD6\xDC\x73\x13\x17\xC7\xD7\x12\xC9\xD4\x16\xCB\xD9\x10\xCD\xDC\x14\xCF\xD6\x10\xD1\xD2\x13\xE6\xB2\x10\x37\xA5\x04\x58\x00\x05\xC4\xD2\x10\x3C\xDF\x02\x5E\x08\xDC\x64\x17\xDD\x01\x17\xA3\x41\x04\x04\x44\x0D\xDD\x01\x1F\xDD\x2B\x01\x00\xCC\xD3\xDE\x7E\x7A\x46\x55\x02\x04\xEE\xD9\x10\xF5\xD0\x00\x2D\x0A\xDE\x00\x03\x17\xE4\xD0\x00\x37\xAD\x04\x55\x0C\x04\xFA\xDF\xDD\x2A\x0D\xDF\xFC\xD1\xDF\xE7\x79\x04\x56\x03\xE0\x02\x1F\x02\x2F\x0B\x6A\x07\xE9\x10\xFF\xDF\x04\x44\x07\xDF\x03\x17\xDF\x25\x07\x92\x73\x17\xAB\x55\x0E\x04\x49\x0F\x04\x4E\x06\xE1\x02\x17\xDF\x26\x04\x89\xDE\xC9\x2F\x4E\x04\x05\x45\x02\x05\x53\x05\x04\x43\x04\x05\x1F\xEE\x04\x0C\xE1\x10\x2F\x0C\x07\x45\xA3\x17\x33\xEA\x32\x45\x0E\x71\x2F\x0C\x03\x2F\x0D\x03\x6E\x88\xE3\xF5\x52\x10\x47\x0B\xE3\xCE\x8F\x02\x3E\x0F\xE3\xCD\x52\xE4\x09\x1C\xD3\x4C\x04\x05\x39\xED\xE3\xD3\x6C\xE4\x3D\xD4\xE4\x50\xE3\xE4\x34\xEE\x03\x71\x64\xE5\x03\x1C\xD3\x45\x01\x05\x3C\xED\x03\x3F\xE3\xA8\x5C\xEE\xDD\xC8\xA6\xE4\x7C\xAF\x02\x21\x0F\xE3\x0C\xA3\x17\x96\xA1\x04\x53\x03\x05\x49\x07\x04\x32\xE8\xE5\x00\x0F\xE3\x20\x62\x9D\x8B\xB6\x04\x41\x09\x04\x4C\x05\x04\x44\x0F\x05\x54\x08\x04\x45\x0E\x04\x3C\xEF\x03\x2F\x0F\x03\xAF\x63\x17\x9E\xC0\x00\x51\x05\x05\x45\x03\x05\x30\xE0\xE2\x5F\x0D\x04\x41\x02\x05\x4B\x01\xE5\x3F\x09\x45\x38\xD1\x10\x53\x03\x04\x4F\x00\x05\x45\x0F\x05\x44\x05\x04\x4C\x09\x04\x4D\x09\x04\x2A\xE2\x05\x39\xEA\x03\x3A\x0D\x75\x1B\xE7\xC4\xA0\xEC\x04\x20\xE2\xE2\x01\x17\xDF\x3A\x0B\x8D\xC3\x66\x95\x9E\xE5\x04\xA9\xE3\xEB\xB5\xE7\x12\xF7\xDB\x03\x42\x31\xEB\x2C\xA5\x1A\x4F\x0D\x04\x96\xE6\xEB\x00\x07\xDF\x2C\x01\x69\x11\xE8\xA3\x4A\x2F\x04\x54\x0C\xEC\xF7\xDE\x02\x07\x8F\x46\x08\xA1\xEA\x85\xEF\x05\x97\xE2\x05\x41\x09\x05\x51\xEB\x05\xA9\x7A\xE7\x1E\xAB\x6F\xB4\xED\xE2\xDE\xE2\x05\xE0\xE2\xEE\x76\xEF\x02\x5D\x0D\x5A\xDA\xE2\xA7\xDC\xEE\x04\x5F\x02\x04\xE0\xE3\x04\x45\x01\xE5\x7B\x08\x01\xEF\xD5\x7E\xBC\x73\x04\xE9\xE3\xEA\xF8\xE1\x04\xFA\xE1\xE5\x7D\x09\x01\xFF\xE1\xC7\x78\xC5\xEF\xF7\xE9\xEF\x4B\x05\x04\x57\xED\xE4\x0D\xE8\x02\x0D\xD3\x10\x8C\xE5\x31\xF5\x13\xF0\x0F\xF6\xF0\x11\xF3\xF1\x55\xE4\xE3\x29\x0A\x38\xD4\xD4\x16\x39\xE1\x04\xD5\xE2\xEC\x02\x10\x04\x1C\x0B\xF0\x24\x12\x75\x54\x09\x05\xA2\xEF\x05\x56\x0F\x04\x49\x04\x04\x1E\x76\x07\x1E\x44\x06\x1D\x0E\xF2\x23\x16",
"\x7F\x31\xF3\xF3\x4F\x02\x04\x4A\x0E\xE2\x54\x06\xA9\x55\xBA\x06\x81\x88\x68\xF6\xB1\x62\xAE\x42\xF3\xA3\xE9\x04\x29\xEB\xE2\x7C\xEA\xEF\x52\x7F\x87\x6D\x6F\x01\x3E\xF2\x12\xFF\xC1\xF4\x51\xF9\xE2\xFD\xD7\xA3\x1F\x40\x02\x5B\xFF\x0F\x30\xF0\xF5\x5F\x05\x05\x52\xF4\x05\x1E\x75\x07\x1F\x41\x02\x65\xFE\x8E\x5E\xFF\x05\x46\x04\xEB\x28\xF7\xAB\x66\x0E\x8D\x22\x05\xF6\x40\xF8\xF6\x44\x0F\x04\xF3\xDF\xE7\x96\xA4\x06\xB4\x35\x32\x23\x0C\xF7\xBC\x73\xF7\x92\xE2\x05\x52\xF7\x04\xA4\xB4\xC4\x67\x04\x02\x65\xF7\xF6\x33\xF3\x04\x48\x07\xE9\x1E\x71\x11\x46\x15\x02\x93\xF9\x8F\x73\xF2\x04\x4F\x0F\x04\x4C\x0E\x71\x62\x0F\x06\xF0\x86\x02\x65\xFD\xE8\x11\xF9\x05\x57\x0F\x04\x52\x01\xE8\xA0\xEE\x04\x92\xE7\xAB\xC8\x74\x07\x27\x08\xF8\x8B\xBB\xFA\xAD\xFF\xFA\x5F\x03\x05\x48\x0C\x04\x61\xF2\x10\x73\x08\x06\x6C\x08\x02\xB8\xF7\xEE\xBA\xFE\xFA\x81\xEE\xFB\x52\x01\xFC\x11\xB8\x06\x72\x09\x02\xC7\xF2\x9C\x00\x09\xFC\xBC\xF8\x05\xAE\xFE\xFC\x00\x08\x07\x5E\x1A\x02\xD3\xF2\x9E\xD5\xF5\x04\xAC\xFA\xFC\xDE\xEE\x04\x44\x0A\xFD\x0F\x6B\x02\x71\xF6\x8D\xD6\xF1\xE8\xAE\xF9\xE3\x5E\x1C\x02\xDF\xF7\xC5\x01\x1D\xFE\x5F\x0E\x04\xD4\xEA\xFD\x4B\x94\x07\x2D\x05\xF6\x72\xC6\xFF\x4E\x01\xC0\x63\x7C\xEB\x46\x3C\x2E\x02\xFF\x78\x63\xF6\x7B\xD0\x49\x03\x29\x02\x94\x03\x27\x0B\x07\x80\xD4\x65\xFE\x62\x7F\xDD\x71\xE8\x54\x02\x14\x10\x74\x42\x4A\x2B\x25\x02\x18\x09\xFA\x1A\x7A\x04\x83\x7F\xBC\x7C\xCF\x4C\x03\x16\x78\xF7\x4E\x4D\x19\x11\x01\xF3\x78\xAB\x5F\x80\x0A\x8F\x05\x7F\x70\x15\x1A\x7E\x53\x14\x0E\x32\x01\xF5\x78\xA0\x76\x7E\xD4\x79\x71\x6A\x0B\x06\x1D\x81\x84\x0D\x42\x76\x7C\xB8\x6E\x02\x45\x77\x56\x50\x4E\x87\x14\x03\x29\x83\xBF\x00\x80\x45\x07\x0A\x3A\x7F\xD3\x15\x03\x34\x82\x9C\x56\x7F\x4F\x06\x08\x30\x7E\x33\x06\x03\x4E\x81\x58\x76\x7F\x70\x71\xC7\x53\x0B\x1B\x06\x05\xC8\x43\x0A\x84\x7F\x0B\x80\x07\xB3\x02\x1C\x00\x01\x9A\x4F\x17\x9C\x7D\x43\x00\xCE\x6C\x7A\x67\x44\xC9\x74\x01\x0E\x05\x83\xA3\x4F\x0C\x81\x74\x23\x0D\xE1\x43\x02\xC7\x2E\x4C\x63\x02\x07\x25\x7A\xDD\x69\x00\xD0\x79\x14\x96\x54\xE1\x2F\x0D\x26\x03\x1D\x00\x07\xB8\x4E\x1C\x82\x74\x50\x7D\x75\x7C\x01\x42\x8A\xC6\x07\x86\x10\x12\x7A\x38\x7E\x19\x4E\x53\xBC\x0D\x03\x65\x7B\xF1\x50\x82\x42\x05\xC5\x52\x02\x2B\x05\x04\x5F\x60\x00\x15\x5A\x8D\x2D\x0C\x3E\x01\x2E\x8F\xD4\x07\x84\x88\x70\x7F\x6E\x07\x07\x3B\x82\x7B\x28\x05\xD4\x00\x15\x06\x78\x48\x06\x52\x53\x2A\x34\x10\x04\x2B\x84\x29\x47\x84\xA5\x77\x15\x96\x7D\xC1\x78\x83\x68\x01\x10\x06\x82\x02\x0E\xFE\x56\x03\x4B\x7A\xFD\x48\x3A\x10\x1B\x81\x2E\x21\x18\x93\x80\xF2\x78\xEF\x45\x01\x10\x0B\x02\xB7\x52\x0C\x12\x0D\x35\x03\x04\x65\x7A\xBE\x36\x7F\xB1\x78\xC6\x41\x81\x22\x0F\xCF\x75\x35\x11\x39\x11\x44\x06\x16\x99\x21\x43\x82\x05\x12\x79\x15\x12\x02\x4E\x06\x52\x7C\x4B\x1C\x2B\x2E\x62\x86\x81\x38\x85\xA6\x72\xE2\x45\x02\x5E\x81\x03\xE5\x02\x11\x08\x86\x86\x2A\x19\xA0\x81\x40\x70\xEE\x0B\x81\x11\x02\x82\xBD\x5D\x0C\x07\x02\x52\x82\xD8\x07\x85\x12\x12\x82\x76\x77\x91\x08\x02\x46\x8F\xCD\x07\x86\xA9\x6D\x71\x1E\x3B\xD0\x14\x0B\x24\x0E\x0E\xAD\x33\x21\x93\x02\x57\x02\xD5\x7B\x85\x9C\x53\x07\x28\x66\x12\x0C\x88\xF7\x10\x1B\xB0\x72\x34\x7A\xD6\x14\x65\x19\x0B\x02\x96\x80\x8F\x36\x7F\x52\x7C\xE7\x01\x70\x15\x1E\x84\xA0\x60\x3F\x2B\x0C\x26\x08\x0F\xFD\x42\x3E\x8C\x81\x57\x00\x09\x3E\x73\x7F\x87\xC4\x77\x01\x3E\x2D\x02\xC0\x87\x10\x86\x03\xEC\x78\xE0\x00\x02\x19\x1E\x0A\x4E\x06\x1A\xAF\x26\x1F\x85\x04\x1C\x84\x8B\x60\x74\xFF\x63\x23\x14\x08\x40\x44\x06\x4F\x01\x50\x81\x7F\xFB\x82\xD0\x52\x03\x2C\x0A\xFD\x59\x09\x1E\x10\x02\x35\x8C\x40\x77\x88\xF2\x79\x06\xD4\x02\xE5\x74\x7D\xD0\x60\x0D\x11\x03\x94\x8C\xBE\x76\x7E\x11\x12\x7A\x41\x04\x09\x0C\x03\x2C\x0E\x09\xD9\x64\x77\x39\x03\x52\x01\x2C\x8D\x51\xB1\x88\x06\xCC\x00\x9C\x73\x02\xB4\x78\x3C\x13\x02\x90\x8C\x17\x81\x75\xA1\x75\x02\x4D\x01\x22\x86\x14\x2A\x0A\x14\xC1\x46\x5B\x9E\x8B\x45\x71\x00\x8D\x03\x7F\x69\xF7\x79\x19\x45\x16\x10\x55\x05\x22\xB7\x5F\x8B\x86\x01\xD5\x03\x8B\x6F\x7C\x2D\x16\x0A\x04\x8D\x43\x80\x05\x52\x01\xA8\x7E\x38\xE9\x60\x0E\x17\x02\xBD\x8D\x03\xCB\x84\xEF\x6D\x8A\x85\x74\x0A\x37\x55\x19\x46\x11\x58\x02\x66\x8E\x7A\x9C\x88\xE5\x49\x03\x21\x0F\xF8\x36\x0F\x18\x19\x02\x8D\x88\x1D\x50\x82\xA7\x8C",
"\xF8\x25\x77\x3F\x6F\x03\x53\x8C\x25\x06\x10\x2D\x0C\x1A\x85\x8D\xDA\x72\x73\x40\x87\x56\x79\x0E\xB4\x1B\x05\x65\x7B\xD3\x40\x80\x41\x05\x09\x11\x74\x28\x06\xF0\x45\x02\xD4\x37\x38\xD4\x55\x0C\x1C\x03\xDB\x80\x18\x76\x7D\x13\x14\x70\x01\x73\x1E\xB9\x59\x46\x50\x38\x5D\x03\x68\x98\x8A\x2C\x85\xC3\x6A\x75\xB6\x7E\x06\x2C\x19\x78\x70\x6E\x64\x69\x3D\x2E\x7C\xC0\x7A\x0D\xA3\x74\xA8\x66\x8D\x55\x05\x3F\xB6\x3F\x17\x04\x02\x08\x2D\xC3\x56\x1D\x5F\x04\x2D\xA6\x65\xFF\x8C\x1F\xD2\x7B\xA8\x7C\x8E\x55\x05\xC5\x5E\x84\x02\x9E\x39\x79\x0D\x19\x05\x08\xF8\x8B\xAB\x7A\x8E\x00\x9D\x1F\xDF\x03\xDA\x74\x7A\xDD\x8B\x40\xA4\x00\xAC\x71\x1B\x61\x01\xD9\x6C\x57\x0C\x91\x40\x8E\x91\x2F\x0C\xED\x60\x74\x15\x0E\x7D\xEE\x44\x40\x9B\x03\x20\x0D\x02\x5A\x01\x17\x0F\x01\x77\x02\x05\x22\x02\xF2\x85\x1F\x7B\x8E\x8A\x8E\x02\xA3\x72\xCE\x74\x73\x28\x75\x20\xE5\x7A\xC7\x2E\x02\xD9\x8D\x08\x32\x63\x2D\x01\x06\x2D\x02\x1E\x14\x91\x5A\x07\x0B\x37\x91\x1C\x94\x06\x6F\x8E\xF2\x6B\x71\x80\x77\xFE\x49\x93\x7F\x62\x23\xB0\x01\x0B\x19\x01\x5D\x02\x05\x25\x03\xB2\x77\xAB\x75\x7B\x13\x08\x79\x13\x94\x0C\x2B\x00\x17\x0F\x02\x6A\x92\x19\x05\x7B\x9E\x87\x43\x85\x73\xE6\x75\x14\xED\x93\x0A\x07\x03\x65\x7E\x52\x4B\x7D\xC6\x70\xF7\x09\x09\x9F\x80\x00\x27\x00\x05\x1B\x02\x2F\x07\x02\x5C\x00\x17\x1D\x02\x7C\x06\x50\x9C\x02\x17\x09\x02\x2A\x03\x09\x1C\x03\x22\x02\x50\x9E\x02\x11\x06\x28\x88\x96\xA2\x8C\x94\x2A\x02\x04\x28\x03\xF7\x83\x14\xD2\x02\xA5\x74\x02\x7B\x90\x08\x9C\x7D\x84\x03\x2A\xF7\x70\x09\x08\x01\x81\x93\x50\x85\x95\x43\x99\x28\x86\x94\xA6\x8F\x94\x91\x93\x50\x94\x94\x56\x97\x29\x8D\x96\x08\x09\x01\x69\x05\xEC\x7A\x6F\x5B\x53\x05\x5C\x8E\xBE\x7A\x7E\x2F\x03\x0E\x2B\x00\x35\x00\x27\xBF\x60\xA8\x6A\x76\xB1\x8A\xE1\x49\x08\x65\x97\xE7\x0E\x72\x0A\x12\x94\x2A\x00\x51\xAF\x00\x15\x0B\x02\x03\x96\x83\x7D\x02\x8D\x93\x5A\xAB\x00\x07\x7B\x06\x65\x7B\x70\x67\x76\xCC\x59\x20\x1F\x02\xB7\x07\x03\x47\x5F\xB8\x99\x08\x37\x06\x05\x12\x02\xD3\x74\x07\x6F\x0F\x4F\x0E\x47\x40\x00\x04\x24\x00\x1E\x07\x2E\xF0\x03\x0D\x1E\x01\xB7\x55\x5E\xB7\x00\xFB\x3A\x2F\xAE\x02\xBB\x91\x3A\xF9\x41\x5E\xB4\x96\x72\x9E\x03\x0D\x75\xBD\x9A\x09\x69\x06\x29\x49\x0A\x8A\x0A\x6F\x07\x98\x4B\x0A\x98\x69\x04\x22\x2E\x00\x1A\x05\x03\x3B\x05\xB2\x16\x98\x01\x0B\x60\x99\x08\x84\x90\x31\x94\x0A\x0F\x1A\x01\x20\x06\x61\x89\x98\xDC\x64\x11\x20\x00\xC8\x9E\x5A\x74\x00\x04\x22\x00\x57\x72\x02\x20\x00\x92\x9A\x8E\x26\x98\x04\x17\x38\x10\x03\x15\x20\x02\xAC\x29\x53\xC3\x08\x08\x0D\x00\x05\x0A\x31\xF0\x00\xC7\x84\x99\xA2\x80\x64\xA2\x99\x8E\x95\x06\x31\x98\x1E\x84\x11\x2A\x98\x05\x2D\x99\x2D\x01\x32\xCF\x15\xCC\x89\x57\x2E\x38\x04\x3B\x02\x95\x9C\x02\x2D\x99\xBD\x99\x46\x4F\x98\x2B\x73\x02\x10\x0D\x07\x20\x01\x17\x0A\x99\x29\x05\x65\xB5\x98\x1C\x35\x48\x3A\x98\xCF\x83\x9A\x40\x9F\x63\x8D\x9B\x8D\x9F\x30\xC0\x99\xCC\x88\x99\x2A\x9E\x05\x2D\x99\x97\x95\x04\x31\x9B\xCC\x95\x99\x59\x55\x6C\xBB\x99\x9E\x9F\x33\x8B\x99\xD0\x8B\x9B\x3E\x9D\x6D\xBE\x9B\x98\x97\xC1\x4A\x08\x08\x08\x01\x87\x99\x71\x88\x9C\x11\x07\x40\x2D\x9B\x1E\x28\x03\x52\x98\x04\x0F\x41\x94\x9D\x03\x2A\x99\x12\x13\x03\xF4\x15\x65\x9D\x9B\x14\x00\x02\x7C\x01\xE2\x8C\x9C\x73\x05\x65\xA2\x01\xFD\x7E\x38\xAC\x18\xE4\x93\x9A\x93\x98\x04\x15\x9C\x11\x07\x39\xCE\x02\x3A\x79\x9C\x5C\x98\x04\x1C\x9C\xCE\x92\xE8\x1B\x25\xCC\x81\x2F\x34\x9B\x6B\xB4\x16\x9A\x68\xD0\x58\x98\xE7\x9E\x9C\x8B\x9D\x71\xAA\x99\x39\x12\x16\x62\x9A\xEE\x85\x26\x1D\x65\xA6\x43\x0E\x10\x0F\x38\x91\x9D\xEA\x8B\x9D\xAD\x9E\x78\x1A\x9C\xD9\x9D\x39\x9F\x9E\xF0\x83\x9D\xEA\x62\x74\x84\x9E\x36\x06\x3C\xA0\x03\xEE\x89\x9E\xBD\x99\xC3\x0C\x9E\xD3\x9E\x3C\xC4\x22\xEA\x96\x9C\x73\x06\x75\xB4\x03\xE2\x15\x3C\xB1\x9F\xEC\x86\x9B\x7C\x9A\x70\x91\x99\xBF\x98\x36\x83\x9C\xC8\x85\x9C\x20\x0A\x65\x82\x84\xAB\x94\x2F\x37\x9E\xED\x95\x99\x06\x1F\x61\x05\x40\xF8\x95\x3F\xF3\x9E\xDA\x85\xA0\x25\x9F\x7E\xAD\x60\xC5\x9A\x32\xEA\x09\xE9\x85\x1C\xE5\x98\x2B\x27\x9E\xD6\x9E\x06\x53\x9F\xEF\x9F\x9C\xA4\x9D\x81\x95\xA1\xF1\x90\x41\xA8\x9E\xF9\x8B\x9D\xEA\x9D\x35\x16\xA0\xEA\x97\x35\xE2\x9C\xC8\x81\x61\x53\x12\x5D\x39\x9C\x10\x01\x44\x74\x00\xEF\x8F\x16\x04\xA6\x2D\x3D\x9A\x03\xA2\x34\xB2\xA2\xFC\x89\xA0\x20\x04\xBD\x12",
"\xA0\x11\x0B\x05\x56\x9A\xD3\x80\x99\x02\x31\x2F\x2A\x99\x2E\x0D\x3D\xC2\x02\x79\x2F\x26\x65\x9C\x83\xA7\x9C\x10\x0C\x13\x13\xA1\x6B\x06\x10\x78\x02\x73\xBB\x9A\x04\xA4\x3F\xB6\xA3\xC8\x96\x9F\x20\x00\x7F\xAE\x02\x06\xA8\x38\xC1\x9D\xE8\x8A\xA2\x11\xA4\x72\xA8\x9E\xD8\x9B\x39\xD5\x9E\x17\xBA\x9E\xD9\x98\x8C\x9E\xA0\x09\xA0\x3D\xE9\x9F\xEB\x9B\x24\x23\xA4\x76\xBD\x9E\x90\x98\x3B\xB5\x9B\xF7\x87\x68\x4E\x9F\x82\xA7\xA3\xE1\x92\x3D\xAB\xA3\x1D\xA5\x69\x05\x42\x8D\x92\x9D\x0F\xA8\x3E\xEC\x9C\xF7\x8E\x9F\x66\xA5\x81\x9F\xA2\xEC\x94\x07\x5A\x9D\x1F\xB6\xA3\xC8\x98\x8F\x85\x24\x41\xAF\x3C\x85\xA6\x3A\x66\xA4\x71\xA1\x86\xAC\x9B\x2B\xA4\x43\x80\x9F\x0C\xB8\xA1\x5A\xA4\x8B\x96\x9F\x2F\xAD\x3C\xEB\xA2\x18\xAC\x9D\x98\x98\x8E\x88\xA4\xE0\x9A\x48\xE8\xA1\x23\xB4\xA4\x84\xA0\x95\xAA\x9E\x32\xA4\x3D\xF2\xA2\xED\x94\xA3\xFF\x9F\x78\xBD\x09\x17\xA3\x49\xFA\xA1\x2B\xBC\xA3\xED\x98\x92\xBB\xA4\xF0\x9E\x34\xA5\xA7\x20\xAC\xA3\x85\xA5\x8F\xA5\xA2\x56\xA0\x3A\xAE\xA6\x23\xA1\xA6\xBA\xA3\xA4\x44\xA7\x49\xA6\x4C\x95\xA6\x2C\xB7\xA4\xCA\xA5\x96\x9A\xA5\xC0\x9C\x49\x9E\x98\xC8\x83\x9D\xA7\x1C\x7F\xB7\xA4\xC9\x96\x3B\xA2\x03\x1E\x0D\x99\x53\x9D\xD2\x5C\x39\xFF\x11\x33\x9C\x58\xE5\x5B\x9A\x5D\x9A\x04\x3D\x03\xEE\x91\x3B\x17\x58\x01\x7A\x9B\x67\x9E\x8A\x84\x9B\x03\xAA\x4F\xEE\x9B\xC9\x8B\x36\x29\x9A\x04\x32\x9A\xFD\x96\xB5\x65\x02\xE8\x93\x0A\x73\x99\x49\xB6\x9B\xDB\x29\x34\xBE\xA3\x24\xB7\x9F\x93\xA4\x69\xA2\x00\x90\x0E\x50\x81\xA7\xFD\x9B\x59\x91\x9A\x04\x15\x9A\xC0\x98\x35\x97\xAA\x74\x31\x9D\x5F\x9F\x56\x9D\x9E\xAD\x54\xBE\x20\x09\xBC\x86\xA6\xA0\x82\x69\x7D\x9F\xD5\x98\x11\x30\x09\xA5\x24\xA9\x52\xA1\x9F\x9B\xA5\x7D\xA5\x43\xB3\xAA\x3F\xA0\x01\x70\x9A\xA0\xA2\x9D\x94\xA0\xB4\x22\x9E\xD2\x9C\xA8\x26\xA1\x8B\x91\xA8\xFD\x9B\x41\xA5\xA1\xC4\x04\x9C\x18\xAB\x6A\x9A\xA9\x8A\xAD\x51\xD9\xA0\x46\xBD\x9A\x21\xA9\x6C\xAB\xA0\x92\xA0\x43\x82\xA4\x4F\xB7\x5A\xB6\x9B\x75\x93\x03\x84\x90\x07\x53\x10\x4C\xBC\x9A\x53\xA5\x9F\xBE\x9A\xB5\x90\x4E\xF7\x02\x38\xBD\x09\xFE\x98\xAD\x91\x95\xA5\x90\x54\xC7\xA8\xC8\x90\x9A\x59\x49\xA3\x9B\xA8\xA3\xAB\x3C\xEF\xAA\xD6\x80\xA9\x60\x9C\x9E\xAE\x56\xD5\x10\x43\xE1\xAA\x4D\xA3\xAB\xDF\xA3\x08\x86\xA8\x06\xAB\x56\x82\xA5\xF6\x4A\x0B\xF2\x5E\x7B\x62\x25\x09\xA9\x40\x65\x46\x47\x14\x08\x23\xA4\x99\xBD\xA0\xC3\xAE\xBC\x08\xAD\xF7\x54\x5F\x79\x06\x89\x96\x16\xC7\xA3\x3F\xF1\xA1\x5B\xB5\xAB\x20\x07\xB0\x9B\xA3\xA5\xAF\x59\x86\x9F\xFD\x82\xA2\x5D\xA1\xAF\x82\xA5\xF8\x57\x59\xEC\x08\x63\xBF\x5D\x9C\xA8\xB2\xAB\xA5\xCF\x94\x44\xAB\xAD\x5E\x09\xAC\x98\xAA\xB3\x84\x0B\xE9\x82\x5B\xE5\xA0\xE7\x95\x99\xD4\x5D\xA4\xAE\x03\x6D\xAF\x49\xFF\x9A\x08\x02\xAC\x2D\x99\xB5\x85\xAC\x63\xA2\x5A\xB8\xAE\x6B\xAC\xA9\xB0\xAC\xB7\x83\xAD\x65\xAF\x39\x93\xAC\x73\xB5\xAC\xDB\x5D\xB5\x8B\xAC\xE8\x9B\x59\xD2\xAE\x67\xB4\xAB\xA6\xA9\xB4\x98\xAE\xAA\x9C\x54\xC1\xA9\xFA\x44\xAC\x52\xAE\x98\xAC\xAD\xF9\x5F\x5C\xAA\x99\x63\xBE\xAE\xB3\xAB\x71\xB5\xAC\xF5\xA7\x5B\xDA\xAD\x66\xBC\xAE\xBB\xAF\xB1\x93\xAF\x5A\xAB\x42\xC1\xAD\x5F\xB2\xA9\xDC\xA4\xA6\xAA\x99\x73\xA1\x39\xDF\x03\x10\x11\x10\xAE\x54\x31\x19\x9B\xCB\x40\x4F\xAA\x9B\x3C\xAB\xA1\x94\x3A\xBB\x3F\xAF\xF8\x9D\x4D\xFF\x9B\x95\x85\x87\x81\x74\x6E\x8B\xA9\xC5\x03\x55\xE3\x5A\xF6\x09\x1F\x13\xB4\x8A\xA4\xAB\xC2\x12\x3C\xF6\xA3\x20\x21\xB1\x62\xAD\x93\xB4\x7B\x96\x46\x34\xAC\xB1\xCD\x93\x4C\x4A\x08\xC5\xBF\xAB\x4E\xA1\x2A\xC7\x01\xCC\x94\x5D\x2B\xA4\x8B\x2D\x69\x88\x14\x5C\xB7\xA2\x71\xB1\x81\x56\x9F\x42\x5E\x6B\xA2\x90\x32\xFA\x69\xC9\x1B\x9A\x4A\xAB\xAE\x82\xB3\xB3\x63\x25\x37\xB3\x90\xAD\xB0\x8C\x9B\x83\x85\xAC\xF0\xA9\x3F\x90\xA9\x20\xA2\xA9\x2B\xA6\x40\x78\xA6\x0A\xB2\x60\x9A\xB0\xC8\x97\x9B\x5B\x9A\x80\x55\x09\x7B\xA3\x40\xFE\xA9\x80\xA9\x9B\xDF\xA3\xB2\x94\xB3\x2D\xA0\x32\xA5\x7C\x19\x19\xAC\x22\x05\xB6\xB5\x99\xB7\x54\xB6\x5D\x1F\xD9\x5B\xB2\x22\xB7\x9B\xBC\x4D\xEE\x98\xA2\x34\x3A\x8A\x49\xA2\xC6\xA0\xC7\xAB\x9D\x50\x29\x23\x31\xA8\x97\xA8\xB3\x2A\x99\x36\x54\x0A\x3E\xBC\x85\x47\x0B\x9F\xA3\xA0\x82\xA2\xD0\xAA\x98\x23\x06\x02\x86\xB5\x9E\xA0\xA6\x87\xA5\x66\xBD\xB2\x47\xB5\x55\x81\xB7\xE3\x33\xA0\x98\xA0\xAC\x80\xB1\xE2\xAA\x36\xF2\x93\x8A\x6E\xB2\x2A\x4B\x85\xBE\x1C\xFE\x42\x63\xE7\xB0\x60\xA0\x01\x66",
"\x90\xE5\x68\xB5\x1C\x1B\x42\xB7\x17\x1B\x19\x15\xE1\x9C\xC7\xA6\xB2\x52\xBA\x67\x9B\x27\xFE\x8D\xA8\x21\x9B\x8E\xA4\xA6\xB5\xA2\x55\xC2\xA5\x19\x00\x26\x9B\x25\xD5\xBC\xB4\x4F\xAE\x63\x84\x9F\x24\xA2\x01\x08\xA9\xD8\xA3\xA7\x3A\xA1\x4D\xB0\x26\xF2\x8A\x0A\x27\xAC\x7C\x93\x9A\x16\x12\xD0\x13\xA3\x15\x05\x03\x93\x0E\xD2\xA9\xB0\x6F\xAA\x32\x86\x11\x0B\x5E\xA9\xE5\xAE\xAD\x8E\xAA\x05\xB4\x5A\xEB\xB1\xCC\x9F\x41\x64\x01\x08\x6A\xAD\x9A\x92\x14\x2D\x40\x45\x2A\xB6\x3E\xB4\xAC\xB3\x85\x88\x08\x6E\xA5\xAD\x95\xAB\xB7\x16\x0C\xBC\xBE\xB6\x36\xB9\x43\xAC\xB0\x96\xB5\x99\x12\x29\x07\x6F\x40\x3C\xB3\x6E\xC6\xAD\x78\x3D\xB7\xEE\xB6\xCA\x98\x9B\x83\xB1\x4D\xB8\x27\xB3\x18\xB7\x15\xB4\xAC\xAC\x98\x97\x9A\x50\xDF\xB0\x43\xB6\xA3\xC2\x60\x93\x3B\x64\x9C\x98\x6D\x86\x99\xC3\xA6\x97\x0D\xBE\x05\x31\x00\xD4\x79\x10\x2C\xB8\x00\x07\xB4\xAF\xB3\xAD\xB1\x97\x10\x0E\x6E\xA2\xAA\xC9\xB3\xB1\x14\x08\xE5\xB8\xB9\x32\x0E\x02\x32\x03\x40\x89\x08\x3F\xBF\xE5\x97\xB4\x1E\xA2\x02\x71\x95\xC4\xA1\xAD\x6B\x5B\x88\xA3\xA8\x0F\xBB\x3D\x76\xB0\xF8\x10\x50\x10\x58\x00\x2B\xB1\xB2\x4C\x2F\xB0\xB0\x48\x0A\xB9\x25\x06\xD6\x59\xBB\x8C\x93\x75\xEA\x14\x59\xB8\x83\x45\xBC\x81\x9E\xB2\x99\x9C\x50\xCB\xAE\xB6\xB4\x99\x4B\x4E\x0D\x0D\x4B\xA7\x40\x6A\xB7\x2C\x19\x11\xAC\x9F\x9F\xA7\x86\xA6\xCE\x2C\x94\x0A\x9B\x7D\xAA\x99\x41\x01\xED\x8D\x4A\xDA\x1F\x45\xBE\xAC\x08\x0C\x9A\x5D\xBC\x44\x38\x49\x80\xB6\x57\x8C\xB2\x5C\xB6\x9A\x56\xBE\x25\x58\x4B\x05\xBA\x78\x0D\xB1\x54\xA2\x9D\x3A\x07\xAC\x84\xB2\x10\x0B\x0E\xFE\x4A\xED\x88\x9C\xF7\x73\xC4\x2B\x03\x98\x92\xB1\x01\xBA\xE7\x86\xB0\x92\x2A\xEB\x3E\x08\xCE\xB0\x75\x55\x9E\x08\x1B\x01\x2D\x9F\xB7\x9B\x9B\xC4\xBF\x3F\x37\xBA\xAB\xB3\x9F\x3A\xBF\xF5\x92\x99\x19\x02\x01\x36\x75\xED\xBC\xBA\x0D\xBC\xAC\x80\xB2\xA3\xBB\x64\x93\x53\xE4\xA6\xB2\x14\x57\xF0\xA1\x99\xDE\xB9\xA1\x4E\xB0\x93\xBC\x08\xB1\x99\xCA\x90\xB9\x1F\xA2\x54\xD7\xB1\xB1\xBB\x9A\x5A\xB5\x00\x7B\xB5\x7C\xBF\x4D\xC0\xB3\xF0\xA0\x51\x43\xB6\xF8\xBE\xBC\x24\xB4\x5E\xBC\xBC\xF6\xA7\xBE\xDA\xB9\x43\x50\xB2\x07\xA0\x6C\xC7\xB9\x28\xB4\xB8\x20\x01\xFA\x99\x46\xD7\xB5\x5C\xB1\xBD\x71\xB3\x98\xB7\xBD\x56\x35\x6E\x98\xBD\x49\xC7\xAF\xF8\x41\xBB\xCA\xAA\xEE\xA7\xBB\xE6\xA6\x5F\xAF\xAD\x7E\xBD\xAC\xF1\xAA\x65\x96\xAF\xFD\xB8\x5D\xCE\xAF\x76\xB6\x9C\xDD\xAA\xBF\x9F\xAE\xE6\xB2\x5A\x82\xBA\xF9\xA8\xAD\x9F\x99\xBD\xA7\xBB\xF5\xAA\x58\xF7\xBA\x08\x0F\xAF\x0A\xC1\x00\xF1\xB3\x07\xAB\x44\x94\xC1\x6E\xB8\xAF\xB1\xAB\xBF\xB3\x9D\xFE\xA3\xBE\x4F\x14\xFB\xBE\xB1\xEE\xBE\xC7\xAE\x01\x1A\x02\x0A\x27\x09\x0B\xD8\xBD\x3B\xBC\xAC\xA7\xA7\x78\x99\x4E\x87\xB2\x57\x09\xB0\x84\xBC\x66\xB7\xAB\x78\xAF\x60\xE3\x98\xEB\x23\x16\xD6\x5B\xD4\x94\xBF\x01\xBD\x32\xC0\x01\x0D\xC8\xB0\xA5\x52\xC1\x85\xBD\xC6\xB9\x7C\xBD\xC3\xD6\x91\xB0\x79\x3E\x04\xDE\x80\xA9\xB7\x72\xF8\x20\x15\xAE\x01\x36\x04\x1D\x27\x08\x2D\xC0\x83\xB2\xBE\x71\xB6\x1D\x66\xAE\xE8\x82\xB6\xDC\x96\x4E\xE8\xA5\xC8\x95\x33\xEC\xA0\x64\xAE\xA6\xB9\x20\x65\xCE\xC2\xCB\x82\x59\x9E\x34\xCC\xAB\xBE\x21\xC9\x71\xDF\xA4\x18\xC1\xBB\xB5\x98\xAD\xB8\xA4\xB5\xAF\x53\x80\xBC\xF3\xB0\xAB\xDC\xBD\xDD\xBF\xC3\x1D\xCE\x35\xF3\xB7\xD6\x8B\x58\xEF\x56\x7A\x53\xC2\x2A\xAD\x30\xA9\xB9\x0C\x16\x01\x41\xBB\x20\x01\xBA\xFA\xB4\x6E\xA2\x01\x20\x86\x03\x61\xBB\xCA\xA3\xC3\x72\xAF\x7C\xDE\x9F\x26\x28\xB6\x3D\x0A\x0A\xFC\x80\x81\x0C\x88\xEF\x27\x15\xD1\x01\x37\x03\x35\x89\x08\x55\xC2\x74\xB9\xBD\xAF\xBD\x09\x99\xC7\xA7\xA6\xBF\x67\xBD\x89\x90\x6B\xC5\xAA\xC4\xA3\xC2\x5C\x8D\xB9\x46\xCB\x73\xAA\xB8\x0E\x04\x96\x09\x08\x18\xED\xC5\x18\xCF\x4D\xFB\xB4\x1A\x11\xC5\xE9\xB0\xB4\xB4\x8D\x80\xA3\x57\xCC\xBF\xD1\x86\x9C\xE8\xB9\xE1\xAE\x40\x83\x22\x7D\x8B\xC7\x2E\xC6\xC5\x8E\xC1\x07\x39\x95\x84\x0B\x8D\xC3\xC6\x17\xC4\xAB\xE6\xB0\x4D\x08\xC7\x81\xB8\x54\xEC\xB5\x33\xCF\xA8\x20\x00\xDE\xB2\xB6\xF4\xB5\x6F\x93\x2A\x0E\x58\xC5\xC9\x82\x17\xFB\xB8\x5E\xCE\x85\xBD\xB8\x0C\x0B\x84\x09\x08\x1F\xDE\xC7\x65\xBB\x32\x91\xBD\xBC\x83\xBB\x60\xB6\x7B\xA1\xB9\x5C\x69\x49\x65\x52\x61\x74\x79\x88\x6F\xD1\x99\x46\x1B\x48\x90\x91\x6F\xB3\x0A\xB9\x31\x06\x0C\x36\x74\x89\xCC\x75\xA9\x6D\x3B\x25\x24\x64\xAB\x12\xAF\xBB\xF2\xBC\x7C\xE7\xBD\x27\xC6\xA2\x79\x09\xC4\x96\xC9\xD1\x65\x80\x6A\x99\xA7",
"\x9F\x94\x35\xB3\xD6\x85\x9B\x17\xB9\x91\x25\x49\x86\x24\xA0\x23\xCA\x21\xD9\x30\xB2\xA5\x20\xB3\x1D\xED\x03\xAC\x12\xAF\xA7\x80\xC9\xB2\xB2\x55\xDF\x99\xE6\xA5\x0C\x9B\xB8\x88\xA5\xBD\x9A\x9B\xB0\x36\xC8\xC1\x58\xB3\x31\xCF\x59\x24\xAB\x3B\xC2\x6D\xFA\xC3\xB0\xA5\x9A\x85\xAA\x04\x13\x8E\x5D\x19\x8C\xE1\xAE\x47\xDD\x9E\x6E\x53\x4C\x70\x53\xB2\x9C\xAE\x0D\xCA\x6A\x6F\x16\x30\x66\x2B\xD7\xC9\x02\x4A\x72\xE0\x89\x42\x06\xCB\x42\xB9\x29\xD8\xC9\x6F\xAA\x91\xE3\xC7\x2C\xCE\xBE\x45\xA7\xC2\x06\xC9\xCC\x62\x75\xEA\xC9\x01\x41\xCB\x76\xC9\x1B\x7D\xB9\x4D\x99\x10\x7C\xC9\x5A\xC9\xC8\x4A\xCF\x9B\xB5\xC9\x03\x96\x50\xF1\x95\x4E\xC9\xA8\x30\x9E\xE3\x9C\xB0\x2C\xBE\x93\x83\x0C\x50\xC4\xBD\x02\x4B\x85\x85\xCA\xC2\xC3\x97\xB5\x14\x29\xD9\xCB\x19\x30\x2F\xC0\xCD\x42\x2E\x02\x33\x01\x37\xC3\x08\xDD\xC4\x5E\x98\xCD\x88\x1B\x94\xE1\xA6\x18\xD3\xB6\xE5\xA7\xA7\x92\xCB\xB9\x15\x95\xFF\xB7\x55\xCB\xA1\x59\xCC\x4C\x7E\x4F\x70\x94\x85\x99\x08\x0C\x1E\x84\xF5\x90\x06\x2A\xB8\x6E\x07\x12\x3C\xCD\x17\xD0\x01\x4B\xC9\x7B\x86\xBA\xB7\x00\x03\x31\x9B\x51\x62\xA2\x35\x9B\xA8\x48\xA3\x40\xA8\x52\xF0\x00\xA8\xA9\xA3\x7D\x06\xCC\x80\xCF\x6F\xAD\x02\x78\xC0\x71\xC6\xCE\x25\x38\x39\xDB\x9A\xE5\xCD\x5F\x4C\xCF\xD9\xAD\xA2\x20\xA6\x79\x76\x0D\xDE\xA2\x9D\xE4\xAB\x0A\x16\xCE\xB6\xC8\x3B\xF4\x38\xED\xC0\x02\x5C\xCD\x31\xBF\xCE\xCE\xCB\x75\x9D\x20\x8F\x0E\x37\x9A\x9D\xBE\x84\xCE\xB8\xCC\x38\xFD\xB9\x37\x99\x10\x7C\xCE\x37\xD3\xCE\x2A\x9D\x0D\xB8\xC3\x4D\xC8\x56\xB9\xCE\xB3\xA1\xA4\xC6\xB6\xDA\xB9\xB5\xE5\x96\x4C\xDC\xB7\x7E\x56\xC0\x5C\x20\x24\x27\x02\xFB\xC7\xC4\x39\xCD\x7E\xD6\xCD\x2B\xC6\x0B\x36\x74\x0D\xDF\x9B\xE6\xCD\x45\xA5\xCE\x20\x9F\x38\xE4\x03\x15\xAE\x9E\xD4\xA4\x7C\xD3\xA0\xF3\xC8\x68\x9A\x9D\x6D\xA0\xA0\x8C\xA7\x87\xCA\xCF\xD0\x4B\x44\xC9\xCE\x9D\x66\xA2\x9D\xA0\x13\xB1\xCF\x2A\x9A\x7D\xAB\xD1\xF2\xC4\x9D\xAF\xD1\x88\xD9\xCE\x32\xD3\x3B\xF4\xD0\xEF\xC6\xA3\xE0\xCD\x8E\xC2\xCF\xF5\xCC\x6B\xAC\xD0\xB2\xA2\xA0\xCD\xCB\xE4\xB8\x9D\x06\xD2\xE2\xA2\x9F\x04\xDC\xCF\x0B\xD2\xE1\x8D\xD0\x01\x6F\x41\xD3\xA1\x08\xD4\x95\xCA\xD0\x8F\xC0\x01\x34\xBD\xE1\xBA\x98\x6B\xCB\x73\xA9\xC1\x85\xAE\x01\x37\x01\x16\x36\x74\x35\xDD\x85\xCB\xB4\x15\xAF\x9B\x00\xA9\x5E\xBA\xA8\x82\xA1\x0A\xCB\xBC\x3A\xC1\xA5\x12\xAC\xA2\xA4\xC6\x8F\xA1\x35\xC9\xB1\x6B\xC4\xB8\xCB\xC6\xF1\x86\xC4\x10\x04\x55\xB5\xD3\x12\xB7\xAA\x23\x69\xAB\xAA\x99\xAD\xAD\x06\x5D\xAB\xB1\xA5\xA8\xE2\xB4\x18\xCC\xB7\x0A\xB0\xA7\xB9\x36\x9C\xC3\xA8\x13\xA8\x52\xEA\x99\x68\xBB\x93\x8B\xCE\x2C\xDD\xC8\x43\xAB\xA2\x85\xAB\x8E\xC9\x54\x8E\xC0\xA9\xDF\xA8\x50\xAB\x50\xC5\xD4\x22\xD7\xA8\x85\xAB\x4A\xAE\xAF\x78\x06\xA5\x90\x31\xAF\xA1\x9D\xE4\xD2\x17\xC6\xD3\x44\x9E\x05\x38\x00\x40\x07\x12\x3C\xD5\x9B\xC3\xC2\x6F\xD0\x64\x8F\xC6\x93\xA0\x6C\xFE\xC0\x3A\xC0\xC4\xC2\xBF\xE8\x88\xD7\x54\xD8\x7E\xE4\x99\x35\xD9\xC5\xB5\xCF\x56\xD6\xC3\x94\xB9\x03\x34\x89\x42\x16\xD6\xFB\xC0\x58\xCD\xB9\x4A\xDC\x18\x17\xD4\x62\xD5\x9B\x8A\xCB\x25\xDB\x9B\xBC\x9F\xAC\xF1\xC5\xB4\xC5\xAE\xF4\xC7\xFD\xB1\x00\x18\x08\xAD\x83\x08\xB6\xD4\xC4\x55\xA3\xE7\x9C\xD6\x8B\x02\xA7\x9B\xB9\xA7\xC2\xD7\x36\x9E\xD7\x22\xC4\x73\xD5\x8A\xC1\x47\x29\xD1\x01\xC1\x69\x21\x01\xD9\x6C\xD5\x87\x93\xD4\xD1\x86\x9A\xE2\x20\x2B\x32\xD2\x35\xBC\x7C\xC1\xA3\x88\xDB\xC0\x2B\xA0\x24\xC4\x6A\xAC\x9D\x9C\x9A\xAC\x14\xB2\xA2\xB6\xD0\x5D\xD8\xC7\x5E\xC1\x03\x32\x01\x29\x07\x09\x1F\xDF\x57\xC5\xD9\x60\xD9\x45\xAD\x61\xBC\x8A\xAE\xE4\xBD\x9A\xB1\xA4\x11\xAA\x81\x99\xA2\xF2\xB0\xA5\xC8\xA2\x04\x21\xA1\x0D\xAE\x77\xC7\xB8\x0A\xBD\x47\x5B\xA5\x66\xAD\xA0\x5E\xA5\xAE\xF9\x86\x3C\xDE\xC2\xE9\xD2\x05\xF1\x01\x19\x0B\x16\x89\x09\xD1\xC4\xD8\x02\xB4\x64\xDA\xA2\x39\xDF\x6B\xF9\xC3\x93\xD9\xA5\x20\x01\x80\xBD\x4F\x9E\xD6\x13\xBF\xDA\xC6\xDE\xD7\x8E\xC4\x06\x3E\x00\x5B\x7B\xB5\xA2\xD9\xD2\xDB\xD6\x52\xD4\xC7\xA2\xA5\x3D\xAA\xB2\xB1\xDB\xE5\x94\xA5\xBE\xA5\x99\x83\x9F\x34\xA5\xB6\xA7\xA5\xEB\x8F\xA3\xB0\xC0\x91\xB6\xA4\xA7\xC4\x6D\x9E\xC7\x30\xB2\xA4\x81\xA1\x6D\xD7\x9F\xED\x9D\x3D\xFF\xA3\x8E\xAC\xD0\x67\xBE\x9A\x91\x9F\xF6\x94\x5D\xFB\xA2\x8B\xD8\xB4\x7D\xD9\x92\x80\xA4\x8A\xD1\xB8\xAB\xDA\x1B\xAB\x9F\xD9\xA3\x76\xA7\xC1\x0A\xB1\xB4\xE7\xD1\x0C\x15\x01\x72\x07\x24\x19\xDC\xAF\xD8\x68",
"\xCA\xD9\x12\xB0\xB6\x5F\xA6\x69\xE9\xAA\x7C\xD6\xD0\x0B\xDE\xF8\x98\xD2\xD8\x0E\x79\x56\xC1\x6F\xB1\x6E\xE0\xA9\xC6\xDE\xB1\x0C\xC9\xE5\xAB\x96\x75\x62\x27\x64\x00\xBB\x53\x97\x22\xB0\x04\x00\x02\xA9\x31\x78\xCA\x09\xD5\xAD\x49\x3D\xBB\xEB\x86\x08\xE1\xD4\x2F\x89\xBF\xD7\xA9\x17\xC9\xA9\x71\xB7\xD6\x39\xDA\x7F\xB6\xD0\xDD\xAA\xBB\x76\xBD\xED\x8B\x0D\x8D\xC5\xB8\xC0\xB7\xDC\xBA\xBB\xD1\xDB\x75\xB9\xBB\xBA\xBC\x77\x9E\xAC\xE0\xA9\xBC\x83\xB9\x65\x8B\xC3\xCD\x39\xAC\xE0\xDF\xE2\xA3\xDF\xA8\xD5\x10\xD8\xB3\x95\x92\x79\xB1\x99\xE5\xAE\x03\xFD\x98\xF3\x8E\xCC\xC3\x00\x99\x81\x41\xF5\x80\xBD\x6E\x3B\xF4\x82\xCB\xC8\xCE\x39\xA7\xBD\xEA\xB5\xB5\x5D\x4B\x30\x51\xBB\xDE\xD1\x56\x3C\x3C\x01\xEE\x03\x9D\xCA\x78\xC3\x08\xE2\xD7\xC0\xC7\xDE\xB5\x09\xDE\x88\x9F\x5E\xD6\xDF\xB3\xBF\xBC\xEB\xB8\x50\x12\xDE\xDA\x18\xEE\x8B\x9D\xE6\xDB\x44\x95\xE1\xF6\xD8\xBB\xD8\xDD\x7B\xF2\xDA\xC3\xC1\x32\xE6\xDF\x65\x4C\xBC\xE4\xDE\x4F\xE5\xE1\x96\x41\xBE\xA8\xE1\xFA\xCF\xBC\x2A\x99\xF2\x8E\xD2\xF7\xD8\x43\x16\xBC\x5A\xB2\xDF\x9A\xBD\x7E\xF3\x3B\xFB\xD6\x1F\x03\x12\xD9\x32\x03\x3A\xE7\x42\x26\xBC\xD4\xB4\x3D\xAF\xB1\x00\xFD\x58\x72\x65\x05\x9F\xBE\xDF\xBA\xDB\x4A\xE0\xC8\x03\xB2\x2A\xBD\x1A\x89\x08\x29\xE2\x74\xC4\xBD\xC9\x0A\x9B\xCB\xDA\x65\xBD\x01\x3F\xDA\x92\xD9\xB3\x12\xF9\x50\x93\xDC\x68\x95\xDD\x5C\xD2\x03\x32\x02\x09\x0A\x6F\x67\xE4\x73\xF1\xB8\xE4\xA4\x58\x9C\xE1\xE4\x9C\xBF\xEC\xAF\x00\xD7\xC1\xE8\xA9\x81\xD5\xDC\xD1\xB4\xAC\xDA\x5E\x00\xD6\xC1\xD6\x0F\x7F\xBD\xAE\x36\xBB\xD3\xE2\xAA\x7B\x66\xD5\x3B\xD0\x81\x8B\x9E\x04\xD6\xD1\x1E\xC5\xBD\xB3\xE3\x3E\xE2\x82\x89\xA4\xC4\xD4\xAF\x64\x02\x8F\xFA\xAD\x10\xCE\x59\xC0\xAD\x09\xC1\xC2\xF0\xD4\xAC\xAC\xE3\xFC\xBC\x81\xEF\xE1\x01\xDD\xBF\xD0\xAC\x91\xDA\xE0\x01\xCD\xC9\xD3\x98\x1C\xF5\xC0\x93\xE0\xBE\xBE\xAD\xE1\xC8\x8E\x8D\xC2\x20\xC4\xE4\x23\xD2\xB9\x87\xE5\x0E\xC5\x5F\xF1\xE2\x05\xD8\xC0\x00\xC6\x8E\xF3\xAF\x09\xC5\xCB\xA8\xE4\x08\xCA\xE5\xFC\xAE\x92\xEE\x5F\xD9\xCA\x5E\x24\xC4\xFF\x49\x08\x45\x3E\x69\xEA\xB8\x76\x02\x6A\x4C\xE4\xD7\xB4\x17\xE0\xC5\xF0\x53\x13\xEE\x91\x3F\x20\x64\xDF\x5B\x24\xD9\xB6\x46\xF3\x99\xD5\x94\x04\x52\xE7\x74\xB3\xA2\xD0\xE7\x9B\x89\x7B\x40\x44\xCD\xFA\x59\x36\x65\x66\xD8\xE2\x90\x9B\xE6\x95\x9E\x3C\x4A\x78\x57\x16\xB4\xE1\xE2\x83\xB1\xC3\xC1\xA5\x33\xD5\xE7\xDE\x56\x1D\xBF\x35\x0C\x19\xE7\x25\xAB\xCE\x94\xA3\x3C\xF0\xE7\x9B\x24\xAC\xAE\x7A\x8B\x05\xCE\xF2\x1F\x39\xF9\xE7\xFB\xE1\x72\xBD\xE6\xB5\x74\xD0\xA2\xB4\xBD\x91\xE7\x51\xB7\x95\xB5\xE6\x73\xE7\xCD\xBD\x09\x42\xF3\x9A\xFD\xE2\x51\x00\xE9\x9E\x0F\x75\xFA\x7B\x0A\xB6\xE7\x07\xEC\x5E\x17\xE8\xB2\xBC\x61\xAB\x9E\xAD\xA8\x0A\x1B\xEE\xB8\xBA\x79\x02\x15\xD0\xD6\xE4\x3E\xE2\xE9\xEA\xE4\xA1\xAB\x9C\x2B\x0B\xF3\x29\xE8\x16\xFD\xB8\x24\xE8\x5F\xE2\xB2\x19\x28\xCD\xE0\xE5\x40\xFF\xA6\x60\xBD\x58\xF3\xE0\xF4\xDD\xA7\x8E\xC2\xB0\xAB\xD6\xEA\xDA\xAA\xAC\xDF\xA1\xE4\x79\xFC\x30\x00\xE5\x4B\x22\xEE\xA7\xDC\xE8\xA1\x92\x6C\xAC\x44\xBB\xB3\x94\x39\xB4\x89\x27\x1E\x1E\x60\x42\x3D\xEB\xD9\x90\xE8\xA5\x78\x1E\x6D\xE9\x7B\xE8\xCE\x96\xE9\x4C\xE5\xE9\x2A\x9C\x7B\x62\xEA\x87\xEE\xB4\xE4\xA8\x8B\x08\x1B\x63\xE9\xA4\xE9\xE6\x63\xAD\xCF\xBA\xB1\x97\xD1\xCE\x5F\xEF\xA7\xC1\xD0\xAD\xE1\xD7\x95\xEA\x3E\xE7\xEB\x45\x9B\x75\x89\x0E\xA3\x06\xD3\xD4\xEB\x38\xB6\xEA\x01\xBA\x04\x19\x94\x12\xC9\xBF\x7F\x41\x54\xF9\xEB\x53\xEC\xA9\xF8\xB1\x3B\xE0\x78\xC2\xB6\x8E\x4A\xDF\x72\xB3\x5C\xC8\x53\xB9\xE7\x76\xCB\x50\xCB\x04\x19\x4F\x57\x82\xEB\x9D\x2B\x0C\xA4\x19\x51\x61\xEC\xEA\x88\xE9\xA0\x84\xB0\x79\xAD\x3D\x94\x16\x29\x58\x14\x5E\xEF\xA1\xFA\xEA\x11\x05\xFB\x6D\xDD\x91\xBF\xB4\x94\xEC\xA9\xD7\xED\x90\xA9\xD9\xA0\x03\x8F\x5C\xEC\x36\xD6\xB3\xCD\x53\xD0\xE6\x81\xA8\x0D\x18\x04\x7C\x6E\x04\x0D\x39\x03\xD3\xE2\xBA\x8A\xA3\x0E\xE2\x01\x3F\x04\x9E\xAB\x59\x53\x46\xD1\xD2\xE8\xFD\x82\xB6\x39\xAE\x5E\xF8\xE9\x80\xC7\x33\x8F\xEE\x6C\xF1\xEC\xFD\xC7\x5B\xDB\xB0\xD2\xD3\x90\xC4\x64\x42\xF9\x97\xC7\xE6\xE8\x06\xE7\x4D\x2D\x73\xDD\x95\x42\x0E\xEF\x42\xB8\xA2\xE0\xBA\xE6\xDC\x56\xCD\xEE\x0E\xC6\xBC\x2A\xE6\xBE\xC8\xEA\x18\xEB\xD4\xF6\xEC\x68\x4B\x0D\x4F\xEA\x5D\x00\x53\x0A\xD9\xDE\xBD\x43\x7A\xFD\x09\xBA\xD5\x4A\x89\x08\x05\xF1\xDF\xB3\xED\x6D\xE7\xCD\x4E\xCB\xB2\xD3\xAD",
"\xCA\xE3\x4E\xBB\xEE\xD2\xB0\xCD\x9B\xE8\xAD\x86\xA6\xE1\xE0\xDA\xB9\x66\x68\xEA\x99\xC6\xE8\xB9\xCA\xEE\x0A\xD0\x2E\xCE\xDB\x3F\x6A\xE6\xEB\xD6\x00\x89\x08\x15\xFD\xE0\xE0\xEC\xCB\x9F\xC7\xDB\xEF\xE3\xBA\x9D\xF2\xE9\x49\x03\xF1\x89\xF4\x17\x27\xF4\x5E\x10\xC8\x7F\x79\x10\x3C\xF1\x8B\xE6\xAE\x4A\x9B\xE6\xA2\xDC\x9B\xBF\xBA\x94\xDF\xC6\xD5\xC7\x33\x05\x06\x11\xC4\x22\x72\x10\x19\xE7\x2B\xC5\x03\xBF\xB2\xE6\x8C\xEA\x32\xC5\x8B\x9F\xC7\x46\x69\xB6\xF0\xC6\x67\xE7\xD6\x1F\xB3\xC6\xC0\x99\x67\xD6\x01\xAC\xC3\x20\x2C\xC4\x27\xFA\x32\x8F\xB9\x43\xAC\xE5\x16\xAD\xF9\x93\xB9\x2A\xFA\xD1\x37\xC4\xD5\xC2\x8B\x56\xDC\xCB\xC7\xF3\xF7\xB3\x03\x37\x02\x30\xC3\x08\xC2\xC4\xCC\xD0\xB6\x87\x02\x8E\xE7\xF0\x20\xEB\xC6\x83\xE1\xCD\xC3\xD7\xD1\xAD\x89\xD2\xC7\xBD\xB9\xF2\x55\xDB\xCB\xC6\xF2\xAC\xDD\x8B\xB3\x00\x0E\x1F\xCC\x02\x09\x34\xC3\xBB\x70\xCC\x6F\xFE\xF2\xF9\xAD\x28\x81\xF5\xA9\xAA\xC7\xD1\xBC\x8E\xBD\x87\xA1\xE5\x40\x5D\xCB\x34\xC3\x0F\x8B\x72\x10\x0D\x6A\x58\xC4\xC9\x7A\xCB\x76\xD7\x09\xBC\x0A\x5B\x02\x08\xEE\xC2\xF5\x4A\x0E\x07\x3A\xDD\x30\xE0\x34\xDD\xF2\xDF\x8B\xC1\x37\x06\x0E\x03\x50\x5D\xFA\xC6\xAA\xB0\xD8\xD8\xA9\x00\xA9\x86\xF2\xE0\x09\xE3\x36\xFA\xD4\xC3\xB2\xD4\x24\xD9\xA7\x83\xA8\x62\xF3\xAE\xD3\x53\xB1\xFF\xC6\x35\xAE\x0B\xED\xB1\xB2\x42\xD4\xCA\xD7\x5D\xB9\xEF\x83\xC6\xF0\x8C\xD7\x4E\xCE\xAC\xD9\x45\x8F\xA3\xD9\xBF\xF7\xFC\x8D\xDA\x02\xD8\xAF\xD2\xD8\xC6\xBF\xDA\xF2\xD6\xB9\xC2\xE2\x94\xDB\x41\xED\xDA\x66\xA3\xE5\x87\xDF\x65\xEE\xF6\x10\xAA\xCE\x2C\xD9\xCD\xCC\xBE\x37\xDA\x85\xBA\xD8\x19\x6F\xB7\xA5\xB8\x1D\xC8\xF7\xD2\xF1\x6C\xCB\x9F\xD4\xA8\xB2\xA4\xA5\xE3\xC6\xDB\xA9\xA1\x6E\xF6\xE3\xBD\xDC\xB6\x87\xFA\xDB\xCF\xDC\x68\xDC\x84\xA4\xF6\x3F\xAA\xB8\xFD\xF5\xFE\x9A\xDB\x8B\xA4\x6F\xD4\xF9\xBB\xD6\xBA\xC7\xAB\xBC\xE9\xA6\x84\xDC\x7A\x8C\xA6\x86\xFF\x4A\xA3\x9F\x23\xB1\xA6\x3C\xDC\x71\xF6\xD0\xC1\xDF\xB8\xA1\xB7\x2A\xF3\xBE\xE0\xF1\xDD\xF9\xA1\x84\xD1\x50\x8C\xD8\x3A\xCE\xD8\x17\xF5\x66\x92\xD9\xE5\xCA\xF2\x87\xD4\x8E\xD4\xA0\x17\xDE\x4B\xFF\xF7\xCE\xDF\xEB\xCA\xF7\x4E\xBA\xD4\x53\xB0\x54\xC1\xA5\x3C\xD3\xAA\xF7\xD1\xA9\xCF\xE5\x69\xF1\x50\xF8\xAA\xF4\xBB\xAA\xBD\xF9\xE4\x88\xD4\xAF\xD2\x04\x0C\xD4\x47\xD4\xAB\xDF\xF4\xC0\xE5\xAE\xF3\xD1\xA0\x98\xD4\x44\xD7\x50\xDF\xA2\x04\xE9\xFA\x77\xD1\x54\xFA\xD3\x4B\xFF\x51\xD8\xF6\xD3\xEF\xE1\xAA\xD5\xA0\xAF\xCF\x22\xDE\xAA\x8A\xD7\x1C\xF2\xD5\xDA\x1D\xEB\xF0\xF8\x01\xB6\x7F\x94\x20\x04\xF3\xE0\x36\xD7\x94\xDF\xC0\x58\xD2\xCA\x9A\xC3\x00\xC1\xFC\x9F\xE6\x96\xE9\xE5\x3A\xEC\x5F\xC7\xBA\x2B\xE7\xC7\x51\xFD\x90\xEA\xAC\x48\xE2\xC9\xA1\xE4\x25\xFA\xC0\xBB\xE0\x91\xFD\xE5\xC1\xF4\x41\x85\xFE\xDF\xA2\xE6\xD5\x5D\xCC\x83\xFB\x98\xB4\x60\xC7\xC3\x0D\xC9\xC2\x39\xC0\xA9\xEC\xEC\x08\xBF\x83\xD3\xDA\xB7\xFB\xFB\x88\xB5\xAC\xB6\xED\xA7\xC5\xED\xD9\xF4\x13\xCE\xFB\x69\xF3\xBF\xC3\xD4\x44\xCC\x57\xCF\xF4\x3F\xCC\xCA\xF6\xEC\x0C\xE5\xFD\x33\xCB\x4E\xE7\x35\x3B\xA6\x54\x4D\xC2\xAF\xB7\x02\x7B\xA2\x5C\xDE\xF8\xA2\xAC\xF6\x20\x03\xA7\xF2\xC3\x97\xC0\xFB\xAF\xB7\x85\xB9\x92\xD0\xFC\xCE\x9F\xB0\xB9\x5E\xFB\xC3\xC1\x4A\xD7\xED\xA9\xB2\x67\xD0\x7D\x73\xF1\xFB\xBF\xA9\x98\xD4\xC5\x45\xBD\xFA\xF5\xBE\xEB\xBE\xC4\xF6\x69\xF8\xA7\xB2\xC9\xD6\x8A\xCD\xB3\xDB\xE7\x7C\xE3\xBE\x94\xBF\xD4\x69\xF8\x2E\xDE\xE2\x97\xCA\x6B\xA3\xFD\xFD\xA4\xB1\x5F\x52\x89\x57\x40\x24\x7F\x31\x5E\xCD\x79\xE6\x6E\x59\x70\x59\x6F\x7A\xFD\x4D\x5D\x66\x2F\xD3\x52\xFA\x64\x79\x07\x73\xB4\x7A\xEF\x6B\x5E\x2D\x24\x01\x8F\xFF\x5A\x40\x8C\x59\x8A\x23\xF7\x4B\x51\x92\x5A\x08\x04\x68\x53\x57\xCE\x7D\xCC\x5A\x68\x74\x73\xD0\x5D\xA3\x58\xEA\x67\x6E\x67\x5D\x07\x84\x69\x72\x26\x20\x82\xFA\x75\x89\x5A\x7C\x9A\x5A\x09\x82\x93\x5E\x7C\x29\x83\xA7\x50\x42\x4A\x53\x21\x81\x27\x51\x6B\x54\x01\x5D\x73\x8B\x5E\x8D\x16\x7C\xC3\x56\x0B\x8F\x37\x66\x5A\x52\x01\x0F\x8B\x35\x6B\x5A\x02\x53\xEB\x7E\xFF\x55\x62\x97\x60\xC4\x53\xF1\x68\x5F\x10\x34\x47\x3F\x00\x83\x5D\x66\x78\xDA\x71\xF5\x68\x7F\x1B\x7F\xB1\x51\xD1\x19\x18\x16\x80\xB9\x5E\xB9\x57\x59\xD1\x59\xF0\x70\xB5\x65\x6E\x40\x82\x20\x5E\xA0\x6A\x6E\xDE\x58\xB8\x5B\x06\x3B\x68\x4B\x82\x71\x56\x8C\x76\x69\x51\x7C\xA6\x70\xF5\x4D\x55\x83\x7B\xA0\x66\xE8\x6F\x63\x53\x82\x2B\x65\x6E\x7D\x42\x70\x81\x53\x50\xE8\x73",
"\x81\x41\x57\xA6\x70\xC4\x5D\x7A\xF6\x58\x1E\x8A\x04\xA4\x79\x34\x5C\xAC\x76\x52\x42\x81\x1A\x5F\xB0\x71\xE3\x5C\x58\x20\x5E\x25\x13\xCC\x05\x64\x5C\x67\x41\x6A\x08\xAE\x01\x9A\x66\x43\x6C\x99\x75\x00\x68\x67\x40\x08\x96\x62\x66\x9B\x65\x49\x6C\x96\x57\x18\xE8\x58\x9A\x7E\x07\x98\x81\x3A\x7E\x5C\x64\xDA\x34\x65\xA7\x7B\x0C\x83\x1C\x19\x82\x5F\x64\x67\x66\x03\x3E\x65\x03\x06\x5F\x60\x0A\x9A\x82\xA2\x82\xCA\x43\x98\x43\x2C\x44\x08\x5B\x52\xE5\x67\x7D\x3D\x65\xC8\x43\xBF\x41\x65\x20\x01\xE7\x59\x32\x44\x65\xE5\x2A\x51\x6E\xB0\x38\x2C\x09\x07\x7F\x1F\x93\x46\x06\x27\x7B\x30\x8A\x72\x42\x02\x27\x04\x35\x8C\x75\x43\x83\x32\x61\xD8\x59\x4E\x46\x0B\x41\x71\xFA\x6B\xFA\x7A\x7C\x9A\x5E\xB1\x03\x45\x58\x83\xDF\x50\x81\x56\x84\x61\x4C\xDC\x83\xFE\x61\x80\x2D\x61\x45\x51\x38\x80\x75\x37\x67\xB6\x66\xEB\x5A\x9B\x6A\x7A\xB5\x6E\x3B\x28\xBB\x44\x67\xB2\x78\x10\x00\x0F\xB0\x01\xB7\x67\x0F\x39\x9B\x5D\x66\x15\x39\x42\x01\x10\xBF\x67\x64\x55\x75\x60\x38\x60\x68\x37\x6B\x7A\x61\xA4\x6D\x67\x43\x6A\xB7\x76\x55\x7F\x7C\xA6\x0F\x19\x03\x9E\x5F\x73\x00\x59\x8B\x6D\xA4\x62\x81\x05\x6B\x75\x62\xF0\x46\x4E\x54\x68\xDE\x6E\x10\xA8\x6E\xDD\x5A\x56\x59\x15\x12\x68\x91\x68\x3F\x8E\xA1\x47\x84\x30\x6B\x83\x14\xA2\x4D\x84\x2F\x67\x43\x88\xA2\x6F\x01\xF4\x65\x2E\x7F\xA5\x47\x6E\x51\x69\x42\x81\xA3\x6B\x84\x13\x6D\x4B\x85\xB1\x74\x7B\xAF\x51\x1F\x0B\x0F\xB1\x00\x17\x68\x1C\x01\x03\x13\x4C\x0C\x7B\x40\x0C\xE0\x7D\x4C\x31\x00\x3F\x59\x11\x31\x00\x08\x6D\x7B\x1A\x32\x58\x75\x35\x84\xCE\x79\x0A\xAC\x84\x34\x81\x91\x6F\xF3\x6E\x05\x6C\x80\x52\x8A\x36\x67\x7F\xFC\x82\x3E\x85\xA1\x6E\x05\x40\x86\x3F\x80\x16\x9D\x66\x79\x45\x42\x05\x16\x9E\x63\x49\x85\xB4\x7C\x14\x82\x6B\x34\x7F\x53\x8E\xA3\x45\x83\x43\x07\x80\x11\xB1\x47\x51\xDD\x67\x47\x87\xA2\x50\x57\x70\x00\xC6\x60\xAD\x7D\x6B\xE8\x23\x15\x62\x03\x35\x00\x6C\x6A\x41\x01\x18\x90\x80\x45\x7D\xB0\x7A\x53\x4C\x6D\x48\x7C\xFE\x77\x05\x8B\x7D\x44\x54\x17\x7C\xA7\x71\x55\xB8\x7E\x1F\x8F\x54\x49\x75\x23\x56\xDC\x76\xA8\x57\x7D\x75\x7C\x5A\x5A\x55\x5C\x55\x5E\x56\xA6\x68\xD7\x44\x86\x32\x7E\xD1\x78\x18\xB5\x69\x9B\x6A\xD9\x7F\x08\x90\x65\x8A\x87\x29\x8C\x18\xA2\x6A\x8E\x84\xC0\x50\x19\x99\x7A\xE6\x57\x64\x80\xC3\x73\x59\x96\x84\xAB\x68\x19\xA1\x42\x59\x7D\x4B\x59\xBE\x39\x7D\x9E\x84\xAD\x7E\x37\x76\x7A\xF3\x4D\xCF\x56\x03\x3E\x6A\x06\x04\x71\x80\x1A\x81\x7C\x05\x5C\xB5\x72\xE5\x46\x6B\xB9\x7F\xB5\x70\x1B\xAA\x5B\xBA\x7D\xB3\x6F\x62\x08\x7A\x70\x7A\xA2\x72\xC6\x73\x79\x2A\x62\x0C\x07\x03\x2D\x6B\x27\x29\x93\x77\x69\x49\x7B\x86\x86\xDC\x40\xE3\x49\x66\x39\x74\x6C\x6E\xEC\x6F\x79\x7B\x45\x9C\x7B\xE8\x7D\x85\x29\x5E\x0C\x08\x03\x1C\x87\x17\x0E\x77\x8A\x07\xA0\x87\xB9\x1A\xB0\x71\x76\x50\x7F\x37\x4F\xBE\x6A\xE5\x7C\x85\x3C\x26\x75\x8E\xE5\x72\x00\x39\x03\xC0\x63\x10\x03\x6C\xC7\x84\xD8\x7C\x16\x8E\x85\x44\x5E\x29\x81\x54\x78\x7C\x10\x6F\x54\x89\x13\x95\x85\x3E\x7E\xC5\x6A\x59\x3A\x85\xFC\x6B\x35\x6C\xE8\x48\x79\xEC\x6A\xAD\x3C\x04\x33\x5F\xDF\x85\xB8\x7B\x40\x6C\x7B\xA5\x73\x31\x5E\xB6\x74\x6C\x22\x7C\x06\x59\x46\x72\x7B\x0E\x7F\x73\x66\x64\x19\x52\x80\x71\xBE\x78\x34\x7B\x7B\x2E\x53\x34\x52\x7D\x6D\x81\x4A\x84\x72\x89\xDA\x44\x56\x29\x6D\x8A\x8C\x5D\x70\x7B\x2E\x6D\x8E\x8B\xF2\x71\x52\x33\x6C\x8B\x86\xB3\x70\x23\x29\x53\x8B\x8B\x35\x7B\x6C\x32\x8B\xFA\x55\xE4\x57\x87\x17\x88\x9D\x71\x03\x21\x6C\x06\x04\x94\x85\x20\x8D\x5B\xEA\x7A\x82\x50\x22\xB0\x6C\x23\x88\x8F\x82\x9C\x5A\x50\x21\x8A\x35\x51\x24\xB2\x6D\x2D\x88\x91\x88\xB3\x79\x58\xFC\x7B\xB5\x50\x12\x3E\x86\xF3\x4C\x70\x83\x7B\x72\x00\x47\x6F\x40\x07\xB4\x53\x89\x94\x6B\x46\x89\x3F\x53\x54\x98\x60\x84\x7F\xB4\x68\x55\x00\x53\x7C\x29\x04\x99\x18\x68\x88\xC3\x48\x1D\xA7\x69\x34\x03\x0D\x0E\x07\x2A\x37\x83\x89\xAF\x7E\x05\xA1\x7B\x93\x50\xC1\x73\x4A\x5D\x89\x8E\x6D\xC4\x73\xF2\x59\x7C\x0D\x7F\x8F\x88\xF0\x73\x52\xAA\x53\x2A\x73\xE5\x63\x81\x15\x7E\x99\x8B\x45\x58\x7C\xCF\x51\xA6\x58\xF2\x49\x89\x28\x82\xA4\x8F\xF0\x6E\x7C\x25\x8A\xE1\x6E\xB2\x70\x80\x9F\x8A\x47\x81\x2A\x8B\x51\x2C\x7E\xFA\x44\x2A\x92\x6E\x34\x89\xB4\x76\x20\xAA\x79\xE2\x4E\xA2\x84\xB6\x7A\x88\x63\x51\xA5\x85\x2A\xBF\x52\x87\x6F\xC7\x77\x4D\x6E\x50\xBA\x8B\xFB\x47\x29\xB8\x89\xA9\x89\xC7\x7B\x3C\x5C\x8A\x88",
"\x6D\x16\x89\xF2\x6B\x8A\x61\x52\x13\x59\x3E\x51\x6E\x8E\x70\xC9\x7D\x29\x89\x6E\x1C\x7D\x19\x8E\x2B\xAF\x6D\x90\x6D\xC8\x72\xB9\x4B\x89\xB5\x7B\x9F\x89\xAB\x73\x00\x33\x02\x2F\x04\xDE\x22\x8B\x86\x89\xBC\x66\x23\x89\x8A\xA2\x52\xDA\x67\x2D\x89\x7C\x8D\x73\xA3\x8E\x4C\x58\x89\xCE\x88\xA5\x8A\xF0\x4D\x7E\x13\x7E\xB1\x5B\x2C\x87\x55\x9C\x8A\x9C\x68\x2A\xB6\x6D\xD2\x52\xAA\x80\x21\x8D\x8B\x6D\x53\xAB\x81\x2D\x90\x8A\x25\x7F\xBE\x8E\xB7\x5A\x8A\xF0\x89\xC0\x88\x4D\x5A\x8B\xB2\x4C\x23\x82\x2B\x94\x89\xB4\x8B\x51\x56\x2B\xBF\x52\xEB\x8A\xA3\x8B\x28\xBA\x8B\x91\x88\xAB\x8E\xB8\x72\x8B\x8D\x73\xDC\x67\x27\xA4\x6E\x99\x8A\x95\x67\xF1\x43\x8C\xD3\x8A\xB2\x80\x2A\xBF\x8B\xA6\x51\xBC\x80\x2D\xAE\x8B\x6B\x6D\xC1\x87\xF2\x7C\x8B\xF7\x88\xE0\x62\x2A\xB1\x8B\x0B\x8F\x21\x5E\x5B\x4E\x8C\x06\x6F\x4D\x51\x4A\x53\x8C\xEA\x88\xAE\x88\x4A\x56\x8C\xA6\x89\xC6\x80\x30\x96\x52\xC0\x8B\xBC\x83\x82\x58\x84\x20\x8D\xB5\x88\x30\x88\x8B\x26\x7C\x34\x50\x33\xA7\x8C\x32\x8E\xC6\x83\x29\xAB\x8C\x17\x8D\xCB\x85\x32\xB6\x8B\x50\x8F\x95\x6E\x33\x98\x8B\x02\x8D\x0A\x0D\x27\xA5\x01\x6A\x88\xCF\x53\x03\x34\x00\x9B\x6E\x41\x05\x36\xB0\x89\x07\x6E\x9C\x83\x5A\x48\x54\x76\x8B\xE8\x69\x05\x8A\x68\x1B\x81\xE4\x47\x06\xA7\x01\xAB\x6E\x1A\x8A\x39\x7C\x6E\x89\x5F\xEF\x65\x96\x13\x4C\x0A\x72\x40\x0C\xC0\x46\x6F\x40\x74\xF2\x62\x76\x67\x86\x80\x7D\x07\x78\xBD\x6C\x5D\x20\x52\xDB\x50\xEF\x6E\x71\x53\x4E\x07\x78\x38\xA0\x70\xDC\x6D\x7E\x0C\x22\x9F\x6F\x2C\x73\xF9\x67\xDF\x77\x7E\x0E\x62\x09\x7A\x78\x2E\x70\x51\x4F\xB6\x70\x79\x73\x7E\xEF\x6D\xFC\x62\x0C\xB9\x70\xEA\x83\x0E\x7F\x79\x7D\x70\xC8\x47\x0F\x7D\x0D\x9E\x5E\x2A\x4C\x11\x7A\x7A\x70\x5A\x47\x70\xE5\x28\x37\xAD\x24\x7A\x8E\xBA\x0B\x82\x7D\x8D\x01\x07\xDF\x8D\x92\x0E\x70\x63\x03\xDF\x77\xF6\x4C\x8E\x68\x5D\xDD\x5F\x38\xB2\x6C\x8A\x8E\x06\x60\x3C\x8E\x8E\x1F\x7A\x08\x0B\xBD\x50\x6F\x22\x72\xDF\x54\x39\xA5\x25\x2D\x70\x51\x7F\x1A\xAD\x5B\x9A\x8E\x10\x72\x3D\x82\x6A\x22\x55\xBD\x60\x3A\xB5\x70\xF0\x6F\xE5\x53\x3A\x8F\x66\xA5\x8E\x10\x77\x3A\xA1\x5E\xAA\x8D\xF8\x8A\x60\x7D\x6F\xAE\x8D\x80\x70\x97\x17\x1E\x4F\x2F\x01\x71\xBE\x5B\x25\xEE\x8C\x56\x2A\x72\x7B\x48\x09\x04\xFD\x82\x74\x55\x8F\x8C\x06\xDA\x49\x4E\x61\x14\x75\x23\xD3\x45\xB8\x31\x4E\x59\x71\x7F\x75\x2F\x94\x80\xD0\x8C\x56\x2E\x8E\x1E\x3B\xC4\x29\x12\x7C\x3F\x95\x15\x2A\x5D\x82\x49\x10\x0E\x90\x42\x5F\x02\x93\x53\x24\x55\x40\x03\x7D\x88\xD3\x68\x14\xFB\x27\x4A\x11\xC3\x62\x77\xE1\x6B\xDF\x5C\x91\x68\x63\x93\x75\x30\x88\x70\x49\x90\x78\x31\xFB\x73\x64\x4D\x71\xF2\x7C\xCF\x52\x03\x14\x71\x03\x04\x15\x74\x2F\x69\x90\x37\x74\x79\x83\x33\x62\x00\x5B\x72\x82\x8A\x6E\x78\x58\x9A\x5B\x17\x72\xA2\x04\x78\x3E\x30\x32\x77\xE0\x62\x8D\x0F\x41\x42\x01\x44\xBF\x78\x07\x51\x55\x76\xB2\x6A\x4C\x8B\x76\x25\x7D\xD8\x7D\x30\x3D\x04\x7A\x7D\x43\xAA\x77\xE2\x4A\x8E\x74\x03\x33\x40\x09\x04\x15\x94\x44\x86\x76\x4E\x65\x6A\x72\xA7\x58\x75\x3A\x6E\x56\x7E\x44\x3A\x2F\x5D\x75\x13\x9C\x43\xBD\x04\xB8\x66\x8E\x75\x03\x3D\x3F\x09\x04\x1A\x97\x45\xA8\x76\x47\x90\x74\x72\xDD\x62\x05\x2C\x2F\x26\x1E\x44\xA4\x91\xFE\x82\x8E\x76\x03\x3A\x40\x09\x04\x1E\x9B\x46\xB6\x77\x5A\x90\x11\x6E\x60\x6D\x76\x86\x0B\x6B\x79\xA8\x62\x91\x37\x7B\x13\x96\xE0\x51\x91\xEC\x77\x0D\x03\x1E\x49\x04\x8B\x93\x1E\x92\x6C\x74\x2E\x0B\x6D\x7D\x76\xD9\x42\x1E\x98\x74\x56\x69\xE1\x45\x4D\x1B\x79\x69\x7E\xA4\x1E\x78\xAB\x6E\x26\x93\xCD\x5C\x4D\x73\x91\x19\x05\x46\xAC\x77\x39\x01\x15\x49\x10\x26\x92\x8E\x93\x38\x58\x32\x75\x6B\x8E\x82\x0C\x92\xE3\x79\x6B\x8F\x0E\x8D\x74\x9B\x66\x78\x8C\x26\xD4\x5A\xE3\x4F\x62\x45\x87\xC6\x2E\x1D\x90\x74\xB5\x76\x64\x7F\x78\x11\x92\x1E\x92\x7D\x76\xE1\x4D\x88\x9A\x75\x8D\x2A\xE1\x5D\x76\x9A\x90\x71\x73\x41\x61\x78\x20\x07\x88\x70\x4A\xA3\x91\x65\x01\x8E\x7C\xDE\x71\x00\x38\x02\x8F\x73\x10\x3E\x78\xDF\x74\x90\x7D\x32\x74\x5C\x30\x76\x48\x51\x4A\x86\x4C\x3A\x78\x3D\x89\x17\x36\x83\xD9\x91\x3E\x81\x4A\x92\x93\x08\x79\x0C\x09\x03\x18\x03\x27\x04\x3B\x9F\xCC\x73\x76\x41\x75\x61\x54\xE1\x4E\x65\x80\x60\x0D\x66\xD4\x63\x53\xD1\x86\x52\x72\xC3\x7E\x77\x4E\x76\x11\x70\xD5\x5B\x12\xD6\x74\xEF\x8D\x6F\x73\x93\x93\x5C\xB2\x67\x0E\xAD\x5B\x47\x74\x21\x6C\xDF\x7B\x93\xC2\x5B\x7F\x77\x0C\x84\x90\x02\x7A\x1C",
"\x90\x4D\xA8\x93\x2A\x91\x0C\x02\x0C\x27\x04\x17\x97\x3B\x91\xD9\x76\x77\x12\x7A\x24\x95\xE1\x54\x92\x5D\x02\x9C\x6D\xDB\x7F\x76\xC7\x91\x70\x79\x4C\x9C\x92\xDE\x5A\x27\x94\x11\xA5\x93\xDF\x51\x2F\x9C\x51\xB8\x76\x13\x7A\x6E\x70\x52\xA2\x94\x96\x92\x31\x98\x49\x88\x93\x9F\x77\x26\x93\x3C\x8C\x93\xC9\x77\x72\x7F\x4C\xA5\x78\xF8\x66\x58\x88\xA1\x74\x00\xFE\x67\x40\x0E\x9F\x7D\x4C\x16\x86\x95\x13\xFB\x61\x17\x68\x78\x42\x81\x4A\x5D\x84\xC6\x8A\xD6\x86\xA3\x73\x8D\x10\x6B\x48\x87\xD7\x61\x7A\xA1\x81\x36\x20\x0B\xA3\x65\x7A\x67\x0D\x00\xE9\x41\x04\x92\x7B\x25\x85\x9A\x66\x55\xC3\x8B\x5F\x71\x95\x53\x65\x13\x6B\x9F\x78\x0A\xA3\x6B\x78\x2A\x56\x6A\xA7\x14\x87\xE9\x86\x7F\x8F\x1B\x9E\x8B\xFF\x84\x0D\x0C\x06\x27\x04\x77\x95\xB9\x83\x56\x8B\x95\xE9\x71\x19\x65\x60\x68\x61\xC6\x7E\x1A\x68\xFC\x7C\x60\xCA\x7C\xF3\x7A\x1F\x89\x7A\xFC\x84\x30\x32\x57\x81\x87\x32\x03\x0C\x0E\x07\x27\x04\x8F\x96\x5E\x96\x87\x61\x53\x65\x94\x7D\x71\x4C\xB6\x7E\x29\x73\x73\x80\x5A\x79\x93\xCA\x7E\xB9\x20\x57\xAD\x10\x89\x97\x43\x2A\x1E\xB9\x6A\x36\x00\x0C\x01\x00\x2A\x37\xA7\x96\x64\x9A\x32\x6C\x7F\x29\x93\xFB\x71\x7C\x79\x77\xAD\x94\xFD\x7B\x7D\x49\x5F\xE4\x5E\x15\x8A\x1A\x8E\x84\xE8\x5E\xFA\x5C\x27\xB1\x8A\x65\x7A\xAF\x58\x89\x65\x5F\xE4\x7A\x9C\x6C\xE6\x5A\x81\x52\x83\x1C\x6A\xE7\x55\x81\xA9\x86\x79\x5F\xB9\x43\x97\x16\x5E\x2E\x18\xC9\x53\x7A\x7C\x83\x07\x91\x07\xA6\x63\xAD\x86\x20\x82\x5C\x9D\x4F\xED\x62\xC2\x54\x8D\x46\x97\x43\x5F\x1B\x82\x5D\x92\x86\xD4\x94\x20\x73\xE8\x57\x97\x2B\x53\x1D\x8B\x70\x45\x20\xED\x8C\xFE\x86\x11\x30\x8F\xEA\x94\x1D\x03\x31\x76\x8F\x03\x06\xFD\x85\xBC\x55\x8E\x97\x26\xFE\x81\x32\x52\x90\x30\x06\xFF\x8F\xC6\x0D\x58\x67\x7C\x43\x98\x9A\x44\x8B\xB0\x8D\x01\x97\x99\x3B\x6E\xF9\x20\xCD\x33\x64\x7C\x4B\x76\x37\x0A\x69\x57\x86\x04\x0B\x9A\x68\x63\x64\x64\x55\x48\x1C\x07\x95\x1E\x92\x54\xFE\x94\xDD\x66\x3B\x61\x94\x5A\x71\x6B\x87\x7E\x44\x71\x35\x4E\x5D\x3E\x7A\x1B\x2B\xF7\x3B\x75\x10\x85\x4A\x17\xDC\x14\xC0\x21\x62\x87\x17\xAD\x7F\x72\x1A\x72\x44\x87\x03\x06\x71\x87\x62\xB2\x1E\xD7\x1F\x72\x15\x44\xBF\x97\x66\x95\x1F\x60\xC8\x48\x6B\x91\x85\x50\x5C\x59\x91\x6C\x22\x99\x8A\x9C\x5D\x07\x90\xFC\x18\xF7\x2F\x66\x49\x71\x41\x9B\xDA\x2D\x73\x4A\x00\xB6\x38\x92\x9C\x75\x45\x99\x6F\x5A\xDA\x44\x61\xB3\x7E\xB1\x1D\xB8\x16\x4F\x88\x94\xE3\x51\x94\x9B\x49\x18\x8F\xC3\x7E\x3A\x5B\x96\x29\x61\x20\x03\x1A\x66\x27\x2C\x83\x10\x5A\xB9\x17\x79\x13\x51\x4C\x99\x1E\x0E\x64\x9B\x90\x4C\x76\x95\x9D\x13\x1B\x4D\x07\x97\x5C\x52\x6C\x6A\x99\xC8\x5C\xB3\x69\x65\x80\x96\x97\x1F\xF1\x79\xAD\x09\x7F\x61\x9A\xC4\x1D\xB1\x06\x4C\x5A\x14\x6C\x10\xBB\x26\x4B\x7D\x98\x6F\x11\x58\x13\x4C\x26\x49\x42\x05\x68\x91\x90\x6D\x15\x57\x14\x56\x69\x46\x12\x9B\x0C\x95\x61\x9F\x8C\x24\x70\x0D\x9A\x61\x93\x52\x5F\x4C\xCD\x51\x04\x10\x01\x2A\x08\x5E\x11\x96\x42\x19\x7C\x18\xF3\x76\x62\x9C\x9A\x9C\x19\x9F\x1F\x3B\x0A\x10\x13\x4C\x22\x07\x12\x26\x9A\x4B\x9A\x95\x1B\x68\x22\x9A\x5B\x1A\x02\x14\x93\x64\x48\x0A\x11\xA3\x95\x76\x4F\x9A\x31\x4C\x9C\x92\xA7\x7C\x00\xB3\x7D\x6A\x7D\x3F\x62\x00\x3E\x02\xE8\x4C\x61\x8F\x61\xAA\x99\xA7\x93\xB2\x15\x2B\x1D\x2F\xA6\x91\x6C\xA1\x9A\x9E\x99\xC5\x26\x60\x47\x9B\x59\x1B\xB0\x9C\x73\x76\x00\xA8\x9A\x41\x01\x6D\xB4\x4B\xA0\x99\xB3\x93\xCF\x6F\x9A\xCE\x9A\xAC\x9B\x98\x74\x9A\x6D\x5B\x98\x15\x4E\x78\x9A\x6C\x93\xDC\x1D\x4D\xBD\x9A\xAD\x8D\xF7\x45\x6D\x9D\x1A\xA3\x9A\x9B\x17\x79\x16\x2A\xE3\x49\x43\x17\xE2\x54\x14\x13\x4E\x37\x07\x12\x32\x9B\xB8\x5D\x43\x14\x56\x4B\x63\xDA\x98\x6A\x8E\x51\xB4\x93\x5A\x4F\x94\x9E\x66\xB8\x93\x0A\x96\x6A\x5E\xBF\x6B\x50\xCC\x23\x98\x99\x4F\x76\x9B\xDF\x50\xBE\x9C\x71\x6E\x92\x9E\x6B\xBE\x95\x50\xB7\x55\x6D\x9B\xEC\x7B\x63\x83\x9C\x35\x4D\xC1\x9D\xB1\x1A\x3F\x1E\x4A\x19\x09\x2F\x7A\x0B\x2E\x01\x0E\x03\x0B\x27\x04\x1F\x9C\xD7\x5A\x2F\x24\x55\x8F\x13\x40\x9A\x32\x51\x98\x0B\x9C\xB8\x65\x1E\x82\x90\x34\x9A\x9C\x6B\xC5\x45\x62\x6F\x67\x9A\x76\x35\x43\x83\xB7\x4E\x06\x43\xCA\x1E\x90\x22\x02\x44\x43\x58\x78\x70\xE0\x8D\x0E\x56\x02\x77\x9C\x9F\x5E\xBE\x06\x34\x7F\x9C\xD0\x25\x44\x04\x3D\x5F\x4D\x00\x50\x75\x22\x90\x3C\x6E\x92\x2C\xBF\x42\xB9\x13\x4C\x95\x03\x49\x01\x75\x9C\x5D\x92\x2F\xA2\x9C\x55\x39\x9B\x68\x98\xD2\x82\xA7",
"\x44\x58\x63\x5F\xE5\x2B\x28\x38\x9C\x1B\x57\xD8\x55\xBA\x1F\x9D\x5F\x4F\x93\x99\x72\xAA\x64\x83\x74\x05\x18\xBB\x0A\x58\x21\x56\x1B\x62\xBA\x02\x70\xBC\x3A\xD4\x59\x37\x86\x70\x89\x5D\xC7\x98\x3B\x80\x00\xBA\x8D\x59\x22\x50\x83\x8E\x0C\x9E\xBE\x92\x48\x48\x8F\x16\x61\xFA\x04\xBD\x7B\x8A\x66\x5E\xF3\x67\x38\x89\x8F\xCB\x8F\xDE\x52\x39\xA0\x89\xCF\x8E\xBA\x01\x3D\x97\x8E\x99\x94\xF5\x84\x5F\x9B\x8E\xD7\x8F\xD4\x7A\x4F\x9B\x8F\x13\x30\x4C\x7C\x73\xB4\x6F\xE6\x8C\xEB\x88\xBF\x7E\x70\xE6\x0F\xEA\x89\x32\x68\x8F\xFF\x6E\x3F\x92\x98\x3B\x99\x8B\x60\x13\x34\x07\x35\x19\xE6\x4A\xEA\x95\x67\x13\x4C\xF7\x46\x41\x01\x7B\xB4\x4B\xAE\x9C\xC7\x16\x5F\x88\x90\x6F\x32\x7E\x9A\x84\x31\x99\x67\x9D\x07\x9C\x72\x96\x98\x66\x74\xC5\x97\x24\xB4\x31\x1C\x1F\x39\x95\x4B\xA8\x78\x33\x00\x7C\x73\x10\x30\x77\x2C\x95\xA2\x52\x38\x8B\x87\x4C\x74\x8E\x97\x4F\xBC\x9B\xDA\x78\x65\x89\x75\x8D\x94\xFD\x90\x44\x9C\x99\x25\x01\x58\x94\x2E\x8A\x55\xA0\x98\x97\x81\xC7\x94\x0B\x82\x04\xB6\x81\x2B\x81\x98\x7A\x82\x06\x48\x2F\x86\x3B\x3E\x82\x3A\x67\x69\x84\x5E\x8D\x66\xA4\x8D\x31\x83\x94\x47\x62\xC9\x80\x65\x6C\x0C\x80\x18\xA4\x63\x30\x81\x0D\x9A\x5E\x3D\x5D\x2D\x49\x10\x3E\x9F\x42\x5C\x39\x8E\x47\x9B\x83\xA5\x5D\xE7\x91\x57\x44\x96\x11\x6E\x3B\x82\x90\x04\x98\x03\x72\x5D\x38\x60\x90\x71\x31\x03\x82\x93\x10\x0D\x98\x06\x9B\xF1\x50\x61\x84\x76\xE3\x86\xCA\x93\x33\x66\x9D\x48\x8E\xFA\x6F\x72\xB1\x9C\xE2\x4E\xF0\x90\x02\x1E\x98\x60\x36\x17\x42\x75\x52\x32\x25\x92\xB1\x08\xA6\x4E\x02\xB6\x38\x0B\xAC\x75\x46\x0B\xE0\x62\xFF\x10\x13\x13\x9A\x90\x5A\x08\xA2\x25\x3F\x1F\xE2\x83\xD9\x40\x83\x91\x7B\xB7\x95\x4B\x82\x82\x8F\x0B\x39\xA0\xED\x90\x75\x1A\x72\x01\x45\x7D\x7A\xF4\x58\x4D\x18\x9A\x08\xA5\x40\x07\x10\xEA\x0C\xF0\x2D\x40\x10\x1D\x53\x53\x0E\xAA\x32\x6F\x6F\x46\xA1\xFE\x78\x84\xB2\x69\xBF\x99\xF4\x7C\x3D\x81\xA1\xBD\x3F\x10\xAC\x96\x53\x43\x99\x61\x16\xA1\x19\x2A\x81\x5C\xA2\x14\xA4\xDB\x60\x04\xDF\x41\x61\x65\x6E\xAC\x7E\x37\x0B\x9C\x04\xDB\x0C\x06\x07\x90\x0A\xA1\x01\x67\xA0\x50\x1E\xCA\x58\x12\x49\x04\x77\xA2\xD0\x56\x86\x94\xA1\x24\x70\x08\xA7\x54\x61\x54\x59\xA0\x6A\x03\xC1\x1B\x27\x61\x35\x17\xA2\x90\x09\x71\x2A\xA2\xCF\x57\x12\x13\x62\x86\xA1\x00\x21\x83\xB5\x43\xE8\x67\x62\x83\x71\x59\xA1\x37\xA1\x95\x05\xC1\x32\x29\x8D\xA3\xDC\x18\x88\xB5\xA1\x33\x03\x59\x83\x10\x27\x85\x42\xA2\x40\x24\x84\x8C\xA1\x61\x5C\x73\x8D\x83\xBF\xA1\x6B\xA2\x25\x7C\x84\x89\x10\x0B\x13\x13\xA2\x90\x18\x9C\xFA\x0B\xC6\x96\x06\x2A\x5C\x21\x9E\x41\x05\x8B\xB4\x4B\x23\x9F\x37\x55\x72\x96\x96\x12\x54\xCA\x9D\x5F\xBC\x95\x6A\x57\xCB\x9E\x93\x47\xA1\x21\xA2\x54\x5F\x0C\x84\x83\xDE\x25\xD1\x90\x39\x52\x54\x3A\x9D\xF2\x67\x8C\x83\x9D\x2C\x80\xD0\x91\x32\x42\x9D\xC2\x68\xD1\x96\xC9\x07\x9D\xAA\x5A\xD2\x91\x80\x31\xA1\x50\x1F\x26\xA2\x90\x2B\x60\xD5\x45\x42\x01\x8E\xBA\xA1\x5E\xA2\xCA\x4E\x13\x73\x36\x6E\x64\xBE\x77\xDB\x08\x4D\x58\x5B\x33\xA6\x80\xAB\x50\xB2\x37\x94\x04\x88\xA6\xA0\x99\xA3\x85\x0E\x8D\x81\x20\x58\x60\x28\x07\x12\x3A\xA3\x2F\xA1\x39\xA6\x89\x62\x12\x78\x60\xCD\x97\x32\x7B\x04\xEB\x30\x4C\x04\x06\x1C\x83\x12\x54\x06\x95\xE9\x45\x56\xC0\x83\xCC\x91\x7F\x8A\xA4\xB1\x32\xFD\x65\x76\x89\x5A\xE6\x17\x36\x3E\x90\xBD\x9C\x76\x47\x36\x3C\x0D\x88\x9D\xBA\x4E\x35\x3A\xCA\x33\x2C\xAD\x82\xB1\x00\x3F\xB1\x64\x2A\xA1\x0C\x0F\x82\x46\x04\x27\xA7\x2D\x8A\xDA\x26\xA1\x1D\x45\x20\x39\x8E\x96\xA1\xC5\xA2\xE8\x49\x65\xB0\x32\x75\x11\xCC\x46\x12\x63\x32\xBC\x9E\x44\x51\x13\x45\x19\x9F\x8F\xF7\x8C\x79\x9D\x99\xF3\x0E\x4C\x44\x07\x37\x9C\x6D\x9D\xF7\x40\xCB\x2C\x36\xA0\x36\xB8\x44\x92\x90\x1D\x23\xA5\x42\x69\x88\x90\x03\x27\x04\x54\xA5\x91\x4E\xA5\xFE\xA3\x51\x42\x07\x23\x63\x12\x73\x95\x86\x4C\x7B\x23\x1B\x06\x0A\x54\xEF\x72\x01\xCD\x0A\xCD\x84\x78\xB5\x96\x52\x46\x4F\x04\x15\x1B\x64\x5B\xA4\x3F\x2E\x95\xA0\x78\x33\x20\x55\x4B\x80\x68\x63\x2E\x88\x34\x66\x8C\x82\xA4\xF2\x9D\x64\x6C\x92\x4A\x24\x11\xA7\xDC\x1D\x3E\x8B\xA5\x02\x25\x53\xA1\xD9\x2A\xA0\x33\x00\x94\x83\x10\x12\x89\x21\xA5\x39\xAD\x8B\x98\xA0\xBD\x9C\x08\x08\x74\x29\x0F\x19\x99\x21\x69\x22\x5D\x48\x2D\x48\xCA\x3E\xFA\x18\x67\x8C\xA6\x29\xAA\x63\x8E\x87\x80\x80\x74\x81\x70\xA2\xA0\x24\x1C\xCD\x11\x21\x08\xA5\xE8\x13\x65\x64\x95\xBD\xA5",
"\x23\x11\x61\xAF\x8D\xB4\x00\x82\xA6\x40\x04\x98\xBC\xA5\x8E\xA0\xC8\x47\x98\x97\xA5\x89\xA7\x62\xA5\x76\x42\xA3\x36\x4E\x8F\x40\x99\xA2\x3A\x2E\x4B\x64\xAF\xA3\x69\x0F\x7D\xA0\x66\x9D\xF6\x5A\x96\xE1\x55\x74\x89\x85\x9D\xA6\x41\x1E\x1C\xA6\x06\x52\x5D\x56\x06\xB1\x0D\xC4\x49\xA7\x75\xA1\x0C\x0F\x11\x49\x04\xCF\xA6\xD0\x5C\x9C\xA2\xA2\x82\x65\x85\x4B\x68\x67\x6C\x6B\xA3\xE7\x54\x97\x86\x83\x45\x73\x13\x6D\x74\x16\x48\xC6\x0B\x4F\x81\x14\x83\x85\x31\x02\x27\xAA\x41\x32\x87\x4B\x85\x8D\x8B\x16\xB3\x7C\xED\x17\x16\x9F\x16\x92\x85\x5B\x4F\xCE\x75\x17\x8C\x8B\x53\x4E\x91\x63\xC7\x79\x85\x3F\x97\x2C\x90\x16\xAE\x5E\x43\x86\x38\x94\x06\x24\x93\xF5\x49\x52\x8A\xBB\x7B\x83\x32\x01\x50\x82\x03\x13\x4C\x0C\x02\xAD\x39\xA0\x9D\x61\x32\x01\x8D\x82\x03\x0D\x85\x3B\x53\x0B\x05\x51\x6B\xA7\xF0\xA4\x08\x02\x9F\xB1\x8D\xF5\xA7\xCF\x74\x04\x11\x4C\x59\x85\xBD\x4D\xA0\x91\x7B\x0F\xAB\x81\x8B\x43\x65\x00\x13\xA8\xE7\x51\x17\xAC\x67\x17\xAB\x65\x89\xA1\x93\x50\x7F\x0D\x87\xAE\x16\x1F\xA8\x60\x69\x80\xAB\x4D\x70\xA8\x1E\xA8\x84\xA1\x50\x4B\x76\x01\xAA\x89\xA8\x9A\x33\x85\x54\x85\xD4\x87\xF5\x7F\x7C\x4D\x02\x6A\x0B\xA2\x44\xA8\x06\xA9\x67\x6A\x0F\x27\x04\x47\xA8\x83\xAE\xA0\xB6\xA8\x2A\x4E\x84\xA0\x38\x54\xA8\x27\xAB\x42\x89\xA2\x90\x5A\x3B\x86\xCA\x4B\xA1\xB6\x01\x25\x84\x8D\xAF\xA2\x8C\xA9\x22\x00\x89\xAF\xA4\xBA\xA8\x72\x86\x83\x8C\xF3\x7A\x84\x77\x86\xCA\x4D\xA2\xAC\x75\x2F\xAB\x92\xA2\xA2\xB7\xA8\x25\xA8\x10\x51\xA5\xBC\xA8\x0F\x89\xCE\x4E\x12\xAB\x4E\x41\xAA\xCD\x8F\x35\xA1\x8D\x13\x4F\x0C\x01\x18\x83\x04\x83\x85\x87\x81\x1A\xA1\x87\x47\x7D\x9D\x62\xA7\x5C\x6A\x84\x8E\x6D\x9A\x5C\xAB\x86\x6B\x7F\xA9\x65\xD4\x59\xA6\xCA\x62\x6C\x81\xF7\x61\x42\x18\xA8\x13\x59\x19\x81\x76\xB0\x68\xDE\x75\x15\x7D\x86\xBC\x94\x7D\x8C\x6E\x63\x7D\x90\x6A\x65\x9E\x87\x8B\x4F\x4C\x7E\x86\x9F\xF4\x50\x7E\xE0\x95\xE7\x86\x7D\xB4\x86\x90\xAA\x8A\xA2\xA9\xB8\x86\x76\x7F\xD6\x7D\x19\xA4\x86\xB5\x6B\x5E\x86\x21\xAC\x87\xBD\x60\x0D\x08\x03\x1D\x6D\x06\x04\xAE\xA8\x36\xBA\x8C\xE8\x8A\xA2\x8D\x33\xB3\x8C\x6D\x50\xD0\x8C\x2B\x99\x50\xEB\x88\xC7\x8F\x5D\x43\x90\x4F\x8E\xBF\x87\x2C\xA4\x8C\xC9\x88\xD6\x8A\xAC\x92\x95\x52\x8F\xA8\x84\x35\x81\x8D\x8D\x52\xBE\x8F\x32\x87\x8C\x22\x8F\x16\x55\xAC\xB5\x8C\x71\x53\xEC\x84\x75\x74\x9D\xC0\x6F\x0D\x07\x77\xB9\x9D\x5E\x5D\xE0\x8F\xC0\x7C\x9D\x1A\xA1\xD9\x57\x3C\x87\x9E\x81\x9D\xF1\x86\xC7\x6B\xAB\xC2\x8C\xE2\x91\xC2\x4B\x9E\xCE\x8F\x0A\x72\x60\x94\x9E\x90\x9F\x6F\xA2\x79\xB7\xAB\xD6\x8D\xBE\xA6\xAA\x8B\x94\x03\x6B\x38\x51\x3A\x9E\x8F\xEE\xA1\x5D\xA6\xBF\x63\x8F\xF9\x6C\x10\x7F\x8E\xA4\x9E\xDD\xA5\x80\x97\x7A\x94\x2E\xE9\x97\xE4\x97\x21\x2C\x97\x12\xAC\x63\x0D\x99\x70\x97\xDE\x1A\x77\x8D\x5E\xB7\x9E\xF8\x95\x41\x9F\x3F\x9D\x4D\xBF\xA1\xDB\x8B\x87\x78\x6B\xED\x97\x01\x9D\xB1\x8A\x90\xC4\x29\xCF\x50\x41\x83\x04\x10\x90\xBD\x4D\xB1\x94\x90\x12\x98\x06\x9E\xBC\x2B\x14\xDA\x8D\x62\xAB\x81\x9F\x97\x41\x55\x08\x9D\x32\x5C\xA4\x20\x01\xC7\xA6\x7C\x89\x04\x18\x14\x8A\x74\x03\x3A\x91\x03\x06\x1E\x9D\x7C\xBC\x91\x0B\x51\x19\x62\xA7\x6E\x61\xAE\x76\xA5\x00\xDB\x44\x92\xB3\x90\x8E\x77\x7C\xB7\x92\x35\x01\x23\x93\x10\x0D\x92\x47\xAF\x23\x90\x53\xA5\xA2\x32\x95\x66\x5C\xDB\x75\x94\xFD\x4D\x26\x99\x53\x8A\x93\xA3\x76\x4A\x94\xE2\x51\xAD\x9B\x10\x45\x9A\x72\x77\x00\xA8\x93\x40\x08\x4A\x99\xAD\xAA\x92\x61\x8F\xE2\x76\xAC\xAF\x91\x77\x72\x51\x85\x92\x3D\x06\xDA\xA5\xC6\x79\x92\x9F\x33\x2E\x9E\xE0\x4E\x08\xB3\x7D\x47\x9D\x87\x93\x92\x5E\xAD\xCE\x75\x4C\xA1\xAD\x38\x97\x70\x78\x52\xAB\x4E\x3C\x96\x33\x9E\x13\x93\x94\x53\xAF\x34\x92\x03\x06\x00\x59\x20\xE5\xAA\x51\x86\x57\x84\x3D\x1D\x05\x32\x3D\x75\x2F\x76\xED\x44\xD7\x72\x74\x56\xAA\x37\x7D\xA1\x90\x74\x2B\x77\x46\x63\xD1\x46\x74\x7E\x74\x60\x73\x41\x74\x74\x2C\x76\xD0\x7D\x7C\x99\x6A\xEE\x72\x44\x7B\x35\x60\x74\xA9\xAF\xE7\xA8\xD6\x62\x00\xED\x70\x39\x7E\xBA\xAD\x75\xBA\xA1\xB6\x9F\xD1\x54\x74\x9D\xAD\x49\x9C\xCF\x60\xAE\xFE\x71\xBA\x93\xBA\xB3\x76\x03\x76\xEC\xA0\x02\x34\xAE\xC1\xAF\x4D\x9A\xCD\x44\xAF\x0C\x75\x4F\x84\x40\x72\x77\x1E\x77\xE9\xAE\xD2\x65\x75\xCE\xAF\xF0\xA7\xBB\xA7\x74\xD2\xAD\x40\x9D\xBB\x8A\xAF\xCC\xAC\xF6\xAA\xBA\x9C\x57\xDD\xAC\x64\x76\x5C\x6F\x75\x5D\x6A\xF5\xA4\xD6\x79\x73\xE3\xAF",
"\xA2\x60\xF9\x07\xAF\xE0\x76\xE6\x30\x9B\xAA\xAF\x72\x76\xF0\xAA\xD0\x44\xAF\x83\x74\x6C\xAD\x07\x13\xAF\x7A\x74\xD2\xAF\xDC\x5C\x91\x47\x8A\x17\x9B\xC3\x20\x91\x51\x11\x6C\x7C\xBB\xB4\xAD\x90\x81\x98\x5B\xC0\x03\x30\x83\x92\x3E\x7E\xBD\xAA\x4C\x61\x76\xA7\x8B\xBC\x80\xAF\xE2\xAE\xED\xA4\xA9\xA2\x00\x6A\x76\xCD\x8C\xBF\xA0\x77\xF1\x92\x8D\x9A\xDF\x58\xA6\xFF\x98\xF5\x9C\x84\x5E\x8E\xD7\x9E\xC0\xA9\x7D\x8E\xAC\xDB\x9F\x06\xB7\xDD\x47\x76\x49\xAD\x12\x91\x66\x61\x01\x4B\x91\x18\x9E\xC0\xA6\xAF\x4C\x68\xE0\xAE\x4B\xA9\x5A\xB9\x76\x30\x90\x52\x86\xAE\xBE\x77\x25\x92\x48\x5C\x78\x3A\x95\xF2\x8D\xB8\xBE\x94\xFB\xAF\x03\xB1\xDE\x48\xB0\xE4\x76\x24\x82\x72\x58\xAF\x2A\xB3\x8C\x99\x45\x89\xAD\xAB\x74\xD3\xA1\x48\x8E\xAD\x0D\xB1\x13\xB8\x45\x93\x5E\x37\x8A\x1B\x92\x99\x53\x77\x4F\xAF\x0C\xB0\xB7\x8E\x65\xD9\x75\x2B\x99\xAE\x89\xB0\xB0\x93\x72\x06\xC0\xB1\x73\x2F\x94\x0E\xB1\x53\xBA\xB0\x85\xAC\x31\x9D\xC3\xB6\x94\x3F\xB3\x49\x93\x3C\xA4\x76\x39\x97\x27\x95\xC4\xB4\xB0\xDF\x52\xF9\x73\xE4\x61\x4D\x5E\x84\xDE\xA1\x4D\x91\xAE\x08\x7A\x0C\x00\x03\x0A\x9F\x0C\x1E\xDF\xAC\xC1\x8F\x9F\x1E\xB1\x42\x98\xDF\x53\x9F\x0F\x9D\xF5\x9F\x78\x75\xAC\xFC\x91\xA8\x9A\x3E\x8A\x05\xB2\x91\x31\x78\x48\xB9\xAD\x80\xB2\x0A\x99\x7C\xA7\x04\xCC\x9F\x01\xB2\x02\x1D\xB0\x0E\x9C\xE7\x83\x3D\x95\x4D\x22\xAE\xBF\xA7\x80\x96\x9F\xBF\x9F\xE4\x5E\x50\x93\xB2\x20\x04\xBD\x0D\x7D\xB1\x82\x05\x20\x43\x61\x7E\xAB\x6B\x5F\x94\xAE\x2E\x1D\xA2\x95\x93\x94\x59\x9D\x81\x92\x79\xAB\x64\x5C\x7A\x56\xBA\x7F\x78\x4D\x5B\x92\x9B\x68\x87\xA0\x97\xAC\xAD\x1F\x97\x61\x53\x92\x36\x07\x12\x0A\xB3\xAA\x96\xEC\x75\x56\x84\x61\xF6\x92\x96\x9E\x33\x1C\x99\x5E\x9A\x20\x28\x67\x88\x83\xCB\x7E\xB3\x96\x82\x7C\x96\xCE\xB3\x2E\xB6\x0E\xA9\x53\x74\x99\xC7\x26\x67\x9D\x2C\x60\x98\x36\xB6\x58\x9F\x96\xA4\x62\x31\xBA\x58\x88\xB3\x31\x01\x64\x96\x10\x2E\xB3\x7A\x78\xF0\x7F\x04\x81\x79\x97\x97\xB1\x60\xC2\xAD\x86\x3B\x98\x36\xBE\x59\xA8\x97\x20\xA5\x7B\x9C\x2C\x43\x04\xCC\x49\xFC\x87\x99\x2A\x4B\xEC\x49\xED\x60\xB0\x38\x6E\x1B\xAE\xEE\x64\x64\xAD\x7E\xCB\xA5\xEB\x7A\xAB\x7E\x02\xEA\x34\x44\xBB\x64\xAD\x7E\x6A\x4E\x72\x5C\x94\x46\x53\xB5\x3D\xE8\x19\xF5\x79\x30\x5B\x75\x56\x0C\x23\x94\x96\x8A\x75\x88\x89\xD1\x9A\x17\x59\x7F\x06\x10\x05\x1E\xB4\x60\x8A\x3C\x96\xAF\x8E\x9E\x96\x8E\x41\x99\xDF\x6D\x97\xA2\xB0\xF6\x82\x55\x5C\xA0\xC6\x14\x8C\x93\x7C\x0B\x17\xB5\x99\x8F\x9F\x7D\x1E\x05\xB5\x1D\xB2\x65\xD3\xA3\x98\x3C\xB4\x77\x19\xD3\xA8\x98\x3B\xB7\x76\x12\x16\x02\x6A\x05\xAC\x77\xAE\x83\x45\xB5\xAD\x5F\xD9\x40\xD4\xB2\x01\x15\xB4\x06\x54\x59\x98\xB4\xAD\x7F\x46\xB2\xC0\xA7\xB4\xFA\xAC\xE1\x9C\x94\x61\xB4\x82\x53\x48\xB9\x77\x25\xB4\x30\xB0\x56\xBE\x59\x6A\xB4\x02\xB4\xBE\xA5\x4F\xA5\x6F\x15\xAD\xEA\x7B\x99\xB3\xB4\x59\x9F\x4F\xBE\x63\xA2\x05\x43\xB6\x4D\xB1\x7A\x3D\xB4\xF9\x76\x5B\xB5\xD4\xB8\xB4\xDD\x98\x51\xB1\x63\x9C\x17\x48\xB7\x76\xA3\x7F\xB6\x4C\xAD\x7D\x55\x25\x45\x24\x62\x73\x9F\xE2\x27\xC0\x7A\x6A\x02\x3B\xB5\x66\x5F\x33\x97\x7A\x9E\xB9\xAD\x3B\xA8\xAB\xE3\x75\xE1\x81\x39\x40\x9E\x18\x73\xE0\x99\xB6\x70\xAB\xD0\x6F\xF0\x89\x78\x8D\x2A\xF4\xA8\x7F\x5D\x78\x82\x5E\x2D\xB4\xC4\x9F\xD2\xA9\xB5\xE2\x6E\x29\xB2\xD3\xBD\xA4\xFC\x91\xE6\x94\xB0\xBE\xB5\xFC\x6D\xC8\x48\x3A\xA2\x5E\x0A\xAE\xC1\xA6\x3A\xAB\xA1\xAF\x8C\xEB\x57\x6E\x13\x51\x80\x8E\xF3\x97\xAE\xA9\x56\xBF\x8D\x88\x84\xD9\x89\x8E\xD3\x6F\xE2\x8E\xDB\xAC\xAB\x13\x53\x66\xBD\x3C\x9E\xB6\x2B\xB4\x68\xB7\xC2\x57\x8F\xFE\x98\xE2\x54\xDA\xB1\xB4\x96\x9C\x6A\xB8\x7D\xAA\xB6\x37\x72\x4F\xA4\x0C\x9C\xA7\x08\xAC\xE8\x9A\xBF\x72\xB6\xE2\x8C\x6D\xBC\xCA\xA6\x25\x26\x21\x81\x9E\x80\x86\x70\x09\x9A\x5D\x98\x57\xB7\xB2\x0F\x9B\x37\x5E\x8B\x84\x8E\x1C\xA3\xC4\x71\x52\x75\x90\xBF\xB3\x24\xAD\x3D\x64\xA0\x97\x1D\x58\x66\xD7\xBB\xB5\x62\x06\x89\x97\xDF\xB7\xB4\xDC\x15\xCF\x5C\x62\x82\x04\x2E\x9B\x7E\xB3\xD7\x9C\x17\x4E\xB3\xC7\x8E\xE7\x56\xA6\x9A\xA7\x22\xBC\xA8\x81\xA7\x6B\xB5\x11\x5A\xD3\xB8\xB7\x6C\x00\x90\x90\x1E\x02\x99\x79\x00\x91\x93\xE1\x86\x99\x34\x02\x92\x91\x55\x1C\x88\x65\x9B\x99\x99\xCA\xB1\xB5\xE1\x1B\xE1\x55\xCA\xB0\x99\x58\x9A\x19\x62\xCD\xBE\x04\xD4\xB3\x60\x9F\x47\xB9\x99\xD0\x1A\xC1\x94\x6D\x97\xB8\x4D\x9A\x6B\xAB\x41\xA3\xB8\xDE\x9B\x9A\x99",
"\xAC\x6F\x99\x35\xB8\xEF\x91\x52\x73\x99\xC5\x7D\x9D\x92\x58\xB7\x99\x08\xA3\xD8\x42\x66\x83\x2E\xD6\x22\x81\x50\xE3\x95\xB8\x25\x91\x99\x9A\x72\x5A\xB8\xA8\x14\x87\xB7\xE4\x9E\xB8\xDC\x99\x68\x59\xE3\x81\x62\x21\xB3\xE4\x54\xE2\x93\x7D\x33\x63\x5F\x9D\xE3\xA2\xB3\x3F\xB8\x39\xB7\xCD\x8F\x61\x43\xB8\xE5\x24\x66\x8F\xB9\x32\xBB\x87\xB9\xD7\x8D\xB0\x54\xB8\x94\x93\xE5\x98\xB9\x45\x60\x38\xBB\xE5\x94\x2E\xE3\xB3\x3B\x5F\xE5\xB6\x4C\x61\xBA\x5C\x1C\x67\x89\x9A\x81\x14\xA0\x98\xE7\xAF\x15\x2B\x63\xA1\x93\x10\x07\x9A\x2E\xAF\x9E\xB0\x14\x16\x9D\x3C\x04\xD6\x96\xE6\xB4\x7E\x12\x54\x7C\xBF\xA9\x86\x4E\x95\x9A\xB7\x38\x69\x89\x16\x67\x00\xEF\x67\x69\x99\x9A\x8A\x14\xBF\x43\xE9\x90\xBA\x2A\x5C\x08\x0A\xDE\x1A\xBA\x5C\x5F\xA5\xB3\x9F\x0A\x16\xD9\x83\xD2\xAD\x3D\x41\x9A\x6F\x9E\x38\xB4\xD5\x9F\xBA\x79\x16\x83\x09\x52\xB5\xB1\xFB\x57\xA9\xB8\x57\x24\x54\x13\x52\xD6\x26\xDA\x6C\x75\x9E\xB8\x5E\x11\xEA\x96\x8D\x74\x6A\xD2\x22\x3A\x6E\x61\xA4\xBA\xEA\x21\xBB\x36\x09\x5D\xB4\xA4\xB8\x5C\x2B\xBA\x4D\x2A\x1D\xB1\xEC\xA8\xBA\xB0\xB8\x4F\x82\xEB\x9B\xAE\xB4\xBB\xA3\xB8\xEA\xB7\xBA\x67\xA2\xBD\x12\x3A\x5B\x54\xF1\x78\xD9\x7B\xE2\x88\x5C\x82\xBB\xAF\xB8\x34\x6E\xBA\x8A\x17\xB0\xBC\xB8\xA0\x5B\x22\x78\x11\xB7\xEC\xAF\xBA\x05\x56\x8A\x8B\xEC\xB6\xB1\x53\x51\xAD\xB0\xEA\xA5\x83\x99\x61\x2F\x9F\x0D\x9B\x4D\xBD\xB8\xEC\x2C\x4E\x5C\xBB\xA9\xBA\xBD\x1B\x4C\xA0\xBB\xCD\x92\xB8\xB4\xEF\x89\xBB\xEC\x72\xD5\x23\xEB\xBD\x01\xC6\x9B\xA6\x16\x6D\xA9\x9B\x9F\x98\xB3\x98\x6E\xAD\x9A\x3C\x5D\x0D\x01\x6D\x83\x04\xD3\x9B\xB2\x92\xF0\x87\xBC\x6D\x18\xB6\x9F\xCF\x48\xB1\x25\xB2\x53\x60\x67\xAA\x4C\xB8\x99\x29\xBA\x6B\xA5\x53\xE4\x98\x67\xA6\xF0\xAC\x9A\x8E\x19\x7D\xB0\x62\xA7\x9B\x20\xBD\x6C\x05\xF0\x8F\xBC\x25\xBC\xA9\x97\x03\x0B\xBC\x02\x05\xC3\xB4\xF2\x8C\x7F\x12\xBE\xF1\xA4\xF1\x87\xBA\x17\xBE\x08\x00\x6E\xBE\xAF\x85\x18\xC7\xB1\x86\xA6\x9B\x1F\xBC\xF3\x7F\x3F\x2C\x9B\x14\x17\xBB\x9D\x50\x2B\x60\x02\x89\x71\x35\x6F\xB9\x8F\x09\x9D\x43\x16\xE8\x89\xB2\x00\x9E\x82\xB5\xE5\x90\xB7\x9E\x8C\x16\xAD\xDA\x7A\x22\xEB\x99\xCE\x2D\x6E\x8C\x06\x42\xBE\xC5\xA6\x03\x05\xBD\x16\x1E\x7C\x88\x70\xAA\x4C\x0A\x9D\x6F\xB1\x4C\x8A\xB2\x98\x8F\x52\x55\xCA\x93\x9C\x59\xA2\xC5\x94\xB9\x30\xA2\x66\x00\xBB\x9C\x71\x9D\x6C\xB5\xA3\x40\x07\x8B\x99\x9C\x24\x9F\x6F\x9A\xD2\xA2\x00\xEB\xB5\xDF\x95\xF1\x86\xB8\x92\x9A\xD7\x46\x43\x8A\x63\x58\x81\xC1\xA9\x8C\x97\xA3\xCC\xA0\x0B\x8E\x8C\xB4\xA5\x23\x82\x34\xA9\x71\x90\xA3\x95\x33\x6F\x28\x8D\x89\x9D\xBD\x35\x81\x9D\x74\x86\x70\x4F\x9D\x0D\x03\x75\x86\x04\x97\xBC\xBD\x45\x75\x9F\x53\x8C\x9B\xCC\xB1\xE5\x82\x7F\x16\x90\x79\x8E\x75\xA3\x5E\x12\x55\xD8\x98\xD3\x63\x9D\xA3\x5F\x44\xAB\xD4\x63\x5D\xB4\x2D\xDA\x97\xBB\x14\x14\xEA\x6E\xDB\x9E\xEB\x82\xB6\x1F\x14\x61\xBD\x92\x09\x71\x75\x9F\xBA\x63\xAE\x9C\x88\xB9\xB7\x27\xB2\x38\xBC\xB6\x85\xA8\x66\xB6\xC1\x6D\xAB\xC1\xB6\xF1\x83\xDC\xB1\xAB\x16\x62\x71\xBD\xD9\xA3\x60\x9F\xB7\x4D\x21\xDA\x8E\xBD\xCE\xB4\xBF\xAA\x84\x66\xB6\xD1\xB7\xDE\xB4\xC3\x54\xB7\x45\x4F\xE6\x97\xDD\xA5\x5E\xD9\xB5\xEA\x81\x7A\x8B\xAC\xDE\xB6\xE9\x9B\x3E\x9D\x2C\x40\x00\xBF\x4F\xDA\xBF\x70\x06\x4F\xF9\xB6\x3E\x2A\x5C\xEE\x45\x42\x0D\xFE\x92\xA7\xE4\x8E\xF9\x01\xD5\xA2\x00\x24\x01\xCB\x4E\x39\x4F\xA6\x2B\x49\x64\xAF\x22\x45\x81\x1D\x91\x0A\x06\x74\x6C\xB6\xF6\x6E\x0F\x69\xB0\xA2\x83\xA9\x9C\xF1\x9B\x96\x2D\x9E\x06\xC2\xCF\x09\xA1\x67\x04\xB3\x9D\x17\xAA\xC7\x36\x9E\x20\x4F\xFE\x84\xAC\x3A\x9E\x33\x24\x00\x95\xA8\x9F\xBE\xE5\x51\x16\xA5\x7B\xAB\x25\x40\x03\x2B\xBC\x55\x99\x18\xB2\xB1\x56\x99\x61\x2A\x5C\x32\x03\xF8\x91\x10\x25\x9F\xB8\xB0\xFA\x9A\x0C\xAB\x9F\x38\x9D\xFB\x9A\xF7\x8C\x66\xFF\xBD\xFC\x9A\xD4\xB4\x9F\x02\x2F\x4D\x63\xD1\x34\xA3\xC6\xA5\x1C\x44\x87\xA7\xA6\x35\x00\x79\x3D\x03\xFD\xA3\xD4\xA5\x8C\xAA\x2F\x04\x50\x7B\xA1\x11\xA5\xCF\x92\xA2\xE2\x4C\x20\xAD\x3D\x4B\xA1\xBE\x2E\x13\xA2\xBC\x0B\xA0\x51\xA2\x3F\xAE\x15\x57\xA4\x3F\xA5\x3A\x35\x90\xAD\x33\x91\x65\x42\xA9\x16\x7D\x5B\x0D\xA6\x75\xB6\x93\xA9\x45\x1B\xA4\xCE\x99\x91\x8E\x93\x05\xAF\x18\xC1\xCE\x3B\x70\x3C\xAE\x39\x30\x75\x04\xC1\xE5\xA3\xA2\xB3\x27\xA9\xBD\xD4\x23\x1A\xC1\x05\xC1\xC1\x22\x03\x39\xAF\x49\x86\xAA\xEA\x58\x6A\x28\xDB\x33\x89\x73\xA6\x0C\xCF\xD7\xB1",
"\xA3\x6F\xA0\xBD\x63\x07\xED\xA6\x31\xAB\x74\xA1\x80\x2C\xC1\x41\xC1\x22\x83\x9A\x87\xC2\x83\xC3\xDC\x1A\xC9\x5C\x8F\x55\xA0\x12\xC8\x8A\x8A\xA1\x5B\xA2\x1C\xCA\x83\xA5\xA3\x34\x5F\x30\x88\x08\xC4\xC2\xD1\xB9\x1A\xAE\x6B\xA6\x9B\x68\xA0\x8E\x01\x08\xF4\x01\x9B\xC2\x23\xCF\x85\xB6\x8D\xA9\xA1\x7C\xA3\x0D\x46\x0B\xA5\xC3\x85\x07\x40\x6E\x7F\xB2\x95\xF1\x5D\x61\x83\x59\xAC\xC1\x23\xCE\x0A\xDF\x53\x06\x08\x24\xA1\xDF\xA1\xA0\x94\xA2\x0C\xA3\x0A\xC0\x01\xDC\xA3\x21\xA9\x82\xB5\xA1\x39\x00\x3F\xA6\x10\x06\xC3\xA1\xA0\x27\xC3\x05\xDE\xC1\x03\xA6\x3A\x31\x88\x18\xC1\x87\xC0\xCE\x90\x91\x9C\xC1\x85\xA9\x1F\xCD\x73\x90\xA4\x61\xC2\x44\x56\x06\xD4\xC1\xC4\x82\x19\xC1\x06\xF6\x51\x1E\xA6\x2C\x35\xE4\x84\xC0\x7B\x85\x49\xA0\x03\x07\x03\xEA\x34\x3A\xC0\x04\xDC\xC2\xB9\xC3\xFF\x14\x83\xB2\xB7\x2B\x51\x25\xAF\x0B\xF6\xC2\x48\xBF\x2E\xC7\x54\x7F\xA0\x71\xC0\x14\xC7\x09\xF4\xC1\x76\xC3\x60\x58\x07\xE0\x56\x7A\xC0\x3B\xA6\x0D\xFF\xA4\x33\xC0\x08\x00\x08\xF5\xC2\xFB\xC0\x27\xC7\x14\x24\xA2\x47\xC3\x29\xAB\x3C\x4A\xC1\x24\x63\x2A\xAF\xBB\x2D\xA2\x4F\xC0\x23\xC9\x10\xE6\xC2\x65\x78\x40\xAC\x0C\xF8\x54\x04\xA7\x33\xC7\x90\xA5\x5E\x5A\xC0\x24\x34\x0D\xEF\xC0\x03\xC4\x31\x88\x0D\xE5\x5E\xAA\xBF\x36\xCB\x11\xDE\xC3\x28\xC6\x1F\x51\x0E\xD6\xC4\xC9\xC0\x46\xC2\x02\x12\x43\xA8\xC2\x08\xA3\x86\x93\x06\x08\xC5\x4C\xC7\x0B\xE1\x4C\xB0\xC2\x62\xA9\x7D\x73\xC2\xC7\x5D\x4E\xC5\x8F\xB5\xC3\x9D\xC2\x28\xCF\x09\xEC\xA1\x69\xA2\x50\xCB\x87\x90\xC2\x0D\xC7\xA1\xA8\x84\xA9\xC2\x5A\xA3\x20\xAB\x06\xC1\xC3\x9D\x31\x01\xCF\x8D\x94\x93\xC6\xC3\x40\x08\x0C\xC3\xC5\x16\x07\x88\x5A\x11\xC5\xAC\x56\xC2\x47\xC8\x90\x81\x68\x5B\xC0\xB0\x5D\x05\xC5\xAC\x27\xC5\x64\x68\x61\x9A\xC3\x15\xA4\x19\xC8\xF8\xAD\xC5\x67\xC2\x10\x79\x06\xEF\xC4\x73\x1C\xBF\x44\x93\x97\x17\x06\x4F\x5D\xC4\x15\x13\x4C\x8C\x45\x42\x0D\x17\xFA\xA1\xA8\x31\x1D\x1C\xA4\x57\x17\xEF\xC1\x08\xAB\x4F\x80\xC0\x3B\x72\xCE\x61\x18\xD7\x17\x40\x03\x42\xBA\x9C\xB6\x13\xA0\x5D\x22\xA1\x9D\x83\x04\xD1\xA4\xB5\x9F\x06\x26\xA1\x24\x02\x75\xAB\x73\x99\xA7\x1B\xC4\x77\xAF\x3A\xB6\x07\x4E\x1F\x2F\xCC\x6E\x83\x83\x4D\x72\x34\x8E\x9F\xB6\x1F\xB8\x6C\x36\x8A\xBB\x7B\xA5\x8B\xC3\xDC\x1B\x55\xB3\x13\xCD\xA5\x0E\x0B\x01\x2A\x37\xB3\xC7\x54\xAF\x97\xBE\xA3\x2D\xA6\x48\xC8\xB3\xAA\x5B\xAF\x66\x5F\x9B\x0D\x8B\xC6\x54\x07\x17\xCD\xF8\x91\x04\x39\xA7\x1E\x81\xCA\x2B\x06\xA8\xB4\x5D\xAB\x93\xAB\x06\x44\xA7\xB5\xB7\x24\xA8\x32\x42\xC4\x6B\xA8\x11\xEF\xA6\x12\x9A\x6C\xAB\x98\x74\xA6\xF8\xBC\x90\x4C\x22\x78\xA6\x92\xA4\xFF\xB7\xA3\x55\xA6\x37\x9B\x3D\xB1\x1E\xCE\xB2\x50\xC4\x71\xA5\x73\x11\xC7\xAD\xC7\x4E\xCF\xC9\x9E\x05\x23\xC7\x18\xB9\xFD\x96\x4F\xED\x7B\xD9\x5C\x95\xA3\x89\x5F\xA5\x58\xA0\xEF\x64\xA5\x6D\xA7\x59\xA1\x22\xB3\xC7\x6B\xA6\x08\x08\x1A\x13\x45\xFA\xC4\x98\x83\x24\xA2\x30\x02\xC4\x37\xC2\x7A\xB5\x5A\x00\x25\x34\x37\x21\x00\x01\xAC\xC7\x6D\xC2\x90\x2F\xC6\xAB\x35\x1D\xAD\x58\xA7\xA4\x03\x05\x4A\xA6\x9A\x9C\xC2\xB9\xC7\x42\xA9\x5C\xBC\xC6\x58\x82\x6F\xC8\x0E\x80\xC7\x93\x5F\x4D\xAA\x8C\x85\xC7\x22\x03\x72\xC5\xF2\x47\xC6\xF1\x9E\x89\xC4\x94\xA2\xBA\x39\x58\x74\xCC\x9C\x06\x70\x24\x21\xE8\x16\x30\x71\xC8\xDA\x15\xCF\x51\x0E\x42\x84\xDE\x84\x8D\xC9\x77\x0F\xA2\xEE\xC1\x67\xCF\xD7\xBA\xC8\xAD\x1F\xB9\x15\xFE\x86\x70\xEA\xBE\x4F\x09\xFE\xB1\xBF\x3E\x05\xCF\x5F\xFE\x83\x04\xEF\xBE\x65\xC9\xB0\xB3\xBF\xF5\xBD\xF5\x49\x1D\xE3\x3A\xFA\xBE\x6E\xA5\x1E\xB4\x4E\x88\xC6\x10\x72\x00\xDA\xB7\x42\x1F\x02\xAB\xD0\x85\xB5\x0D\xB5\x51\xB8\xA6\x5C\x68\xB2\x9C\x87\xB4\xD1\xA0\x4C\x16\xB7\x54\xB7\x76\x5E\xB5\xCA\x1D\xAB\xA7\xD5\xA8\xB4\x76\x73\x56\xBB\xD8\x67\xBA\xD7\x1C\x58\xBC\x41\x30\xC9\xFC\x54\x59\xB0\xD3\x95\x9E\xA3\xB6\xF4\xBA\xD6\xA4\xC7\x58\x58\x4D\xBF\xE0\xBC\xB7\x70\xB7\x99\xBF\xD4\xB4\xB5\x0E\x62\x80\xB4\x7B\x02\xB5\x86\xCB\x5B\xB2\x9B\x38\x55\x49\xB7\x5F\xBF\xD4\xBF\x0F\x40\x00\xDB\xB2\x8B\xBA\x6A\x71\xBE\x40\x03\xF7\xB9\xA2\x0D\x52\xDD\xB6\x63\xB8\xBD\x84\x76\xE7\xB0\x8C\x90\x65\xB4\xA6\x1B\xC4\xE8\x46\xC8\x74\x52\xCD\x9A\x8C\x91\x9A\xCD\xA1\xE2\x45\x06\xD6\xA3\x8E\xBD\xD0\x96\x06\x0C\xBE\xBD\x26\x32\xAF\xF8\x87\x81\xDA\xA3\xDC\x1C\xF6\xAE\xBD\xB3\xA3\xD0\x69\x29\xC1\x04\x9B\xCA\x19\x05\xF7\xA6\x9C\xA0\xC8\x6C\xAF\x8B\x8F\xB3\x7D",
"\xBF\x30\xA0\x93\xB7\xC3\x25\xC5\xCD\x99\x23\x37\x9C\x85\xBF\xA2\x5E\x2A\xC8\xBE\xB0\xCA\xD1\x92\x2B\xF4\xCA\x37\x9C\xE7\x4C\xB3\x8B\x27\x0B\xA0\xEF\x63\xDE\x86\xB6\x09\x9A\x0C\x02\x81\x82\x04\x14\xA2\x5D\x37\x81\x86\xCB\xEE\x9C\xCE\x98\x01\xE8\x55\xEF\xB5\x61\xC7\x0F\xD9\xA1\xF4\xB7\xC5\x95\x14\x59\x9C\x97\xCA\x0C\x0F\x2B\xC0\x00\xC1\xCB\xB0\xC7\xE0\xA7\x9C\xA1\xCB\xB1\xCB\xCB\xA5\xCA\xC4\xA0\xB3\xC8\x2A\xD2\x4E\xAA\xC8\xE1\xB0\xF6\x86\xBE\xD3\xC9\xFC\x99\xF8\xB6\xCA\xD7\xC9\x35\xA1\x8D\xB6\xCA\xDA\xC9\x36\xA3\x8F\xA5\x42\x3B\xC1\x00\x27\x8F\xB3\x1D\xBA\x6B\x38\xA3\x10\x23\xA3\x3A\xC4\x51\xCD\x0F\xE5\x82\x61\x89\x5E\x0B\x07\xE7\xCA\x3E\xCA\x5D\xAB\x35\x47\xC4\x1F\xA5\x52\xA5\x97\x69\xC7\x8C\x06\x5F\xAB\x92\xB5\xA1\x2C\x62\x0B\x67\xCB\xAC\xCC\x5D\xC7\x37\x59\x21\xC7\x63\x96\x79\xC0\xCB\x3C\x6B\x6F\x33\xA4\x88\xC2\x1C\xF5\xCA\x96\x30\x89\xC6\x22\xC9\xC7\x29\xC9\x50\xA2\xCA\x36\xCA\x45\xA5\x8B\xC1\xC8\x20\xA6\xF9\x26\x52\xA4\x33\xF4\x01\x2E\xCC\x39\x1A\x82\xB6\x00\x52\xA6\x41\x05\x35\xEA\xA4\x52\xCD\x55\xAC\x1E\xFE\x79\x59\xA4\x7C\xCB\x1F\xEA\xA5\x48\x4D\x7D\xC1\x16\x37\xC7\x52\x59\x59\xAE\x96\x82\x52\xFC\xC5\xD8\xCC\x96\x80\xC8\x19\x72\x80\xCA\x8E\x84\xC8\x72\xA7\xC0\xC5\x10\xD1\x24\x0A\xC8\x63\x0D\x20\xEF\xCC\xA4\xA6\xDD\x17\x21\xD8\xCC\x37\x01\x6A\xA1\x10\x2B\xA6\x4F\xCE\x87\xB9\xF7\xAA\x9C\xD6\xC6\x59\x98\x1D\xF6\xA6\xF9\xBC\x77\xCB\xFF\x94\xA6\x0C\x54\x82\xBB\x59\xA2\xC7\xD6\x78\xA0\xC3\x9C\xB2\x1C\x25\x1F\x67\xAF\x0E\x9F\x85\x4B\x87\x78\xAD\x73\x66\xA7\xD3\x2C\x7A\xA2\x14\xAA\xA7\x5C\xAB\xA4\x4D\x54\xA0\xA9\x28\xA8\x5D\x81\xA9\xB6\xA7\x58\x85\x7E\xA6\xC9\x91\x6B\x05\xAA\x50\x90\x07\x07\xA8\x31\x01\x92\xA6\x10\x32\xCE\x3D\x4E\x96\xA9\x11\x21\xA8\xEC\xA6\xC2\x68\x44\xAD\xA9\x70\x87\x8E\xA2\xA6\xB3\xA7\x28\x8F\x8D\x6C\xA2\x82\xA9\x68\xAB\xED\xCA\xA6\xB9\xCE\xA4\xC1\x93\xAC\x3B\xD5\xA8\x53\xAA\xD5\x7B\xA2\x9C\x73\x1C\xA9\xF1\xCF\x3A\xC7\xCF\x3A\x51\xF2\xCD\xA5\x8B\xCF\x6F\xAB\xEF\xC7\x3A\xC0\xA9\x52\x0F\xD9\xAB\x3A\xDE\xA8\xAE\x5F\x81\xAE\x9F\x80\xA8\x69\xAB\x80\xA8\x39\xF0\x01\x33\x01\x50\x83\x03\x2A\x5C\x68\x02\xAD\x3D\x3E\xDD\x61\x33\x03\x56\x8E\xA1\x9B\x53\xF1\xCD\xB4\x73\x03\x1C\xA9\xE7\x64\xE0\x48\x3B\xCC\xCF\xA6\xCE\xAA\xA6\x9F\x81\x01\x64\x00\xF5\x64\x3F\xF5\x88\xF7\xCF\x9A\xAA\x32\x50\x4A\xFA\xCC\xE9\xC2\xA5\xBD\xCF\xB6\x87\xF3\xC8\x80\x4B\x0A\x9E\x22\x8B\xA9\x11\x35\xCF\x80\x4D\x01\xD8\x3C\xEA\x4C\x26\x01\x45\x5B\x3F\xD9\xCF\xF1\xA4\x03\xDE\x3C\xC2\xCF\xAB\x4D\x33\x1A\x14\x12\xD0\xE8\xCC\x01\xDC\xA5\x86\x84\x35\xAA\x9B\xAE\x3B\xDD\xD0\x3D\xA8\xB4\xAF\xA3\x9B\x69\x9A\xAF\x90\xA7\x3E\xE9\xCF\xAE\xCF\xFA\xC4\x03\x16\x01\xB6\x38\x0E\xD0\x3F\xE6\xD0\x06\xD2\x08\x09\x3F\xE9\xD0\xBD\xCD\x98\xAC\x42\xF1\xA9\xD8\x5B\x9C\xA8\x77\x41\xD0\x25\x84\x05\xD5\x2F\x56\xD0\xD5\xCF\x01\xDA\x41\xCA\xD0\x70\xAB\x98\xA2\xB6\x55\xA9\xC5\xAC\x20\x2F\xCE\x52\xCF\x4A\xD2\x5B\x0C\x44\xED\x85\x22\x01\x06\xD9\x40\xEA\xD0\x42\xD2\x85\xAE\x41\xE4\xA9\x56\x87\x04\x52\x42\xFA\x69\x9F\x87\x12\xDC\x43\xD7\xD0\x22\x00\x0A\xDB\xA5\xA0\xD1\xA5\xCD\x0B\xD4\xAC\x54\xD1\x53\x01\x0C\xDE\xBA\x72\xAA\xF3\x60\x5D\x97\xEB\x75\x00\x35\x01\x38\x07\x12\x3E\xD1\xAA\x96\xA6\xA9\xD8\x5C\xAA\xA4\x84\xE8\x61\xFA\xAE\xC7\xBB\xC4\xE0\xB8\xA8\x8D\x7D\xD3\x97\xA2\xA4\xAA\xB1\x86\x70\x7C\xD5\x75\x1B\x9F\xD0\x58\x7E\xDD\x7A\x1B\xAF\x54\xBD\x84\xB7\x83\x57\x8D\x89\x2A\x61\x0D\x04\x03\x0E\x03\x27\x04\x28\xD1\x48\xC5\x86\xF5\x87\x9C\x69\xA9\x45\xD2\xF4\xB2\xA9\xC8\x73\x89\xAA\x6F\x7E\x23\xD2\xAA\x91\xD2\x9D\x61\xD5\x74\x9F\xAB\xAA\x2A\x55\xAB\xAC\x19\x8F\x6A\xB0\xAA\xC9\xA4\x42\xB3\xA1\xB8\x9F\xEE\x9D\x99\x6B\xAC\xA4\x62\x77\x8F\xB2\x9F\x53\x15\x91\x62\xA2\xB3\xAA\x14\x8B\x54\xFB\x69\x81\x91\xB6\x87\x64\x20\x7A\xB3\x85\x62\x23\x93\x1B\x3F\xB3\x99\x14\x3F\x91\xCF\x54\x03\x04\xB2\x80\x1E\x21\xB6\x5C\x60\xB2\x63\xBD\xD3\xB5\xF6\x8F\xBD\x95\x9C\x09\xBA\x4C\xCC\x75\xAB\xB2\xF8\xB4\xC9\x9B\x12\x1E\xC3\x09\x81\x31\x21\xC0\xDE\x9F\x08\xC3\xB4\x75\xB2\x61\x96\x08\xC4\x9A\x79\xB2\xA3\xC8\xB0\x5D\xCB\x94\x65\x7F\xBE\x55\x6B\x56\xBE\x76\xC2\xB3\x56\x6F\xC1\x05\xB9\xDD\x2A\x02\x19\xC4\x41\xD4\x3C\x5D\x44\x67\x12\x07\x95\xF7\x3F\xB4\x2A\xAC\x1F\x61\x0A\xD5\x6C\x07\x48\xD1\xB6\x1E\xC8\xA9",
"\x31\x58\x80\xA5\x40\xBA\x73\xCE\x32\x4D\xD4\xC4\x98\xE5\x20\xF4\xAE\x9B\xC7\x9C\xBC\x90\xB0\x67\x04\x04\x8B\xD5\xB5\x33\xE0\xBD\x4A\xBF\x32\xDE\x7B\x8C\xBD\x22\xB1\xE4\x90\x4E\xD4\xBF\xE2\xD1\xDA\xB4\xF5\x9D\x2C\x4C\x9E\xAF\xBE\x74\xBE\xBA\x2A\x5F\xE5\xB3\x10\x19\xBE\x5F\x03\xE6\xBA\x32\x4C\x9A\x26\xD7\xCA\x9B\x2E\xD0\x65\x5C\x9C\x4E\x73\xFA\x80\x71\xA5\xBE\x84\x98\xFA\x80\x71\xAA\xBE\x18\xB8\x76\xB6\x2E\x91\x10\xA6\x79\x34\xD3\x74\xF2\xBB\xB9\x1F\x25\xD7\x1F\x61\xCB\xF5\x1A\x72\x52\xB4\x06\x04\x56\xD6\x19\xC5\xB5\x51\xB7\xE2\x47\xD1\xAB\xC9\x55\xB6\x9B\xCA\xC3\x22\xB5\x2D\x6C\x48\xB3\x27\xE0\xD5\x45\xB6\x9D\xC4\x56\xD6\x8A\x7A\xCB\x73\xBC\x27\xD9\x8E\x6E\xD4\x4B\xD6\x7D\x82\xCA\x7A\xB4\xA1\xCC\x06\x31\xB5\x87\xC8\x5F\xBE\xD3\x83\xCA\x03\xB9\xA1\xC2\xE5\xB5\xD5\x7D\xD7\xA3\xC9\xAA\x51\xCA\x26\xCC\x60\xBC\xD4\xB7\xB6\x4E\xB7\x99\xC4\x58\x5F\xD5\x36\x68\x9B\xC8\x6F\x22\xD5\x1D\xB5\x56\xB9\xB6\x72\xC9\x22\xB5\x58\xDA\x19\xA0\x78\x61\xB4\x9E\xC2\x2C\xAD\xD5\x7E\xC9\x69\xB2\x7D\xBB\xAB\x2C\xB7\x72\xB2\x57\xF0\x70\x74\xD6\x5C\xBB\x28\xFE\xD5\xB1\x1D\x5E\xD7\xD4\xBB\xD5\x80\xD7\x69\xD7\x57\xCD\xCA\x77\xB6\x5E\xD3\x58\xD9\xC9\x0A\x5B\x52\xBA\x80\x12\xD5\x49\xB8\x43\xB0\x19\xCF\xB5\x3D\x5C\x99\xC3\x10\x24\xC9\x5B\xD7\xF5\x1D\x55\xC3\x4F\x6A\xC9\x63\xD6\x59\xD7\xB0\x1C\xB6\x13\x1A\x59\xCE\x72\x77\x62\x9C\x67\x56\xC6\xD7\x69\xD6\xDD\x76\xD2\x8B\xD7\x9C\x4C\x67\xD1\x5A\xE6\xB5\x90\xCF\x9E\xC3\x5A\xEA\x56\xA5\xD6\x6A\xDF\x5A\xFF\xD5\xA6\xD5\xDE\x18\x28\xED\x5B\x8A\xCA\x78\xDC\x28\xE0\xD7\xDE\xD5\x5F\xBE\x07\xC5\xD6\x93\xCA\xE2\x27\xEE\x12\xD4\xD7\x1F\x8C\xCC\x81\x35\xC8\x31\x03\x8D\xC6\x10\x36\xD7\xF4\x48\x90\xCE\x15\x3C\xC8\x33\xA1\x0C\xCD\x73\x85\xC4\xFA\xD4\xF6\x1D\xB1\x2C\x9B\xFC\x1B\x89\x7C\x6F\x3B\x66\xBD\x66\x77\x8C\x6F\x0C\x69\xE0\x07\x43\xDD\x41\xB4\x5C\x65\x9A\x20\x59\x88\x13\x50\xFC\x1B\xF4\x44\x27\xC3\x1F\x59\x7D\x33\x17\xBD\x94\x6F\x63\xBA\xEA\x04\x72\x99\x9B\x3D\xD7\xCC\x40\x61\xC7\xB9\x12\xDB\x85\x1A\x59\x53\xBC\x5D\x4F\x85\xDA\xD1\x90\xD6\xCA\xD6\xFE\xA4\x60\xE0\x07\x06\xD8\x78\x0D\x73\x65\x8D\x03\x07\xD9\x86\xE4\x9E\xD8\xDF\xAE\xF1\xA1\x62\xE5\x5D\x8B\x77\x88\xDA\x3A\x14\xB8\x25\xDA\x10\x54\xBE\xB2\xBC\x29\xD8\x5A\xD5\x27\xD2\xD7\x99\xD6\xFE\xA7\x9F\x46\x0A\xF9\x66\xA1\x0A\x72\x7A\x01\x27\x04\x94\xD8\x7B\x46\x0A\xF7\x9A\xA1\x0E\x60\xEB\x9C\x04\x5B\xB8\x4A\x87\x0A\x06\x41\x01\xCC\x49\xAB\x1C\x5F\x5A\xDA\x9F\x0C\x65\xDE\xD9\x8A\x05\x39\xBB\x35\x46\x21\xC6\x7E\x31\x53\x61\xE2\xCD\x36\x8F\x92\xD6\x21\x0D\xD9\x16\x09\xCF\x53\x09\x27\x04\x73\xDB\x94\xD6\x21\x1D\x74\x96\x46\x95\xDB\x63\xCB\x66\x59\xD9\x1C\x23\x66\xE0\x4C\x5F\xD9\x81\x5E\x67\xD6\x06\x5D\xD8\xA0\xD5\x66\xF1\x4E\xE9\x53\xA0\xDD\x06\x02\x01\x64\xD9\x17\x23\xE7\xA8\xD9\x75\x9A\x9A\xD6\x62\xE6\x74\x45\x05\x5A\x9D\x07\x38\x66\xAA\x9C\xEF\x6A\x7A\xAA\x5C\xC0\x45\x42\x0D\x69\xE4\xA3\x2D\x0A\x5B\x79\x5C\x17\xD9\x33\x93\x4C\xA9\x00\xDB\xB7\x61\x32\xCF\x06\x66\xEC\x50\x65\x33\x64\x33\xF2\xBD\xBC\xCE\x9B\xC9\xBB\x67\x08\x9B\xCE\x9A\xCA\x5C\xF2\x81\x04\x2E\xBC\xAC\xD7\x6D\x82\x66\xB0\x9A\x1A\xAE\x2F\xF8\xB8\xE0\x1B\xB7\x99\x6B\xAD\x30\xBB\x99\xC7\xB3\x9C\xBA\xDA\xE9\x9A\xBF\x19\xE4\x8D\x2E\x3E\x0F\x72\xAC\x6C\xC9\xC9\x31\x03\xAD\xD0\x00\x2E\xBC\xCF\xD8\x54\xB6\x33\xC9\x06\x69\x03\x63\xB2\xE4\x8C\x36\x1C\xC1\x90\xD3\xA2\x62\x84\xBE\x46\xA5\x5C\x6F\x35\x19\x64\x54\x72\x4E\x13\x0A\x47\x24\x80\x9D\xBC\x6D\xFE\x0C\x23\x77\x9A\xDC\xCE\x49\x47\x66\x1C\x85\x8B\x1F\xB1\xBB\x5D\x16\x9E\xBE\x67\x9D\x15\x2A\x5E\x9F\xBF\x5C\x02\xD3\xD9\xB8\xA1\xB9\x17\xBB\xD9\x50\x67\x4F\xD8\x73\x9F\xA0\x3A\xCC\xA3\xB1\xA3\xAA\xBB\x67\x03\x54\xD3\x7C\x15\xD5\xC3\x1C\xEC\x9B\xA1\x66\xC9\x5C\xD4\x9A\xC2\xD5\xA4\x95\x2A\xD8\x49\xBC\x62\xFB\x30\xCB\xD4\x33\x54\x59\xC7\xBB\x47\xDB\x65\xDE\x1F\xC9\xD9\x63\xB6\x07\xBA\x5D\xDF\xD6\x73\x57\xC8\xDD\xE0\x91\x9A\x87\xC4\x5F\xDE\x5A\xF8\xD5\x8E\xC9\x9A\xB2\x0C\xAA\xDC\xE6\xD4\x6A\xD0\x73\xE4\x98\xAB\xD7\x6C\xDB\x5E\xC1\xC0\xDE\xA7\x61\xD6\xAD\x39\xD6\x60\xCB\x6E\xDE\xD0\xB5\x00\xBE\xD6\x40\x00\x5C\xE0\x5E\x11\xDF\x62\xD5\x5C\xCB\x51\x8E\xD6\x1C\x06\xD5\xA3\xD5\x19\xDF\xC4\xD2\x3A\x4F\xD7\x48\xDF\x71\xDB\x4C\xA0\xDC\x29\xB6\xC8\xD1\x57\xE4\xDC\x78\x62\xC9\xD0\x28",
"\xEC\xB5\xFD\x75\x79\xD4\x73\xDF\xD7\xA9\xD5\xCB\xDC\x5A\xE1\xD7\x5F\xDC\xCB\xD1\x5B\xF5\xDC\x30\x9C\x6D\xD1\x70\x76\xD6\x25\x20\xDC\x93\xD8\xA2\x4B\x85\xB7\x7B\xD5\x77\xB6\x00\xBB\xBC\xD7\x5D\xFB\x81\x75\xC0\xBF\x0B\xC2\xFC\x9F\x70\xC4\x8D\xF1\xBF\xAE\x87\xBF\x99\xB6\xBC\xA1\x39\xBD\x5D\xC8\xB5\x59\xBD\xAF\x98\xDD\x46\x5E\xD6\xD3\xC2\xA8\xB2\x51\xBB\xC0\xA5\xDD\x84\xD6\x07\xAE\x6B\xB8\x24\xF1\xB6\xD8\xB5\xF8\xBA\x7D\x8A\x05\x1F\x99\x09\x32\x2E\x5E\xDD\x41\xB5\x7E\xBA\x6C\x9C\xDE\x46\xB4\x1B\x03\x31\x7F\xB7\x01\x05\x80\xB3\x73\xDD\xDE\x6C\x01\x81\xBE\x36\xA4\xB5\xBE\xA6\x2B\xD3\x1E\xCB\xDE\xB3\x85\x7C\xA7\x7A\xE1\xDE\xC0\xC1\x91\xB5\x66\x96\xB8\x3F\xDA\x91\x93\x03\x04\x02\x27\x04\xEF\xDB\x64\xA4\xB9\xEA\xCA\x9A\xB1\x6C\xF6\xB8\xF9\x74\xB0\xD8\xE6\xAC\xB9\x5A\xBB\x96\x93\x51\xD5\xB3\x04\x1F\x9C\xBC\x6F\x14\xCA\x92\xBA\xB3\xB8\x57\x16\xBA\xD2\xDE\x62\x1B\x82\x5C\xBA\x06\x04\xF6\xDE\xB2\x95\xDF\x67\x01\x36\x88\xEB\xA7\xD2\xBA\xBA\x45\xD4\x6F\xF2\x16\x42\xCB\xB8\xBD\xED\xAA\xBA\x65\xAC\xAB\xB6\x61\xE8\xD5\xE4\xB9\x28\x46\xEE\xBE\xBB\xCC\xB9\x1A\xD8\x70\xDE\xDF\xD1\xB8\x56\x03\xED\xAF\x8B\xE0\xDD\x4F\x52\x7E\xD9\xBB\x94\xCA\xF9\xD5\xEF\xB1\x6C\x43\xB3\xFA\xD0\x5D\xED\xDF\x4A\x2F\xFB\xDD\x58\x3F\xBB\xE9\xB8\xF7\xD4\x7F\xEE\xBB\xBC\xB8\xFF\xD5\x7E\xF4\xBB\xDE\xB8\x5B\xA7\xDC\x79\xBB\x02\xE1\xD4\xD8\xEC\xA5\xBB\xAB\x4F\xB9\xBB\x52\x8E\xBA\x94\xB9\xF7\xDC\xEE\xBB\xDF\xF7\xD8\xF9\xD7\x79\x23\x74\xF5\x18\x5E\x11\x81\xE2\x00\x74\xB1\xB1\xBD\xEA\xAC\xDF\x8A\x14\xBF\xB8\xBB\xB0\xDF\x76\xB1\xF4\xDD\x81\xD4\xDF\x1D\xE0\x16\x64\x02\x36\x3A\x37\xE1\xA7\xBA\x80\xDF\xE0\xF5\xDD\xC9\x74\xED\xA4\x4E\xA3\x85\xF8\xDF\xEE\xBD\xAC\x0E\xE1\xA4\xDC\x82\xFF\xDF\xA7\x51\x00\xE1\x3B\x7B\xBB\x18\xE1\x8E\x6A\xCE\x1A\xE0\x96\x5B\xFC\xDC\x83\xC0\xE1\xB9\xBA\xFE\xD3\x84\xE3\xDF\x89\x2E\x11\xE3\x80\xE7\xDF\xF6\xB9\xFA\xDA\x82\xD5\xE0\x91\x4D\x09\xED\x82\xCD\xE1\x32\x6F\x13\xE0\x83\xD3\x57\x32\xE0\xA4\xB4\x83\xD8\xBA\x32\x03\x25\x07\x12\x2E\xE1\x3A\xE1\x07\xEB\x80\xC0\xAE\x72\x6B\x0F\xE7\x22\x96\xBB\x57\xE1\x11\xE6\xEA\x87\xE1\x27\xE2\x12\xE5\x64\xDB\xE1\x8B\x14\x19\xEA\x3E\x50\xE1\x5C\x4D\x1A\xE8\xEA\xAB\xE1\xA8\xB8\x9A\x66\x0A\x36\x3A\x8B\xE1\x1C\xE0\xE9\xB3\xE1\xD2\xBA\xC0\x55\xED\x9D\xAA\x20\xE2\xA0\x99\x85\xFB\xE1\x80\xE1\x1F\xE8\xEF\xBD\x94\x60\xE3\xD4\x42\x86\xC1\xE2\xEE\xDE\xB2\xB7\x86\xD1\xE1\x3B\xE2\x1F\x93\x89\xC2\xAA\x95\xE1\xA9\xB0\xE7\x90\xE0\xE8\xDE\xCA\x49\x82\xFF\xBB\xFE\xDE\x0B\xE3\x88\xE3\xE2\xCD\xBA\x1C\xEC\x83\xCF\x78\xA9\xE3\xEC\xB9\x66\xFC\xE1\xAD\xE2\x7F\xCB\x89\xCE\xAE\xB1\xE0\x19\xE4\x88\xC0\xBC\xAF\xD8\xCA\xB9\x6C\x95\x1F\xA4\x63\xCB\xB5\x6B\xF8\x00\xD2\xD9\xAE\xD6\x8C\xCE\x9B\x31\xBC\xC2\xB6\xE8\x91\xB9\x35\xBF\xCD\xB6\x44\xA2\x9B\x3A\xBD\x79\xC8\x6C\xC8\xBC\x94\xCB\x46\xD8\xF5\x9D\xD4\x43\xBF\x0D\x0C\xF5\x8F\x23\x5E\xBC\x51\xC1\xF6\x81\xBF\xA1\xB3\x5B\xD4\x65\xA9\xD4\xB0\xD3\x51\xC5\x71\xAF\xD4\x94\x2C\x03\xA1\x77\xB9\xD4\x32\xD4\xE5\xB4\x53\xF6\x00\x36\xD6\x40\x08\x53\xFA\xD4\x22\x01\xE7\xBF\x6B\xF4\x98\x7E\x91\xD7\x94\x25\x0B\x0A\x91\x9A\xE9\xB4\x1E\x87\xD5\x85\x62\xD9\x9C\xFA\x8F\x1E\xAE\xBD\x53\xDC\x76\x96\xD4\xAA\xE2\x5C\x1E\xAD\xAA\x0B\x11\xAF\xDE\x8E\x9F\xBA\x36\x08\xB7\xEE\x8A\xBB\x56\x93\x02\x06\x8F\x77\xE2\x82\xD8\x94\x2F\x28\x34\xEA\x41\x04\xA6\x79\x38\xB1\x92\xCA\xA3\x2A\x5F\x5F\xC3\x10\x3F\xC5\xF4\x4A\x49\xE2\x57\x23\x32\xF2\xCC\x16\xE0\x14\x04\x50\x2E\xE6\x9D\x00\x93\xE0\x4C\x34\x5D\xE2\x50\x04\x18\xDA\xC9\x16\xA6\xD9\x5C\x13\x4C\xB4\x03\x49\x01\x94\xFD\xA3\xA1\xDB\xB5\xDD\x22\x06\xBA\xDF\xB0\x3A\x87\x6A\xF1\xB6\xA9\xDA\x59\xA3\xE7\xAA\x9E\x4D\xB6\x10\xA5\x94\xEA\x4C\xC9\x1C\x52\xEA\x0D\x8A\xE5\x0F\xC3\x5A\x21\x33\x4D\xE5\x8C\x0B\x53\xED\x6A\xE3\x99\x05\xC1\x56\xEE\x33\x0C\x64\x1B\xC2\x02\xCE\x9F\xB7\x6E\x52\xE4\x1B\x16\x7B\xBA\x6E\x54\xC7\xDC\x1D\x95\x6A\xA0\xFE\xA7\xF1\x28\xBB\x70\xA0\x6C\xE7\x38\xC0\x85\x96\xC5\xF8\xA1\xC7\x69\x15\xC2\x04\x5B\xC6\x19\xAB\x0C\xE0\xC5\x1D\xC4\x3B\x3F\x11\xD9\xC1\x64\xC6\x48\xC6\x59\xA7\xC5\x74\xA5\x5A\xC2\x91\xA2\xC1\x70\xC7\xC0\xCC\x12\xEA\xC5\x2E\xC5\x5C\xC0\x87\xB6\xE5\x02\x25\x5E\xCD\x9C\xB3\x00\x7B\xE5\x40\x0D\x97\xD2\xC1\x5F\xC4\x5D\xA1\x16\xC2\xE6\x63\xC4\x6D\x75\x16\xCC\xA4",
"\xD5\xC3\xC0\xCA\x98\xE8\xC1\x8C\xE6\x36\x33\xE2\x7E\xD7\x3F\xA7\x63\xEB\x98\xE0\xC3\x92\xE6\x45\x06\x17\xE0\xC8\xF0\x8E\x5E\xCC\x73\x7E\xA7\xFA\x1B\x5C\xE0\x22\xF9\x83\x77\xCD\xD6\xCF\x20\xE0\x9F\x4F\xCE\xCA\x55\x03\x06\x01\xB6\x38\x71\xE6\x1B\xF8\xCD\x18\xC8\x2A\x3D\x07\x8E\xC5\x31\xA4\x34\xB5\x60\x76\xE6\x3F\xCC\x4E\xAD\x60\x7A\xA4\x46\xCC\x72\xCD\xD6\x85\xCD\xC7\xC7\x50\xA8\x34\xD6\xD4\x47\xA4\x14\xA7\x36\x52\xC7\xEA\xC7\xCD\xCB\x9C\xDC\xC8\xFA\x7E\x5F\x97\x0E\xBD\x3E\x3E\xCF\x09\x57\x5D\x12\xE7\xB1\x4C\x75\xE9\x9D\xC4\xCD\x3D\x9E\x8A\xCB\x9D\xC3\xE1\xDD\xE6\x30\xCC\x4B\xC6\xC2\xAE\xC7\xC8\xB7\x19\xF5\xA1\xFE\xA7\xD3\x28\xBB\x78\xE7\xAE\xC3\x6A\xC0\x92\xA0\xE7\x8C\x07\x3F\xB2\x10\x01\xB4\x04\xEA\x45\x04\xD0\xB4\x6E\x79\x07\x41\xB8\x35\xF0\xC6\xA2\xA2\xEE\x6C\x2F\x41\xD8\xF0\x8D\x80\xDB\xA0\xEB\x7A\x64\x01\x6E\xE9\x5F\xF3\xD7\x3B\xCB\x46\xE7\x12\x1E\xE4\xC9\xD6\x65\x37\x79\x22\xE4\xB4\x10\x29\x61\xA2\xFF\x0F\xA3\x32\xCA\x5D\x09\x36\x3A\x2B\xEB\x0B\xA2\xC0\xA8\xE8\xCA\xA2\xFC\xC6\xD7\x04\xC1\x2F\xEB\xB9\x17\x93\xC5\xC2\xAD\x7C\x8D\xEA\xC3\x30\xE8\x96\x32\xFC\xC2\xB9\x3A\xE8\xE7\x0C\x8F\xEF\x9B\x32\xCF\x04\xD4\x90\xEE\x59\x36\xE8\x31\xE8\x4E\xE2\x52\xE4\xC2\x51\xA1\x8D\xE3\xA2\xC9\xE9\x31\xAA\xEA\x96\xA4\xE2\xE8\x1D\x2F\x8D\xE1\xA6\x46\x0A\x53\xEA\x90\xE1\x11\x32\xCF\xCA\xE3\x3C\x79\xA5\xC8\xE9\x3D\xEA\x92\xE1\x60\xDF\xE9\x4F\xE9\x98\xE5\x08\xE0\x07\x43\xCA\x61\xB5\x24\xF2\x01\xF0\x8F\x9A\xE7\xA1\xF5\x6E\x1A\xEB\xE7\x9E\xFD\xBE\x04\xF9\x82\xC2\xD1\x7A\x1B\x9A\x0E\xB5\x7F\xE3\xB3\x3F\xE7\x14\xB6\xEE\x6B\x2B\xD6\xBD\x6F\xBC\x0C\x07\x2F\xF9\xCB\xBA\xA2\xA7\xCE\x0B\x83\xCE\x10\xD6\xC0\xD9\x2C\xF6\xC3\x3B\xCD\xB3\xC9\x2A\xCF\xCB\xB6\xC9\xB4\xCA\x86\x9A\xBF\xD8\xC8\xC3\xC3\x8D\xB3\xCA\x0E\xCF\x70\xC0\x39\x51\xCC\x90\xBC\xD4\x1C\xF6\xBC\x4B\x1C\x9E\x7F\xAF\xCF\x38\x6E\x23\x9E\xEE\x6E\x2D\xC7\x98\xE4\xB4\x14\x73\x03\x23\xCB\x01\x05\xB9\xC9\xDE\xBC\xCB\xE8\xCA\xDE\xBF\x64\xA5\xB2\xB8\x4D\xBB\xCC\xA8\xD0\x63\xF0\xCB\x90\x5F\x3F\x16\xCA\x15\x68\xC7\x93\x03\x03\xEA\xDE\x84\xA7\xCC\x38\x46\xEA\x38\x9D\x84\x90\x70\xD6\xBF\x23\xAD\x63\xAA\x2C\xD2\xC2\x8D\xEB\xC0\xC3\xF8\x8E\xBE\x92\xEB\xE1\xBA\x30\xD5\xCB\x90\x4D\xC3\xCE\x73\x8F\xCC\xD7\xA0\xA7\xE8\x2B\xCC\xCD\x47\x2E\xD3\xCE\x20\xC1\x20\x51\xCC\x84\xE8\x8F\xB9\x00\x55\xCF\x40\x07\x35\xFB\xCD\xEA\xC6\x55\xAD\x1E\xE3\x77\xD8\xA5\xF0\x41\x1F\xF6\x68\x69\xCE\xE1\x4C\x66\xE4\xCD\xA2\x4E\xD9\xC1\x20\xE9\xA5\x5D\xA6\xDA\xCE\x8B\xEC\xCD\x96\xB4\x09\x5F\x36\xC5\x89\x71\xCD\xC9\xC8\x73\xF0\x5A\x09\xC9\x5E\xA7\x21\x3D\xE6\xE2\xE9\x7E\xEA\x79\xEB\xCC\xDF\xE8\xC6\xCB\xAE\x7E\xCD\x00\x00\xE0\xCD\xB0\xFB\xC4\xD4\xC5\x6C\xA6\x14\x0C\xA6\xC9\xC9\xBC\x43\x25\xDB\xC7\x2B\x39\x77\xCC\x38\xDC\x58\x8E\xCC\x83\xB0\xFD\xAF\xDE\xE4\x6C\xB3\x63\x39\xC0\x1D\xE7\xC7\xE5\xC0\x54\xB7\xCE\x45\xAA\x0C\x02\x3B\xC3\x04\xB4\xCE\x87\xA4\x3D\xDC\xD1\x24\xA8\x9A\x70\xA5\xAB\xD0\x62\xD2\x1C\xDA\xAD\xA5\xA9\x22\x03\x99\xA9\x46\xE9\xA9\x20\xA8\x97\xA2\xA1\xB6\xEC\x50\xD2\xF6\xCE\x3F\xDA\xA8\xD1\xCF\xCF\xE6\x3C\xC1\xED\x3D\xD1\xA6\x44\xB4\xF0\xD1\x0B\xD2\xCE\xE6\x44\xFD\xEC\xC4\xCF\xE3\xAB\xB2\xF0\x01\x34\x01\x50\x84\x03\x2A\x5C\xBC\x03\x49\x0D\xB5\xDD\x61\x5A\x6E\x92\xEA\x45\xDB\x53\x61\xEC\xE0\x44\x03\x1C\xA9\xC3\x3F\x21\x5B\x44\xC5\xED\x43\xD2\x14\xDE\xA3\x8E\xD0\x5A\x7C\xF1\x34\x42\xE5\xED\xF5\x4B\xD9\xED\x43\xC3\x3F\xB0\xA7\xDA\xE0\xB5\xD1\xD1\xC0\xCF\xDB\xE0\x42\xCB\x6A\xD0\x3E\x0C\xD7\xB5\xD9\xED\xAE\xCF\xD6\xE4\x03\x2A\x02\x27\x04\xE2\xE0\xB6\xF5\x88\x76\xEC\x1B\xD9\xB6\xD5\x54\x16\xD0\xFF\xCA\xB3\xE3\x74\xF6\xA7\x12\x16\xA7\x80\x58\x74\xEE\x5B\x0D\xB8\xCD\xD1\x22\x00\xDE\xE0\xB9\xEC\xED\x39\xEC\x11\xD3\x47\xFC\xEC\x4B\x12\x92\xD3\x43\xEA\xCF\x3D\x5E\x0E\xD6\x10\x2A\xEE\x3D\x4D\x16\xD3\x41\xF6\xA8\x72\x6A\x17\xD0\x44\xD2\xEE\xA2\xEF\xCE\xE5\x46\xE1\xD0\xF5\x44\x1A\xD6\x66\x6E\xEE\xE8\xCC\xEC\xEE\x44\xDF\xD1\x41\xD1\x1C\xD5\xBB\xD3\xED\x9D\x22\xEE\xAA\xB4\xE5\xD0\xF6\xCE\xEF\xED\x46\xCF\xD1\x7B\xEE\xD1\xED\x40\xFF\xED\x5A\x7E\x1D\xD7\xBC\xFC\xEE\x5B\xD1\x7B\xAA\x32\x7F\xD0\x6F\xD1\xF0\xE1\xB5\xC3\xEF\x54\xD0\x00\xD4\xBD\x7B\x83\x33\x02\xEB\x5B\x3E\xE3\xCF\xD6\x23\x3D\x83\x41\xF9\x83\x77\xAA\x1E\xD1\x1C\xB6\x00\x34\x00",
"\x20\xD6\x10\x2E\xEF\xBB\xA8\x16\x56\xF4\x55\xE1\xB2\x56\x21\xD8\xC4\x9E\xAA\x05\xDD\xFE\x41\xAA\xBF\x79\xA3\xAB\x2B\xDF\xAF\x8F\xAA\x4A\x2F\xE9\xC3\xA9\xAF\x56\x96\xA8\xAD\x6A\x4B\xEF\x31\x28\xAF\x1B\x33\x31\x40\xD3\xE2\x4A\x30\xD4\xAC\x30\xAC\xC6\xD1\x4A\x1A\x41\xAB\xBE\xE9\xC9\x33\xD7\x74\x4F\xD3\x3C\xAD\xC7\xA7\x40\x84\xD4\x03\xD4\x46\xDA\x42\x85\x95\x02\x04\x42\xD4\x50\xCB\x65\x1E\xF1\xBE\x9B\x75\xA6\xB8\x29\xB9\x45\xD3\x84\xC4\xD4\x3F\xBE\xD5\xB1\xF4\xA0\xE3\x16\xAE\x0C\x03\x8E\xE1\xD4\x14\x17\xBD\x9A\xF4\xB7\xEF\xD5\x78\xD9\xBA\x52\xD2\x9C\x0D\xB8\x54\xCA\xF6\x92\xE4\x92\xBD\x3D\xE6\xD8\x8F\x9D\x32\x01\x3E\xE1\x10\x3B\xE3\xBE\xBA\xBF\xD6\xC2\xC8\xEB\xB4\x7E\x5F\x92\x90\xE6\x2E\x60\x9E\x51\xD3\x90\xE9\xBE\xC1\xDE\xC5\xEA\x92\x0D\xE4\x6B\x9D\xC0\x5F\x54\xF3\xAE\xBA\xE3\xCE\xD7\x9F\xFA\xD6\xB7\x40\x72\xAE\xD0\xB3\x00\x41\xDD\x40\x03\x74\xCF\xB5\xC3\xD6\x33\xB5\x71\xDF\xB5\x17\xDF\x5A\xDA\xD5\xA6\xD5\x95\xD5\x74\xDE\x71\xD3\xD7\x92\xD4\xF5\x40\x7D\x86\xDE\xD3\xBC\xD6\xD9\xDC\x8E\xBF\xA2\xD7\x8E\x9D\x5D\xCE\xCA\x66\xDC\x84\xBE\x72\xEF\x98\xDE\xD5\x20\xF6\x57\xEA\xD7\xFF\xD6\xA4\xC1\xD8\xA3\x2E\x56\xBD\x81\xD7\x7C\x87\xD8\x33\x00\x14\x06\xEB\x12\xF2\xBF\xDC\x8E\xD1\xA0\x4D\xD8\x38\xF2\x8F\xDD\x11\x00\xD9\x92\xDA\x90\xDA\x32\x55\xD8\x4B\xE2\x91\xD8\x61\xF6\x7D\x1A\xDB\xFA\xA2\x6E\xE0\x07\x1F\xDB\xC4\xB9\xC5\x5A\xF2\x73\x00\x27\xF7\x76\x6E\xDB\x55\xD1\x9B\x1D\x89\xE0\x00\x49\xDF\xD2\xD1\x59\xE7\xF2\x96\xF1\x44\x72\xF3\xA7\x7D\x4E\xEF\x99\xE9\x7B\xEF\x59\xDE\xDB\x89\xD4\x64\xDC\xDC\xA3\xF3\x1C\xF4\x75\xFD\x01\x2F\xDA\xEA\x01\x63\xEA\x0E\x13\x4C\x8D\xDB\x97\x0A\xD8\xA8\xF1\x8E\xD2\x8D\xF8\xF0\x5C\xB4\x2B\xFE\xCA\xF6\x68\xB0\xF0\xF3\x73\xCB\xF5\xF2\x48\xDB\x9D\xC6\xBA\xC0\x95\x4C\xDA\x58\x8E\x64\xF3\x00\x52\xDA\x41\x05\xCE\xC3\x4C\x54\xD9\xC2\x96\x65\xD4\xF3\x7D\xDB\x96\xD4\x68\xCD\xDA\xBA\x2A\xA0\xDE\xCE\xED\x01\x85\xD8\x08\x01\x68\xC1\xB9\x67\xDB\x15\x2B\x8B\xD8\xF3\x93\xDA\x13\xE0\x96\xA3\xCD\xAA\xCD\xE3\x19\xCE\xA1\xF3\x3E\x92\x2E\x6E\x64\xF4\x00\x75\xDA\x41\x09\xD0\xE8\xF3\x77\xD8\x50\x75\x69\xD7\x46\x6D\x03\x12\xFE\x57\xA1\xD9\x86\x23\x3B\xF6\x68\xCE\xDA\x89\xDB\x3C\xF5\xCF\xF7\xF3\xF2\xF2\x98\xD6\x19\x0C\xDA\x17\xF5\x3C\xF8\xCF\xE0\x00\x90\xD8\x26\xEB\x44\x70\xF2\xB7\x09\xDE\x0A\x39\x7C\xE4\x2D\x0A\x4F\xED\x22\x3D\x5C\x9F\xDB\x40\x0F\x69\xE9\xE5\x5C\x06\xA8\xD7\x94\xEC\xF3\x26\xB9\x59\xE8\x6A\xDC\x1C\xAB\xD8\x54\xEE\x6A\xCB\xEC\x0E\xBF\xAC\xD3\xF0\x88\xBC\xB2\xDB\xAA\x9C\xFC\x7D\x5C\xCD\xE2\x82\xDB\x8D\xD1\xBC\xBC\xDA\xEF\xA1\x40\x94\xE3\x39\xB8\xC6\xB3\x6C\xD8\xE3\x6A\x56\xB1\xDC\xF3\x8F\xE3\xF3\x73\xFF\x0D\x95\x75\xE4\x24\x09\x58\x6C\xD5\xCA\x05\xED\x74\x27\xBE\x1D\x9F\xF5\x20\x04\xC7\xA3\x01\xEF\x55\x1F\xAD\x30\x93\x6E\xDC\x1C\x36\xA5\xB5\xDE\xF7\xB1\xA8\x64\xF7\xF6\x2A\x8C\xB8\xDE\xC7\x22\xCF\x0B\x69\x95\xDB\x6F\xE9\x5E\x0E\x9F\xEF\xB8\xEB\xD8\x9D\xE3\xEB\x4B\x62\x32\xE5\x1E\x06\x6F\xD6\xE2\x40\x05\xCF\x5A\x6F\xCD\x19\xFC\xD9\x08\xEF\x56\x0A\xF1\xD4\xF2\xC0\xD9\xE8\xAE\xCB\x0F\xC7\xC1\xDC\x7D\xF6\xE9\xDA\x14\xC3\xD1\x7A\x18\x61\x58\xD7\x40\x0A\x55\xC4\xDD\xC2\xD6\xC4\xDE\x55\xC7\xDD\x61\xE2\xD4\xDA\x55\x6F\xC9\x75\xF2\xC6\xD0\xC7\xC4\xF3\x2B\xDA\x31\xFE\xCD\xE1\xDC\xF5\x76\xE2\xDB\xC3\xFB\xF1\x3F\x25\x1F\xFD\xC3\xF3\xEA\x2F\xDD\x6B\xD1\x73\xE0\xDD\xB3\xDF\x78\xD3\x57\x60\xDE\x78\xB4\x7A\xD2\x76\xF6\xDC\x89\xF0\x7B\xDB\xC8\xEE\xB8\x9C\xF7\xF0\x19\xC6\xCC\xD6\x16\xE1\xC7\xD8\x5C\xE4\xF6\x1F\xB4\x59\x9C\xD5\xAB\xF1\x6D\xCA\x6A\xFE\xC6\xE3\x60\xD6\xD6\x72\xB8\x5D\xE3\xEC\x78\xF3\x9F\xC0\x7B\xDC\xD7\x6D\xB5\x6E\xF7\x5E\xE1\xDD\x67\xDF\xA3\xCE\xA7\x7F\xBF\xDE\xF6\xCC\xD6\xDB\xDF\xDD\x88\xF0\x41\xCA\xC8\xFA\xDC\xC5\x98\x88\x9C\xDB\xDC\x17\x2D\x3D\x42\x01\xDF\xD2\x5D\xEF\xF6\x58\x09\xD7\xE4\x01\x06\xE9\x40\x0C\x2C\x69\xC6\xE5\xF5\xEA\xDA\xD0\xBC\xDC\x54\xD6\xCF\xD2\x26\xF9\x00\x99\xF6\x40\x0B\xD9\xE8\xF1\x9E\xF4\x71\xD4\x71\xE2\xF2\xA9\xF7\x72\xFC\x74\xE5\xF6\x4E\xDF\xEE\xC8\xDA\xD6\xDC\xD2\xF4\x75\xD5\xED\x6E\xF6\xFA\xA9\xC9\xD7\x75\xF3\xF6\xDD\xF7\x79\xF8\x7A\xC6\xF2\x81\xD7\x1C\x0D\xDC\xB5\xF6\x64\xDF\x87\xF0\x5B\xC2\xF2\x90\xCA\xDA\xDF\x50\x86\xD6\xB7\xD4\x71\xF8\xE0\xC6\xDD\x0B\xF8\x74\xDA\xDC\xDB\x69\xCC\xF5\x59\xDE",
"\xDC\xD0\xDD\xA1\xF6\x1C\xF7\xC1\xB4\xF1\xAC\xF5\x30\x98\xE1\xEE\xDE\xD9\xF6\x67\xDC\xE1\xDD\xDD\xFD\xF4\x88\xFE\x5A\xEC\x99\x75\xB5\x91\xF7\xE2\xC7\xF2\x29\xFB\xCD\xD9\x18\xF9\xDC\x2D\xFB\x80\xDD\xC8\xF0\xD8\x8F\xF2\x8C\xDC\x09\x93\xF2\x4E\xB9\x2E\xFB\x6E\x18\x9D\xD6\xF3\xDA\x2D\x6E\xFD\xF3\x22\x00\x28\xFF\x87\xC9\xF7\xC5\xF3\x05\xB5\xCA\xC7\x74\xB8\xF1\x47\x09\xCA\xFB\xF2\x85\xA9\x8F\xD7\x63\xDB\xF2\x5E\xF9\x30\xF3\x64\xD3\xF3\x63\xF9\x8E\xF3\xE3\xCC\xAE\xC7\xF1\x87\xDA\xE6\xD2\xF3\xB2\xF0\xC5\xBD\xE5\xEF\x59\x5F\xFA\x27\xF1\xCB\xCE\xD4\xA1\xF2\x8C\xF5\xE6\xF4\xF8\x0F\xFA\xE6\x42\xE1\xBF\xF2\x79\x01\x57\x6A\xE4\xB1\xE5\x78\x13\x7F\xEF\xE4\xA6\xEA\x05\x98\xC2\xDD\x3E\x88\xDC\xF7\xF4\x46\xEB\x7D\xF2\xE1\x7F\xF7\x5E\x81\xD8\xC3\xF6\x4F\x9E\x0D\x07\xD8\xC0\x00\x80\xBA\xB7\x3D\x6F\xDC\xBE\x57\x9E\xA8\xCF\xCC\x8F\xF6\xB7\xE9\xFE\x4D\xE8\x88\xDC\xF2\xE3\xDB\xD2\x75\x48\xDC\x88\xE0\x5E\x13\x31\x70\xE1\x06\x04\xAE\xFB\xE9\xCF\xE2\xB7\xE2\x0D\xB6\xF6\x9F\xDF\x78\xE1\x03\xEA\xD8\xEB\x2E\x72\x16\xFF\xDA\x89\xD3\xE0\x9C\xE1\xA1\xF6\x81\xC4\xE0\x40\x2E\x01\xE6\xB3\x3F\xBB\x01\xBE\x50\xF0\xF1\xB1\x06\xF3\xF7\x40\x03\xDF\xC1\xF5\x46\xF5\xAD\xDE\x9F\xB9\xF7\x00\x03\x7E\xF4\x6D\x8B\xF5\xB1\x05\x3E\x8E\x8D\xD6\x04\x4D\x70\xBC\x97\x1A\xFC\x1E\xF7\x82\xBD\x94\xE9\xC3\x70\x93\xBF\x10\xF4\x53\xF9\x00\x46\xF0\x00\x08\xC4\xF0\x2E\x8C\xF7\x3F\xE0\x7C\x80\xD5\x12\x9B\x50\xD1\xC5\xC9\xA6\x08\xE5\x52\xD5\x1D\xCC\xE4\x4C\xD5\x16\xF9\x32\x5B\xF1\x13\xB1\x54\xD3\x82\xF1\xD4\xB0\x2F\x4C\xD0\xBB\x3A\x6A\xF1\xFB\xBC\xFA\x68\xA8\xFA\x85\xBA\xAA\xFE\xCD\xB9\xFB\x53\xF0\x51\xD2\x70\x62\x9D\x15\xFD\x42\xE3\xE3\x96\xF1\x39\x08\x16\xF0\xFB\x84\xFC\x11\xE6\x9D\x08\xF0\xDD\x15\x0A\xFC\xBE\xD7\x03\x0D\xFC\xDE\x84\x3F\xEE\x8F\xD7\xC0\xF5\xD2\x13\xF2\x54\xD9\xFC\x45\xD5\x4F\xDD\xEF\xD5\xF1\x0B\xE7\x15\xF1\xF0\xDF\xFC\x10\xE5\x17\xFD\xB1\x1C\xE4\x01\x06\x47\xE1\xD7\xF7\x9C\x27\x04\xD9\x32\x2E\x7F\xFC\x28\xE6\x7F\xAD\xF3\x09\x04\x47\xFC\x00\x08\xBB\x44\xFD\x3D\xEA\xEE\x6B\xD5\xEF\xB9\x72\x16\x57\xF0\xF5\xF6\x09\x9D\x65\x2E\x07\x12\x16\xFD\x5C\x5D\x5C\xF6\xD6\xF9\x9E\x68\xF7\x7E\x9D\x9E\xEE\xB6\x6E\xF7\x09\x5E\xD6\xCD\xBA\x4C\xFF\x6F\x24\x93\xD3\xFD\x24\x0B\xD6\xFB\x7B\x94\xC0\xD7\x19\xEC\x44\x73\x67\xE8\x60\xEA\xD9\xF9\xC4\x7F\x0F\x4D\x73\xFF\x0D\x73\x4E\x02\x27\x04\xDE\xFC\x75\x7F\x0F\x6A\xFD\xFF\x8D\xF5\xFB\x9E\x0D\x58\xCD\x55\xF6\xD1\x04\x04\x50\xDF\xF1\x01\xF7\x97\x67\xF4\xCD\x49\xD6\xEF\xFD\x4E\xE9\x95\xEB\x2A\xEC\xF4\x10\x0A\x4B\xF0\x21\x1D\x66\x31\xF6\x40\x03\xD3\xCE\xC0\x10\x0A\x4D\xF0\x21\x16\xE5\xCF\xE7\x52\xEB\x95\xFC\xF4\x5E\xE5\x15\x32\x24\xD6\xE6\x62\xE6\x4F\x08\x00\xE5\xFE\x72\x02\xCA\x51\x7B\xBF\xD6\xDE\x86\x4E\xF6\x6D\xC5\x58\x1D\xAC\xDB\xF0\x65\x16\xC0\x7D\x9C\x24\xBF\x04\x9A\xC0\x4B\xE5\x5B\xE7\x21\x16\xE6\x57\xC5\x0D\x09\x99\xC0\x00\x9B\xE4\x1D\xCF\x97\xDE\xE6\x81\xE6\x41\xA1\x9A\xD3\xC3\x5C\xCD\x69\xEB\x11\xE7\xE6\x72\xC5\x6A\xE7\x17\x4E\xE6\x70\xC7\x37\xCD\x91\xB1\xE6\x03\x27\x80\xEF\x34\xD0\xC8\x25\xA4\x0E\x04\x21\xC2\x04\x16\xC9\x82\xE4\x07\x2E\x75\xCA\xE5\x22\xDA\x4F\xE5\xE7\x3D\xCD\x20\x35\x93\xAA\xE7\x9A\xEA\xD0\xC5\x9D\xD5\xAB\xD7\xE5\x7C\xEB\xFE\xCD\xC7\xF4\xE6\x8B\xC2\x90\x33\xE6\xE6\xFC\x5E\xC9\x7A\xA0\xC8\x29\xE7\x49\x0C\x92\xE8\xE7\xF5\xFC\x55\x03\x18\xD7\xA7\xAD\x7D\xD1\x28\x8A\x61\xB8\x73\xB0\x76\xCD\x7C\xFC\x00\x00\x20\x75\xC6\x7F\x49\x77\x1A\x51\xF4\x66\xD1\x4A\x00\xAF\x72\x45\x7F\x82\x59\x5E\x01\xE9\x73\x10\x09\xFA\x73\xE5\x0F\x80\x36\x73\x18\x76\x9F\x73\x5E\x61\x8B\x5D\xD5\x73\xA2\x35\x00\xC0\x74\x91\x4E\xB0\x65\x50\x74\x2C\x68\xD4\x61\x6B\x36\x7F\x00\x73\x45\x76\x2A\x6D\x1D\x54\x97\x4F\xD6\x46\x9D\x51\x75\x09\x66\x8C\x50\xB5\x77\x7E\x34\x8D\x57\xD6\x5A\xEA\x37\x65\x51\x37\x5C\x67\xC1\x76\xFA\x73\xB1\x6C\x0C\x18\xFF\x4D\x53\x37\x00\x51\x02\xAD\x1A\x08\x87\x9C\x7E\xCD\x5C\xC2\x6A\x75\x66\x62\xC2\x46\x56\x52\x3E\x60\x36\x72\xD7\x7E\xF3\x76\x63\x1A\x30\xFC\x60\xBF\x77\x6B\x69\xAF\x6E\x02\xBB\xEB\x66\x52\x6D\x66\x4B\x47\x80\x60\x60\x7C\x07\x72\x9B\x7F\xB5\x74\x66\x06\x76\xC6\x03\x14\x2E\xFB\x7F\x75\x3B\x9A\x64\xE6\x7A\x5E\x4B\x80\x78\x75\x13\x81\x7F\x23\xAF\x71\x02\xA5\xCD\x79\x63\x6D\x66\x7C\x74\x7D\x63\x6D\x68\x05\x9D\xD7\x7E\xBF",
"\x61\x44\x70\x67\x2E\x82\xC0\x77\xC9\x74\xB0\x78\x4B\x5C\xEB\x53\x18\xDE\x74\xE4\x72\xC2\x70\xA3\x11\x08\x86\x02\x8E\xEC\x33\x00\xE5\x74\x81\x03\xB9\x74\x0C\x80\xD4\x26\x03\xAE\xC0\x08\x69\x69\x81\x25\x29\xBC\x74\x0D\x8F\x04\x80\xE8\x4B\x7C\x15\x28\x72\x34\x7B\x75\x1C\x84\x09\x85\x05\x94\x04\x97\x01\xE7\x66\xF7\x3C\xB8\x52\x98\x42\x85\x2C\x02\x8E\xF2\x5A\xC9\x2B\x2F\x05\x77\xF0\x53\xF9\x64\x70\x75\xD0\x71\xD6\x1B\xED\x32\x00\x8A\x76\x83\x01\x2C\x85\x67\x29\xB9\x79\x08\x1B\xEE\x34\x3E\x72\x35\xC7\x75\x05\x68\x74\x7D\x3C\x73\xA5\x55\xEE\x72\x76\xD2\x67\x5A\x80\xD6\x72\x79\x7E\xB9\x7B\x05\x8D\xEF\x6D\x76\x7D\x76\x17\x68\xDC\x75\x74\x7E\x3D\x62\xE8\x7F\x6C\x34\x00\xAE\x2F\xAD\x74\xF9\x70\x41\x16\xBE\x78\xDA\x66\x93\x67\x67\x35\x01\xA0\x41\x0D\x02\xE5\x26\x00\x0A\x6F\x1D\x03\xDD\x30\x35\x00\xF9\x66\xE6\x73\x9B\x21\x0E\x91\xF6\x35\x00\x5C\x54\xE4\x4D\xBA\x74\x2F\x83\x8C\x61\x3C\x76\x4F\x47\x01\x54\x00\x24\x69\x72\x80\xE0\x27\x1C\x8D\x43\x7C\x01\x04\xDC\x36\x81\xEB\x80\xA9\x74\x15\x6F\xCF\x11\x0F\x95\x11\x74\x03\xEC\x68\x37\x5E\xCD\x75\x3E\x84\x7B\x7C\xB3\x6F\x72\x3D\x03\xE6\x81\xE8\x81\x7B\x83\x30\x87\x18\x81\xBA\x6E\xDB\x4A\x03\xD0\x77\x45\x1D\x83\x83\x3C\x84\x4B\x5D\x03\x0A\x08\x8D\xEE\x34\x77\x0E\x83\xFC\x24\x15\x6F\xCB\x12\x11\x95\x97\x3F\x03\x9C\x77\x21\x00\x8B\x83\x40\x81\x23\x86\xBB\x71\x10\x60\x50\x45\x00\x82\x76\xFD\x51\x46\x01\x1B\x8E\x3A\x7B\x06\xB4\x00\x74\x01\xB6\x1C\x98\x80\x38\x86\x1F\x8C\xA5\x41\x08\xB8\x03\x8C\x82\xBD\x81\x29\x69\x41\x80\x1E\x82\x3D\x72\x07\x9E\x04\xB5\x82\x22\x82\x9C\x80\x3B\x82\x4E\x5B\x0F\x88\x09\xBD\x04\xB4\x82\x3D\x69\x74\x82\x40\x82\x28\x83\xB9\x73\xDA\x6F\x03\xA5\x42\x3E\x82\xB7\x03\x47\x84\x8B\x6E\x03\x01\x0A\x9A\xEF\x7C\x76\x9D\x2C\x9E\x75\x44\x87\x28\x88\x10\x9D\xA1\x55\x04\x95\x2A\x17\x82\x0E\x69\x43\x81\x19\x83\xBA\x77\xDD\x6E\x57\x51\x00\x50\x82\xA4\x80\x1B\x69\x24\x80\x16\x83\x09\xA4\x05\xC3\x2B\x53\x76\x20\x25\x33\x82\x0B\x19\xCE\x53\xA0\x68\xEE\x33\x00\xAA\x77\x81\x00\xEB\x72\x8D\x69\xBC\x7D\xA1\x67\x67\x68\x3C\x1B\x68\x9C\x75\x4E\x86\x6F\x7F\x3F\x68\xA2\x58\xD1\x6B\x68\x9C\x77\xEA\x30\x60\x86\x2D\x8B\x3D\x70\xA1\x62\x01\x49\x68\x88\x82\x2E\x69\x06\x6B\x31\x8C\x14\x84\x08\xA6\x05\xA2\x00\x67\x68\x9A\x37\xEE\x71\x32\x88\x20\x50\x94\x14\x06\xD7\x82\xCE\x76\x4A\x6B\xCF\x3D\x78\x77\x45\x71\x55\x55\x88\x79\x68\x9C\x69\x33\x36\x0D\x06\x06\x0E\xBE\x63\x08\x30\xEF\x7E\x54\xC8\x43\xF9\x75\xFE\x6D\x7E\x74\xA8\x5A\xBB\x51\xA2\x0E\x62\x86\x27\xFD\x74\xDB\x38\xC8\x7A\xA8\x47\x65\x71\xDE\x04\x35\x93\x68\x5F\x83\x00\x78\xBA\x25\xC0\x7E\x0C\x47\xF0\x3B\x4F\x09\x78\x5F\x69\x0D\x04\x81\x72\x75\x2E\xE0\x6F\x31\x10\x78\x63\x2F\x63\x6B\x04\x7A\xA9\x6D\x41\x47\xCC\x39\xD3\x7F\x2D\x18\x79\xF2\x48\xB1\x15\x22\x77\x5D\x73\x58\x65\xA6\x6D\x4B\x3D\x2E\x8C\x55\x40\x02\xBE\x41\xE4\x6A\x9B\x27\xE7\x31\x7F\x7F\x7F\x0A\x60\xC8\x54\xE5\x7F\xCC\x46\xA7\x71\xF6\x0A\x0F\x07\x48\x45\x6D\x10\x01\x89\x32\x1F\x9D\xB9\x36\x01\x27\x02\xF7\x82\x3B\x6D\x45\x7C\x9E\x76\x1E\x92\x80\x5C\xFD\x0A\x7F\x5E\x7F\xF5\x83\x0B\x67\xE5\x44\x04\x56\x9B\x16\x08\x3E\x06\x02\x2F\x8A\x4F\x3C\x7A\xCE\x7F\xC9\x6E\x10\x1C\x16\x3D\x42\xC7\x83\x3A\x11\x57\x35\x63\x57\xDF\x72\xCB\x6E\xAC\x0F\x78\x75\x72\x04\x14\x45\x7A\x6D\x02\x04\x14\x0F\xB3\xF3\x42\x00\x3D\x2F\x55\x03\x49\x02\x44\x8A\x1F\x9C\x10\xBD\x07\x88\x7F\xFF\x82\x28\x1B\x03\x14\xF6\x78\x48\x7D\x7B\x5B\x08\x9C\x11\x39\x31\x3F\x12\x27\x15\xF9\x6A\x54\x28\xA0\x6F\x08\x89\x05\x31\x85\x23\x0F\x8C\x87\x2A\x09\x7C\x3B\xA8\x0A\x08\x9E\x7A\x6D\x00\x06\x85\x15\x6B\x47\x8A\x19\x81\xCB\x6A\xE5\x07\x60\x56\x30\xD7\x7D\x6F\x6C\x01\x6D\xFA\x6B\xCA\x67\x08\xBD\x69\x7E\x7E\x00\x84\xE0\x7C\x45\x89\xA8\x6D\xF9\x78\xFE\x28\x7F\x4F\x7E\xE5\x6E\xC8\x58\xA8\x71\xD7\x6A\xB9\x30\x87\x2A\x06\x63\x7A\xB4\x7D\xAC\x38\x64\x27\x1E\x89\xFC\x6A\x08\xBC\x4F\x8C\x7F\x1D\x75\xDC\x79\x22\x09\x25\x93\x66\x7F\xF4\x04\x81\x52\x2F\x2E\x87\x35\x6A\xAC\x79\xF5\x62\x13\xA5\xF5\x64\x84\xFE\x83\xB5\x7D\x7A\x85\xED\x7D\x35\x20\xBC\x2B\xF5\x5A\x72\x62\x7F\xBE\x78\x52\x68\xAE\x76\x27\x92\xEB\x56\x32\x73\x7E\xE7\x0D\xBA\x7F\xB9\x0A\xE5\x27\x0F\x29\x08\x0D\x0A\xC2\x2E\x86\x7E\xDD\x35\x9E\x81\x4A\x87\x26\x81\xFC\x7D\x3E\x18\x80\x24\x05",
"\x51\x18\xA2\x87\xF2\x0A\x28\x97\x3C\x1D\x66\x0F\x85\x03\x03\x47\x87\x86\x77\xF2\x0F\x24\x88\x0F\x92\x09\xEA\x83\x84\x84\x2D\x86\xE3\x7E\x92\x1B\xC1\x7E\xE0\x5D\xF0\x1C\x07\x0B\x6B\x89\x26\x28\x6E\x20\x03\x2B\x94\x97\x23\xF0\x76\x30\x25\x79\x99\x5D\x52\x72\xA2\x6E\xE3\x54\xA8\x5E\xB9\x23\x7A\x2C\x78\xC4\x6A\xAD\x86\x83\x74\xC2\x70\x15\x84\xFA\x67\x3E\x59\x5D\x74\x29\x0A\x7F\x57\x86\x51\x61\x16\x95\xBD\x4D\x41\xE9\x58\x8E\x68\xD0\x51\x5A\x86\xB1\x53\x01\x33\xF0\x65\x71\x23\x6B\x9C\x4F\x0D\x7D\xB7\x53\xB8\x5E\xA6\x6F\xF6\x1F\x58\x5B\x6E\x77\x73\x99\x68\x1E\x70\xC4\x6C\xF7\x42\xF1\x6F\x6B\x4F\x4F\x19\x00\xCA\x7C\xEA\x49\xC4\x70\xF8\x78\xA7\x21\x56\xC8\x65\xA0\x6A\xE8\x58\xE6\x77\xF1\x67\x7D\x59\xFC\x7E\x7D\x1C\x7F\xDA\x17\xF8\x12\xE0\x71\xFB\x45\xE7\x06\xFC\x1D\x16\x6E\x6D\x36\x00\x9C\x6D\x0D\x0B\x82\x25\xE7\x43\x04\x67\x79\x14\x7B\x2A\x6E\x85\x06\x2A\x73\x9C\x3A\xE8\x70\xF3\x60\x6C\xF2\x83\x87\x87\xA3\x6A\x9F\x7A\x85\x67\xE9\x60\xF9\x2E\x27\xFF\x79\x36\x6F\x57\x44\xA0\x70\x45\x54\xC2\x0E\xD9\x36\x00\x09\x7B\x81\x03\x42\x79\x61\x8E\xD0\x79\xB3\x4B\x0C\xBA\x85\xD6\x32\x87\x85\x48\x78\x62\x8A\x32\x96\xE7\x47\xDA\x5D\x26\x19\x7A\x20\x84\x48\x7E\x65\x8E\x68\x63\xE9\x65\xF4\x2B\x71\xAF\x78\x30\x7D\x4A\x7E\xD2\x61\xED\x79\xF6\x73\x73\x45\x7A\xC2\x4D\x79\x39\x67\x31\xA9\x79\x6A\x58\xEA\x69\x9B\x51\x71\x7D\x7C\x78\x86\x7D\x3D\x1A\x73\xD5\x79\x79\x55\xF5\x62\x85\x36\x26\x70\x7D\x46\x6E\xCE\x50\xD8\x79\x76\x60\xFA\x34\x6A\x33\x01\x51\x7D\xA9\x79\xB0\x75\xEF\x6C\xF9\x74\xEA\x36\x27\xAC\x7C\x55\x6B\xAB\x7C\xFB\x69\xCC\x7D\x08\x0E\xDB\x4C\x79\xE7\x7D\xC5\x16\xA4\x7E\xC3\x6D\xE9\x7C\xD7\x01\xF6\x0C\x32\x81\x7B\xFB\x78\x5A\x76\xD4\x73\xEC\x66\x33\x6B\xFB\x73\x71\x92\x17\xF6\x47\xD3\x4F\x22\x76\x4F\x18\xDD\x15\x9D\x77\x86\xB2\x7C\x7A\x70\xEC\x11\x89\x3F\x74\x51\x01\x31\x00\x6B\x85\x42\x2E\x95\x7D\xAA\x7E\xDE\x7C\xF7\x52\x17\xAA\x9C\x7A\x7D\x45\x6A\x7E\x7F\xBD\x84\xE6\x78\xD3\x2D\x7D\x77\xFC\x4E\x6A\x2C\x64\xA8\x69\x6F\x09\xBC\x56\x2E\x83\x1C\xA5\x90\x05\x87\x30\x00\xC4\x86\xE6\x5D\x5D\x8B\x53\x6B\x1C\xAC\x07\x93\x7E\x89\x52\xC8\x85\xBD\x87\x20\x77\x2F\x88\xB9\x7F\xFB\x36\x7E\xFB\x84\x9C\x7F\x10\x71\xE4\x74\x22\x0D\x13\xA8\xB8\x67\x0D\x23\x72\x00\x01\x49\x75\x50\x87\xDF\x6D\xF5\x01\x04\x4B\x7E\x85\x85\x7C\x40\x6E\x37\x53\x13\x25\x1C\xDD\x04\x0F\x89\x5E\xB6\x01\x93\x01\xF2\x81\xEB\x7A\xA8\x09\xE3\x6C\x47\x54\x06\x21\x45\xE7\x85\x17\x5C\x45\x5A\xA8\x10\xF7\x15\x0B\x2C\x06\xD1\x86\x47\x14\x29\x7D\x3E\x2D\x13\x5C\xAF\x27\x7D\x44\x38\xE9\x28\x5A\x14\x52\x00\x72\x2F\x4F\x3C\x54\x31\x4E\x67\x73\xCB\x84\x39\x5D\xD7\x20\x6F\x2A\xA8\x1B\x14\xAD\xF7\x40\x7A\x76\x7E\x3D\x76\xCA\x60\x77\x3C\xF7\x7A\xDD\x10\xFE\x5C\x02\xA7\x7F\xC9\x7E\x7F\x52\x8E\x13\x97\x69\x2E\x28\xEF\x46\x84\x6C\x18\x8E\x0D\xFE\x81\x80\x8B\x96\x1D\xCC\x2B\xFE\x42\x6E\x4D\x84\xD4\x7D\xDF\x7D\xAA\x02\xFB\x6B\x11\x82\x08\xAD\x84\xFE\x30\x64\x67\x95\x87\x48\x8E\x33\x1A\xFD\x62\x01\xF8\x72\x0E\x76\x1B\x03\xEF\x79\xF8\x7A\x0C\x7D\xCC\x71\x9F\x1F\x73\xC6\x7E\x90\x61\x61\x72\x43\x62\xD1\x6E\xD4\x74\xF2\x60\x60\x2D\x62\xB6\x62\x6A\x76\xA7\x45\x06\x71\xFE\x6D\xC4\x30\x73\x7F\x81\x2D\x19\x21\x81\x61\x77\x21\x1F\x01\x9F\xA3\x32\x00\x26\x52\x99\x65\x11\x84\x86\x84\x14\x62\xCF\x62\xFF\x2E\x33\x1D\x65\xF2\x7C\x24\x1F\xFC\x77\x42\x89\xFF\x53\xE7\x46\x63\x42\x53\xCF\x44\x6B\x74\x18\x42\x9F\x77\x46\x44\xFC\x75\x73\x01\x10\x5E\x75\x89\x3C\xE3\x47\x03\x01\x01\x82\x5D\x42\x75\x25\x4E\xA1\x39\xB1\x63\x1A\x71\xB0\x57\xF7\x4A\xEB\x01\x80\xAA\x2A\xC1\x5D\xC1\x60\x5A\x77\x30\x72\x96\x54\xEA\x19\x75\x40\x67\x58\x67\xA5\x75\x52\x79\xAD\x70\xA6\x5B\xEB\x2A\x76\x2A\x82\xAC\x76\xD6\x75\x33\x31\x0B\x83\x08\x33\x02\xF5\x76\x8C\x76\xB4\x76\xDC\x70\xCD\x31\xB9\x62\x0B\x83\x06\x8F\x82\xBF\x81\xCB\x74\x2D\x81\x8F\x87\xB7\x61\xDC\x7C\x11\x8C\x83\x47\x76\x1A\x7F\x37\x79\x8E\x8C\x12\x8D\x05\x9E\x04\xBD\x2E\x32\x82\x83\x01\x24\x8D\x67\x21\x15\x8B\x09\x8A\xEF\x36\x82\x0B\x82\xD0\x80\x32\x85\x31\x8B\x3A\x26\x08\x9C\x05\x93\x82\x6B\x54\x39\x36\x52\x87\x26\x8A\x49\x83\x0B\x9C\x12\xAA\x26\x4F\x83\x4F\x8B\x4F\x81\x94\x88\xF1\x56\x0A\x98\x04\xEF\x82\x53\x76\x7E\x82\x2A\x8A\x2A\x8A\xBC\x75\x0A\xAD\x05\x95\x83\x24\x82\xA7\x82\x51\x87",
"\x78\x75\x49\x90\x03\x13\x05\xD6\x77\x22\x00\xB6\x82\xD9\x70\x91\x8F\xBC\x76\x4F\x72\x05\xB3\x89\x96\x88\x56\x88\x0D\x4E\x95\x8E\x47\x83\x0A\x80\x12\xD7\x42\x68\x83\x80\x78\x5D\x87\x67\x35\x03\x0E\xBD\x1B\x03\xD3\x81\x72\x15\x6A\x81\x38\x86\x7C\x67\xB5\x76\x01\x01\x85\x36\x00\x2A\x2E\x10\x79\x63\x16\x73\x66\x03\x02\x07\xAB\x04\xDB\x29\xE5\x89\x68\x3E\x0D\x04\x4B\x5C\xFD\x19\xDB\x74\x12\xB8\x89\xB0\x88\x2A\x68\x16\x03\x6B\x6B\xBF\x5B\x07\x5E\x13\xAE\x67\xE0\x88\x1A\x02\x4A\x76\x95\x04\x4E\x95\x11\x6B\x13\xBD\x68\xED\x89\x8A\x2B\x3F\x87\x95\x89\x15\x97\x0C\xB3\x13\xFA\x57\xF1\x82\x8D\x7A\x87\x80\x48\x81\x04\x0A\xB9\x39\x07\x86\x02\x0F\x8A\x86\x7B\x7E\x81\x08\x0B\x40\x93\x29\x0D\x10\xBC\x4F\x01\x48\x02\x87\xD4\x1B\x4E\x26\x20\x9A\xCA\x64\x56\x3F\x84\xFB\x82\x21\x84\x72\x0F\x41\x8A\xE8\x65\x72\x4A\xDA\x1D\x84\x25\x49\x93\x8A\xCA\x2C\x44\x86\x10\x0C\x29\x92\x14\xA6\x84\x87\x7E\x28\x84\x03\x8B\x4F\x83\xFB\x6F\x20\xAC\xEB\x0D\x53\x37\x85\x43\x05\x8E\x80\x82\x68\xB3\x21\xC4\x36\x08\x8A\x6D\x8A\x04\x2F\x6E\x8E\x85\xA7\x8D\x23\x80\x24\x40\x09\xC2\x84\xA4\x82\x12\x05\x49\x8A\x43\x8C\xC1\x65\x21\x44\xD4\x1D\x33\xE2\x88\xA3\x22\x77\x47\x56\x83\x3C\x39\x15\x88\x0B\xA8\x78\xCB\x6E\x15\x5F\x0A\x7E\x83\x74\x29\x63\x1E\x8A\x2A\x66\x25\xC7\x87\xFB\x78\xFF\x85\x25\x7D\x3C\x99\x10\x98\xA2\x64\x61\xFC\x35\x92\x53\x0D\x03\x83\x8D\x24\x82\xFE\x5E\x10\xBD\x4E\x20\x88\x68\x63\x0E\x39\x24\x64\x42\x93\x79\x7C\xB1\x4B\x7F\x28\x88\xC8\x72\x0A\x8F\xF9\x7B\x12\x6E\x21\x90\xE6\x30\x88\x70\x89\xEF\x66\x54\x82\x1B\x8D\x99\x31\x24\x83\x04\x13\x89\x1E\x82\xB5\x80\xE7\x76\x96\x88\xE6\x21\x0B\x82\x06\xCE\x89\x1A\x82\xAD\x83\x2E\x8E\xCC\x2D\x4B\x9F\x25\xBB\x50\x3D\x4D\x8D\x8A\x62\x8A\x68\x83\x82\x29\x4A\x9C\x25\x8A\x16\xDC\x68\xF6\x81\x48\x52\x63\x89\x8C\x6F\x47\x91\x2C\x97\x06\xB2\x89\x9E\x8B\xAE\x80\x40\x82\xB4\x8A\x59\x9E\x05\xBF\x7C\x1E\x89\xA9\x8A\x50\x88\x1B\x6F\x2B\x89\x59\x90\x27\xA7\x12\x97\x30\xD1\x89\xD8\x8B\x2A\x8B\x2D\x8A\xE8\x4B\x0A\xA5\x12\xA5\x8B\x25\x83\x17\x6B\x49\x83\x2E\x88\x92\x15\x0B\xB6\x4B\x41\x42\xE9\x24\x83\x69\x7F\x36\x73\x67\x2F\x22\xDB\x59\x04\x36\x00\xDB\x29\xE6\x88\xE0\x27\x06\x0C\xA5\x4F\x30\x15\x54\x7F\x89\xBF\x8A\xC8\x89\x70\x88\x6E\x79\x77\x22\xA0\x7B\x83\x37\x00\xC8\x8A\xBE\x62\xFE\x7C\xB9\x85\x23\x54\x2E\xBD\xD0\x56\x8B\x80\x26\xEC\x88\x41\x88\xD0\x2C\xB3\x7D\x2E\x84\x17\xC0\x0A\xF5\x25\x7B\x8A\x23\x8E\x2D\x00\x4E\x92\x01\x3B\x13\x81\x09\xFD\x88\x75\x8A\xF2\x71\xA0\x82\x5B\x8B\x2F\x85\x13\xBF\x3E\x07\x8B\xF7\x8A\x71\x8E\x06\x0E\x7A\x20\x27\x98\x13\xE1\x1A\xD5\x81\x72\x8A\x59\x8D\x10\x52\x1F\x8B\x28\x93\x14\x9D\x33\x0F\x8B\x81\x01\x44\x89\xA7\x84\x51\x91\x29\xA6\x0A\x95\x85\x54\x84\xDF\x4C\x7C\x5D\x40\x8F\x65\x27\x10\x9C\x7A\x3E\x84\xF9\x79\xA3\x89\x27\x7F\xDB\x6D\x20\x96\x37\x24\x14\xDC\x26\x09\x8A\x99\x86\x83\x8C\x43\x83\x31\x38\x02\x36\x3A\x2E\x8C\x25\x84\xC5\x02\x10\x05\xA2\x89\x5F\x54\x29\x8E\x10\xB3\x5E\x04\x6F\x79\x79\x50\x88\xD0\x63\x54\x8A\x17\x3E\x14\xA9\x86\x40\x85\x1D\x8E\x3D\x7D\xC7\x86\xCD\x51\xA7\x20\x18\xA4\x7A\x0B\x85\x11\x8E\x30\x7E\x8A\x6A\x54\x88\x53\x5F\x08\xB4\x8C\x1E\x57\x00\x84\x8E\x88\xC8\x8B\x1F\x82\x32\xB2\x08\xC4\x8A\x35\x84\x1F\x2A\x8E\x8B\xA7\x88\x05\x9E\x31\x85\x15\x84\x4E\x49\x8D\x9C\x86\xA0\x79\xA9\x83\x42\x68\x31\x80\xD4\x1E\x78\x5D\x33\xA7\x88\xA4\x7C\x7D\x18\xBB\x23\xE1\x5C\x13\xF1\x88\xE0\x8A\xD7\x65\xBA\x26\xBE\x83\x5E\x9D\xC2\x12\x17\xFA\x25\xCA\x76\xF4\x89\x7C\x8D\xB5\x8D\x0E\x9F\xF9\x2E\x17\xD2\x89\xC5\x8B\x9F\x37\x0D\x06\xF5\x29\x2E\x27\x30\xA6\xA0\x55\x81\xF7\x25\x37\x8E\x60\x89\x23\x08\x03\x01\x0A\x78\x00\x44\x42\x27\x03\xA3\x41\xBD\x27\x56\x51\xED\x38\x01\x1C\xA9\x5B\x66\x78\x8C\xDB\x89\x22\x89\x03\x7A\xBF\x5B\xA6\x14\x1A\xB1\x54\xE4\x25\x3E\x59\x1C\x8D\xD1\x8E\x3A\x6F\x34\x9D\xA2\x27\x02\xA0\x51\x49\x8D\x8D\x46\xD2\x8D\x43\x78\x34\xA4\x4B\x7C\x8C\x44\x82\x9E\x77\xF5\x02\xC0\x8F\xB3\x32\x2F\x9D\x0C\xF1\x8B\x9D\x33\xFB\x8A\x3E\x19\xBF\x89\x5E\x8C\x27\xAC\xC7\x68\x3C\x03\x8B\x66\x8A\x3E\x84\x67\x71\x60\x86\x33\x9A\x08\x8D\x8C\x29\x8A\x8D\x7B\xC4\x21\xC2\x8D\xA2\x12\x0F\x5A\xF4\x50\x8C\x17\x8A\xFE\x49\xA1\x52\xA3\x8A\xE2\x1C\x28\x9D\x18\xDD\x6D\x1F\x8B\x10\x8D\x48\x8A\xC9\x82\xD8\x2E",
"\x10\x8D\x74\x7D\x00\x2B\x8C\x18\x84\x1D\x05\xDC\x7B\x65\x8E\x2F\x71\x00\x45\x20\x09\x02\x74\x8D\x2B\x35\xDC\x81\x43\x48\xA4\x60\x14\xEA\x06\x64\x8C\x93\x2B\x77\x89\xBC\x83\x03\x1A\x35\xBB\xFF\x04\x26\xD1\x3C\xF3\x88\x1B\x6E\xBA\x88\xE6\x2A\x2F\x82\x1B\x96\x83\x26\x82\x10\x3B\xF7\x77\x7C\x64\x6A\x93\x2F\x8C\x1A\xAA\x2E\x9C\x66\x12\x0A\xE7\x67\xD3\x83\x69\x8A\xDE\x6E\x1A\xE8\x25\xB0\x8D\x67\x89\xAC\x5B\x91\x8B\x68\x90\x03\x38\x00\x2E\x2F\x8F\x8C\x43\x8C\xC5\x65\x1A\x87\xAB\x4A\x34\x8E\x03\xD1\x35\x39\x01\xA0\x41\x0E\x02\xE5\x2C\xAA\x60\x00\x14\xA0\x6E\x02\x39\x00\x73\x8A\xC5\x8B\x9B\x29\x72\x91\xF6\x39\x00\x5C\x54\x3F\x01\xE8\x38\xE0\x24\xD5\x89\x5D\x83\x36\x97\x06\x94\x2D\xB3\x1A\xFB\x07\x25\x1C\x66\x32\x6A\x95\x38\xA1\x1C\xAE\x67\x23\x8E\x1A\x00\x73\x21\x21\x03\x74\x9E\xC6\x2D\x1C\x80\x27\x2F\x8F\x1E\x69\xCC\x8D\xA2\x24\x73\x9E\x2F\xB6\x85\x37\x8E\x06\x09\x29\x06\xCE\x8D\x22\x0B\x54\x98\x44\x48\x1B\xBC\x69\xF5\x83\x1A\x00\xB3\x8B\x1C\x1E\x6C\x8C\x28\x90\x1B\xB6\x8C\x18\x8B\x69\x8D\xCB\x24\xC3\x82\x33\x3E\x30\x83\x82\x47\x8C\x8A\x6D\x40\x7C\x89\x89\xCC\x7E\x6D\x9D\x09\x61\x1B\xB8\x84\x74\x01\xB0\x30\x50\x8A\x41\x72\x3F\x81\x4D\x7F\x0E\xAF\x8A\xE2\x8D\x7C\x41\x8A\x8B\x3F\x88\x52\x98\x3A\x9F\x08\xD8\x30\x30\x8C\x83\x01\xE0\x88\xEF\x8F\xD1\x7F\x3A\xA7\x0A\xFC\x84\x53\x8D\xA6\x25\xB9\x8A\xA8\x8C\x53\x9E\x32\x87\x94\x3F\x8A\x8B\x8E\x1E\x8D\xE3\x8D\xC8\x89\x20\x9A\x36\xAA\x0D\x48\x8A\x44\x8D\x32\x8F\xCF\x77\xC9\x86\x61\x86\x13\xA9\xF5\x67\x3E\x39\x8D\x20\x8C\x97\x8C\xC9\x84\x70\x13\x32\x50\x1E\xA2\x8F\xA5\x5B\x2B\x8E\x97\x8E\xC8\x86\x54\x9B\x36\xA2\x19\xEB\x8E\xF1\x8C\x9A\x37\x3E\x45\xE0\x87\x6B\x8E\x0B\x0F\x1A\xB2\x00\x09\x8F\x54\x8E\xED\x8B\xD5\x87\x69\x97\x4A\x68\x79\x7A\x8D\x4E\x8E\xD7\x8B\xC4\x8C\xD6\x80\x72\x82\x39\xBD\x5C\x45\x8E\x03\x03\xA2\x8D\xCF\x27\xE8\x85\x2F\x29\x3A\x88\xCF\x72\x34\x4B\x8F\x99\x8D\xC4\x8E\xB4\x81\x70\x82\x01\x38\x1C\xD2\x8E\x82\x08\xAA\x8C\xA0\x88\xBE\x88\x72\x8E\xBD\x23\x1C\x9A\x8E\x05\x22\xA5\x7F\xF2\x8A\xDC\x7E\xC2\x6B\x0A\x70\x00\x6F\x4D\xE6\x8E\x95\x2C\x1C\x07\x24\x0B\x7E\x9D\xC2\x2B\x6B\x2A\x8E\x39\x01\x6D\x2B\xFB\x8E\xE5\x86\x93\x4B\x47\x50\x63\x32\x8E\x01\x54\x84\x42\x0B\x80\x72\x2D\xDF\x20\x0B\x48\x84\x0B\x66\xD7\x51\xA4\x4C\x0C\x28\xE8\x56\x7E\x88\x3F\x82\x85\x3A\x33\x32\x01\x25\x66\x40\x05\x49\x69\x7F\x95\x11\x4E\x1F\x81\x62\x45\x68\x2D\x59\xFE\x8E\x59\x69\x46\x86\x3A\x7D\x1F\xE6\x8F\x6C\x88\xC7\x5E\x00\x94\x98\x3F\x71\x94\xE8\x43\x0C\xBA\x35\xF6\x01\x93\x01\x08\x92\x3F\x8A\x30\x91\xE8\x68\x0C\x8A\x8F\x0C\x8A\x89\x87\x79\x71\x62\x8B\x32\x93\x18\xA9\x21\x26\x7A\x91\x26\x58\x78\xC6\x80\x0A\x8B\x79\x8D\xE8\x60\xBD\x6B\x79\x57\x8A\x14\x93\x44\x8F\x61\x81\xCD\x4C\x41\xB4\x0C\xA2\x7A\x16\x6B\x9B\x85\xB1\x7C\xDB\x85\x09\x9A\x18\xA0\xF3\x16\x04\xEF\x4C\x27\x6F\xBA\x30\x05\x06\xEB\x0C\x42\xA4\x20\xA5\x86\x0E\x06\x1C\x91\xA1\x55\x9D\x79\x82\x8D\x41\xAB\x20\xAD\x86\x1C\x7B\x98\x84\xDF\x8A\x62\x86\x33\x94\x18\xB0\x20\xD3\x26\x28\x7B\x4A\x6E\xB8\x29\x9D\x79\x68\x2F\xE8\x52\x21\xAF\x60\x54\x91\x1D\x93\xCA\x85\x07\x98\x85\x8F\x19\x9D\xF4\x5B\x90\x2D\x91\x2E\x93\x0B\x90\x67\x8C\xCF\x62\xF4\x7B\x0C\xD5\x8E\x0C\x8C\x8D\x79\x57\x35\x3E\x8B\x66\x86\x65\x37\x83\x4F\x8D\x0B\x8C\x7A\x53\x49\x8F\xED\x8B\x68\x7D\xCC\x2C\x14\x83\x02\x2E\x8B\x9C\x8B\x8C\x8D\xF3\x89\x22\x9F\x3C\xA2\x1D\xBA\x90\xF0\x8D\xD1\x8C\x91\x87\xC7\x80\x89\x82\x37\x8C\x1E\xDD\x8C\x94\x8F\x6C\x8C\x92\x88\x48\x8A\x76\x8B\x32\x84\x09\xC4\x8F\xCD\x8E\xE3\x8F\x0C\x00\xF9\x82\x10\x0A\x3E\x8D\x1F\x8E\x90\x30\x8F\xE8\x38\x9A\x3D\xE9\x8F\x6F\x99\x25\x94\xD1\x57\x8F\xC5\x19\x9D\x8E\xE6\x24\x00\x97\x80\x85\xF7\x69\x1F\xE9\x86\xE7\x1D\x6A\x83\xFB\x8A\x77\x34\x8B\x8B\xD7\x06\x20\xA9\x3C\x34\x00\x05\x91\x40\x04\x01\x9E\x7F\x88\x45\xA7\x50\x76\x8F\x73\x44\xFC\x8E\xFF\x8C\x02\x93\xCA\x10\x64\x4B\x23\xE8\x88\x37\x4F\x0D\x90\xD7\x15\xFC\x87\x80\x9F\x45\xBA\x66\x36\x00\xC2\x90\x00\x00\x31\x96\xFC\x86\x8C\x94\xE5\x48\x23\xA3\x2B\xCA\x90\x0C\x93\xA3\x75\x02\x9C\x7F\x9B\x27\x4F\x23\xB6\x80\xE4\x91\x6C\x53\x00\x94\x1A\x96\x38\x9F\x45\x83\x85\x66\x5B\x09\x03\x93\x8F\x52\x41\x2D\x4F\xA4\x5F\x3F\x9C\xD1\x0A\x82\x86\x87\xE9\x8F\x76\x88\x7A\x71\x04\x1D\x0B\x27\x01\x3C",
"\x8E\x66\x2C\xC3\x86\xCA\x8B\x5D\x30\x04\x1D\x45\xB1\x00\x6E\x91\x2A\x2E\xDB\x21\x42\x02\x21\x98\x16\x54\x47\x93\x20\xCA\x89\xF8\x91\x9B\x74\x69\x8A\xBB\x83\xB5\x7D\x47\x9E\x04\x7F\x91\xB3\x90\x76\x93\xF9\x8D\xA3\x69\x7E\x93\x01\x19\x23\xDB\x91\x07\x91\x6E\x90\x04\x91\x19\x91\x89\x4B\xD7\x0C\x23\xB6\x65\x17\x91\x03\x91\x06\x96\xE8\x42\x8D\x86\x62\x07\x21\x82\x86\xE2\x79\x38\x6D\xB9\x26\xD6\x1F\x00\x1C\x10\x54\x0A\x25\x90\x9C\x7E\x0A\x8E\xC4\x82\x0B\x9A\x36\x1B\xE8\x6E\x21\xC3\x70\x42\x90\x3B\x05\x27\x95\x0D\x85\x83\x8D\x03\x38\xD9\x51\x90\x27\x87\x1C\x92\x4E\x95\x05\x9C\x93\x9F\xB3\x7F\x20\x8D\x2C\x4D\x93\x8F\x78\x17\x91\x08\x9E\x85\x91\xC7\x42\x09\xF7\x90\xDB\x8F\x81\x7B\x9B\x69\x26\x94\x30\x99\x01\x21\x0C\x82\x02\x23\x87\x9B\x90\x14\x90\xA2\x79\x93\x9E\x41\x81\xDA\x51\x92\xF4\x79\xA9\x93\x15\x92\x66\x83\x95\x80\x4A\x95\x25\xC3\x90\xAF\x8F\x09\x28\x56\x95\x0F\x0B\x77\x9C\x10\xBB\x21\xFF\x8E\x7D\x91\xF8\x12\xF8\x8A\x11\x94\x7E\x90\x16\xBF\x6C\x3E\x91\x1C\x93\x03\x93\x0A\x37\x23\x9E\x39\x73\x3F\x88\x1D\xF5\x8F\x22\x66\x76\x51\x38\x92\x25\x93\x8E\x97\x39\x63\xD3\x0F\x92\xE8\x91\x68\x90\xAE\x62\x4B\x1E\x97\x91\xD6\x06\x0E\xB6\x91\x42\x43\xFE\x52\x04\x84\x0C\x08\x1A\x68\x0A\x42\xA8\x05\x92\xEC\x91\x83\x91\x60\x96\x70\x8D\x99\x2C\x48\x83\x04\x0C\x92\x9E\x92\xF5\x52\x3D\x90\x41\x41\x91\x9A\x47\x94\xEE\x7E\x8C\xFE\x90\x9A\x34\xBF\x27\xB0\x45\x1D\x4B\xB3\x2A\x5C\x3E\x87\xDE\x31\x6C\x13\x40\x91\x06\x00\x9A\x95\x4C\x81\xA8\x22\x93\xD3\x85\xBF\x93\x50\x42\x06\x06\x9A\x82\x08\x28\x26\xBF\x93\xAA\x92\x8A\x81\x49\x92\x22\x92\xBC\x6E\x45\xAD\x17\xB1\x93\xA0\x90\x4A\x06\xC9\x2E\xC9\x60\x7E\x90\x2A\x3F\x21\xF7\x6C\xFF\x7A\x5E\x69\x0A\x48\x85\x4A\x43\x53\x12\x1D\x66\x2C\x48\xF5\x02\xEF\x40\x0C\x48\x64\x20\x7A\x8D\x0D\x78\x90\x50\x2F\xDD\x92\x7D\x39\x3A\x6E\x15\x40\x69\x00\xCE\x6D\xD3\x11\x06\xBA\x35\x5D\x03\x49\x02\x3E\x9B\x43\x8C\x4F\xB7\x09\x90\x58\xA4\x41\x1F\x88\xA0\x33\xB9\x41\x97\x21\xC9\x0F\x97\x29\x60\xDD\x59\x79\x5A\xE8\x20\xAD\x40\xD9\x71\x40\x9D\x62\x31\x33\xFE\x68\x25\x44\x1E\x68\x68\x3A\xBE\x72\x98\x38\x10\xAE\x2E\x03\x02\x97\x2E\x9E\x3A\x8F\x55\x55\x24\xF2\x0B\x28\xD7\x36\xB4\x55\x7A\x30\x0D\x06\x06\x07\x0B\x07\x09\x1D\x28\xA3\x69\x32\x3E\xCE\x76\x01\x45\xA9\x2E\xB0\x34\x29\x58\x05\x9B\x8D\x08\x31\xA0\x3F\xF1\x74\x1F\x33\xA2\x81\xAA\x08\x80\x26\x94\x73\x2C\xA6\x2D\xD9\x16\x7B\x0E\x00\x4A\x50\xA7\x06\x8C\x94\xA9\x83\x5C\x34\x0D\x00\x06\x01\x7F\x27\x17\x36\x24\x92\x35\x7D\x3E\x87\x07\xDF\x3D\xF0\x4B\x44\x22\xFC\x0A\x72\x38\x39\x7E\x39\xB4\x37\xE1\x3D\x48\x99\xF8\x3E\xE5\x08\x60\x1E\x3F\x8D\x3E\x06\x30\x76\x2D\x0E\x7A\x61\x52\xFC\x18\x59\x14\x3F\xA0\x38\xC2\x3F\xE5\x3A\x97\x31\x22\x49\xE4\x32\x71\x7C\x38\x5B\x95\x60\x3B\x0B\x5B\x98\x34\xCC\x46\x2E\x98\x28\xC7\x59\x29\x2E\x1A\x00\x0D\x02\x00\x06\xEB\x0C\x53\xA0\x28\xC8\x43\x75\x40\xD6\x6E\x3D\x5C\xC1\x23\xE2\x71\x9C\x5B\xF7\x52\x43\x9D\x03\xE7\x4B\x7C\x47\xD7\x31\xA7\x9E\x60\x6D\xDE\x71\x2A\x11\x4E\x92\x75\x3B\x70\xC2\x23\x1D\x45\x53\xA3\x96\x5D\x45\x39\x94\x2F\x3C\x0D\x01\x07\x07\xE7\x22\x08\x39\x79\x5D\x4B\x7C\x3D\xBA\x8B\x6E\x86\x7A\x6F\x48\x6A\xB7\x31\x29\x85\x3D\x91\x95\x69\x30\xFF\x3B\x38\x09\xBE\x69\x54\xBB\xD1\x30\x00\xF0\x68\xCF\x64\x3F\x34\xD2\x38\x33\x7F\x87\x56\x65\x0D\x0A\x54\x94\x40\x3A\x20\x43\x50\x39\x5D\x5A\x54\xB4\x26\xF1\x4A\xA1\x4B\x8B\x13\xA1\x97\xD6\x36\x03\x15\x01\x3E\x03\x27\x02\xB7\x95\x66\x5A\x3C\x59\x05\x8E\xA7\x93\x53\x8C\x61\x01\x95\x76\x95\x92\x77\xA9\x54\x06\x6B\xCF\x5C\x2E\x7A\x81\x01\x94\xBC\x95\x48\x61\x53\x2F\xAC\x59\x63\x49\x70\x77\x29\x9D\x31\xBC\x3F\x8E\x03\xAB\x95\x98\x58\x1A\x99\x50\xAF\x5F\x36\x00\x31\x01\x1E\x94\xE9\x07\x47\x90\xED\x33\x42\x77\x5F\x6D\x38\x21\x44\x23\x96\x1C\x38\x49\x9D\x2E\x55\xAE\x21\x2B\xCD\x94\x9C\x3E\x30\x94\x30\x3F\x68\x42\xA5\x82\xE4\x0B\xB8\x2E\x33\x79\x03\x76\x77\xE4\x3C\x97\x31\xC9\x39\x52\x8B\x72\x61\x94\x69\x37\xCC\x3C\x2D\x3D\x5E\x9A\xF8\x3F\xE5\x0C\x7E\x23\x30\xA0\x3E\xE1\x29\xA7\x96\x5A\x9A\x82\x37\x23\x73\x0A\x83\x02\xB5\x84\xD8\x83\xAC\x42\x36\x88\x87\x7B\x90\x4A\xD2\x0E\x42\xBA\x83\xDE\x83\x20\x7A\x62\x95\xFD\x48\x55\x41\xF0\x7E\x67\xC3\x83\x45\x37\x2D\x6C\x56\x33\xB0\x88\x53\xBD\x62\x36\x00\x38\x01\xD6",
"\x82\x40\x07\x35\x8B\xA7\x9F\x53\x65\xD2\x04\x69\x42\x71\xDA\x81\x8B\x86\x61\x93\xFE\x70\x58\x8D\x86\x7C\x77\x19\x7C\xFF\x76\x6F\x80\x80\x72\xB5\x18\x58\xAC\xAA\x1E\x6E\x97\x69\x59\x35\x26\x6F\x42\x92\xE7\x3E\x54\xAB\xEF\x37\x00\x9E\x00\x5B\x1D\xD0\x97\x4D\x9B\xB0\x80\x54\x74\xEF\x7E\x61\x2C\x96\x20\x8B\x22\x6A\x66\x92\xE2\x69\xD6\x14\x2C\xA4\x58\x16\x97\x9A\x95\x31\x89\x63\x9A\xF5\x3B\x58\x98\xAA\x71\x77\xF3\x27\xB0\x3D\xDC\x21\x50\x52\x84\x69\x5A\xBB\x27\xCB\x96\x30\x97\xA8\x24\xB0\x97\x69\x93\xAC\x80\x0E\xA9\xAA\x53\x96\x37\x96\xE4\x6A\xD5\x90\x56\x5D\xB1\x8B\x67\x69\x5C\x37\x00\x31\x00\x62\x02\xAD\x1A\x6E\x94\xB4\x90\x18\x4C\x2C\xC8\x3E\x2A\x96\x88\x6A\xD7\x97\x40\x38\x35\x31\x58\xAD\xD2\x00\x95\xCD\x95\x46\x57\xA0\x91\x6A\x9B\xB5\x14\xA4\x54\x2D\xB9\x96\xBC\x42\xB6\x95\xA6\x54\x94\x6B\xA9\x5C\x5A\x96\xE1\x79\x96\x27\x6B\x02\x96\xFE\x77\x65\x93\xA9\x8D\x5A\x81\x2E\xA7\x95\x83\x97\xAD\x26\x2C\x6D\x1D\x87\xB8\x91\xD5\x3B\x86\x17\x55\x6C\x97\x45\x32\x0D\x32\x0E\x08\x83\x34\x03\x26\x4B\x23\x97\xA5\x96\x95\x2E\x68\x21\x21\x0B\xBA\x92\x4E\x48\x61\x79\x06\x3B\x63\xA3\x2E\x8E\x16\x75\x8E\x4C\x7F\xB4\x3C\xAC\x4F\x5A\xE1\x37\xF4\x5F\xEB\x95\x72\x06\xBA\x96\xC2\x28\x2E\xA8\x3F\xEE\x4B\x1B\x6B\x49\x05\x75\x94\x6D\x5B\x5D\xB1\x2E\xCC\x2F\x97\x3A\x0E\x50\xF3\x28\xC7\x27\xBB\x8D\xFD\x21\x6F\x35\x6F\x1A\x84\xB4\x8B\x7E\x45\x24\x51\x03\x1A\x98\x42\x04\x1C\x66\x5C\x63\xEF\x7F\x37\x2F\x63\x6A\x9F\x88\x4C\xA9\x26\x06\x94\x5E\x81\xC2\x68\xCA\x63\xFE\x76\xC0\x36\xCD\x79\xC5\x78\x7F\x74\x8C\xBF\x61\xEB\x7B\x37\x7D\x52\x44\x8C\x41\x00\x90\x59\x2A\x7C\xA5\x67\x10\x8A\x91\x12\xDE\x48\xD5\x60\xCB\x50\x38\x36\x01\x92\x8E\xAB\x76\x02\x5A\xDE\x5D\x97\x6C\xB7\x4C\x78\xB5\x74\x9C\x89\xFE\x70\x2E\x82\x82\x51\x97\x50\xAC\x3C\x80\x82\x81\x1A\x8A\x7B\x91\x81\x96\xB1\x47\x37\x9B\x88\x57\x35\x1C\x44\x46\x81\xB1\x76\x7F\x94\x1E\x45\x9C\x5F\x11\x9B\x76\x55\x64\xEF\x63\xCE\x0D\x71\x62\xA8\x82\x5B\x97\x2E\xFF\x2D\xC2\x52\x50\x60\xCA\x76\x72\x65\x99\x7F\xCE\x41\xCE\x65\x5C\x26\x80\x9F\x61\xD2\x0B\x36\x5B\xB3\x55\x4D\x5C\x48\x09\x67\x1D\x77\xC5\x67\x6E\x54\x83\x91\xAC\x92\x2E\x35\x29\xFF\x94\xD8\x47\x93\x75\xE5\x67\xE4\x02\x90\x08\xD8\x51\xC8\x79\x66\xD2\x10\x74\x76\xC5\x52\xFB\x7A\x43\x9F\xCB\x3D\x00\xD9\x85\x3E\x88\x53\x96\xD2\x90\xB7\x4A\xD4\x22\x22\x89\x32\x41\x63\xE8\x7E\x72\x92\xFA\x7F\x3D\x7D\xFE\x7F\x49\x4D\x11\x8E\x5F\x4F\x88\xF9\x7D\x00\x16\x87\x96\x2C\x16\x21\xB9\xE5\x54\x66\x51\x53\x99\x67\x11\x9A\x7B\x99\x68\x2E\x04\x98\x9D\x11\x81\x91\x27\x49\x83\x16\x2C\x28\x93\x96\x4F\x03\x93\x01\xE8\x66\x6B\x81\x35\x98\x1D\x80\x14\x81\xA5\x82\x05\xB9\x01\x84\x98\x26\x89\xB9\x65\x2A\x80\xEA\x06\xDF\x5D\xEF\x7A\xB7\x7D\x7B\x9D\x32\x37\x95\x4F\x1C\x43\x45\xDF\x69\xBD\x57\xB1\x2B\x6F\xBD\x95\xE6\x40\x9D\x96\x69\x9E\xAB\x82\x56\xBF\x06\x85\x99\xE3\x41\xFE\x7A\xEA\x69\x59\x72\xA7\x8A\x64\xBF\x2A\x9F\x98\x04\x2F\x7C\x5A\xEC\x6E\xC3\x71\x7A\x77\x73\x75\x0D\xD7\x86\x0B\x7F\x1B\x02\xD6\x81\xB1\x74\xD8\x66\x33\x6E\x0B\xDC\x88\xAB\x7C\x01\x9B\xB2\x67\x21\x62\xE4\x28\xB8\x52\x11\xB3\x49\x1C\x4E\x1A\x02\x15\x88\x17\x53\x02\x9D\x94\x65\x00\x94\x98\x10\x89\x96\x7C\xC0\x63\x95\x90\xBE\x9B\x88\x7B\x1F\xB8\x4E\xAD\x65\x33\x89\x64\x96\x52\x7B\xF8\x50\x46\x90\xCC\x6E\x88\x39\x80\x63\x07\x6C\x95\x90\x00\x3F\x4F\xC8\x38\xE6\x6F\x09\xD5\x80\xDD\x91\x20\x94\x62\x62\x53\x93\x29\x09\x07\xF5\x10\x68\x34\xE6\x81\xCB\x55\x9A\x90\x13\x10\x0E\x97\x90\x12\x78\xC9\x68\xEA\x83\x84\x4D\x7B\x90\xFE\x39\x11\x2F\x9F\x5A\x83\x08\x79\x12\x49\x0A\x49\x2C\x39\x42\x57\xEF\x7B\xF5\x26\x48\x16\x51\xB6\x87\x7E\x42\x9D\x52\x5A\x4B\x2C\x52\x4C\x35\x00\x32\x00\x6D\x94\x83\x0C\x5B\x9C\x8F\x2C\x2D\x69\x27\xAE\x4B\xC8\x2E\x60\x95\x6C\x4A\x85\x93\x5B\x51\xA7\x35\x96\x7B\x96\x6A\x47\x41\x36\x6E\x49\x62\x08\x33\x42\x01\x3E\x33\xCF\x38\xE0\x2F\x58\x63\x91\x2D\x4E\x93\xD0\x80\xBE\x3C\x9E\x2F\x36\x4A\x99\xAF\x96\xCC\x4B\xFF\x33\xAD\x86\x53\xBD\x2C\x84\x96\x67\x35\x1A\x00\xED\x2E\xF6\x2C\xCF\x83\xC2\x01\x29\x9B\x63\x1B\x39\x73\x95\x1E\x3E\x5E\x94\xAE\x90\xF7\x0B\x29\x9E\x39\x2B\x9B\x7E\x97\x93\x90\x5F\x9E\xAF\x6D\xE5\x23\x57\x3F\x7D\x0F\x31\x58\x39\x04\x35\x4B\x9B\xF9\x27\x52\xB4\x71\x39\x39\x84\x4E\x7D\x95\xE4\x26\x4B",
"\x9B\xC7\x29\xC0\x00\x35\x80\x96\x63\x95\xD0\x3E\x8D\x93\x9E\x95\xAD\x9E\x58\xB5\x63\x35\x00\xC3\x43\x5E\x36\xA8\x92\x5B\x31\xA2\x86\xB8\x09\x32\xCB\x95\xF7\x59\xEB\x81\x26\x9D\x87\x73\x36\x25\x54\x8B\x35\x88\x4B\xF4\x98\x59\x96\x3D\x99\xE1\x5F\x8B\x27\x09\x0F\x2A\xC7\x95\xDE\x4B\x8C\x99\x39\x31\xB1\x34\xCA\x42\x2F\x46\x5C\x18\x95\x85\x41\xF3\x4B\x57\x9D\x36\x91\xD6\x90\x0E\x17\x61\x35\x00\xDA\x31\x93\x02\xA4\x3F\x58\x94\xAA\x83\xCF\x42\x2E\xEC\x9A\xB7\x83\x40\x43\x83\x0B\x1D\x3D\x89\x2D\x55\x9F\x7A\x73\x9A\xB0\x95\xBA\x9A\x47\x9A\x35\x82\x03\x0E\x67\x43\x04\x70\x59\x43\x2F\x5D\x96\x17\x8D\x92\x98\xD5\x90\x7E\x5A\x35\xD0\x5E\x65\x97\x68\x94\x21\x0E\x50\x93\xD6\x98\x53\x76\x00\x39\x00\x43\x96\x83\x01\x68\x98\x6B\x98\x43\x37\x5B\xA8\xD2\x12\x97\x5B\x28\xBF\x95\x23\x6B\x94\x51\xD8\x9C\x8D\x4E\xAA\x12\x69\x67\x96\xC3\x95\xDA\x93\x4B\x3B\xB6\x81\xBF\x6B\x28\xD4\x9A\xB1\x82\xA3\x97\x6C\x80\x69\x98\xDA\x8B\xA5\x58\x02\xE1\x96\xAC\x9A\xE0\x9B\x69\x5B\xAA\x21\x1C\x9C\x5C\xB3\x36\x9B\x43\x8D\x35\x57\x56\x6D\x9D\x6D\x95\xCF\x97\xC2\x37\x00\x30\x00\x74\x96\x83\x01\x74\x9C\xB4\x93\x79\x26\x6D\xA9\x2C\xA6\x43\xB6\x82\x30\x8A\x6A\x9D\x54\x5C\xDA\x97\x6C\x8F\x86\x43\x9B\x84\x96\xE1\x2A\x55\x2D\x73\x95\x1C\x8A\x5C\x94\x37\xDA\x96\xA6\x68\x3C\x70\xE4\x93\xE5\x48\xD0\x91\x18\x60\xAA\x0D\x43\xDE\x9A\xD7\x43\xC4\x97\x6F\x90\xDE\x9A\x5C\x85\x37\x84\x83\xE4\x9B\xCF\x94\xC7\x92\x74\x96\xBC\x8C\x0C\x27\x2E\xFD\x9B\x0A\x74\x19\x01\xEB\x92\x2F\x8A\x60\x60\x70\xA4\x31\xB2\x97\x94\x48\xDA\x7B\x05\x7E\x76\x9C\x86\x57\x3E\x39\x2E\xFC\x9B\xA7\x3E\xD8\x94\x63\x04\x21\x3F\xBB\x92\x70\xB4\x1D\x9B\x93\x73\x87\x0A\x9C\xEF\x92\xEF\x84\x99\x75\x8A\x65\xC3\x4D\x53\x34\x00\xEB\x95\x40\x00\x7B\x96\x86\x5C\x5E\xAA\x35\xC7\x91\x89\x93\xB8\x67\x12\x8F\x40\x65\x33\x23\x5F\x81\x20\x74\x7F\xF3\x96\xAA\x03\xF9\x95\xFF\x72\x36\x56\x37\xAB\x2F\xB4\x9C\xFF\x7F\xC1\x2B\x0A\x81\x82\x80\x79\x7C\x03\xB6\xE6\x27\x75\xC7\x2F\x07\x53\xF1\x28\x4D\x3A\xBF\x88\x6F\x7C\x2F\xB0\x75\x58\x4F\xF6\x58\x40\x76\x56\x7B\x02\x99\xD5\x47\x5F\x14\x65\x5C\x98\x3E\x9B\x02\x9E\x10\x87\x21\x10\xC8\x10\xEC\x12\x76\x0C\x99\x91\x69\xC5\x73\x21\x7B\xC2\x97\x8E\x6D\x30\x98\x98\x8A\x66\x2B\x67\x06\x98\x64\x7D\xC1\x9D\x6E\xA5\x39\xB9\x98\x22\x99\x1D\x99\x97\x63\x8B\x98\xC0\x94\x72\xBE\x00\xD3\x9C\x3C\x88\x05\x75\xC7\x33\xFB\x71\x10\x1D\xFE\x67\x30\xD4\x72\xE1\x7F\x13\x9E\x7B\x9A\xC5\x93\x80\x5F\x90\x74\x38\xD1\x73\x23\x65\x23\x89\x89\x63\xFD\x70\x9F\x76\x62\xAF\xFF\x73\x73\x6E\x30\x28\x8A\x5E\x55\xCD\x91\xE7\x91\x3B\xB0\x39\xBF\x98\xF8\x50\x41\x59\x22\x81\x20\x0B\x08\x97\x73\xAB\xC7\x30\x53\x67\x80\x48\x82\xD7\x60\x8E\x9D\x09\x92\x63\xA5\xE1\x19\x86\xF4\x75\x29\x50\x1C\x80\x2D\x5C\x09\x93\x03\x9F\x02\x81\x64\xA1\x81\x34\x3D\x5C\x55\x0B\x8B\xE2\x8F\x47\x77\xA5\x76\x11\x61\x80\x8B\x01\x1F\x9C\x93\x9B\x5C\x1F\x63\xB4\x3A\xFD\x5B\x35\x00\xD2\x6C\x00\x06\xF4\x67\xEB\x82\x0B\x13\x32\xCD\x78\x57\x9B\xCB\x52\x65\x9F\xCC\x95\xB1\x9B\x64\xA5\xF8\x21\x6F\xAF\x99\xEF\x64\xC7\x4E\x06\x03\xCB\x94\x7B\x64\x00\xDA\x88\x29\x98\x47\x4E\x2E\x9D\x85\x9B\x02\x97\x2B\xA2\x11\x90\x75\x06\x67\x9C\x4C\xC2\x62\x98\x90\x80\x8A\x23\x85\x33\xC3\x99\x6D\x89\x6D\x66\x0E\x83\x32\x7A\x21\x87\x59\x65\x90\x14\x84\x38\x00\x6D\x9A\x73\x83\xF7\x4E\xCD\x84\x0F\x52\x07\xE1\x99\x49\x9C\x72\x9A\x4F\x60\x87\x52\x42\x50\x77\x44\x2B\x63\x34\x3C\x97\xF5\x42\x53\x9C\xCE\x39\x03\x04\x1A\x88\x6D\x31\x3F\x0F\x9B\x9E\x62\x45\x9B\x90\x75\xD1\x8F\xB2\x34\x96\x3F\x9B\x7A\x9D\xD7\x31\x0E\x4B\x53\x9A\x14\x00\x72\xBE\x5E\x7B\x52\x50\x38\xBE\x85\x18\x7F\xD5\x3F\x60\x52\x67\xA0\x35\xCD\x9A\x6E\x97\x5E\x31\x0D\x01\xDA\x67\x6A\x53\x6A\x85\x6C\x0E\x9A\x54\x05\x20\x2F\x3F\x9A\xA2\x9F\x5A\x4E\xC0\x05\x3C\xF5\x3F\x07\x9E\x90\x65\xB5\x9C\xCF\x2F\xA0\x05\x40\x33\x1E\xB1\x2F\x19\x8E\x76\x27\xBF\x20\x5E\x22\x2F\x3D\x99\x37\xAA\x33\x8F\xCB\x98\x8B\x8E\xBF\x27\x21\x0F\x13\x12\x3A\x02\x4C\x2A\x8D\xFB\x41\x1C\x01\xEC\x2F\xFB\x82\xF3\x9C\x79\x82\x20\x56\x11\xF1\x25\x6A\x81\xCA\x89\xE8\x99\xF3\x83\x39\xBF\x4B\x3E\x9E\x20\x01\xF1\x8D\x2F\x90\x06\x04\x8F\x29\xF1\x2A\x7A\x7F\x25\xF6\x0F\xA4\x9C\x52\x40\x38\x33\xF5\x94\x0F\xA9\x1F\xB3\x9E\x48\x9F\xA8\x9D\x03\x91\x89\x39\x42\x46\x31",
"\x6D\x33\xD7\x9E\x46\x9F\xA7\x16\xD6\x98\x9E\x9E\x7B\x3E\x01\x24\x3D\xE9\x93\x5D\x33\x76\x9B\xBF\x22\xDF\x0F\xF3\x90\x21\x61\x92\x66\x25\xE1\x49\xA2\x9E\x51\x07\xE8\x98\xA0\x0B\x7B\x90\x73\x21\x49\xFC\x24\x1D\x3F\xD3\x99\x60\x22\xF6\x9F\x7B\xA7\xCF\x30\x00\xB1\x2F\x79\x42\xDE\x9F\x5D\x21\xF6\x95\x06\x80\x67\x7B\x41\x30\x01\x9C\x9E\x6E\x33\xF0\x91\x75\x3F\x79\xB8\x83\x7B\x41\x34\x01\xD8\x2E\x34\x83\xF1\x9C\xF7\x92\x53\x2B\x3D\x9A\x77\xF8\x25\x55\x81\xCE\x9B\x6B\x74\xF9\x91\x3B\x56\x3E\xB6\x81\xA1\x9F\xAB\x75\x0D\x01\xF6\x27\x4D\x9C\x7C\xB4\x3C\xDA\x89\xA9\x9E\x46\x89\xCE\x9B\x1B\x85\xFA\x92\xF5\x67\x3E\xBE\x89\xB1\x9F\x8A\x8E\x0D\x01\xF6\x26\x60\x8E\x7D\x8D\x3E\xBD\x26\xE5\x88\x7B\x89\xCE\x98\x9C\x85\xFB\x95\x7D\x41\x04\x37\x9F\xE5\x89\xF5\x93\xB3\x05\xDA\x72\x10\x17\xF6\x61\x9F\x68\x9E\x7B\x9E\xDC\x93\xDA\x9A\xAC\x4A\xFC\x85\x24\x07\x00\x9E\x72\xE1\x4F\x7F\x24\xC0\x17\xE7\x92\x56\x5F\x1A\x78\x26\xD7\x30\xD0\x9F\x9F\x00\xBB\x17\xF3\x91\x83\x3F\x1A\x4D\x33\xBD\x31\xFF\x24\xB5\x9E\xD8\x99\xF7\x2F\x13\x51\xBD\x1A\x26\xEA\x19\x60\x9F\xBE\x9D\xCD\x99\x40\x59\xFB\x9D\x40\xA0\x85\x39\x9E\x43\x43\xE2\x9F\x4B\x0B\xE5\x1B\xFE\x89\x4F\x44\xA8\x31\x2F\xE2\x66\xDF\x9E\xFC\x9D\x1A\x8D\xA0\x44\x50\x79\x3C\x87\x54\xFA\x9E\xE7\x0B\xF1\x9D\xFF\x93\x3D\x60\xDF\x71\x5E\x63\x77\x02\xA0\xCF\x9F\xFC\x9A\x8B\x65\xFF\x93\x26\x91\x6B\x33\x00\x39\x9F\xF5\x65\x02\xA6\x38\x07\xFB\x91\x9F\x7A\x2E\x91\x9C\xBC\x97\xEF\x9E\x86\x9D\xCA\x91\xFE\x94\x03\x23\x3F\xF3\x9F\x23\xA1\xFC\x47\x07\xA4\x74\x90\xBC\x8D\xD3\x46\x38\xBB\x9E\x7B\x9E\xF5\x9D\xF1\x90\x04\xAE\x0A\x77\x1F\x95\xFF\x2A\x66\x98\x7E\xAE\x03\x85\x77\x5F\x22\xC7\x0B\x7B\xAA\x9E\x3E\x00\x36\xA0\xD2\x7F\xE4\x78\xEB\x9C\x7B\x1F\x79\xBF\x40\x86\x71\x78\x0A\xF8\x44\xA6\x7D\x04\xAA\xDB\x0B\x7B\xB3\xDF\x48\xA0\x8A\x0A\x40\x4C\xF7\x68\x06\xAF\x13\x0D\x74\x3F\x3C\xF3\x6F\x16\x88\x59\x9C\x88\x48\x2E\x7C\xF9\x87\x5E\x3E\x40\xC3\x50\x59\xA0\x3A\x01\xC3\x22\x05\x5F\x2F\x2D\x82\xA2\x3D\xB0\x50\xDC\x82\xEB\x7B\x85\x04\xE4\x13\x10\x04\x79\x01\xF9\x3B\xA0\x46\x9F\xED\x9F\xFC\x9B\x63\x59\x06\xBC\xE3\x4A\x1E\x5F\x9F\xE0\x83\x7F\x26\x0D\x17\xE7\x9B\xB1\x50\x71\x8F\x31\xE5\x00\x64\x72\xFC\x7D\x09\xA4\xEE\x93\xFF\x96\xCD\x5A\x39\x65\x97\x20\x65\xF6\x46\x6D\x74\x0A\xAD\xBB\x8C\x5F\x06\x41\xBB\x73\x8E\x62\xA8\x0F\xA7\x4B\x3F\x7F\x8D\x45\x81\xAA\x3F\xFC\x74\x30\x51\x48\xA2\x40\x16\xD1\x74\x09\xB8\x47\x73\x3D\xEF\x09\x3F\x9E\x00\x75\xFE\x46\xE1\x99\xA1\x03\x49\x51\x3C\x9C\x9F\x66\xA0\x8A\x9E\x05\x54\x14\xA5\x32\x06\x97\x09\x98\x7F\x25\x56\xA0\xB1\x9E\xB9\x63\x34\x6A\x79\x2D\x98\x26\xC6\x1C\x9F\x59\x9F\xF9\x9C\x36\x44\x16\xA0\x94\x29\xE2\x12\x83\x71\x9F\x12\xA0\x7A\x24\x36\x41\xCA\x92\x90\x0C\x83\x82\x04\x6E\xA0\xDE\x7E\x38\xA3\xDE\x9A\x0E\xAF\xEA\x21\x9C\x44\x43\x81\x10\xDF\x9F\x64\xA2\x1E\xA5\xFB\x0C\xFD\x81\x9C\x73\x3A\xC7\x9D\xCB\x0A\x44\x0F\x8F\x0C\x90\x7E\x28\x6A\x86\xBF\x04\x5C\x7D\xCC\x25\xB5\x9D\x21\x9E\x07\x07\x0D\xBE\xAE\x79\x0E\xA6\x3D\x85\x98\x46\xA3\xF5\x9C\xFF\x92\x0C\xB2\x64\xA5\x0D\xF3\x00\x0D\x27\x03\x6D\x09\xA1\x17\xAB\x36\x8A\xF3\x6F\x43\xF4\x7A\x73\x00\x46\xA0\xCD\x9C\xAF\x7A\xE6\x61\x18\xA8\x5C\x54\x93\x11\xA1\xB0\x1B\xE7\x9C\xCA\x61\x30\x93\x4D\x8E\xD9\x1B\xA0\xEC\xA1\x84\x87\xA2\x78\xCE\x7F\x66\x37\xEB\x4C\xFA\x5E\xA1\x8D\xA0\x53\x1B\xDA\x9D\xC3\x5B\x10\xAD\xE5\x6B\x2D\x71\xA1\x47\x5C\x46\xA2\x19\xA4\x1F\xA6\x11\xAD\x32\x53\xE8\x1C\x74\x11\x04\x86\x32\x85\x73\x10\xA0\x0A\xB3\x7F\x81\xD8\x07\xA1\x86\x5B\x00\x6D\xFB\x46\x42\x7F\x2F\x3E\x82\xA2\x3D\xA7\xA2\x9E\x99\x52\x9B\xF7\x99\x6E\x85\x02\xA7\x81\xB8\x6E\x5C\x86\x31\xA2\xC9\x16\x12\xA1\xDB\x5C\x08\xB2\x81\xB4\x0D\xA5\x99\xE4\xA1\x62\x72\xB4\x79\xE5\x55\x06\x1A\x86\x89\xE3\x52\x86\xB7\x72\xCE\x9C\x38\xA4\xFF\x9F\x9F\x68\x8A\x81\x45\xC0\x7A\x5D\x75\x74\x4F\x39\xA7\x28\xA6\x34\x88\x78\x6A\x43\x9F\x74\x09\xA3\xA8\xA0\xC2\x5E\x07\x0B\x0E\xA2\x97\x30\xFD\x65\x74\xBF\x13\xBD\x1D\x42\x02\x2C\xA7\x82\x58\x14\x8A\x05\x29\x74\x25\xA0\x0A\x82\x40\x01\xE9\x7E\x03\xA6\x8B\xA0\x04\x30\x72\x5D\xA3\xB2\xA2\x9A\x80\x2C\xA1\x11\x06\x8A\x9E\x45\xEE\xA2\x86\x85\xDF\x10\x23\xA4\xF9\x91\x10\x13\xEF\x46\x41\xF8\xA2\x30\x72\xF3\x5F\xE4\x6C\xC2\x93\x79\x70\x88\x84\x42\xFC\x74",
"\x4F\x64\xC1\xA1\xC2\x55\x7D\x4E\xA6\x6D\x89\xB8\x11\x21\xA1\x93\x6E\xB7\x9C\x80\x7B\xF8\x03\x09\xA2\x93\x56\x42\xB3\x16\x13\xA2\x8A\x58\x65\x79\xEF\x0C\x09\xA2\x93\x5F\x42\xC1\x11\x90\xA2\xAE\x6B\xB8\x7A\x0C\xA8\x8D\x23\x7A\x73\x43\xC5\xA0\x13\xA0\x7B\x4F\x68\xA4\x3E\x83\xF4\x40\x86\x82\x44\xEB\x9F\xAA\xA3\xD0\x91\xD5\x9F\xFD\x9D\x2E\x26\x7A\xB4\x43\xA9\x93\x06\x92\xAF\x9D\x66\x92\x1F\xA1\xF6\x89\x4D\x84\x22\x8A\x05\x26\x4D\xB9\x8E\x7B\x4F\x32\xAA\x32\x63\x88\xA8\x1E\x92\xA3\x7E\x8E\xD4\x8F\x5D\x90\xF5\x8C\x08\xA4\x84\x84\x1E\xBA\x8A\xDF\x7E\xB6\x5E\xC1\x21\x54\x7C\xF9\x9F\x67\x2B\x3D\xA3\x4E\x6C\x5E\xDE\x34\xC7\x4F\x5F\x2E\x09\x3F\x79\xA3\x9C\x23\x7E\x81\x0A\xF8\x47\xDE\x80\x15\xA6\x4F\x0B\x7B\x95\x9D\x60\xA3\x6F\x0A\x73\x27\xD3\x48\x16\xA3\x85\x3F\x79\x95\x9D\x39\x9E\x0B\x33\xEE\x0E\x6D\x94\x24\xA0\x1A\xB3\x80\x98\x64\x70\xA3\x19\x0D\xF6\x47\x43\x36\x31\xAE\x08\xAC\x80\xBA\x26\xF5\x92\x5C\x6C\xB9\x8E\xB2\x8D\x04\xAE\x12\xB7\x4E\x93\x14\xBE\x00\x00\xA4\x42\x6D\x23\x32\xD9\x85\x06\xA5\x8F\xAB\x3F\xCF\x8D\x11\x85\xAA\x09\x58\x34\x42\x84\x20\xAF\x8C\xB3\x3F\xAF\x56\x11\xA5\x99\x09\xC3\x24\x42\x8D\x20\xA1\xE3\x57\x41\x8F\x78\x09\xA5\x45\x6E\x80\xA2\x66\x80\x11\xA5\x90\x8F\x47\xB3\x8C\x21\xA4\x21\x03\x82\xA4\x44\xAD\x21\xA3\x87\x00\x00\x16\x9F\x4F\x8D\x56\x86\xB1\x82\x81\x01\x96\x2A\x33\x9D\x41\x96\xA4\x6D\x8C\x62\x86\x8C\xA4\x23\x0B\x50\x6D\x98\x0F\x15\xAD\xA4\xEF\x21\x17\xA6\xD8\x9B\x84\x73\x91\x64\x11\x14\xAC\x16\x72\xE4\xA2\x0F\xA7\x1C\xA3\x77\x45\x24\xAA\x0A\x26\x4B\x75\x4E\xEC\xA2\x68\x34\x1F\xA3\x77\x42\x04\xA4\x20\xBE\x0C\x5F\x9F\x4A\x85\x9A\xA2\x61\x1F\x0B\xAA\x40\x95\x92\xAB\x9E\x1C\x0E\xB5\x73\xA5\x71\x4F\xA0\x33\xA7\x06\xAE\x12\x9E\x15\x80\x07\xED\x47\xB0\x89\x09\xA5\x07\xA3\xFF\x87\x1E\x80\x41\xFE\x41\xC7\x86\x83\x25\x58\x8C\x08\xAB\xB8\x1F\x79\xAE\x49\xE7\xA4\x54\x06\xE3\x86\xA2\x12\xE5\x2E\x06\x16\x75\x3D\x49\xCC\x87\x80\x06\xE7\x85\xF5\x82\x90\x22\x3D\x8D\x60\x54\x0F\x80\x07\xD6\x86\xEE\x85\xF6\x80\x70\x09\x61\x6A\x94\xA3\x70\x33\x5E\xE0\x87\x90\x26\xF8\x80\x82\x25\x3E\x88\x03\x10\x25\xA1\x26\xE9\x86\x36\x31\xEC\x24\x7D\x80\x38\x13\xA2\x2E\x49\x89\x7C\x22\x01\x42\xA7\xA2\xA4\x6A\x09\xF5\x27\x1E\x89\x4A\xD8\x87\x84\xA4\xED\x86\xC7\x6A\x84\x6D\x3D\x82\x16\x5F\x0F\xA6\x5C\x93\xA4\xF2\x84\xB0\x3E\x7C\x80\x33\x98\x94\x99\x15\x95\x6A\x9C\xA4\xAA\x04\x9E\xA5\x78\x85\x60\x41\x2B\xB2\x00\x4B\x87\x06\x02\x60\xA4\x59\x89\x50\xA0\x2A\xA2\x95\xA9\x4A\x8C\xA5\x76\x3E\x53\xA6\x06\x37\x7A\x8F\x4A\x26\xA6\x05\x4A\x8D\xA5\xA8\xA4\xBF\x2D\x00\x49\x52\xA9\xF6\x13\x1B\x35\x2A\x70\x34\xB4\xA5\x02\x2D\xA6\xA7\xCB\x4B\x29\xA3\xD7\x0A\x2A\x3B\xA5\x65\x00\x3D\xA4\xE0\x05\x33\x3F\x27\xA6\x08\x25\x4B\xC3\xA5\x54\x06\x41\xA4\xA2\xA7\x58\xA4\x2A\xA9\x96\x83\x4A\xF6\x38\xCC\xA5\x51\xA7\xF4\x80\x77\x71\x2D\xBE\x1E\x85\xAA\x28\x2F\xD1\x59\x58\xA4\xB6\xA6\x52\xA8\x68\x76\x95\xBD\x0A\xCC\x6F\x3C\x85\xF5\x86\xB7\xA5\x53\xA7\x36\x3F\x94\x84\x56\x46\xA5\xCE\xA4\x55\xA7\x05\x5A\x59\xA0\x2F\xAE\x94\x89\x4C\xC8\xA5\xAB\xA4\x47\xA6\xB4\xA7\x5E\xAD\xE6\x52\x94\x96\x4B\xE3\x87\xFB\xA5\x4B\xA4\xAF\x84\xCB\x5E\x2B\x8A\x1F\xB0\x66\x0A\x15\x07\x49\x58\xA5\x12\x39\x56\xAD\x73\x3A\x05\x27\x04\x26\xA6\x5C\x2F\x58\xA6\x40\x3C\x35\x36\x31\xA1\x55\x0A\x06\x3B\x92\xF6\x42\xA3\x2F\xAA\x17\xF2\x81\x87\x90\x8A\x47\x0F\xB1\xA5\x53\x28\x95\xA7\x37\x2C\x40\x92\x33\xB3\x1B\x34\x4C\xCF\x92\x19\x2B\x8D\x2D\xB5\xA6\x65\xA6\x19\x0D\x4B\x99\xA1\x37\xA6\x17\xA7\xC2\x05\x13\x3B\x55\x15\xBA\x8D\x98\x0C\x4D\xC0\x97\xEA\x8E\xF6\x8E\x77\x47\x69\xA6\xE1\x84\x63\x90\x7F\x48\xA6\x68\x07\xF4\x05\xE9\x94\x80\x24\x35\xBB\x70\x9F\x53\x2E\x58\xBE\x3B\x59\x15\xE3\x07\x71\x01\x39\x13\x1C\x00\x2F\xC0\x00\x4B\xA7\xB9\x05\xE9\x96\xC4\x4D\x35\xA4\x81\x9B\x26\xDB\x12\xB8\x37\xB6\xA5\xFE\x43\x9A\x91\x7E\x83\x9A\xBA\x0A\x6A\x06\x23\xA6\x9F\xA6\x62\x02\xE5\x28\x0B\x07\x09\x3D\x4D\xA9\xA6\x7A\xA6\xCB\x03\x01\x2A\x6E\xA9\x83\x24\x55\x15\x4D\x96\x97\x2D\xA7\xAE\x04\xF0\x96\x68\x20\xBC\x8D\xB0\x39\x4A\xF2\x06\x44\xA7\x36\x01\xCE\xA1\x70\xA6\x94\x82\x9A\x04\x4E\xA5\x5B\x86\xA6\xDE\x94\x92\x79\x71\xA7\x06\x05\x5D\x8C\x4E\x87\xA7\xDD\xA5\xB0\xA6\xAA\x14\x72\xA1\x32\xA9\x9A\xA8\x01\x79\xA6\x68\x07\x5A\x17",
"\xC4\x20\x65\xA6\x10\x0C\x9D\xB4\x4B\x3A\xA6\x2A\x26\x02\x94\xE7\xA7\x67\xA1\x68\x67\x28\x42\x4D\xB3\xA6\x2F\xA7\x9A\xA6\x08\x50\x6B\xA3\x38\x03\x1F\x93\x4E\xA9\xA7\xE3\x87\x95\xA6\x2F\x5E\x6E\xA9\x36\x19\x9D\x8F\x25\xD3\x4C\xB7\xA6\xCA\xA6\xD1\xA0\x2B\x32\x36\xA0\x9E\x85\x0E\x25\xA7\x91\xA7\xAE\x30\xEE\xA6\x32\x05\x21\x91\xF4\x6F\x4E\x94\xA7\x1C\x9C\x0D\x86\xC8\xA5\x84\x44\x32\xB1\x01\x16\xAD\x02\x02\x58\x56\xE2\xA5\xAD\x12\x78\xAD\xA5\x24\x9E\xB4\x4E\x87\x6D\x4A\x2B\xE4\xA5\xE4\xA3\x79\xAF\x31\xA3\x9D\x8E\x4F\xE8\x00\xD0\x96\x4C\x51\xAC\xA2\x7A\xA6\x3A\xB5\x9E\xAC\x19\xD7\xA7\xEF\xA7\x7C\x41\x5C\xA7\x23\x7A\xA5\x67\xC6\x27\x04\x64\xA2\xFC\xA7\x35\x84\x1A\x00\x22\xAA\x16\xA1\x08\x2C\x45\xED\xA4\x85\x84\xB8\xA0\x56\xA3\xE8\x79\x40\xAA\x46\x76\x45\xF1\x84\x0D\xA8\x4B\x1B\x5E\xA7\x24\x0E\x17\xA2\x7B\x83\xFE\x68\x00\x3E\x00\xDB\x84\x48\x72\xAE\x0C\x17\xA0\x00\x17\xFB\x5D\x84\x25\xA0\xE9\x9C\x02\xAA\x55\x84\xB9\x19\xA0\x87\x64\x71\x7A\xFB\xA7\x2E\x86\xF6\x9D\x62\x16\x27\xA1\x1E\x90\x4F\xBD\xA7\x85\x07\xB0\x30\xC9\xA5\x42\xAD\x1F\xB1\x9B\xA6\x4E\x88\xA4\x45\x5D\x58\xA6\xD3\xA5\x7E\xA0\x24\xB6\x88\x02\x49\xF8\xA7\x30\xA8\x0C\xAA\xFB\x84\x72\x16\x62\x51\x1F\x9C\x3E\x97\xA1\xA3\x85\x8E\x14\x72\xA7\x38\x5B\x31\xB4\x5C\x1D\x65\x76\x7E\x9F\xA2\x74\x13\xCF\x9C\xEF\x79\x36\xA8\x1B\x25\x2E\xFB\xA7\x97\xA6\x88\xA3\x56\x13\xED\x97\x39\xBE\x01\x15\x51\x8A\xA7\x55\xA6\x19\xAA\xDA\xA0\x6A\xAF\x2F\x27\x81\x80\x51\x9D\xA7\xC0\x96\x1C\xAA\xF6\xA4\x72\xA2\x46\xB1\x9C\xA5\x48\xB8\xA4\x67\xA8\xB5\x06\x1A\xAA\x7E\xA4\x39\xBB\xA1\xAE\x51\xBD\xA8\x9B\x23\x1F\xAA\xF9\xA2\x31\x0B\x44\xBA\x81\x6F\xF9\x6A\x12\x3E\x07\x4F\x4C\x5E\x7C\x38\xA6\x77\x82\x92\xB5\x43\x80\xA9\x74\x74\x7C\xA1\x9D\x0E\xD1\x78\xD7\x71\xA2\xBD\x87\x21\xA1\xD5\x6D\x3E\xAA\x21\x22\xEA\x2B\x9D\x90\x8C\x6D\x33\xB4\x00\xE0\x93\xD2\x02\x78\x91\x3D\x9D\x6E\x90\xA8\x4A\x04\xCD\x2A\xE7\x93\xF4\x2D\x7A\x95\x03\x66\x09\x52\xA7\x6F\x82\x0F\x9D\x0F\x32\xA2\x4B\x44\x31\x82\x96\x4A\xA3\x13\xB0\x5A\x2E\x1F\x28\x32\x0B\x21\xE3\x1E\x08\x4D\x07\x84\x49\x22\x64\x2D\xA9\xF7\x93\x99\x61\x7E\x91\xE1\x9B\x4F\x60\xC9\x24\x5C\x0B\x41\x26\x99\xF7\x93\x70\x04\x26\x39\x7E\x57\xC9\x2C\x9F\x06\x5D\xC1\x41\x1E\x9F\x29\x87\x0D\x35\x03\x67\xCA\x13\x81\x00\x94\x92\x9A\xBE\x5E\x6A\x32\x76\xAB\xF2\x90\xCD\x3D\xD3\x6F\x4A\x65\x2C\x08\x9C\x0B\xA5\x6A\xAF\xDF\x94\x81\x95\x0B\x83\x9C\xD2\x09\x02\x9E\x37\xAB\xA4\x68\xE0\x99\xAC\x0A\x2F\xA0\x48\x0C\x9C\xB6\x6D\xE8\x0F\x79\x96\x03\xB2\xFC\x7A\x40\xB5\x00\x95\x7F\x80\x03\xE5\x7F\x07\xA6\x94\x7B\xFC\x67\x20\x84\x50\xA8\x7F\xCF\x7E\x18\x19\xF4\x7D\xC5\x02\x92\x50\x41\xE7\x00\xB5\x7C\xEB\x6F\xFD\x63\xD3\x5B\xD8\x5C\xC0\x7C\xFA\x26\x71\xC2\x7D\x52\x9B\xBC\x5C\x17\x7D\x85\x6E\xC5\x66\xAD\x4A\x7D\x39\x7C\x66\x7D\xC9\x21\x03\x74\x8B\x77\x63\x7B\xFA\x4F\x5D\x53\x71\x3B\x70\xD2\x39\xA1\xA4\x3B\x8F\x08\x9F\xE2\x27\x70\xAF\x71\xF8\x6D\x30\x71\x14\x7E\x84\x74\x03\x03\xE3\x04\x28\x52\x70\x53\x72\xBB\x5E\x0E\x75\xF2\x21\xF6\x63\xBA\x7A\x70\x74\x91\x65\x7C\x17\x70\x00\x7F\x8B\x7A\x77\x47\xE1\x32\x71\x66\x71\x03\x71\xFC\x68\xA5\xA5\x8A\x7E\x2B\x7D\xE0\x3B\x5D\x2F\xAB\xBA\x87\x42\xA9\x13\x7D\x8B\x7E\xC3\x63\x54\x85\x70\x14\xAA\x9D\xAA\x1D\x5C\x41\x6D\xCF\x44\x6D\x47\x49\xDD\x83\x16\x57\x1A\x02\x78\x80\x00\x04\x1E\x9B\x58\x4C\x22\xFA\x84\x87\x8F\x9A\x8A\xC4\x78\x59\x5D\x5E\x49\xD3\x6F\xD7\x66\x97\xF7\x7E\x1A\x9F\x0A\x36\xC6\x9F\x82\x4C\x5F\xA4\xC5\x52\x65\x3B\x9D\xF0\x95\x01\x80\x44\x6D\x18\x79\xAD\x4F\xC6\x61\x78\x91\x62\x4E\x53\x64\x62\x20\x05\x19\x71\xAB\xB4\xC1\x19\x63\xA1\x63\xE4\x37\xC0\x4A\x3B\x56\x0A\x8A\xB0\x1F\xC6\x5F\x53\x4F\x0F\x6E\x65\xFD\x91\xC8\x99\xAA\x63\x72\xB8\x00\x45\x9C\x15\x33\x57\x77\x16\x8C\xE2\x5A\xE4\x9E\x22\x8C\x39\x83\x98\x50\x62\x03\x9A\x5C\x0D\x37\x98\x7F\x5B\xBC\x5A\x5E\x7B\x4F\x40\x33\xCE\x30\x00\x53\x20\x00\x80\x42\x86\x9A\x5E\x5E\x6F\x04\x51\xC8\x32\x01\x53\xD5\x63\x0C\x4C\x85\x4F\x43\x83\x81\x3F\x08\xD1\x53\x18\x9D\xE7\x22\x03\x15\x8D\x46\x04\x2E\xAB\x0F\x74\x48\x9E\x4C\x61\x89\x9D\xDE\x9D\x8D\x4E\x31\x82\x19\xD7\x0A\x40\x9D\xD0\x62\xD0\x93\x34\x75\x62\x8C\x11\x87\x9D\x4E\x88\xEE\x72\x16\x9B\xEE\x00\x93\x36\x74\x88\x01\x99\x9D\x91\x5A\x34\x9B\xD4\x22\x8D\x9F",
"\x9C\x20\x75\xAE\x01\xF5\x75\xA3\x9C\x2A\x82\xA9\x9F\x3F\x65\x07\x8F\x4B\x6A\x3A\xA3\x81\x05\x65\x3D\x83\x32\xA8\x0C\x88\x1E\x63\x63\x82\xCE\x38\x99\xC6\x2E\x8C\x77\xE1\x67\x85\x9A\x1D\x79\x60\x9F\xEC\x45\x26\x21\x76\x10\x98\xE4\x60\x87\x93\xF5\x3A\x61\x9E\xA6\x3C\x98\x87\x61\x72\xA2\xA3\x66\xD6\x98\x0D\xBD\x6F\x51\x35\x89\x02\xBC\x9D\xFA\xAA\xAF\x9F\x90\x94\xC9\x81\x76\x8E\x2B\xDF\x85\xEC\xAA\xA8\x96\xB1\x9E\xBB\x64\x59\xB6\x35\x09\xE3\x54\x7C\xC1\x92\xE4\x52\x8C\x6E\x06\x04\xC9\x66\x08\x0D\x58\x9C\xA2\x0C\x6C\xD5\x04\x97\x7F\x8F\xA7\xCD\x76\x18\x82\xFA\x62\x7C\x13\x7C\x36\x79\xC4\xA3\xC3\x6D\xA1\x4B\xB0\x7C\xF9\x47\x85\x84\x47\x3F\x7D\x66\x2C\x08\x93\xE8\x71\x35\x50\x54\x9E\x71\xA2\x7A\xC0\x75\xA2\x7B\x77\x5E\x61\xB2\xE7\x2C\xF9\x2F\x60\x6E\x7D\x08\x6C\x89\xAA\x9B\x77\x62\xBE\x46\xBA\xF8\x53\x6E\xAB\x7A\x25\x35\xC0\x81\x09\x91\x67\x66\x1C\xB5\x24\xFD\x06\x36\x92\x32\x91\xCE\x4F\x0C\x9D\x22\x89\x43\xBD\x24\xB0\xA6\x4B\x92\xA0\xA6\x1C\x91\x0C\x1B\xCF\x76\xB0\xAB\x1D\xB3\x90\x96\x81\x18\x2A\x90\xAD\x32\x28\x94\x86\x41\x8A\x25\xE6\x92\xE8\xA7\x4A\x92\x45\x7A\xC9\xAF\x86\x9C\x10\xAD\x25\xD2\x58\x73\x90\xB8\x91\x1D\x93\xED\x83\x97\x91\x9F\x85\xA2\x37\x6F\xCB\x6D\x87\xA1\x0D\x06\xF7\x66\x10\x0C\xB3\x9C\x44\x94\x5C\x50\x5C\xE1\x6F\xF1\x6D\xF8\x65\x65\x4B\x73\x72\x99\x26\x5C\x71\x7B\x38\x5E\xA6\xA3\xA4\x7F\x7C\x62\x92\x5F\x44\xF1\x6B\x8B\x30\x0B\x77\x0C\x06\xBE\x63\x10\x18\xAF\x70\xD7\x46\x7B\xB8\x60\x5F\x62\x5A\xAC\x0F\x81\x60\x74\x94\x7D\x0C\xC1\x86\x04\x5E\x65\x4E\x56\xA5\xCD\x0D\x71\x5E\x77\x9F\xFB\x55\xA2\x4C\x7A\x5D\x41\xAF\x68\x95\x9B\x34\x91\xEA\x76\xBC\x4D\x86\x8C\x03\x62\x6C\xD4\x83\xD2\xAE\xAD\x13\xAC\x8A\x46\xDC\x64\x47\x65\x84\x55\x67\x34\x30\x93\xD1\x4F\x92\x52\xDC\x74\x5F\xF6\x5E\x17\x99\x83\x25\xBC\xA1\xE6\x9E\x8E\x73\x4C\x58\x64\x7D\xAB\xB5\x6E\x77\x53\x00\x6B\x06\x7B\x8C\x91\x08\x27\x97\x0E\x5B\x75\x35\x19\x78\x00\x07\xC6\x6A\xAC\x69\xC9\x31\x7C\x64\x7D\x06\x7C\xA2\x7F\x96\x76\xE3\x6F\xBA\x71\xF1\x77\x7C\x98\x6B\x1C\xAE\xDF\x2D\xBA\x76\x07\xA7\xBC\x59\xD7\x1B\x7C\xE1\x85\x2A\x78\x37\xA1\xBC\x76\xE4\x77\xED\x43\xF2\x05\x99\xDD\xAC\xF4\x79\x93\x7C\x00\x8C\x07\x8D\xAF\x63\xE0\x23\xA3\x59\x5E\x05\x74\x0E\x07\x5A\x87\xF4\x59\x16\xA7\xE3\x59\x9B\x04\x4A\xE8\x58\x9D\xAC\x1D\x7F\xBF\x6B\xDF\x2E\xD4\x20\x05\x42\x65\xDF\xA0\xB9\x78\x32\x62\x1C\xB6\xA6\x67\x04\x6A\x8D\xCF\xA2\x45\x05\x27\xAD\x83\x4F\x6E\x82\x37\x98\x22\xD8\x2D\x7F\x74\xDF\x93\xDB\x59\x06\x0D\xEC\x98\x22\x84\xEB\x5B\x9C\xA7\x87\x27\x43\x2E\x9C\x59\x71\xB0\x77\x76\xA9\x23\xB0\x80\xDC\x9D\x19\x82\xB5\x75\xDB\x96\x74\x5A\xD6\x49\x33\xEB\x60\xE8\xA2\xA0\x00\xE1\x84\xA6\x6D\xB1\x22\x1D\x82\x0E\x8F\x7E\xA5\x87\x88\x7C\xE3\x83\xF5\x6E\x38\x91\x99\x2A\x0E\xA4\x2B\x18\x7E\x28\x78\xBE\x85\xE6\x7D\xF1\x77\x1C\x8F\xE4\x33\x87\x3A\x7F\x78\x71\x88\xA3\x3E\x89\x6C\x8C\x28\x98\x61\x5B\x8E\x48\x19\xAE\x8F\x81\xA7\xAA\xA4\x29\x8E\x44\x83\x08\xE3\x8E\x1B\x8B\x53\x2F\xB5\x88\x41\x8A\x89\x8A\xB4\x62\x14\xED\x8E\x2B\x35\x0C\xA4\x4C\x07\x9A\x9C\x40\x56\x01\x2A\x3B\x9D\x5D\x0F\x78\x62\x69\xCC\x50\x9C\x90\x67\x22\x67\xB7\xAC\x7A\x9C\xD9\x83\x68\x6B\xEE\x4E\xCC\xA2\x88\x9F\x10\x84\x22\xA0\x84\x35\x01\x43\x92\x40\x01\x11\x97\x52\x86\x3C\x98\x18\xB6\x8A\x1A\x8C\x2D\x8C\xEA\x8F\x12\x94\x7A\x9C\x11\x99\x19\xDA\xAC\xD0\xA2\xBA\xAF\x24\x97\xCB\x85\x70\xA5\x9A\xB3\x58\x99\x8F\x68\x68\xB2\xAC\x35\x9D\xA9\x8C\x4B\x6F\x2A\xB5\x00\x51\x8A\x22\x78\x62\x84\xAE\x83\x46\xA3\x58\x39\x41\x8A\x0B\xB7\xA5\xCC\x85\xAD\x88\xE3\xA8\xFA\x65\x60\x49\xBC\x38\xBE\x40\x37\x86\x87\xBA\x6F\xFD\x43\x77\x4E\xD8\x5E\x1D\x68\xE3\x7F\x4E\xC4\x5A\xE0\x59\x16\x84\xF0\x4B\x77\x7A\x6C\x73\xAB\x04\x6F\xCC\x5E\xD8\x7A\xE2\x2A\xB6\x78\xDD\x7F\xF1\x73\x2C\xEB\x37\x8D\x6E\xEE\x46\xE8\x42\x99\xA7\x3E\x52\xBC\x49\xAC\x07\x64\x0C\x57\xDA\x59\xEC\x43\xB2\xAE\x25\xAC\x3D\x49\x09\xE2\xA4\x36\x01\x03\x8A\x19\x79\x81\x84\x41\x94\xD3\x44\x5D\xB3\x8A\x59\xAB\x1B\x8F\xCA\xAC\x92\x93\x41\x96\x92\xBE\x04\x3B\x72\x70\xA4\x45\x16\xB8\xA4\x6A\x03\x31\x20\x96\x83\x04\x42\xA5\x95\x1D\xE6\x85\xB1\xA3\x50\xAF\x30\xAD\x97\x9E\xDC\x0C\xA6\x84\x4F\x78\xA4\xBB\xA3\x5E\xAA\x32\x2C\x95\x9E\x56\x2F\xA5\x05\x2C\x7D\xA5\xA5\xA2\x63\xAB\x2D\xB4\x3C\x8F",
"\x4E\xFA\x39\x2F\xA9\x33\x01\xAD\x10\x75\xA1\x44\xBD\xCC\x1F\x4F\x81\x02\xE1\xA6\xD8\xA7\x3D\x69\xAD\x4B\x47\xA5\x9A\x8C\x25\xF6\x43\xB3\xA6\xE3\xA4\x47\x7B\x77\xAD\x3C\xA1\xA2\xA8\x4D\x90\x63\x97\xA6\x3B\xA8\x18\xAC\x77\x9D\x73\x2D\x3F\x86\x04\x0E\xB0\x67\xA9\xD2\x97\xC0\xAD\x3C\x4F\x7E\xAB\x55\x1A\x4D\xE7\xA6\xBF\xA7\x05\xB2\x7A\x60\x6C\xAC\x3B\xA7\x03\x0E\x0E\x3F\x03\x65\xA7\xAD\xA5\xFC\xA8\x6F\xAC\x3D\xB4\x9C\xBD\x5C\x22\x9C\x00\x00\xEC\x97\xF4\xA5\x72\xAC\x39\xBE\x9C\x82\x6B\x0D\xA7\xE9\xAF\x31\xA9\xD5\xA7\x73\xAA\x39\xA1\x9D\x9D\x60\xEA\x06\x6D\xAB\xFB\x71\xB5\x6F\x6C\x85\xD7\x69\x92\x72\x00\x16\xAD\x7F\xA8\x72\x6F\xB5\x69\xDC\x6C\xE2\x48\xA4\x80\x71\x24\xAC\xFB\x03\x6C\x6D\x87\xA9\x92\xA2\xCE\x30\xB7\x46\x08\x66\x4D\x6E\x7A\x12\xAF\x13\x06\x09\xB0\x02\x5C\x82\x20\x4B\x15\x8E\x37\x00\x77\x13\xB3\x03\xBA\x18\xF1\x04\x0B\x33\x1E\xDA\xB0\x85\x08\xE3\x18\x11\x85\xE4\x1C\x14\x01\x7A\xA0\x61\x85\x10\xC6\x1A\x52\x02\xAD\x1E\xCD\x1A\x91\x87\xC3\x99\x23\x46\x1B\x8D\x70\x32\xB0\xC3\x1A\x3B\x99\x9E\x96\x50\x29\x27\xC6\x1B\xA8\x01\x35\xB2\x17\xB0\x9A\x4E\x71\x14\x17\x06\x37\x2A\x01\x7A\xB1\x32\xB3\xE1\x9E\x0D\xB9\x61\x06\x6E\x2C\x02\x01\xB1\x32\x02\xCC\x9C\x21\xB1\x62\x06\xDC\x0E\x05\x08\x62\xA4\x02\xFB\x41\x1A\x03\x22\xB3\x38\x06\xDC\x10\x05\x0F\x62\xA3\x02\xF6\x89\x49\xB2\x52\x06\xB8\x12\x0B\x17\xC4\x87\x26\x16\x33\x33\x88\xFB\x92\x86\x0E\x1A\x1B\x85\xA2\xCA\x5E\x62\xAC\x08\x9A\x69\xF9\x26\x26\xB0\x24\x06\xDC\x16\x05\x27\x62\xBF\x42\xAB\xB1\x71\x70\x00\x00\x17\x0F\x8A\xA7\x9F\x72\x00\x31\xB1\xC6\x1A\x5D\x01\x2D\xB7\x6A\x73\x03\x18\xC5\x9E\xED\x27\xB1\x2B\xA1\xD2\x97\x56\x10\x77\x98\x95\x06\x6E\x3E\x02\x27\xB1\x36\xA0\x1C\x1B\x57\x75\x63\x16\xDC\x00\x06\x27\x62\xFF\xA9\xB8\x93\xC0\x7B\xFF\x06\xB8\x12\x0C\x07\xC5\xA1\x41\xD2\x0E\xC6\x04\xE3\x19\x74\x9D\x0B\xBA\xC5\x09\x19\x01\xF9\x35\x12\x50\xAA\x8B\x02\x71\x1E\x18\x07\x8A\xBE\x83\xB8\x56\xD4\x02\x87\x18\x1A\x9E\x71\x18\x19\x07\x8A\xBA\x84\x93\x24\x79\x11\xD9\xB1\x93\x02\x32\x07\x19\xB3\x58\xBE\xBD\x1B\x25\x12\xAB\x76\x04\xE3\x18\x33\x07\x14\xBC\x0B\xA6\x0C\x18\x63\xD0\x0E\xC6\x1A\x67\x03\x29\xB7\xB4\xA5\xDB\x10\xC7\x80\x64\xD1\x52\xA7\xB0\xF9\xA9\x78\x7B\x2B\x15\xC8\x86\x6E\x12\x03\x7C\xB1\x53\x7C\xD5\x06\xBE\x0D\xCF\xA7\x79\x06\x6E\x14\x03\x3B\xB1\xFA\x52\x43\x07\xF1\x11\x28\x94\x22\x06\x6E\x16\x03\x56\xB1\xB6\x6F\x23\x5F\x44\xB5\xCE\x59\x8F\xAD\x27\x65\x63\xB0\x64\x20\xA2\xAF\x02\x0D\x15\xD1\xA7\x6E\x06\x6E\x1A\x03\x40\xB1\x55\x87\xBA\x85\x34\xB0\xA6\xA2\x57\x06\x6E\x1C\x03\x09\xB2\x42\xA2\x9F\x85\xBA\x4F\x81\xA4\x6A\xB3\x1A\xA5\x64\x89\x02\xDE\x01\x53\xB3\xFE\xA7\x2B\xAB\x2A\x9F\x4D\x36\x1F\x53\xB1\x27\x02\x70\x03\x49\xB2\x4D\x73\x79\x7F\xC7\x82\x24\x46\x1B\xE2\x01\x76\xB3\x64\xA1\xF4\x00\xB0\x06\xB7\x8C\x63\xA7\x02\xE4\x00\x88\xB2\x6F\x94\xA2\x0A\x6F\x1F\xE1\x7F\x64\x86\x02\xE6\x00\xAD\xB1\x65\xAE\x32\x91\x03\x1E\xC5\x89\x04\x68\x01\x52\xB3\xE4\xA1\x95\x8A\x0B\xAB\xB0\x62\x8E\x87\x5C\xAC\xB1\x27\x02\x75\x03\x29\xB7\x53\x73\x9D\x11\xC7\x89\x04\x6C\x01\xF4\xB1\xCE\x85\x57\x09\x74\x19\x73\xB5\xC9\xA7\x04\x6E\x01\x4B\xB3\xF7\x6B\x0D\x64\x62\x65\x8A\xA9\x08\x30\x03\x20\xB2\xC7\x8C\x8D\x7B\x3F\x1A\xD1\x66\xDC\x12\x07\x08\x66\x98\x51\x1D\x56\xA9\x0D\xC7\x56\xB8\x16\x58\x82\x08\x33\x3B\x79\x90\x32\x87\xC5\xB3\x3C\x7E\xB8\x16\x0F\x0F\xCC\x85\xA2\x04\x6A\x30\x18\x67\x87\x55\xB1\x21\x08\x0F\x19\xCB\xB3\xE3\x09\x2F\x80\x13\xDD\xAF\x57\xB0\x66\x70\x93\xBF\x70\xA8\xFE\x72\x18\xAE\x7E\xE3\x18\x3F\x00\x19\xB1\x7D\xA0\x1C\x16\x2A\x47\x87\xC6\x1A\x7F\x02\x50\xB3\x81\xA0\x41\xA4\xA1\x90\x00\x96\x19\x47\xB3\x96\xB1\x77\x02\xBD\x18\xD9\x00\xC5\xBD\x66\xEE\x84\x97\x0F\xE0\xB1\x45\xB5\x62\x04\x9C\xA4\x0B\x31\x5F\xB5\x15\xC7\x17\x0E\xB1\xAD\x16\xB8\x1F\x00\x0D\xCE\x8C\x05\x43\xA8\x72\x0A\xE5\xB3\x68\xB0\x9D\x06\x9D\xB2\x09\x1F\x51\xE8\xA8\x55\xA7\xAD\x11\x07\xB5\x74\x96\xDC\x13\x00\x1D\x67\xA4\x02\x23\xB0\xC5\x01\x74\xB5\x00\xB5\x3C\xB6\x0C\x06\x37\x15\x00\xE7\xB3\x3B\x1A\x0E\xB2\x50\x86\x7F\x1F\x13\xBE\x0C\x46\x1B\x17\x01\xF8\xB2\x48\x02\x0B\x05\x0F\x10\x6E\x0C\x3B\x00\x02\x2A\x1E\x2E\xB2\x80\xB3\x40\xB4\xA0\xA5\xD0\x86\x68\x87\xB4\x08\xB5\xE9\x1B\x3F\x07\x3F\xB7\x92\x02\x1A\x04\x68\xCD\x0B\x27",
"\x12\x66\x1C\x81\xB7\xBB\x87\x92\x13\x05\x12\x68\x82\xB4\xF6\x89\x93\x13\x9E\x57\x40\xB1\x89\xA7\x49\x2F\x02\x17\xB4\x5C\xB0\xCC\x9F\x49\x15\x17\x00\xA2\xB3\x6E\x20\xEF\x27\x12\xBB\x01\x12\xB7\x73\x1C\x40\x57\x92\x19\x05\x2A\x68\xCB\x1B\x3F\x42\x02\xB7\xF1\x15\x44\x38\x86\xA7\x62\x15\x1C\xB0\x00\xAB\x0C\xE3\x18\xFC\x18\x0E\x0F\xCF\x09\xD1\x3E\x4D\x10\x9F\x0B\xB4\xE6\x18\x25\x16\x41\xB3\xA0\xB0\xD0\x81\x68\x89\xB4\x14\xB4\x90\x4F\x8B\xB7\xB8\x19\xA1\xA7\x09\x1B\x68\x86\xB4\x1D\xB5\x93\x03\x87\xB1\x41\xB1\x68\x91\x23\xB4\x00\x23\xB4\x4B\xB4\xE3\x1B\x89\xB3\x3E\x99\xA5\xB6\xD1\xB6\x3F\xB7\x67\x2D\xB5\x2E\xB7\x15\xB7\x4B\xB2\x14\x52\xD1\xB8\x11\x34\xB4\x6F\xB0\x2F\xB6\x05\xA1\x37\x39\xA3\xB6\x73\x1D\x39\x02\x02\x3C\x03\x7F\x19\x44\x43\x22\x40\xF9\x82\xD0\x81\x69\xD0\x1B\x07\x10\x10\x0F\x83\xB2\x4D\xBD\xEC\x14\xD2\x95\x69\xD8\xB0\x15\xB4\x31\xB4\x6D\x32\xF7\x9A\xA1\xA2\xD4\xAB\xCE\x15\x8E\x35\x00\x0F\xB6\xA1\xB7\xE3\x85\x71\x97\xD2\xA7\x04\x24\xB4\x54\xB5\x2D\xB5\x42\x01\x45\xB1\xA9\xB6\xC5\xA1\x69\x95\xB5\x57\x77\x18\x03\x49\x15\x15\x0B\xA8\xB6\x80\xB7\x68\x84\xB4\x00\x17\x5B\x1B\x24\x43\xE4\x25\x98\xA6\xD7\x0C\x35\xDE\x30\x18\x1F\xFF\xB1\xEE\x85\x4D\xB2\xA0\xA6\xD2\xB6\x37\x7E\xB4\x49\xB5\x84\x02\x85\xB0\x53\xB1\x47\x96\x01\x05\x6A\xB4\xB5\x88\xB4\x45\xB4\xAE\xB4\x4C\xBE\xA8\xA9\x08\x10\x6A\xC8\xB4\x33\x68\x14\xB5\xA7\xB7\x4F\xB4\xA6\xB2\x01\x17\x6A\xC0\xB5\x99\xB5\x4D\xB7\xB0\xB5\x4E\xB3\xA0\xB8\x4D\x8B\x80\x33\x94\x77\x2D\x1A\xB4\xB4\x37\x54\xB5\x5C\x3B\x6F\x3F\x67\x9D\xA8\x6E\x10\x02\xB6\x1B\x11\x42\xB0\xAB\xA7\x9F\x77\x00\x01\xB5\xBB\xB5\x35\xB4\x7D\x8F\x56\xB8\xAC\xAC\x24\xBA\x6A\xE5\xB5\x8D\xB4\x2C\xB5\xB8\xB5\x4A\xBB\x44\x62\xD6\xAB\x6B\xDC\x8F\x60\xB5\xAB\x7F\xB2\xB7\x7C\x6A\xA9\xA7\x09\x1C\x6A\xEF\xB5\xC6\x8A\x0E\x23\x9D\xB4\xBA\x18\x68\x1D\x6F\x1A\x6B\xFC\xB4\xC3\xB4\x62\xB6\xB8\xB0\x5D\x20\xAE\xA8\xD7\xA4\x69\xB6\xB5\x4E\xB5\x79\xB6\xEA\x9F\x5C\xB8\xA0\xA2\xD1\x8F\x6A\x8A\xB6\x71\x89\x19\x02\xBB\xB6\x60\xB3\xB0\xAF\x9D\x47\x6B\x8D\xB6\xF4\xB4\x65\xB4\xBE\xB7\x67\x3C\x01\x25\xD0\xBB\x6B\x98\x1E\x28\x20\xBB\x0C\x82\xB6\x55\xB6\x10\x01\xD8\xB1\x6A\xB6\x51\x10\xB6\x42\xB5\xC2\xB3\x63\xB1\xAD\x29\xD4\x92\x69\xA9\xB6\xBC\xB4\x75\xB4\xC5\xB4\x5D\xBA\x45\x73\xD8\x98\x6C\xD7\x76\xC6\xB4\x79\xB4\xCB\xB1\x40\x56\xA6\xAC\x5F\x28\x69\x85\xB1\x7C\xB4\x78\xB4\x3F\x44\x55\xB1\xF2\x05\xDA\xBC\x04\x5A\x1F\xEA\x26\x20\xB7\x7F\xB6\x8A\x4F\xA6\xB4\xD2\x93\x1B\x5C\xB5\x3B\xB6\x72\x25\xC1\xB7\x66\xB5\xAB\xA4\xD7\x94\x6D\xB9\xB5\x2F\xB7\xA8\xB6\x2D\x82\x66\xB7\xB5\xA4\xD3\x92\x6C\xDC\xB4\x5A\xB6\x8B\xB6\xCE\xB3\x66\xB2\xB4\xB5\xD7\x89\x04\x77\xB5\x64\xB7\x7C\xB4\xD1\xB7\x50\xBF\x71\x94\x5D\x07\x49\x46\x07\x5F\x46\x02\xB7\xD3\x13\xD3\x2A\x4E\x74\xC4\x93\x61\x54\xB5\x3E\x2D\x8F\xB6\x65\xB4\x68\x56\xE6\x14\xD2\xA4\x6C\x97\x1C\xDD\xB5\xAB\x77\xB7\xB2\x49\xB1\xB6\xA8\xD8\x89\x04\x4F\xB4\x05\xB5\x28\xB5\x42\x03\x4A\xB9\xB6\xAF\x06\x9C\x6D\x9C\xB4\xC1\xB4\xB0\xB5\xE3\xB4\x75\x67\xB1\xB0\xDC\x89\x6B\xF6\xB5\x30\xB7\x8A\xB5\xC7\xB2\x40\xBA\xDB\x02\x24\x03\x80\x61\xB0\x77\xB7\x8B\x9E\x17\x32\x6F\xB1\x10\x1F\x07\x2A\x1B\xCD\xB6\x09\xB5\xA7\xB7\x91\xB5\x6B\xB5\xB1\xA3\xDC\xB2\x6A\x99\xB7\x34\xB7\xE7\x8A\xD5\xB6\x72\xB6\xAE\xB9\xDA\x93\x6E\xF5\x76\x8F\xB6\x28\xB5\xE4\xB3\x52\xB0\xBB\xA2\xDA\xB9\x6C\x89\x02\x2E\xB5\xB0\xB6\xD9\xB6\x20\x08\xB6\xAC\xDD\xB1\x6E\xC3\xB6\x03\xB5\x5B\x16\xDB\xB6\x19\x1F\x01\x51\xDB\x83\x68\xF3\xB6\x32\x41\x52\xB6\x96\x38\x6F\xB5\x61\x24\xDD\xBB\x37\x4D\x20\x14\x1E\xA7\xB4\xC0\xB1\x70\xB0\x67\x93\xDA\xB4\x6E\xAA\xB6\x87\xB7\xDE\xB6\x71\x8E\x65\xBB\xB8\xA2\xDF\x8E\x6E\x8F\xB6\x61\xB7\xAF\xB4\xEF\xB1\x6C\xBF\xBB\xA6\x08\x01\x6F\xB7\xB7\x60\x42\x8D\xB4\xFC\xB6\x36\x3B\xB6\xAC\xD4\xAD\x6D\x8F\x0F\x65\x24\x13\x22\xF3\xB2\x40\xB0\xBD\xBA\x00\x60\x6E\xD3\xB5\xA2\xB7\xE2\x2A\xF5\xB7\x1F\x0D\xB6\x49\x36\x3E\x69\xDB\xB5\xAB\xB7\xEF\xB4\x99\xB6\x75\xB8\xB2\xA5\xDC\xB3\x6E\xBA\xB7\x0B\xB6\xDB\xB6\xF1\xB2\x68\xBD\xAB\xA6\x08\x3F\x6A\x93\xB8\xC6\x8A\xF5\xB6\x41\x04\x52\xB3\xBF\xA2\xDB\x80\x6F\xE6\xB7\x96\x92\xF9\xB4\x06\xBC\x63\xB6\xAD\xAC\x6E\x24\x41\x2D\x81\x08\xB4\x04\xBB\xAB\xB1\x6C\xBC\xC0\xB2\x7B\x60\x70\xF1\x8B\x0F\xB9\xC4\xB4\x36",
"\x84\x61\xBA\xC0\xB5\xD8\x95\x70\x83\x02\x17\xB9\x1A\xBB\xF1\xB2\x83\xB3\x10\x1C\xE0\xA3\x70\x94\xB7\x63\xB7\x1F\xB9\x80\x52\x84\xBA\xC3\xA2\xDA\xB0\x00\x7F\x01\xFA\x1B\x7F\x03\x1B\x21\xEA\x29\xC2\xBB\xDE\xAC\x70\xDE\xB7\x10\xB9\xAA\xB7\xCA\xB5\x83\xB4\xBE\xA6\x08\x0C\x6E\xC2\xB8\x9A\x77\xDC\xB6\x0C\xBC\x17\xB6\xB3\xA5\xE2\x86\x17\xED\xB7\x03\x03\xF7\xB4\x16\xBB\x29\x44\xC4\xB1\xE2\xB7\x68\xCA\xB8\x86\x1B\x91\xB6\x13\xBD\x83\xBD\xC2\xBA\x94\x6F\x70\xE3\xB5\x53\xB9\x31\xBA\x2F\x8C\x86\xB6\xC6\xB1\xD9\xA8\x6F\x9D\xB8\x3C\xB8\x81\x02\x0F\xBE\x8B\xBF\xB3\x20\xE3\x82\x04\x62\xB8\x7C\xB9\x10\xB8\xE6\xB1\x6C\xB0\x03\x07\x49\x37\x02\x43\xB5\xFB\xB7\x01\xB9\x25\x23\x61\x78\xA0\xA5\x52\x10\x6D\xEC\xB8\x50\xB9\x2D\xBA\x14\xB9\x7C\xB1\xB6\xB5\xE2\x83\x04\x57\xB8\x81\xB8\xDC\xB7\x1D\xBA\x8E\xB9\xC7\xA1\x08\x3B\x71\xF5\xB8\x15\xB6\x3F\xB9\x40\x00\x90\xB0\xCA\xA7\xDE\xB1\x00\x03\xB8\xA3\x21\x31\xB6\x81\xB7\x6F\xB3\xE2\x1C\xDE\x80\x6A\x84\xB7\x1D\xB8\xC3\xB6\x60\x47\x8D\xBB\x12\x94\xE3\x92\x72\xE9\xB5\x9B\xB9\x4C\xB9\xCD\xB2\x72\xB2\xC7\xA2\xE5\x80\x00\x24\xB9\xB7\xB8\x32\xB7\xF0\xB3\x20\x05\xBC\xBA\xE5\xB6\x66\x06\xB9\x88\xB9\x54\xB2\x63\x0F\x3F\xBA\x0A\x28\x50\x0D\x71\xAA\xB9\x7D\xB5\x27\xB8\x2C\xBA\x8E\xB2\xCB\xBC\x53\x74\x72\xF3\xB8\x12\xB8\x63\xB8\xD6\x72\x8B\xB3\xA1\xBB\xDD\x9B\x70\xD7\xB9\xBE\xB8\x60\xB9\x37\xBF\x72\xB7\xB6\xB7\xE6\x87\x71\xFF\xB3\x9B\xAA\xF0\x1F\x33\xBB\x50\xBD\xCA\xB2\xE6\xAF\x6E\x8E\xB8\x71\xB8\x6D\xBA\x25\xBA\x20\x08\xC9\xA5\xE5\x94\x70\xDC\xB9\xC9\xB6\x6F\xB9\x0F\xB8\x9C\xB5\xB9\xB6\xE7\x86\x17\xC3\xB9\x02\x03\x62\xBA\x3F\xBC\x63\xB3\xC0\xBF\x85\x01\x23\x6A\xB8\xD0\xB8\x93\xB6\xB7\xB1\x92\xB3\xCE\xB3\xE4\xB3\x72\x95\xB9\xB6\xB9\x86\xB8\x2E\xBE\x57\xB7\xCD\xBD\xE4\x80\x00\x1F\xB9\xC1\xB9\x50\xB9\x3F\xB9\xA3\xB6\xCA\xA5\xE3\x9C\x74\xC6\xB8\xC8\xB8\x2A\xB6\xF3\xB3\x80\xB4\x68\xB3\xA4\xAB\x73\xEC\xB6\xB7\x1C\x57\xBB\x02\xBC\xA1\xB9\xCF\xBD\x26\xB1\x70\x92\xBA\x64\xB5\x79\xB9\x40\x05\x9E\xBF\xD1\xA6\x2E\xB7\x70\x82\x02\x39\xB9\x81\xBB\x05\xA5\x8B\xBA\xD3\xBE\x50\x5B\x74\xB0\xBA\x15\xB6\x80\xB9\x40\x02\xA0\xB5\xD3\xA4\xE8\xBF\x67\xC5\x00\xA1\xB6\x03\xB6\x0A\xBD\x64\xBA\xD2\xAD\xDD\xAC\x74\x98\xB4\xE7\x67\x6A\xBA\x40\x00\x71\xB0\xD4\xA7\xDE\xB2\x74\x80\x00\x34\xBB\xAA\xBB\x3D\xB9\x97\xBD\xD3\xBB\xE5\xAB\x6F\x9D\xB8\xE1\xB9\x6B\xBA\x50\xB8\x00\x04\xD4\xBA\xEA\xB9\x6B\xFE\xB4\xFE\xB2\xE6\x1B\x18\x03\x66\x18\xD0\xAC\xE7\xA9\x74\xEE\xB9\x0D\xB9\x58\xBB\x4B\xBD\xA5\xB5\xBB\xA5\xDF\xA1\x6D\xB7\xBA\x01\x03\x9C\xB9\x51\xBB\xA7\xBC\xCB\xBA\xE6\xA1\x75\xC2\xB7\x1E\xBA\xB3\xB8\xC7\xB1\xA4\xB9\xA0\xBB\xDF\xA5\x70\xD0\x1B\x26\x60\x00\x02\x7E\x1C\x40\xBA\xBA\xAB\xE1\x90\x72\xD3\xB9\xDA\xB8\xA9\xB9\x40\x04\xAA\xB4\xD7\xB8\xDA\xB6\x75\x9D\xB8\x78\xBA\x00\x02\x5E\xBA\xB0\xBC\xD7\xBF\xEA\xBD\x72\xBF\xBA\x95\xBA\x61\xB9\x60\xB9\xB4\xBA\xB9\xB9\xD2\x8F\x22\x46\x1B\x86\xBB\xE9\x19\x00\x1B\x81\x53\x66\x22\xAE\x28\x76\xCA\xB9\x31\x03\xFF\xB1\x2D\x5B\xB1\xB3\xA0\xAD\xEC\x8C\x75\xF0\xBA\x2E\xB8\x78\xB8\x25\xBC\x8A\xB1\xD1\xA4\xED\x87\x6F\x99\xBB\x9B\xBA\xDF\xBA\xD0\xB6\xA2\xB8\xD1\xBC\xEC\xBE\x74\xC1\xB8\xDA\xB9\xB1\xB9\x59\xBA\xB8\xB9\xAF\xA6\xED\xA1\x2B\x2F\xBB\xF9\x9C\xA2\x24\x81\xB6\x06\x1B\x00\x40\xB1\x3F\x6F\xA6\xB5\x01\xB9\xBC\xB7\x7F\xB5\x51\x9B\xDE\x1E\xD3\xB6\x76\x80\xB7\xB8\xBA\x37\xBA\x6E\xBF\xA1\xBC\xDB\xB9\xE6\x9D\x75\xDB\xB6\x5C\xBB\xBD\xB9\xBB\xB5\xAF\xB7\xDE\xBE\xE0\xAE\x6F\xE2\xBA\xA3\xBA\xA8\xBB\xD5\x76\xB4\x4C\xDC\xA3\x47\x0F\x1E\x50\xBB\x37\x95\x6A\xB7\x80\xB4\x5D\x1C\xBD\x40\x02\x78\x77\xD4\xB7\x44\x27\x01\xB8\x36\x6A\xB1\xBE\xDD\xAB\xE3\xB2\x71\xED\xB8\xC0\x65\x6B\xBA\x64\xB8\x00\x04\xD9\xB2\xEF\xB5\x75\xD6\xB8\xD7\xB8\xE0\xB9\x45\xBC\xA7\xBA\xDE\xAF\x51\x60\x76\x8E\xBC\x15\x8E\xE5\xBA\x39\xB9\x4B\xBA\xBC\xB7\xEF\x89\x75\x89\x9B\x3B\x2E\xB9\xB7\xCC\x10\x09\x4E\xFA\x20\xDA\x80\x70\xF4\x9A\x3B\x2F\x01\xB9\xC9\x8C\xB6\xB2\xA0\xBF\xEE\xAD\x73\x8F\xBB\xEF\xB8\xB9\xB9\x3C\xBD\xBD\xB7\xD5\xB9\xEA\xB5\x77\xAE\x81\xF8\xB8\x0C\xBE\xD7\xB4\xC2\xB6\xDC\xB6\xF0\x88\x77\xED\xBB\x1A\xBC\x42\xB8\x87\xBF\x88\x14\xBB\x1F\xEF\x99\x77\x95\x2C\x04\xB4\x7D\x0E\x5D\x39\x5B\x56\xE4\xA8\xF1\xA3\x6E\xFF\xB3\x6D\x00\x3C\x08\x82\xB1\xCE\x0F\xC8",
"\xA7\xF0\x8F\x75\xA1\xB4\x51\xBB\xB9\xBA\x8E\xBD\x62\xB5\xE3\xB1\xF0\xB9\x78\xD8\xBC\x5C\xB8\xF6\xB9\x85\xB9\x5E\xBF\xC1\xA0\xEC\x83\x72\x9D\xB8\x85\xB8\x0F\x95\x32\xB9\xBA\xB0\x34\x23\xF2\xA0\x4B\x45\xBC\x69\xB8\xD2\x06\x6A\xA8\x96\x59\xA6\xA2\xD0\x89\x24\x36\xA9\xD7\xBB\x73\x05\x29\xAA\x98\xAB\x89\xA3\xE0\x8C\x3B\x5A\x1E\x68\xBB\xB4\xB8\x74\x1A\xBF\x17\x80\x06\x6E\x0C\x3B\x44\xBA\xFA\x1A\x4A\x13\x72\xBA\x40\xBF\x35\x5E\xD7\x8D\x75\xC7\xB7\x47\xB9\x25\x1D\x7F\x19\xF5\x04\xA0\xBA\x6F\x05\x29\x07\xB9\x22\xBA\xD8\xB9\x96\xB5\x6B\x10\x50\x2D\xF2\xA0\x78\xA3\xB7\xFD\x1B\xD6\x09\xA5\xBF\x87\x13\x10\x18\xF4\x85\x76\x9A\xBD\x03\xB4\xCA\x21\x4B\x16\xD3\xB4\xAD\x80\xF5\xBC\x66\x88\xB4\x96\xBC\x35\xBD\xA6\xBC\xCD\xBE\x37\x3B\xF4\xB9\x2C\x28\x26\xAC\xBD\xC5\x99\x80\xBD\xBF\x1C\xED\x63\xF5\xA8\x70\x82\x02\xA6\xBC\x04\xB7\xD7\x46\xD6\xB5\x99\x98\xF5\x9F\x78\xAD\xBD\x02\xB9\xFE\x19\xEE\x86\xD7\xBD\x31\x85\xF5\xAB\x79\xF9\xBB\x3E\x2C\x37\xBC\x6D\x35\x7A\x69\xEB\xB3\x55\xB3\x4F\x7F\x01\xFD\x1A\x63\xA2\x81\xB1\xD6\xB9\x10\x01\xF6\x87\x68\xC3\xBD\x03\xB4\x4F\x21\x6A\x3D\xDA\xB3\xD6\x98\xF6\x94\x50\xFE\xB4\xDC\xBC\x83\x02\xB7\xBE\x40\xB0\xEE\xAD\xF1\x84\x2F\x52\xB5\xD8\xBA\x27\xBD\xB2\xBF\x24\x05\x40\xA5\xD0\xA9\x7B\xCE\xBD\xB3\xBC\x68\xBD\x85\x29\x4B\xB7\xD2\x0C\xC4\x87\x7B\xBA\xBD\x40\x26\x73\xBD\x42\x00\xD1\x0C\xEC\xA7\x24\x6A\x7B\xCF\xBD\x00\xBD\x36\xBD\x6D\xBF\xDD\xB5\xE7\xB1\xF7\x9F\x7A\xFA\xBB\x81\xBD\x88\xBE\xC4\xBB\xE2\xB6\x99\xAC\xD0\xA3\x10\x08\xB4\xAF\x0D\x93\x12\xA3\xBC\xD1\xB0\xDB\xA7\x49\x31\x03\x43\xB5\xF8\xA3\x88\x07\x49\x11\x1D\x03\xAC\xA6\x48\xA7\x24\x27\x01\x25\xBE\x8D\x93\x49\x15\x14\x07\xCD\xB9\x01\x27\x24\x23\x01\xD7\xB8\x1C\x01\x95\xBA\x9B\xB8\xE0\xB8\x97\x4A\x78\xDA\xBC\x60\xBD\x07\xBF\x25\xBE\xCB\xB9\xDE\xBD\xF1\x93\xD0\x3C\xBC\x37\xBD\xE3\xB9\x99\xBD\x83\xB1\xB2\xA2\xD0\xB3\x68\xBA\x76\x5A\xB5\xC3\x9D\xFD\xB5\xBB\xB9\xBD\xBF\x84\x3C\x68\xB5\x49\x3E\xB5\xF9\x26\xD2\xB2\x48\xB7\xF1\xA7\xD0\x99\x7C\xC5\x22\xC2\xBD\x8E\xBF\x49\x07\xE3\xB4\xA5\xA1\xF9\x83\x07\x23\xBE\x29\xBF\xAD\xB3\x3C\x97\xE4\xB1\xF6\xA3\xCB\xB9\x1F\xAB\xBE\x2D\xBF\x97\xBD\xCC\xBB\xE6\xBD\xDE\xB5\xF9\xB3\x6A\xB2\xBC\xBB\xBA\x39\xB9\x97\xBF\xAE\xBF\xE5\xA6\xD1\xBA\x73\xFA\xB8\xFC\xB9\x1F\xBF\x98\xBD\x4C\xB3\xA0\xA7\xFA\xB5\xEE\x49\xBE\xF3\xBB\xA5\xBC\x81\xBD\xE9\xB1\xA7\xB5\x25\x73\x69\xBF\xB4\x87\x9E\x3B\xB7\x7F\xB1\x4F\xBE\xA7\xB7\xFA\x92\x38\x7E\xB4\x5F\x46\x8F\xBC\xC8\xBE\x80\x3B\xBC\x03\x08\x24\x7C\xD4\xB4\x26\xBF\x93\x00\xCA\xB8\xF3\xBA\xF2\xA0\xD9\x29\x7D\xA7\x02\x30\xBF\xB0\xB6\xCC\xB9\x81\xBD\xF6\xB7\xF2\xB6\x7D\xAE\xBA\x33\xBD\xBD\xBF\xDC\xB8\xB3\xB5\xF7\xAB\xD1\xB7\x7D\x9E\xB9\x79\xBF\xA1\xBE\x1C\xB9\xC8\xB8\xE6\xA0\xD5\xB6\x32\x34\x3C\xA4\xB5\x3C\xBD\xA2\x39\xE1\xBE\x37\x29\xD5\x8C\x37\x2B\xB5\x8D\xBE\x3E\xB7\xC6\xBC\x0B\xB1\xF9\xBB\xFA\x93\x7E\x86\x5B\x95\xBE\x81\x03\xE5\xB9\x41\xB9\xF9\xA9\x08\x1B\x7E\xCC\xBF\x9D\xBF\x84\x00\xCB\xB9\x6C\xBE\xF2\xA0\xFD\xAB\x7D\xA4\xBF\x7B\xBE\xB7\xBF\xCD\xB9\xF5\xBE\xF3\xB8\xE6\x97\x76\xF2\xB8\x12\xBD\xF4\xB4\xD0\xBB\xCB\xB7\xBC\xBF\xEB\x84\x7D\xF1\xBB\x39\xBF\x4F\xB5\xB3\xB1\x6C\x14\xB3\x12\x51\x8E\x5D\x52\xB7\xBB\xBF\x23\xBE\x74\xBB\x80\xB8\xAD\xBE\xD3\xA0\x18\x1A\xBE\x90\xBE\xAD\xBD\x42\x04\xEB\xB9\xA0\xBE\xFA\x8A\x05\x60\xBE\x9C\xBE\xB1\xBD\x66\x94\xEC\xB1\x00\xC6\xFB\xBE\x1F\xE8\xBE\xD4\xBE\xB5\xBE\xE8\xBC\xED\xB9\xFD\xA6\xFD\xAE\x7E\xA8\xBF\x71\xBE\x79\xB9\x6F\xBC\xFC\xBB\xD5\xB4\xE8\xA2\x7F\xE2\xBC\xDD\xBE\xF3\xBF\xEC\xB8\xFD\xB7\xFA\xB1\x23\xBA\x6B\xFF\xB3\xFD\xB4\xFB\xBE\xF0\xB9\xFF\xB4\xEB\xB2\xFA\x86\x7F\xDD\xBE\x94\xBE\x0E\x91\x40\x03\xF9\xB8\xA0\xAD\xFE\x86\x04\x4F\xBF\x2D\xC1\xE8\xBD\x94\x47\xF3\xB9\x10\x01\xFD\x9D\x70\xA3\xBF\x8E\xBA\x2B\xBC\x64\xBD\xBD\xBB\xE0\xAD\xF0\xA9\x7F\xB1\xBA\x13\xC1\x1F\xC2\x0D\xBD\xF5\xB0\xA3\xAF\xFD\x97\x74\xB1\xBF\xEF\xBA\x33\xBD\x39\xBC\x90\xB6\xA0\xA3\xE0\x85\x7D\xEC\x14\x18\xBF\x11\xC1\xBE\xBC\xF7\xB6\x02\xDB\xFF\x87\x7F\x82\xB3\x2A\xC0\x00\x00\x0B\xC7\x40\xBE\x02\xC3\x08\x30\x80\xDC\xC0\x32\xC1\xC1\x50\x0D\xC6\x20\x06\x03\xD2\xE3\xB8\x80\xB7\xBB\x30\xBD\xB8\xB8\x35\xB8\xE7\xBD\x01\xD6\xEC\x90\x78\xF4\xBE\x3D\xBF\xA0\xBE\x57\xBF\x9B\xBC\xBE\xB7\xF0\x82\x81",
"\xA6\xB9\x3D\xB6\x53\x1B\xCF\xB6\xDF\xB0\xCD\xA6\xE2\x82\x7E\xBB\xB4\x48\xB6\x75\x1B\xD4\xB8\xBA\x1C\xB4\xBD\xDB\x89\x68\xD9\x08\xF8\xBF\x29\xC2\xFC\xB8\x68\x22\xF9\xA8\x01\xC8\x7F\xD9\xC0\x5B\xC0\x03\xB5\x17\xC2\x20\x0F\x05\xD2\x04\xE1\x81\xAA\x53\x63\xC1\x81\x01\x19\xC2\x9B\xB7\x06\xC0\xEF\xA9\x81\xB9\xBB\x70\xBE\xF2\xBA\xDC\xB9\x08\xCD\x06\xD6\xE3\x96\x80\xF8\xB8\xE3\xBF\x3B\xC2\xEF\xB6\x0E\xC5\x0A\xC1\xEA\x9C\x80\x8F\xC0\x1E\xC0\xC1\xBD\x87\xBA\x25\x1F\xB6\xA2\x0B\x29\x76\xCF\x1B\xFD\xB6\x3F\x2C\xFC\xBD\x3A\x44\x05\xCB\xE6\x8C\x37\x7C\xB6\x4C\xBF\x04\xB6\xE3\xBA\xDA\x1A\x08\xD2\xF7\xBE\x58\x0D\xC1\xFD\xBF\x14\xC2\xCB\x9F\x24\x01\x09\xC5\xD0\x93\x82\x81\x02\x95\xC0\x67\xC3\x25\xC7\x6F\x69\x09\xC2\x08\x1B\x82\xED\xBB\x9D\xC1\x17\xBE\x0E\xC1\xC6\xBB\x06\xDC\xFE\xB2\x81\xB5\xB9\xE6\xBB\xBD\xBD\xF8\xB8\x15\xC8\x01\xDF\x06\xEE\x77\xE1\xB8\xF0\xBB\x33\xBE\x1C\xBB\x73\xBC\x85\xBD\xDC\xA7\x58\x3A\xBF\xBC\xC1\x45\xC2\xDF\x23\x80\xB7\xBA\xA6\x04\xC8\x68\x88\xC1\x58\xBF\x6F\xBE\xFE\xBE\x20\x0C\xFF\xB3\xF2\x8A\x83\xAE\x92\x06\x03\x66\xC0\x81\xB7\x19\xC0\x00\x11\x06\xC3\x84\xD3\xC1\x11\x77\x6A\xC1\x40\x07\x1A\xCB\xF7\xB9\x06\xEF\x75\x9F\xC1\xE2\xBB\x50\xC2\x35\xB8\xA2\xB1\x0E\xDD\xFE\xA3\x83\x9C\xB9\xA9\xC1\x56\xC1\xF9\xBC\x15\xC0\x0B\xD9\xF0\xAF\x82\xC5\xC0\x81\xBF\x1B\xBF\xF2\xB4\x4F\x1D\xBC\xB0\xED\xA2\x78\xAA\x66\x74\xB6\x51\xB0\xB9\xBC\x8A\x23\xC0\xB8\xDE\x85\x6D\xF7\xC1\x52\xC1\x53\xBD\x09\xC4\x22\x08\x0C\xDE\x07\xCF\x82\xCB\xC1\x09\x02\x81\xC3\x80\xB4\x20\xC6\x10\xDB\x09\xC8\x84\xD3\xBF\x1D\xB9\xEA\xBD\x0D\xC7\xFA\xB9\x03\xD4\xF9\x8E\x80\xA0\xC2\x0E\xBB\x89\xC1\x79\xBF\xFB\xBA\xCD\xB7\x08\xDA\x73\xC4\xBB\x48\xC0\x74\xC2\x12\xC4\x78\xB6\xCE\xB2\x05\xC4\x79\xF8\xB7\x47\x19\x15\x42\x8C\x9E\x24\xCF\xBC\xB3\x59\x29\x84\xBB\xC1\x71\x4B\x5E\xC1\x6C\xBC\xB9\x15\xC0\xB9\x39\x22\x80\xD0\xB9\xC3\xBF\xE9\x19\xF1\xBE\x0A\xCE\x08\xD8\x02\xF8\x84\x81\xC2\x65\xBE\x03\xAE\x70\x94\x00\xC0\xFD\xA2\x00\xEB\x6B\x08\xC0\x41\xC2\x05\xC3\x0D\xC4\x01\xCD\xFD\xBA\xFE\xA3\x77\xCA\xC2\xA3\xC1\x8A\xC2\x39\xC6\x29\xCD\xDE\xB0\x0A\xF5\x81\xFA\xBE\xDD\xBE\xDA\xBF\x3A\xC7\xB0\xB4\xDD\x07\xE1\x8D\x7B\x87\xB4\xF7\xBF\x7C\xC0\xBB\xBB\x1F\xC3\x10\x1D\x07\xC7\x68\xFE\xBF\x20\x02\x00\xC1\x5D\xC6\x00\xC3\xF6\xBA\xFC\xB1\x85\x86\xB8\x7F\x93\x34\xBE\xF4\xBA\x21\xC0\x00\x0C\x08\xDD\x7F\x8E\xC2\xD1\xB8\x88\xC1\x82\xBF\x2F\xC3\xD5\xB7\xE6\xAB\x7E\xE0\xBF\x44\xC0\x26\xB6\x11\xC5\xB8\xB6\x0E\xDA\x00\xC9\x77\x9F\xC2\xB2\xC3\xF9\xB8\x12\xBC\xB9\x1B\xC4\xB1\x3B\x48\x68\x91\xC3\x8F\xBF\x62\xC3\xC3\xBF\x18\xC7\x02\xC9\x06\xF7\x84\x80\xC2\x96\xBF\xCF\xC2\x59\xC3\x2E\xCE\x19\xC5\x00\xF2\x85\x96\x93\xA2\xC3\x19\xC1\x02\xC6\xFA\xBB\x00\xD8\xFE\xBD\x85\xC7\xC2\xB9\xC3\xA4\xC1\x6B\xC4\x22\xCC\x14\xCD\xEF\x84\x86\xFB\xBE\x86\xC2\xB0\xB8\x47\xC0\x29\xCE\x11\xCA\x07\xDA\x73\xC7\xB8\xBD\xC2\x3D\xBC\x95\xB3\x18\xC7\xBE\x04\x01\xFA\x7B\xC4\x26\x35\xC3\xCB\xC3\x3F\xC1\xC3\x0A\x19\xD1\x01\xF6\x85\xE3\xBA\x3D\xC2\x01\xB7\xD4\x98\x2F\xC2\xC7\xA2\x0A\xE4\x81\xC4\xC2\x68\xC1\x6D\xC2\x1A\xC1\xB2\xBC\x06\xDD\x08\xC0\x81\x82\xC3\x14\xC0\x9B\xB9\x6C\xC0\xF0\xB1\xB1\xB9\x08\xC6\x88\x9A\xBA\x88\xC2\x73\xC2\x62\xC7\x3C\xC4\xD8\xB9\xFA\xB3\x84\xE3\x24\xA5\xB7\xFF\xB3\x22\xB8\x4E\x86\x21\xCE\xEB\xBE\x37\x6E\xC3\x62\xC3\xF8\xC2\x81\xB0\x33\xCE\x06\x15\x0F\xE0\x81\xF7\xC3\x74\xC2\xFB\xC0\x67\xC7\x00\x9C\x1F\xDA\xE6\xBE\x87\x9A\xC1\x00\xC4\x4F\xC2\x80\xC0\x14\xCD\x0D\xD1\x00\xF4\x78\xA4\xC1\x0F\xC5\xDF\xBB\x82\xC1\x68\xB9\xC1\xAE\x10\xE4\x87\xC5\xB5\xE3\xC3\xEC\xC1\x86\xB8\x95\xBC\xA7\xB9\x03\xE8\x74\x9F\xC4\xC2\xC2\x64\xBC\x71\xC4\x2D\xC6\x1C\xCE\x0B\xC8\x87\xCA\xBF\xCA\xC3\x4A\x13\x3F\xB8\x3F\xC1\x25\xCE\x06\x47\x80\x9E\xBF\xD3\xC3\xA1\xC1\x75\xC5\x28\xC5\xFA\xBB\x01\xFB\x7D\xBD\xC0\xAE\xC2\x1C\xC7\x8F\xC3\x08\xC1\x07\xC9\x10\xFF\x6C\x61\xC3\x9F\xBB\x08\xC6\x99\xC2\x90\xBB\x04\xC8\xF3\x95\x88\xFA\xC1\x17\xC5\x01\xB9\x33\xBA\x4E\x1F\x1B\xD1\x09\xDD\x88\xA1\xC4\xC5\xC2\x9B\xC2\x93\xC4\x3E\xCC\x0C\xD5\x12\xD3\x89\xA9\xC4\x27\xC5\x15\xC7\x5D\xC0\x4B\xC9\x17\xD4\x0E\xFB\x85\xD6\xC3\xE6\xC0\xBF\xC2\x44\xC3\x3B\xCB\x14\xCF\x03\xEC\x7E\xE5\xC4\xAA\xC1\x1E\xC5\x39\xC3\x4D\xC2\xF4\xA9\x02\xE7\x7F\xE6\xC3\xED\xBB",
"\x73\xB8\x73\x19\x9D\xB4\xFF\x09\xD0\x80\x87\xC4\xC1\x32\xC3\xF7\xC0\x23\xC1\x4F\xC2\x1F\xC7\x0E\xFC\x89\xB9\xC2\x7E\xC4\xE6\xC2\xF3\xB9\x55\xC0\x1D\xCD\x11\xED\x77\xAF\xC4\xD6\xC1\x18\xC6\x36\xC6\x28\xCE\x25\xDD\xFE\xA0\x89\xDC\xC3\x8E\xC4\xD8\xC0\xA4\xC2\x23\xC3\xDC\xBE\x11\xC2\x89\xC0\xC4\x6A\xC5\x48\xC7\x5F\x90\x37\xCC\x20\xC7\xE3\xBF\x67\x86\xBA\xE8\x11\x28\xC0\x5A\xC0\x44\xC2\x0F\xD5\x02\xFC\x83\xD7\xC0\xD4\x1F\x35\x2E\x89\xC6\x12\xC8\x22\xCD\x0E\xDB\x86\xCF\xC3\x67\xBE\x42\xC5\x7F\xC2\x2F\xC6\x06\xDC\x0B\xC9\x8A\xD8\xC3\xC5\xC5\x83\xB5\x81\xC3\x4C\xC6\xD5\xA2\x13\xFF\x8A\xE4\xC4\xA7\xC0\x8C\xC3\xA4\xC2\x58\xC0\xC4\xB2\xFD\xB7\x86\x98\xC5\x7B\xBF\xE8\xC0\xBE\xB9\x54\xC2\x16\xD9\x10\xCC\x37\x25\xBA\x8D\x20\x4F\xC6\x9D\xC0\x4E\xC2\x2A\xC8\xFC\x8C\x89\xFA\xC4\xD1\xC5\xE4\xBF\x0A\xC4\x55\xCF\x9B\x80\x14\xD4\x8B\x82\xC5\xF2\xC4\x4C\xC1\x96\xC7\x3F\xCB\x25\xC1\x10\xF4\x8A\xDC\xC1\x04\xC4\x6F\xC0\xA5\xC2\x2A\x86\x2E\xC1\x17\xE8\x8B\x96\xB8\x13\xBD\x75\xC4\xAF\xC7\x8B\xB1\x24\xD6\x18\xDD\x74\xF0\xC5\xDD\xBE\x4D\xC4\x74\x18\xA9\xB7\xE2\xA5\xD0\x9F\x8A\xED\xC3\x49\xC4\x80\xBE\xBF\xC7\x59\xCD\x16\xC1\x18\xD0\x82\x84\xC6\x60\x42\x2A\xC6\x73\xC0\x34\xCD\x2A\xDA\x16\xEE\x88\xDC\xC5\x9C\xC0\x6F\xC7\xC4\xC4\x60\xB5\x2B\xC6\x07\xF7\x8A\x8D\xC5\x3B\xBE\x38\xC1\xBA\xC7\x29\xCE\x2B\xDE\x18\xEB\x82\xC1\xC5\x1B\xC7\x61\xC4\xC8\xC6\x1C\xCC\x0E\xC1\xF4\x83\x70\xEB\xBA\x2A\x66\x65\xC6\x87\xC1\x2D\xCF\xDC\x0B\x0B\xEC\x8C\xCD\xC4\x2E\xC7\xB7\xC1\x72\xC3\x66\xCB\x1C\xC4\xCB\x86\x8C\xD2\xC1\x76\xC3\x84\xC4\x35\xC3\x61\xC0\x23\xCD\x18\xF2\x88\x8F\xC6\x03\xC4\x1E\xC3\xB8\xC7\x5C\xC5\x2E\xC8\x10\xEC\x8B\x9A\xB9\x43\xC7\xC2\xC1\xD1\xC4\x47\xCD\xC7\xBD\x18\xF4\x8D\xEC\xC4\x54\xC2\x42\xBB\x9B\xC3\x32\xC7\x21\xDE\xFD\x88\x76\xEE\xB4\x07\xB4\x7C\xC1\x70\xC4\x5E\xCD\x2C\xD4\x09\xE4\x8A\xA3\xC4\xF3\xC2\x91\xBD\x9F\xC4\x6B\xC2\x25\xCA\x15\xEF\x80\xB0\xC6\xE6\x8E\x57\xC7\xDE\xB8\x56\xCB\x10\xD2\x15\xCF\x84\xB3\xC4\x11\xC3\x1A\xC6\x28\xC2\x02\xCE\x36\xC9\x1A\xF8\x78\xBB\xC5\x39\xC5\x5E\xC6\xC6\xC1\x74\xCC\x31\xC8\x1A\xE4\x8E\xCA\xC6\x6D\xC5\x75\xC2\x73\xBF\x98\x1B\x18\x0B\x09\xCD\x5C\x04\xB4\xAB\xBA\x13\x09\x6B\xB8\x2C\xCF\x35\x43\xE0\xB3\x76\xFE\xB4\x82\xC6\x50\xC7\x9D\xC5\x70\xC5\x06\x02\x11\xC5\x68\xA4\xC4\xD3\xC4\xB0\xC6\xA0\xC2\x66\xC7\x2D\xD4\x19\xD9\x8B\xA3\xC3\x64\xC7\x58\xC6\xD9\xC3\x56\xCD\x25\xD0\x18\xEA\x8D\x92\xC6\x6F\xC6\x8A\xC5\xE7\xC7\x74\xCF\x39\xD1\x1B\xE0\x87\xF3\xC6\x7D\xC1\xD2\xC6\xBB\xC0\xC8\xB4\x2C\xD7\x1B\xF9\x66\x2B\xC7\x6A\x1B\x8B\x0E\xEB\xC1\xC4\xB3\xA0\xB4\xEE\x8C\x5D\x56\xBB\xF0\xBD\xE9\xB4\xEF\xC3\x80\xBC\xDD\xA3\xFC\x87\x82\xFB\xC5\x7C\xC7\x7E\xC6\xB3\xC5\x32\xC0\x2D\xC0\x7F\x12\x8B\x8B\xC7\xC5\xC7\xAE\xC5\xC1\xC6\x5A\xCA\x22\xD8\x16\xD7\x89\xC8\xC7\x85\xC4\x2D\xC7\xA1\xC4\x4B\xCD\x00\xDD\x19\xFB\x8C\xF0\x00\x3F\xC7\xC0\xC1\x77\xC2\x1C\xCB\x23\xD9\x1E\xE7\x89\xD8\xC7\x1E\xC5\xA3\xC7\xF6\xC3\xEF\xB3\x21\xD9\x14\xD2\x7B\xAB\x67\x70\xBD\x92\xC6\x92\xC0\xC9\xBB\xDF\xA6\x6C\x3D\x77\x9A\x45\xE3\xC7\x27\xBC\x73\x1B\xC0\xBC\xE2\xBC\xC2\xB9\x8E\xA8\xC6\x84\xC6\x63\xC1\x85\x2E\x77\xC4\xA0\xA0\x1E\xF8\x8F\xFD\xC7\xC6\xC7\x98\xC7\xD7\xC7\x20\xC1\x36\xD2\x1C\xDD\x7F\x94\xC7\xA5\xC2\xCB\xC5\x6A\xC0\x73\xCB\x1A\xCB\x14\xD3\x76\xE1\xC4\xD3\xC6\x72\xC5\x05\xC0\x63\xC7\x01\xDE\xEC\xBE\x75\xF6\xC6\x0E\xC8\xBC\xC4\x31\xBB\xC3\xB2\x12\xDE\xF0\x9A\x90\xAA\xC6\xF3\x27\x93\xC1\x21\xAC\xC4\xB4\x3B\xD0\xED\xAA\x78\x80\xC7\x06\xB5\x13\xC8\x76\x1C\x59\xCA\x42\xD0\x0F\xC7\x8E\xBF\xC7\x89\xC7\xAF\xBF\x0B\xC9\x50\xCE\x3F\xDD\x0C\xEB\x8A\x8C\xC7\x56\xC5\xC8\xC6\xCD\xC7\x55\xC8\x33\xD8\x06\xFA\x8C\xD1\xC7\x3C\xC6\xE7\xC7\x97\xC3\x6D\xC6\x34\xC3\xDF\x95\x8C\xDE\xC7\x59\xB8\xD0\xC6\x10\xCA\x52\xC6\x44\xCD\xEF\xB6\x86\xDC\xC7\x4B\xC7\x03\xC8\x7D\xBB\x4D\xC9\x41\xCE\xF8\x9B\x90\xD2\xBB\x03\xB4\x25\xBF\xF8\x38\x1E\xC1\x16\xCB\x1F\xD0\x79\xD2\xBC\x07\xB5\xAE\x0D\x22\xC1\x85\xC3\x1C\xCB\x21\xDF\x91\xAD\xC8\x61\xC9\xFF\xBF\x18\xCF\x60\xC5\x46\xC3\x00\xFC\x8F\xE4\xC8\x31\xC8\x35\xC8\x00\xCB\x5B\xC6\x28\xDD\x16\xC8\x8A\x87\xC8\x8A\xC4\xCD\xC4\x60\xC4\x73\xCB\x40\xD6\x08\xCD\x90\x91\xC8\x7C\xC8\x3A\xC2\x78\xC6\x74\xCB\x47\xC8\x1D\xF9\x8D\xEE\xC4\xB2\xBC\x4A\xCB\x21\xCA",
"\xE1\xB4\x48\xCE\x22\xC6\x67\xEA\xC3\x0C\x76\x3A\xBE\x89\xBE\x84\xCF\x4E\x03\x49\x1A\x24\x69\xC7\x72\xBC\x56\x43\x25\x44\xBA\x16\xF1\xA2\xD9\x96\x7D\xFC\xB4\x82\xBF\x10\xC9\x71\x2C\x85\xC3\xA0\xAE\x21\xE8\x8A\xE8\xC8\x7F\xC5\x4F\xC8\x27\xC9\x94\xCC\x22\xCB\x23\xD3\x8E\xED\xC8\x0D\xC3\x37\xCA\xE7\xC2\x5F\x20\x2E\xD8\x23\xF2\x6E\xD0\xC7\xE3\xC8\xE9\xC5\x2B\xCB\x30\xCF\x4A\xC7\x12\xE2\x8E\xFD\xC8\x7B\xBF\x3F\xC8\x05\xCE\x48\xC2\xBD\x00\x00\x3B\x81\xF6\xB6\x49\xC8\x36\xB7\x80\xB3\x47\xBD\xA3\xB0\x09\x63\x8A\xBA\xC3\xFF\xB3\x21\xB5\xF0\xB8\x9A\xB1\x4D\xDF\xF7\x96\x7B\x86\xC7\xFF\xC5\x52\xC7\x9E\xC2\x71\xC7\x4D\xD9\x1F\xCD\x8E\xDE\xC6\xDA\xC8\xE1\xC5\x27\xCB\x50\xC3\x4A\xD7\x19\xE5\x92\xB9\xC6\xA7\xC8\x38\xCA\xBD\x25\x9C\xC9\x4F\xD0\xE3\xB6\x88\xAA\xBF\x77\xC9\x8E\xC8\x7A\xBE\x7A\xCD\xFD\xA8\x13\xC7\x91\xB4\xC9\x6C\xC7\xB2\xB4\x3D\xC9\x7C\x16\x4F\xC8\xFA\xA6\x93\xC8\xB7\x02\xB4\x7E\xCA\xE1\xB8\x49\x33\x3F\xC4\xD3\x8D\x8D\xC7\x1B\x03\xB8\xC6\xBF\x7A\xC0\x9A\xCC\x45\xD5\x24\xDE\x91\x89\xCA\x88\xC6\x53\xC4\x43\xC8\x2E\xC8\x4D\xCE\x1C\xDE\x81\x90\xC7\xDD\xC9\x8A\xC8\x1B\xCF\xA2\xCE\x46\xD9\x28\xE9\x93\xF1\xC8\x69\xC7\x39\xC8\x3A\xCC\x7A\xCE\x11\x81\x29\xF0\x92\xE7\xB7\x24\xCA\x73\xC2\x49\xCE\x8F\xC8\x44\xD7\x2A\xCA\x91\x81\xBA\xE6\xB8\xDB\xBC\x32\x71\x98\x1A\xC4\x44\xC8\x39\x7E\xC8\xC9\xF1\xC1\x2E\xC8\xD0\x26\x6F\xC4\xDD\x00\xFE\xBB\x94\x84\xCA\x3D\xCB\x5D\xCB\xCA\xC4\x7E\xCD\x32\xD6\x1F\xC2\x8C\xDA\xC0\x48\xCA\xC3\x87\x0C\xCE\x27\xC5\x43\xDE\x26\xF7\x90\xE0\xC9\xA7\xC2\x71\xC8\x55\xCA\x6A\xB6\x40\xDA\x28\xC9\x90\xAC\xC9\xB9\xC5\xA6\xC1\x3B\xCE\x7E\xB5\xB1\xBB\x2A\xF1\x93\xDD\xCA\xEE\xC9\x7F\xB9\xF7\xC2\xA4\xCC\x0F\x44\xD0\x8E\x6B\xEE\xBF\x0D\x41\x2A\xC9\xDF\xC4\xFE\xB5\x4B\x55\x13\xF0\x95\xA9\xC6\x07\xCB\xDE\xC7\x25\xCD\x9A\xC9\x49\xD9\x0C\xDB\x92\x92\xCA\xDC\xC8\xBD\xC9\x44\xCC\x86\xC8\x30\xD6\x21\xE6\x83\xB8\xC8\xA6\xC2\x73\xC0\x6A\xC2\xA1\xB2\xB8\xBC\x28\xDE\x95\xB0\xB8\x53\xCB\x5A\xC9\xCB\xB6\xAA\xC1\x59\xD8\x2A\xC4\x91\xE4\xC1\xF0\xC9\x0C\xC0\x64\xCC\xB1\xCF\x31\xC9\x1D\xE7\x87\x8C\xC3\x18\x1F\x10\xC0\x95\xB7\x64\xCE\xB9\x1A\x25\xD0\x91\x88\xCA\x57\xC6\x80\xC6\x5D\xCF\x65\xC5\x54\xD0\x28\xE7\x91\x8E\xCA\x69\xC9\xA4\xCA\x74\xC1\x80\xCC\x30\xC3\x20\xCE\x8C\xCD\xC7\x51\xCA\x5B\xC4\x1D\xCF\xA5\xCF\x1A\xCA\x2C\xFA\x91\xA9\xCA\xB1\xC9\x7D\xBB\x61\xC3\x82\xC9\x18\xD3\x2C\xF7\x96\xC4\x33\x4D\xC1\xFF\xB3\x13\xC0\x72\x12\x35\xC7\x12\xC5\x94\xCF\xC8\xA1\xCA\x6A\xCA\x80\xB6\x9A\xC4\x54\xD8\x2E\xD9\x93\xD7\xCB\x30\xC8\xFD\xC7\xFF\xC3\xBB\xC4\x4A\xC2\x20\xE6\x92\x84\xC8\xD7\xC3\xC2\xCB\x53\xC8\x81\xC3\x5E\xD4\x2C\xE5\x97\xDE\xC3\x8B\xCA\x4F\xB7\x8E\xBB\x74\xCA\x5B\xD5\x14\xD2\x85\xC4\xBE\x2B\xCB\xA0\x19\x4B\xCF\xEF\xBF\x52\xD8\xD1\xBB\x93\xF6\x1C\x47\xB7\xA2\x21\xD2\xB7\xF0\x93\xC0\xA5\x04\xC1\x83\xB0\xC2\x9F\xCA\xE7\xC9\x7E\xCB\xB4\xCB\x5F\xC5\x2D\xE5\x88\xA7\xCB\xAC\xCB\x89\xC8\xF1\xC1\xC0\xCF\x50\xC7\x1E\xC4\x98\x96\xCA\x06\xCC\x8C\xC8\x82\xCF\x5B\xCA\x60\xC3\x2C\xE7\x93\x9F\xCA\xDD\xBF\x07\xCC\x03\xCF\xBC\xC5\x47\xCF\x20\xD4\x98\xE8\xCB\x75\xC6\x94\xC9\x91\xCF\xAB\xC3\xD4\xB5\x0A\xCD\x91\xB4\xC1\xCE\x10\x43\x2B\x2D\xC3\xB9\x19\x0B\xDC\xB4\x0C\x92\xB5\xC7\xFF\xB2\x60\xC2\xFB\xC5\xBE\xC4\x5C\xD7\x2F\xC6\x92\xCF\xCB\xA2\xCA\xA0\xC8\x18\xCA\xA8\xC2\x46\xCD\x28\xF4\x98\xD9\xCB\xAA\xCA\x00\xCC\x28\xCA\xC0\xC2\x4A\xD7\x31\xCB\x95\xB9\xCC\x4D\xCB\x1D\xCC\x2A\xCE\xB6\xCD\x5B\xD1\xD6\x07\x96\xB7\xC4\x41\xC8\x24\xCD\xF5\xC7\xB7\xCA\x2E\xC1\x2E\xF5\x86\xC3\xCB\x12\xCC\x57\xC1\x20\xCA\xA3\xC7\x53\xCB\x6E\x2E\x83\x9F\xB7\x68\xCB\x46\xCA\x5A\xCB\x1E\xCF\x9F\xB5\x07\xE7\x98\x81\xC7\x3C\xCA\xD0\xCB\x58\x9A\xBF\xCC\x85\xBC\x2F\xDB\x8D\xFE\xCB\x46\xCA\x4A\xC1\x5E\xCA\x6C\xC9\x10\xC9\x1E\xD5\x8E\xCB\xC7\x97\xC6\xB4\xC4\x8D\xC1\x62\xC0\x64\xC6\x07\xC2\x99\xAE\xC9\x44\xCD\x97\xCA\x63\xCA\xB8\xCA\x64\xCF\x29\xD5\x90\xF1\xC5\x56\xC3\x37\xBF\xE3\x0D\x0F\xBA\x01\x33\x32\xC7\x37\x55\xCC\x75\xB7\x4D\xB2\x41\xCD\xDC\xBF\x9F\xAE\x09\xE8\x6E\xA8\xCC\x1E\xC4\x2F\xCE\xFA\xC3\xD1\xC5\x53\xC1\x08\x16\x86\xC1\xCA\x0B\xCB\x32\xCD\x7F\xCF\xCC\xCF\x5F\xCF\x1C\xD5\x97\xB6\xCC\x62\xC0\x4F\xCD\x0E\xC8\xD4\xCB\x43\xC2\x35\xD9\x8E\xA4\xCD\x9B\xC6\x3C\xCF\x3A\xCF\x80\xCF\x1D\xC5",
"\x29\xD0\x90\xF5\xCC\x16\xCD\x3F\xB9\x3A\xC6\xB8\xC9\x29\xD1\x35\xF4\x66\x34\x17\xF9\xB6\x16\x42\xAD\xCE\xB8\x18\x6B\xCA\x09\xFB\x9A\xAC\xC2\xFF\xB3\xB2\xC3\x43\xCE\xB3\xC1\x6C\xD1\x2B\xE0\x99\x94\xCD\xD3\x1A\x4B\xCC\x94\xC7\xD9\xC2\x43\xCB\x2D\xFC\x95\xAD\xCB\x7E\xCB\xD7\xC8\x60\xCA\xB6\xC2\x58\xD5\x30\xC4\x96\xF2\xC8\xE2\xCB\xDC\xCA\x9E\xCD\xAA\xC9\x67\xCB\x32\xF0\x8D\xFC\xCC\x44\xC7\x23\xCE\xC3\xCE\xC7\xBC\x5E\xD2\x10\xEE\x97\xE0\xCD\xF0\xCB\x01\xBA\x63\xC6\xE0\xB4\x6F\xD6\x2F\xF6\x9B\xAB\xCC\x62\xCC\x4C\xC8\x99\xCA\x93\xC6\x66\xCB\x33\xF5\x98\xFD\xCD\x6A\xCD\x6D\xC8\x9B\xCA\xBB\xC1\x6D\xDC\x2E\xE5\x8D\xDE\xCB\x67\xC6\xF0\xCB\xA8\xCF\x79\xC5\x6A\xC7\x20\xE7\x9A\xEC\xC9\xA9\xCC\xCA\xCB\xAA\xCF\xCF\xCD\x6A\xD4\x2C\xEF\x9A\xA1\xC6\xBB\xC2\xE8\x19\x7A\xC6\xF8\x9A\x2F\xC9\x31\xFB\x8E\xC4\xCD\xD0\xCA\xBA\xC8\xD6\xC3\xBA\xCA\x35\xDB\x37\xD8\x9A\xD6\xCB\xCE\xCD\xA7\xCC\xB4\xCA\x61\xCE\x72\xCA\x1E\xF0\x9C\xCC\xC7\x05\xC8\x84\xCE\xCF\xC5\xC1\xCF\x5E\xC0\x07\xDB\x9B\x9A\xCA\xDD\xCC\xAD\xCB\xB7\xCC\xB8\xC2\x41\xD6\x14\xDB\x80\x83\xCD\x0B\xCC\xF4\xC1\x9C\xBE\x40\xBC\x1E\xCD\x2E\xC7\x9D\xBE\xCA\xFF\xC9\xE8\xCA\x42\xC9\x6B\xCF\x24\xC3\x18\xFC\x9B\xE6\xC8\x51\xCE\x66\xCD\x68\xC6\xB5\xC7\x40\xD0\x2D\xFA\x90\xB4\xCB\xDD\xB7\x1E\xCE\xC1\xCF\xC7\xC9\x6D\xC0\x29\xCD\x9C\xAF\xCA\x61\xCF\x03\xCB\xCE\xCF\x80\xC2\x4F\xCD\x2F\xE8\x9D\xBE\xCC\xFC\x41\xBD\xC5\x81\xB1\x91\xBA\x21\xDB\x56\x2F\x9D\xA7\x12\xC2\xCD\xF8\xBC\xD2\xC9\xCC\xC2\x77\xC8\x36\xF4\x9D\xA7\xC5\xCB\xCC\x93\xCC\x9A\xCB\xC6\xC2\x7A\xDF\xE7\x9C\x9A\xC0\xC2\x05\xCD\xEE\xCB\x81\xCF\xBB\xC9\x75\xC1\x2F\xDB\x9D\x8A\xCE\x13\xCE\xAF\xCD\x62\xC8\xC2\xC9\x73\xDD\x3A\xE8\xCF\x63\xCE\x81\xCD\x8D\xC1\xCF\xCE\xF6\xC7\xCA\xBF\xCF\xA9\x72\x9E\xC4\x19\xCC\xCC\xCF\xC7\xCB\xD2\xCC\x62\xD5\x34\xEE\x98\xC1\xC7\x31\xCD\xD4\xC8\xE9\xCA\xE5\xC7\x72\xCD\x33\xED\x9C\xA9\xCF\x2F\xCF\xD5\xCD\xCC\xCD\xF5\xC3\x73\xD2\x2A\xF5\x9C\x9A\xCA\x37\xCE\x6E\xCD\x84\xCA\x60\xBB\xC3\xB8\x3D\xDC\x9F\xE5\xCE\x17\xCD\xB3\xCC\xB9\xC9\x5E\xC2\x79\xC4\xD0\x98\x99\xCC\x1B\x73\xC5\xB0\x19\xC7\xCD\xCB\xC3\x7C\xD4\xA2\x38\x9B\xCF\x1B\xFA\xCC\xBB\xCE\xD4\xC8\xE5\xC9\x77\xC5\x3D\xFB\x9D\x81\xCE\x7D\xCF\x81\xCF\x01\xCB\xB6\xCF\xE8\xA2\xDA\xA9\x92\xD8\xCD\xAB\xC8\x6D\xCF\xEC\xCB\xC8\xC9\x55\xCA\x3C\xDE\x9F\xAC\xB4\xBB\xCE\x8C\xCC\x19\xBF\xF1\xC3\x78\xDC\x07\x43\x70\x9C\xC5\x2A\x21\xA2\xCD\xBD\xCA\xD2\xCE\x7E\xC5\x3E\xF9\x9B\xC7\xCF\x30\xCD\x7F\xCE\x8C\xCB\xAF\xCA\x1F\xDF\x09\xE4\x86\xB1\xCB\xFB\xCF\x82\xCF\xC2\xCF\xE0\xCE\x7A\xC7\x20\xF7\x99\x86\xCF\x5F\xCF\x05\xCD\xE2\xCA\xA3\xCB\x78\xDA\x28\xCD\x9E\x96\xCE\x0C\xD1\x11\xD2\x6D\x35\xA0\xBF\x4E\x1C\x32\xF9\x9E\x99\xCF\x69\xCA\xB8\xCF\x5C\xCA\x20\x07\x6C\xC3\x33\xC9\x9B\xA4\xCE\xA1\xCE\xE6\xCF\xE8\xCC\x03\xDC\x85\xBB\x0F\xF8\x9F\x9A\xCA\x7E\xCE\x6A\xCC\xE0\xCF\x95\xBA\x75\xC6\x41\xDC\x9D\x8A\xD0\xDE\xBF\x01\xD0\xAA\xCD\x00\xDC\x82\xC7\x40\xD6\x6A\x89\xD0\x64\xCE\xC9\xC9\x0C\xD1\xF6\xC1\x79\xD9\x25\xEF\x9D\xF2\xCA\x51\xC8\xE4\xCA\x65\xB0\x5F\xCD\x10\x32\x40\xDE\x9C\x94\xD0\x0D\x2F\xF7\xCF\x72\x19\xFE\xC8\x57\xD7\x3B\xDE\x92\xA9\xCE\xA8\xCB\x95\xCC\x45\xCE\xCD\xCF\x4D\xCC\x2A\xE1\x93\xCE\xCA\x90\xCF\xFF\xCC\xCD\xCD\xF0\xC1\x64\xDC\x2D\xD9\xA1\xBE\xCB\x38\xB9\x8C\xC6\x9F\xCC\xF1\xC0\x68\xDF\x3E\xDA\xA1\xE3\xCF\x40\xCF\xA3\xBB\x87\xBC\x40\xBC\x5C\xC7\x63\x2A\x98\xC4\xCF\x21\xCE\xD2\xCB\xC8\xCE\xB4\xC5\x72\xC2\x42\xCD\x9B\xC7\xCA\x6E\xD1\x39\xD3\xF3\xC8\xC7\xCA\x7A\xDA\x31\xEC\x9E\x89\xCC\x4D\xD0\xC3\xCB\x13\xD7\x0F\xDB\x5B\xC7\x3C\xD4\x96\xAB\xD0\x0B\xCD\x16\xD3\x82\xCF\x05\xD7\x40\xDF\x39\xCC\x8D\x94\xBE\x4F\xC6\xB6\xBB\x33\xCE\xE8\xCC\x2F\xD8\x13\xD1\xA2\xAD\xCC\x93\xD1\x17\xCD\x25\xD1\x0E\xDD\x7C\xCF\x43\xF5\x9F\x96\xD1\xF7\xCE\xA5\xC9\x1D\xD0\xCE\xC7\x87\xD2\x33\xDA\x94\xFA\xD0\xD6\xCE\x3E\xD2\xA9\xCE\x0F\xD9\x7B\xC3\x22\xC1\xA2\xC5\xC8\xB2\xC9\x34\xC5\xC5\xCD\x15\xD7\x71\xC4\x45\xF9\x66\x65\xCF\x03\xB4\xC3\xBB\x00\xB9\xB1\xB5\x42\xD3\x6E\x1A\x91\x8E\xD1\x5F\xD1\x7B\xCE\x05\xD0\xFE\xC8\x81\xDB\x45\xC9\x9F\xF2\xD0\xCB\xCE\x5E\xD0\x9A\xCF\xF4\xCF\x81\xDF\x3B\xFD\x9F\xC6\x8B\xC8\xD1\x84\xCF\xF5\xCB\xC1\xC9\x7D\xC0\x3B\xDB\x9F\x92\xB5\xD1\xD1\x93\xCB\x34\xD2\xA3\xCE\x8A\xC2\x24\xE0\x8F\x86",
"\x16\x6B\x1B\xD6\xC7\xBB\xCF\x75\xC3\xA0\xB1\x1D\xCC\x30\x2E\xBB\x03\xD3\x14\xBE\x6C\xB8\x8B\xC5\xA0\xBF\x46\xDD\x36\x0F\xD1\x15\xD1\x5B\xD2\xF1\xC9\x17\xD8\x7C\xDA\x40\xCA\x9F\xC4\xD0\xD3\x1A\x23\xD2\x30\xD7\xAF\xC6\x87\xC1\x2C\xF8\xA1\x8D\xD0\xF1\xD1\xD7\xCF\x3C\xD0\xF2\xC5\x8F\xCA\x41\xF7\xA3\xB3\xC3\x51\xC2\x71\xCF\x54\xC3\x89\xC2\xE4\xA3\xD0\xA7\x76\x89\xD2\xA8\xB5\xF2\xC6\xDB\x17\x7C\xCC\xFD\x29\x34\xE7\x9F\xD0\x1B\xED\xC7\x6E\xD3\x73\x1E\x21\xD8\x83\xCA\x34\xFA\xA0\xC5\xCD\x00\x01\x1E\xD2\xC8\xCF\x07\xD4\x89\xC1\x42\xEA\xA3\x97\xD1\x9A\xCD\x4C\xD0\x3B\xD2\xDA\xC0\x82\xDA\x28\xFC\x9F\xE1\xBB\x3D\xC8\x55\xC8\xA3\xC2\x81\xC2\x85\xD8\x39\xD4\xA1\xA9\xD1\x56\xD0\x9C\xB5\x21\xD7\x27\x45\x8D\xCD\x46\xCD\x77\xCF\xCC\x39\x04\x69\xCA\x8F\x2C\x40\xBC\xDF\xBF\x01\x60\x90\xB0\xD2\x02\xB9\xFF\xB0\x09\xC8\x77\xC1\x69\xD0\x48\xE9\xA1\xE3\xD1\x6B\xD1\x72\xD2\x51\xD7\x1C\xDD\x8B\xC9\x33\xFF\xA2\xC7\xD2\xC1\xD0\x3A\xD0\x47\xD4\x18\xDE\x91\xC6\x46\xCB\x98\xA1\xD2\x4E\xD0\xD8\xCC\x79\xCC\x19\xD6\x88\xC0\x44\xF8\x74\x82\xD1\xF9\xD0\xAE\xC8\x16\xD6\x2B\xD6\x4B\xCC\x49\xE8\x79\x97\xC8\xF7\xB6\x95\x12\x58\xD4\x83\xCC\xBF\xA3\xF1\x8D\x0C\x7B\x44\x7C\xC1\x2F\xCD\x68\xCF\x8A\xCD\xF4\xA0\x36\xE7\xA1\xEE\xD2\x3B\x2E\x35\xD3\x71\x1C\x0D\xDA\x13\xDD\x40\xD5\x8B\xF0\xD0\x74\xD3\x75\xD0\xDF\xC8\x09\xDA\x7F\xCE\x4A\xE2\xA0\xDC\xD0\x80\xD2\x51\xD2\x60\xD6\xC1\xC4\x98\xCE\xD8\x97\xA5\x90\xCF\xAA\xD0\xC8\xCC\x2B\xD4\x1F\xDD\x95\xC5\x4C\xD1\x6B\x03\xC9\xEC\xC5\x42\xCB\xB0\xCF\x27\xD4\x11\x09\xF2\xAF\x13\x4B\xBC\x9A\xCA\xF9\xC6\x2F\xC0\xBA\x11\xE5\xAC\x5F\x08\x68\x92\xC9\xCE\x11\x70\xD0\xC8\xCD\xF3\xCE\x83\xDF\x3C\xC3\x95\x97\xCD\x7A\xCE\xA8\xCC\x26\xD3\xFE\xCE\x7C\xD4\x3A\xD0\x9F\xD6\xCE\xD2\xCE\xAC\xCC\x28\xD5\x04\xD2\x9B\xC3\x49\xCD\xA0\xA5\xD2\x90\xCE\x54\xD0\x6E\xD1\x2B\xD1\x47\x9B\x4D\xCB\x98\xFD\xD1\x84\xCC\x6C\xD0\xC7\xBF\x42\xC0\x99\xD6\x80\x82\xA7\xC9\xC9\xC6\xB2\xF3\x4C\x23\xCE\xB8\x17\xE7\xA7\x26\xCD\x7C\xC0\xC9\xC0\xC8\xFD\xD1\xA2\xCC\x4A\xB3\xC0\xA8\x34\x3F\x49\x14\xBE\x08\xD5\x04\xD7\x73\x1B\x1B\xDD\x00\x94\xD2\x96\x3B\x2E\xD2\xCF\xBB\x7C\x11\xE0\x81\xF1\x2A\xA0\xD5\x50\xD6\xA8\xCB\x1B\x0C\xD5\xB1\xA0\xBA\xBC\x4F\xB4\x89\x06\x3F\xE8\x7A\x82\xB4\x2F\xD3\x39\x52\x1F\xA9\x85\x49\xA0\xC3\xE0\xB9\x0E\x87\x1F\x0E\xD5\xE8\xD1\xD5\xC3\x0A\x32\xAE\x99\x03\x12\x1D\x6A\x95\xFA\x2A\xCA\xCC\x73\x18\xD1\x08\xA2\xC9\xD0\x8C\x3B\x02\xBF\x8D\x1D\x16\xD6\xD4\x0C\x5C\x9B\x6E\xD7\x50\xFE\xA8\xEC\xCA\x18\x1F\x06\xB4\x5B\xD0\x9A\xB9\xAD\xB9\x46\xD4\x86\x82\x02\xBF\x00\x84\xBC\x62\x49\x05\xA6\x11\x02\x4D\xC6\x37\x24\xD3\x79\xCB\x74\xD1\x6A\xD6\xF4\xCB\x9A\xCB\x30\xC9\xA1\xD7\xCE\xA1\xCC\x99\xCF\xB5\xCB\x0F\xD1\x80\xC8\x41\xD5\xA5\xDA\xCF\xB5\xCE\x28\xD1\x6E\xD5\x01\xDE\x9E\xD0\x3C\xF3\x97\xCF\x1B\x7E\xBE\x92\x80\x17\xD6\xC3\xC1\x53\xC0\x31\xCF\x7D\x89\xAC\x51\xBF\xA4\xCE\x4D\xCB\x80\xB2\x50\xD4\xD2\x8E\xA4\xC5\xD4\xF3\xD2\xE5\xD0\xE7\xCB\x20\x09\xA4\xD4\x40\xCC\xA9\x8B\x0F\x70\xD3\xD1\xD2\x5C\xD0\x3B\xD6\x7F\xDA\x4E\xC9\xA5\xDC\xD3\x2C\xCE\xEF\xD0\x27\xD1\xFA\xCE\x89\xD3\x3E\xE3\xA7\xD5\xCF\xF2\xD0\x65\xD2\xCD\xCD\x36\xDB\x0A\x87\x49\xE1\x79\x83\xD1\x2E\xD1\xAD\xD0\xBD\xB1\xC3\xCF\x24\x17\x27\xFA\x9A\x94\xCB\x6C\xD4\x2E\xB2\x4C\xC9\xC1\xA7\xF8\xA0\x4A\xC6\x71\x8A\xBF\xCC\x1A\x9D\xCB\xFB\xC4\x48\xDD\x7E\xCF\x4B\xC9\x04\x7D\xD4\x10\xD3\x3F\xD6\x93\xD4\xF7\x06\x9D\xCA\x36\xC4\xAA\xC0\xD1\x86\xD4\x68\xC3\xA6\xCD\x4A\xD0\x79\xD7\x52\xE1\xA7\xD9\xD4\xD4\xCF\x2D\xD5\x32\xD5\x4B\xDD\x87\xC6\x45\xF6\x9E\xEA\xD3\x0D\xD1\x31\xD6\x0C\xD7\x1C\xCA\x92\xD7\x14\xC8\xA2\xAF\xD1\x03\xB5\x50\xB4\xEE\xBC\x97\x1F\x9F\xDA\x3C\xC4\xA7\x98\xC4\xF6\xC4\xE8\x1A\x5B\xCB\x55\xDE\x21\xD8\x53\xC4\x7F\xC7\xD4\x01\x02\x58\xD6\x74\xD0\x39\x56\xE0\x93\x55\xCB\x2E\x35\xD5\x40\xD1\x5B\xD4\x5E\xD1\x57\xD5\x10\xDB\x55\xC7\xA1\xD6\xD4\xAD\xD3\x05\xCF\x53\xD2\x35\xC6\xF3\xAC\x0D\xFF\x90\xB8\xC5\x41\xC7\x47\xC7\x6D\xD1\x59\xDC\x9E\xD5\x38\xA5\xA9\x8D\xD0\xF0\xD3\xB4\xCE\x65\xCC\xFD\xBF\xAC\xAF\xFF\x97\x99\xA6\xC2\x9C\xCB\x04\xAE\x0D\xD4\xFB\xCE\xAD\xCA\x0B\xE0\xAB\x80\x00\xE2\xD5\x5A\xD3\x92\xD5\x5C\xD1\xA8\xCF\x52\xC3\xAA\xCE\xCE\xD9\xD3\xFD\xC4\x6A\xD6\x22\xD2\x87\xCB\x4A\xD5\x9D\x9F\xCD\x58\xD5\x6A",
"\xCE\x96\xD1\x2A\xD0\x80\xD3\x4A\xC8\x96\xF9\xD5\xBA\xC5\x7D\xD7\xB2\xD2\x59\xDC\x85\xDF\x57\xCB\xAB\x81\xD6\x90\xCE\x91\xC4\x75\x1D\xDE\xBA\x93\xCB\x6E\x01\x6C\xB6\x10\x4F\x5B\xE4\xD2\x58\xC5\x40\xD2\x19\xC5\xD0\xAD\x9D\xE0\x0C\xAD\xD5\xD0\xD3\x49\x01\x62\xD1\x3F\xDB\x0F\x72\xAA\x95\xD6\xB4\xD4\xA6\xCD\xDD\xCD\x0D\xD8\xA8\xD6\x4B\xDB\xA7\x99\xD6\x03\xCD\x4D\xD3\x9B\xCD\x13\xD1\x67\xDF\x44\xFC\x98\xA1\xD1\x0B\xCD\x13\xD1\xB1\xD1\x05\xD9\x9E\xD6\x54\xCD\x88\x92\xCE\x2F\xCA\x97\xD4\x17\xD0\x66\xDD\x80\xC5\x34\xCB\xA8\xF2\xCB\x55\xBF\x2C\xC8\x9F\xB5\x61\xDB\xA2\xD7\x10\xE7\x24\x44\xD6\x93\xCE\x6D\xA9\xE9\x96\x5C\xD7\xEE\x08\x57\xC5\xA5\xEA\xD5\x53\xD5\x4C\xCE\xAE\xD2\x29\xDC\xAB\xCD\x40\xFE\xAA\x8D\xD5\xE2\xD3\xAB\xD4\x79\xD1\x6B\xD3\x8A\xCC\x4C\xE5\xA2\xDC\xD6\x0D\xD0\x64\xD7\xCA\xD5\x5F\xD0\x2C\xDB\x47\xEF\xA7\x9C\xD5\x39\x1A\x0E\xCC\xA8\xD7\x0F\xCE\xA6\xC1\x04\xC0\xAA\x80\xCA\xCC\x1A\x13\xCF\x96\xC9\x92\xCB\xB6\xC1\x5A\xDE\x61\x6F\xD6\x4A\xD5\xDA\x93\xD1\xD2\x22\xD7\x81\xD4\x48\xD9\xA0\xA6\xD3\xC3\xC6\x8C\xD3\x73\x1A\x23\xDA\x97\xC2\x38\xDD\xA4\x84\xCE\x1F\xD3\x65\xD5\x6C\xD4\x70\xD3\x9B\xD6\x3D\xE8\xA7\x89\xD7\x5E\xD7\x8A\x8C\xCB\xD1\x6C\xDA\xA9\xC4\xE7\xB7\x92\xEB\xC1\xE6\xCC\x0C\xCB\xAC\xC9\xCA\xC0\xB7\xBC\x0A\xD5\xA6\xA8\xC2\xD1\xB7\x83\xD5\x9C\xC1\xCB\xCC\x90\xC6\x4E\xEC\xAA\xE8\xD0\x42\xD7\x57\xD5\xE8\xD0\x56\x93\xBA\xD4\x4E\xC3\xA5\xF6\xD6\xBA\xD1\xB9\xD0\xC7\xD5\x2E\xD2\xA5\xDB\x5E\xEA\xA6\xEF\xD5\xBD\xD5\x78\xD4\xE4\xCB\x5E\xDC\x43\xD5\x57\xFE\x90\x8C\xBC\x40\xC8\xC4\xD7\xB2\xD2\x71\xDC\x85\xDB\x5D\xD4\x96\xE2\xD6\xAE\xCD\xDE\xD0\xB3\xB4\x73\xB6\x4F\x1E\xDC\x9B\x36\xD5\xD5\x39\xD0\x30\xD3\x72\xD4\xBA\x1E\x68\xDB\x5C\xC6\x68\xD0\xD3\x0A\xD6\x89\xD7\xE6\xC8\x74\xDE\xA7\xD4\x58\xE4\xAE\xE4\xD1\xA6\xD6\x73\xD2\xF7\xD0\x29\xDB\xB7\xCD\x5A\xDE\xAC\xDF\xD3\x20\xD7\x5F\xD6\xC8\xD1\x58\xD4\xB2\xDC\x52\xE6\xAC\x82\xD0\x28\xD6\xF3\xCA\xCA\xD5\x7D\xDC\xB8\xD0\x10\xCE\xAE\xE6\xD4\xF2\xD6\xA5\xBC\x58\xD2\x52\x1A\xD6\x05\x09\xFD\x8D\xDD\xC2\xC8\xD6\xFF\xB6\x4D\xD6\x8A\xCD\x6B\xCD\x5E\xE8\xB0\xDD\xD5\x9E\xD7\x69\xCB\xD0\xD3\x7A\xD0\x5A\x55\x5E\xCA\x9D\xD2\xCB\x9D\xC5\xFB\xC6\x02\xD8\x75\xDB\x81\xDE\x37\xFC\xB0\xA9\xCB\x0F\xD9\x45\xD4\x78\xD0\x70\xD0\xAC\xCF\x54\xC2\xAB\x91\xD5\xC4\xD5\x65\xD2\xB1\xD0\x0A\xDC\xBE\xCA\x35\xDD\xB0\xBA\xCF\x1F\xD8\x80\xD5\x08\xD9\x24\xCD\x4B\xCA\x49\x29\x9B\xDB\xC2\x27\xD9\xE3\xD5\x21\xAF\x2B\xCA\xBC\xDA\x53\xC3\x70\xF2\xCD\x1D\xD5\xBE\xBD\xE7\xD0\x7A\xDF\xB9\xD3\x61\xC5\xB0\xE3\xA9\x97\xD6\xEB\xD6\x24\xD4\x28\xD9\xBD\xD8\x5B\xCB\xB0\xFA\xD6\xED\xD4\xBE\xD4\xF8\xD6\x6F\xD2\xBE\xCD\x40\xE4\xAF\xD6\xCD\x15\xD9\x61\xD7\x05\xDE\x4B\xD9\xC1\xD4\x3D\xDB\xB0\xCE\xD8\x60\xD7\xF7\xD5\xEF\xD1\x8E\x84\xB6\xCB\x56\xDF\x80\xA6\xB8\xA4\xBD\x59\xD0\x0C\xDC\x8C\xD2\xC3\xD2\x5E\xE7\xB1\xDB\xA9\xBC\x96\xBA\xD4\xF5\x18\x7B\xD5\x91\xDF\x61\xE8\xA3\xAA\xD7\xCB\x1A\xD6\xD6\xD4\xD3\x18\xD4\xB5\xC5\x46\xD6\xAD\xF3\xCC\x82\xCF\x65\xD6\xD6\xD2\x89\xDA\xBE\xDC\x42\xCD\xB1\xBA\xCE\x4F\xD8\xF0\xCD\xB3\xD2\xFC\xCF\xBB\xC7\x0F\xC1\x9D\xD4\x1B\x43\xCF\xFD\x9F\x5B\xCB\x91\xD0\x9A\xC5\x63\xCE\xB2\xB1\xD5\x06\xD8\x35\xD8\x2E\xD4\x8D\xD5\xC9\xC5\x42\xE1\x26\x98\xD9\xC7\x1A\x4D\xDA\xA2\xD3\x6A\xDC\xA8\xD5\x5A\xCE\xAA\x82\xD7\x90\xD4\x91\xD2\xA4\xD0\xFB\xC4\xA9\xC3\xDC\x79\xAE\x93\xCC\x98\xD5\x55\xD3\x20\xDD\x3C\xCF\xAC\xC2\x24\xE8\x71\xF4\x32\x9E\xD2\xE2\xC8\xDB\xD3\xB9\x16\x35\xDC\x53\xF4\xB0\xC9\x71\xB9\xD9\x1B\xDB\xDC\xCA\x69\xD0\x7A\xCE\x63\xD6\xB2\xDC\xD7\xC0\xD8\xE3\x1A\x30\xDB\x6C\xCF\xB1\xD3\x36\xE1\xAC\xCB\xD0\x2B\xBB\x50\xD8\x17\xD3\x94\xD3\xA9\xCB\x62\xD6\xA3\xF9\xC8\x7F\xD8\x54\xD9\x20\xDE\xF6\xC0\xBF\xDE\x39\xD3\xB1\x9E\xC0\xF2\xD3\x6F\xD5\x16\xDA\x91\xB6\x79\xD0\x0C\xE3\xB1\xB5\xD9\x8D\xD8\x83\x00\xDC\xD6\x43\xDB\x17\x56\x61\xFC\xA0\xF5\xC7\x39\xD9\xBB\xC9\x69\xD6\x97\xD7\x9A\xD7\x4B\xF9\xAD\xB5\xC6\x1B\xD2\xD7\xD4\x5F\xD0\x76\xDE\x97\xD9\x43\xF4\x99\xF7\xD9\x84\xCF\x24\xD9\x3D\xDD\x94\xD8\x78\xCF\x66\xCD\x96\xA9\xD9\xDA\xC6\xB3\xCD\x72\xBC\x48\xC0\xCD\xAE\x5E\xF4\xB2\xE3\xD5\x11\xD2\x85\xDB\x37\xDA\x5C\x2E\xD0\xC6\x36\xD0\xB4\x91\xD0\x3A\xD8\xED\xD7\x39\xDB\x08\xDE\xC3\xD4\x68\xC0\x9C\x99\xDA\xF9\xCF\xD7\xD5\x08\xD1\x76",
"\xD0\x9B\xDF\x68\xC6\xAE\xB8\xCB\xE6\xD3\x65\xD7\xED\xD3\x7D\xD6\xD2\xDD\x3E\xFB\xB3\xD0\xD0\xFD\xD8\xDE\xCF\x3F\xDF\x46\xB1\xD0\xCE\x58\xCB\xAF\xE8\xCF\xD6\x11\x85\xD7\x49\x13\x9B\xD7\xDC\x1D\x66\xC8\xA9\xB3\xDA\xE4\xD4\x34\xDA\x24\xDA\x9D\xB4\xCE\xD7\x4E\xD8\xAC\x85\xD5\x1A\xD6\x8B\xDB\x1B\xD8\xA3\xDD\xBA\xC1\x6A\xDB\xB4\xC3\xDA\x1D\xDA\x90\xD2\x51\xDE\x37\xD8\xD4\xCB\x66\xF4\xA3\xCD\xD9\x56\xB5\xA6\xDB\x3B\xC9\x31\xDF\x58\xCB\x4C\xF4\xB5\xF1\xB7\x5B\xD1\x0E\xCF\x03\xD1\x69\xDC\x76\xC7\x68\xF0\xB4\xAE\xD5\x32\xDB\x47\xDB\xDC\xD0\x69\xD7\xAE\xC5\x6B\xF6\xAA\xE7\xDA\xB8\xD5\xB4\xDB\xD3\xD0\xAD\xD1\xB5\xC3\x66\xDC\xB2\xC5\xD9\x9E\xD9\x63\xD8\x28\xD8\x6B\xD0\x79\xD4\x67\xCC\xB3\xF6\xD9\x47\xDA\x7C\xD8\xC4\xCA\x6E\xCF\xD4\xC0\x69\xCC\xAB\xA3\xB9\xE3\xCD\x56\xD9\xA6\xC4\x06\xD7\xD0\xB0\x34\xCF\xAF\x88\xDA\x4B\xC5\xC4\xD8\x2E\xDA\xAC\xDC\xD8\xD5\x5B\xCE\xB6\xE9\xD5\x90\xDB\x75\xD6\x64\xDF\x50\xD0\xB5\xDD\x4E\xEC\xB3\x90\xD8\xEE\xD8\x09\xD8\x3C\xDE\xA9\xB2\xCF\xCF\x29\xDE\xB6\xF7\xDA\xA0\xDB\xBF\xDB\x48\xCB\xB4\xD7\x3D\xC5\x6D\xE1\xB6\xE4\xBC\x2A\xDA\x40\xC9\x35\xD9\x3E\xDE\x85\xC2\x60\xD7\xAB\xD9\xD5\xD4\x1A\x32\xD3\xA0\x11\xF8\xCD\x59\xD6\x6E\xFA\xAF\xFB\xD4\x5F\xDA\xC5\xD8\xF0\x93\xAC\xDD\x29\xD4\x64\xE7\xAE\xBE\xDA\x3D\xD9\x8D\xD7\x4E\xDC\x4A\xD3\xC7\xCB\x56\xFF\xAD\xC6\xD9\x81\xD7\xCD\xDB\xE0\xD5\xB3\xD5\xB8\xCA\x6E\xD1\xA1\xFD\xD8\x04\xD0\xE6\xDA\xB7\xCE\xB9\xD6\xDF\xD1\x6A\xD0\xA1\x85\xD9\x6B\xD5\x01\xB8\xC9\xC6\xE1\xBC\xDD\xC1\x60\xC5\xAD\xBC\xC7\x04\xD9\xD9\xD8\x24\xDF\x42\x04\xDE\xD1\x40\xE6\xB7\xBB\xD8\xE8\xDB\x8B\xD1\x4F\xD9\x23\xDE\x81\xCC\x4A\xEE\xA3\xD0\xD2\xE6\xD6\xA9\xD3\xBD\xD0\x68\xC4\xCF\xBC\xF9\xB9\xB3\xB6\xCF\xEE\xD6\x7E\xDB\x34\xDA\xB4\xB1\xD8\xC0\x55\xF0\xA2\xFF\xB3\x50\xC7\x42\xA9\x36\xD9\xF7\xCC\xD5\xD3\x4C\xFF\x94\xB2\xDB\x30\xDB\x9A\xD9\x50\xD7\xA6\xDF\x2F\x19\x69\xE6\xB3\x91\xDC\x97\xD9\x09\xDF\xEA\xD5\xC2\xDD\xCE\xCD\x4A\xF2\xAB\xAF\xD3\x2F\xCB\xD9\xD4\x7D\xDD\x76\xD0\x85\xCB\x6A\xE6\xB2\xFA\xDA\xE9\xCA\xBC\xBF\x7A\xC9\xBA\xD4\x41\xD3\x6A\xF6\x94\xD5\xDA\x6D\xD6\x3D\xD4\x90\xD6\x32\xBC\x8D\xDE\xD3\x80\xB0\xD4\x69\x8C\xD9\xD8\xDA\x37\xDA\xBC\xD5\x35\xAD\x70\xD0\xA9\x99\xD1\xDD\xD7\xF5\xD9\x5E\xD3\x93\xDB\x97\xDD\x64\xFD\xA5\x9F\xD9\xC7\xD1\xB9\xD9\x93\xB1\xA9\xDC\x85\xC6\x72\xE5\xB4\xE1\xD4\xA6\xDB\x10\xDC\x54\xDB\xC4\xD2\x68\xD3\x6E\xE9\x9D\xFF\xD1\xCD\xCA\xF1\xC4\x5A\xD3\x2C\xD5\x90\xC3\x21\x12\x7F\x08\xD2\xF8\xCA\x5E\xCC\x73\x1F\x76\xC4\xA5\xB7\x72\xE6\x14\x31\xD8\x5A\xDD\xF0\xDA\x82\xDB\xB1\xD7\xC0\xD1\x4B\xC9\xB0\xBA\xDA\x38\xDC\x74\xDA\x8E\xD9\x93\xDC\xE3\xC0\x6E\xFE\xB8\xE3\xD7\x40\xDC\xCA\xCA\x90\xDD\x01\xD7\xDC\xC4\x49\xF8\xB5\x93\xBA\xFA\xDA\xB1\xCC\x7F\xD8\x01\xD1\xC5\xCF\x59\xCE\xB9\xA5\xBB\x10\xD4\xD6\xC4\xB6\xD2\x33\xD3\xD6\x93\xEE\xB3\xA4\xE6\x07\xDB\x3F\xC5\x02\xCE\xD6\x91\xCC\xDC\x19\x49\xD6\xB9\x86\xDB\xDE\xDA\x71\xD3\x2D\xD9\xC6\xD1\xCE\xCF\x68\xF5\x95\x91\xDA\xD4\xCB\xA6\xD5\x98\xD9\xD2\xDF\xBD\xC0\x6A\xEC\xA6\xC2\xDA\xAE\xD2\xA2\xD9\x90\xDA\xCD\xD9\xE5\xA4\x72\xE6\xB6\xEE\xDC\xA7\xD0\x24\xDE\x91\xC9\x9A\xDA\x9B\xD4\x73\xC5\x97\xAA\xDB\xF1\xC5\xFA\xD1\x95\xB7\x3E\xD9\xBF\xC0\x33\xE4\xA5\x9E\xC8\x66\xD2\x26\xBF\x9E\xDD\x7A\xBA\x96\xCE\x61\xDA\xB1\xC7\xC4\x2D\xDD\x71\xDF\x8B\xDB\xCB\xDB\xE8\xC3\x6F\xF5\xB6\x93\xD9\xB7\xDB\xBB\xD5\x6E\xDF\xA2\xDB\xDB\xCD\x60\xFD\xB6\x89\xD5\xBF\xDA\x21\xD9\x04\xDC\x88\xD3\xC1\xC6\x62\xF9\xB1\xC8\xD8\x7B\xD9\xAD\xD7\x97\xD6\x1E\xD0\xE7\xCF\x6E\xF7\x9E\xA3\xDD\x57\xD1\x52\xDF\xD8\xD7\xD4\xD0\xE9\xBA\x76\xE4\x28\x2E\xDC\x6B\xCB\x17\xD9\xD3\x60\x60\x07\x99\xC5\xF1\x99\xA6\xC3\xD3\xDF\xDA\xCE\xD3\x4B\xC4\x73\xDF\xDA\xC7\x6C\xD1\xAF\xB0\xDC\xB9\xDC\x9A\xD9\xAF\xDE\xA6\xDF\xEB\xD8\x69\xD2\xB4\xD1\xD4\xE9\xD9\x9C\x17\x44\xC9\x88\xD4\xCC\xC3\x62\xF0\xB7\xC5\xD8\xC8\xD9\x23\xDA\x32\xDA\xA4\xDF\xD9\xC4\x69\xD1\xBB\x85\xDE\xF6\xDA\x39\xDE\x69\xDE\xBF\xD6\xDA\xC0\x70\xDD\x98\x8E\xDE\x42\x14\xC9\xD2\xBA\xD9\xE2\xD6\xE7\xA7\x4E\xCB\x92\xAB\xD8\x57\xDA\xE6\xD0\x24\xCE\x40\xBB\x8D\x1B\x6A\xC8\xBA\x96\xC9\xBB\xDD\x90\xDD\x58\xDB\xC1\xDC\x18\x1E\x72\xD7\xAC\xF2\xCF\xF7\xDC\xA7\xD4\x6F\xDC\xB2\xDE\xDB\xDD\x34\xFD\xB8\x97\xDC\xF4\xD5\xB7\xBE\x86\xD8\x7D\xD8\xAF\xDD\x70",
"\xC2\x8D\xA1\xDD\x06\xD0\x84\xDE\x56\xD6\xAF\xDC\x95\xC5\x71\xF6\x9E\x9C\xCD\xEB\xBD\xB8\xD4\x7D\xD3\x84\xD6\xDC\x15\x7E\x83\xA8\xB5\xD0\x8A\x4A\x63\xC8\xC3\x98\x2E\xB8\xCD\xD8\x4F\xC2\xA8\xF8\xD7\xA8\xD4\x3C\xB7\x49\x07\xF6\x14\xA5\xBB\x95\x12\xA8\xD2\xDE\x54\x28\x97\xD9\x7F\x42\x54\xBB\xC4\x59\xE7\x0E\x9C\xFE\xB0\xCC\x1A\x10\xC3\x49\x06\xF8\x19\xA2\xD0\xE6\x8D\x17\x0C\xDA\x52\xDC\x31\xD1\xE9\xB7\x40\xDE\xEA\x3E\xD3\xBD\x37\x27\x12\x97\xDE\x23\xD7\x85\xC2\xF0\xBF\x88\x1E\x38\x2C\xAE\x64\x00\xA1\x48\x46\xD2\x3D\x09\x7C\x5E\xF8\xDE\x1E\xF8\x0C\x7F\xB3\x64\xA3\x81\x02\xE4\x1C\x4A\xBF\xF9\xC7\x7C\xC7\xB8\x9B\xCF\xA4\xDF\x70\x16\xA5\x11\x77\x5C\x15\x09\x7D\xC3\x68\xBA\x1B\xAC\xDE\xC8\xDD\x3E\xCF\xF5\xDC\xDC\x15\x51\xF2\xBE\x9E\xDF\x7C\xB5\xD0\xDD\x9E\xD2\x2C\xC9\xFB\xCA\x75\xEF\xA8\xCE\x4D\xBE\xDE\xFA\xD5\x18\x79\xF8\xDB\x49\x0F\x7C\xEA\x12\x7F\xB3\xB3\xDE\x83\x01\xF6\xD8\x41\xB5\xFB\xCC\xE2\x88\xBE\x8D\x2E\xCD\xDF\xF0\xC7\x6D\x0A\xFB\x1A\x28\x11\x7E\xED\x83\xAB\xDF\x14\x59\xD6\xDF\xF0\xDF\xFA\xDC\xDC\x05\x95\x07\xBF\xB4\xDF\xC9\xDF\xA7\xDC\xD1\x21\xFC\xD0\x90\xD7\x38\x1E\x1C\x51\x57\xE6\xDF\xE9\x18\xF0\xD9\xFD\xD2\xFC\xD7\x2D\xC4\xBF\xD0\x1B\x10\x95\xCE\xDC\xFC\xDE\xF2\xD2\xFF\xC0\x9A\x34\xBF\xF9\xDC\xB7\x0B\x32\x26\x37\x11\xFF\xDF\xDC\x1B\x7F\xE8\xAE\x4D\x57\xD6\xDE\xE7\x03\x7F\xB4\xF0\xDA\xFD\xC8\x7E\xC4\xC0\xD9\xDC\x15\x2D\x03\xE2\x23\xD7\xE2\x06\xA9\x1D\xE6\x1A\xAE\x53\x04\x0C\xE0\x43\xCC\xFA\xDF\x01\xE8\xBD\x51\x80\xE3\x85\xD0\x1B\x94\xDF\x0A\xE3\x00\xE6\x43\xCA\xFC\xC2\x68\xFA\xA9\x9A\xE0\x0F\xD2\x0E\xE1\xCE\x13\xC9\xB1\x02\xE7\x6E\x0E\xC0\x9B\x6C\xFD\xDE\x70\xCF\xFF\xDC\xBA\x12\xFD\x09\x08\x1B\xBF\x87\xB4\xDD\xDE\xDF\xC3\xF7\xDB\xE7\x20\x03\xED\x35\x1E\x1C\x79\x57\x35\xE0\xE3\x1B\x0D\xE3\x7D\x59\x03\xF6\x46\xFB\xC0\x98\x1E\xDE\x1E\x1F\xE2\x05\xE4\x05\xE5\x00\xFE\x9B\x05\xC1\x87\x18\x1E\x0F\x0C\x59\x12\xE6\x9E\x01\x24\xB4\x7E\xFD\x04\x26\xE0\x03\xB8\xF5\x1D\xCB\x2E\x4F\xBC\xEC\x00\x7D\xD5\xC1\xE1\xD0\x04\xB4\x96\xDB\xF0\x34\x0C\xE1\xFF\xD8\x80\xC8\x92\xBF\xD4\xD8\xDA\x8C\x1D\x62\xBF\x07\xE6\xA0\xA1\x82\xF2\xFA\x1E\xDE\x5E\x30\x3C\xDF\x06\xE7\xB6\x06\x02\xF8\x7C\xDA\x79\x7F\xDC\x4D\xE1\xA3\xD9\x20\xE3\xE2\xBC\xB3\xC9\x08\x3D\xC0\xF0\xE0\x88\xE1\x44\xE1\x82\xB5\x10\xE6\x10\x11\x82\xF6\xA8\xFE\xB4\x53\xA3\x78\x19\x73\x4D\x00\x13\xEB\xDB\x3C\xCA\xC2\x97\xE1\x11\xBE\x46\xE3\x40\x02\x0C\xE8\x09\xFD\x84\xDE\xC2\x82\xBD\xFC\xB5\x93\x02\xFC\x1F\x13\xE4\x0A\xE5\x85\xE6\xC2\xFE\xB4\x19\xD5\x8D\xDE\x81\xB7\x41\xD0\xA2\xD1\x50\xC1\xBA\x89\xDF\xCC\xC9\xC8\xDF\x49\x02\x8D\x44\x08\xFF\xCF\xBA\x37\x2C\x3C\xD3\x1A\x66\x1D\xDC\xD9\xD1\xB5\xDD\xCC\x7A\xFB\x79\xC2\xC9\x11\x06\xAA\xC7\xED\xDF\xBA\xD7\x0A\xE5\x86\xD7\xA8\x9A\xE1\x0D\x1C\x36\xE3\x72\xCE\x9E\x0E\x4B\xA0\x0B\xF6\xBD\x80\xDF\xC6\xE0\x52\xE1\xC2\xD6\x20\x07\xA6\xC5\xD0\xA5\xC1\xB2\xD1\xBE\xE0\x65\xC8\x2E\xA9\xB8\x18\x0C\xE1\x08\x26\xAD\xD1\xE1\xE0\xE1\x34\xE3\xE2\xBB\xF0\xDB\xA1\xD0\xE6\x9B\x23\x5F\xDD\xDA\xE0\x3E\xBC\xDF\xDC\x98\xC1\x8C\x0C\x7C\xE6\x95\xA5\xE0\xAE\xDF\xEA\xDE\x2C\xE0\xBA\x18\x68\x09\x81\xC8\x68\xD7\xE1\x7D\xDF\x6C\xE1\x7E\xD3\x99\xCA\xF9\xDB\x6F\x1C\xBE\xBF\x87\x53\xE1\x23\xC7\x39\xE5\x83\xC9\x0E\xE0\x86\xCC\x2D\x29\xDD\xE2\xDF\xC5\x02\xE9\xDB\xE7\x1B\x05\xE1\xE3\x5D\xC1\xFC\xDF\xF2\xE1\xF5\xDE\x04\xE4\xB9\x11\xFB\xC2\x80\xC9\x68\xF6\xE0\xF8\xD2\x04\xB7\x33\xE6\xA5\x18\x10\xF5\x7F\xF7\x16\x3B\xDF\x62\x01\xD8\x55\x43\xE6\x45\xAF\x10\xE4\x81\xEA\xBF\xFE\xDF\xEC\xDE\xE8\x1A\xF1\xDE\x22\xEC\xFD\xDC\xD3\x83\xC4\x82\xB4\x1B\xE2\x9B\x19\x47\xE0\x01\xEB\x18\x0F\x7E\xF3\x73\x23\xE2\x41\xA5\x92\xE0\x0E\xE1\x22\xE8\x12\xF3\x88\xD0\x37\x74\xE0\x4A\x7F\x80\xE0\x71\xCF\x25\xEC\x85\xB1\x89\xC7\xC4\xAD\xE1\xAA\xDC\xF2\xDD\x93\xD0\x9A\x4A\xFA\xD3\x7E\xD0\xC4\xDF\xE0\xF1\xE0\x9F\xE0\x75\x1E\xFD\xDC\x12\xE0\x82\xEE\xC4\xFE\xB4\x46\xE3\xE8\x0F\x4C\xE3\x0F\xEA\x10\xEE\x46\x38\xBF\xCC\xE2\xBF\xDF\x11\xE3\x4E\xE0\x2A\xE2\x11\xE7\x81\xD4\x37\x01\xE0\x00\xE3\x15\xE2\x40\xE0\x2B\xEF\x0B\xFF\x80\x72\xC4\xC8\xE2\x09\xE2\xF0\xDA\x05\xA4\x7B\x58\x13\xFE\xA1\xBA\xC4\xCC\xE0\x3C\xE2\x1D\xE1\x4A\xE4\xBA\x14\x01\xEF\x7F\xD7\xC4\xD7\xE2\x54\xB5\xAC\xE0\xB8\x10\x2E\xEE\x11\xEB\x0C\x1D\xC0\xDE\x39",
"\x75\xE3\x3C\xAB\x5D\xE5\x7E\x5B\xEA\xDA\x8B\xD2\xC5\x98\x1E\xF6\xE1\xAA\xE1\x1D\xE0\x30\xE9\xA0\xA2\x8C\xEE\x01\x57\xE0\x9F\x16\x3D\x24\xE4\x19\x31\xE8\x1B\x2E\x91\x9E\xC1\x8D\xE3\x4E\xE1\xBD\xE0\xC6\x1F\x10\xEE\x17\xED\x89\xE6\xC3\xEC\xE2\x05\xE2\xB7\xE3\x51\xE4\x0B\xB5\xFA\xCE\x46\x08\xC1\xE0\xE2\xD2\xDE\xCF\xE3\x53\xE0\x34\xE2\x08\xE2\x8D\xD6\x66\x8E\xE1\xA5\xE2\xAB\xE3\x69\xE1\x30\xED\x16\xF9\x35\xC3\xC6\xAC\xE3\xE1\x15\x2C\xE2\xE9\x1C\x0D\x0C\x19\xEB\x82\xCC\xC6\xE0\xE0\xFF\xB2\x4E\xE1\x84\x92\x19\xEE\x21\xC4\x8A\xD3\x37\x16\xE3\xF1\xCA\xE6\x1B\xEF\xCB\x81\x3C\x1C\xEB\x8B\xFC\xC6\xA9\xE3\xBE\xE2\x59\xB1\x85\xD1\x15\xE9\x1B\xF3\x8C\xFB\xC6\x95\xE3\xBD\xE2\x51\xB2\x1E\xE1\x06\xEC\x07\xF1\x8A\xF4\xC6\xDD\xDA\x53\x30\x40\xE1\x5E\xE1\x34\xE4\x16\xF3\x87\xD4\x37\x42\xD4\x6A\xE2\xE2\xC8\x91\xB2\x90\xC0\xB9\xC2\x6A\x2E\x94\x93\xD7\x1F\xCC\xC2\xBF\x9B\xD0\xCB\xD1\xB9\x1E\x27\xFB\xA0\x9A\xB7\x74\xD5\xB4\xD5\x81\xB0\x23\xE3\xD5\x0B\x0C\xE2\xB1\xBE\xB6\xF7\xE3\xB7\xDC\xE5\xD2\x3F\xE2\xA7\xB4\x29\xF2\xA9\x9A\xB7\x81\xDE\xEA\x1A\xAA\xD6\x34\xEE\x21\xD3\x8F\xD4\xB7\xF6\xDC\x31\xD6\xB1\xC8\xC8\x14\xAC\xC8\xCB\x06\xEF\x15\xC2\xC4\xE1\x71\xE0\xCB\xB3\xB6\xD4\x42\xE7\x24\xD6\x90\xE9\x9D\x8C\xDE\xA7\xD5\xF5\xBC\x56\x0C\x7C\x08\x59\xD4\x51\x9F\xC8\xDF\xDB\xFD\xE1\x7F\x01\xFD\xBD\xF0\xDC\xA7\xA6\x91\xF1\xAC\xA8\xE4\x67\xBB\x6E\xE0\x92\xC1\x41\xB6\xF8\xCE\x26\xD9\x8A\xB8\xE4\x24\xB8\x8F\xB4\xDA\xD6\x47\xE3\x20\xF5\x91\xEF\xA3\xC1\xE4\x46\xBF\x33\xB5\x82\xE0\x0A\xD1\xAA\xD3\x6E\x00\x82\xA2\xCC\x82\xC0\x12\xCF\xD2\xB6\xDC\xD0\x1C\xF0\xE6\xB6\xC8\xE5\xD6\x40\xE5\xDF\xD1\xF0\xD1\x32\xD9\x23\x15\x05\xEC\x01\x3D\xD4\x51\xC7\x6E\x76\xCA\x01\x79\xD8\xF4\xDE\x62\xCC\xAF\x9D\xD3\xBA\xE3\x0A\xE7\x91\xE7\x37\xD9\x25\xF9\xCD\x0D\xC5\xAE\xA4\xF6\xD7\x17\xE4\x98\xCC\x1E\xC4\x25\xF3\x6E\x2B\x1A\x70\xE3\xB8\xC8\x0C\xE5\xD9\xD3\x4B\xE6\x9F\xC3\x5E\xE4\x84\xB5\xCD\xC6\xD6\x2E\xB1\xBB\xCA\x4E\xEB\x99\xCD\x61\xE8\xC9\x86\xB4\x77\xE4\x01\xE5\xC8\xC5\x4D\xE4\x9C\x3C\x93\xDB\xBB\xD8\xC2\xE0\x24\xAD\xC1\x19\x00\x4C\xEA\xE2\xC2\x93\xDC\xB1\xE5\xE4\x3B\xD7\x78\xCE\xCA\xDF\x40\xBD\x23\xF2\x46\x2B\x83\x8C\xE5\xB6\x33\x18\xE7\xC6\xCA\x15\x15\x0E\xEA\x93\xFA\x8D\xEE\xDE\x4C\xE5\x57\xD8\xC6\x19\x96\xDA\x00\xBC\x91\xC6\xC9\xA7\xE5\x7A\xE4\x43\xDB\x35\xDF\x97\xC9\x26\xE5\x91\xEB\xC9\xD7\xD1\xA8\xE4\xD3\xD8\xDC\xD8\xAC\xD0\x0B\xF1\x91\xDB\x88\xA9\xAB\x95\xDE\x53\xE4\x9A\xBA\x0D\xE7\x24\xC4\xD0\x84\xC8\xE5\x1A\x9F\xE5\x5C\xE6\xC1\xDB\x57\xEE\x06\xE1\xF8\x8C\x73\xD9\xDA\x9C\xE5\x57\xE5\x9E\xE0\xDB\xD9\x88\xDB\x14\xC4\xB6\xF6\xBD\xD2\xE5\x64\xE5\xAC\xE1\xC0\xD7\x2C\xD8\x7B\xDE\xC7\xC2\xE5\xDA\xE4\x6A\xE4\xD3\xC0\xCA\xDC\xCD\xDC\x0A\xE4\x74\xF8\x18\xB0\xBD\x6C\xE4\x85\xC2\x59\xE6\xDF\xD2\x59\xD8\x3C\x03\xDC\xC3\xD3\x82\xBE\x7C\xE7\x56\xE4\x9C\x20\x95\xD5\x96\xB5\xE1\x6A\xBA\x6C\xE1\x91\xE6\x4A\xE4\x2F\xE7\xE6\xAC\xCB\x90\x9F\xE4\xE4\xF4\xE1\x16\xD9\x46\xE5\xE5\xD4\xD2\x89\xCA\xC4\xE4\x8B\xE5\x7F\xE7\xE1\x9B\x3C\xED\x6A\x10\x78\xFD\x7E\xFD\xDC\x76\x0F\x3F\xDC\xA1\xE2\xD0\xD0\xDD\x04\x74\xC9\x68\x87\xE6\x9E\xE5\x75\xE7\xB6\xE7\xE7\xDB\x15\xE4\x8F\xC2\xA4\xAF\xE1\x04\xD2\x01\xB6\xF9\xC0\xD6\xD1\xB7\x12\x75\xDD\xB1\x99\xE5\xB5\xDD\x3A\xE7\x73\x18\x63\xE0\x05\xDA\x98\xE2\xCB\xFE\xD1\x74\xDF\xA1\xDF\xC3\xE0\x26\xE0\xEE\xD7\xB5\x11\x95\x6B\xE1\x18\xDF\x39\xE5\xB9\xDF\x50\xE5\xA0\xAC\x99\xF4\x97\xAE\xE6\x8E\xD2\xD5\xC5\xCC\xE0\x64\xE4\x3E\xC7\x77\xE2\xC9\xD4\xC8\x27\xE6\x5A\xDC\x74\x1B\xC5\xBE\xA7\xBE\x99\xC5\xC8\xC0\xE6\x60\xCB\x96\xD1\x15\xD9\x2C\xD2\x33\xE8\x83\xEC\xC3\xE8\x11\xC8\xD3\xA4\xE7\xE6\xCB\x80\xBD\x9C\xC6\x65\x3F\x70\xAD\xE6\x3F\xE4\x85\xE7\x7C\xB9\x60\xEE\x30\xF3\x9F\x00\xBD\xF6\xBB\x42\xDF\x7C\xE0\x37\x13\xCE\xBA\x1A\xFF\x54\xD7\xCD\xFD\x43\x7A\xDE\x67\xE1\x78\xE0\x2C\xCC\x85\xB9\x29\xE4\xC3\xB4\xE4\xD0\xB9\x48\x0D\xC8\xC2\xF1\xDA\x58\x4E\x87\xE6\x77\x03\xE1\x35\xE0\x1D\xE5\x64\xE3\x15\xEC\xA7\xBA\x9B\xD0\xAB\x83\xB8\xFF\xE1\xA0\xE1\x7C\xE1\xF7\xC6\x38\xE2\x24\xD8\xC6\x81\xD2\x24\xD8\x80\xD3\xE9\xDD\x38\xE2\x16\xF8\x8B\xED\xC7\x8E\xE3\x66\xE2\x8C\x1D\x45\xE1\x2D\xEF\x17\xF9\x9B\xFD\xCB\xB0\xCA\x55\xE5\xB8\xE0\x48\xE2\x24\xE0\x1B\xE7\x7F\xCE\xC5\xA6\xE2\x80\xE6\x68\x4B",
"\x00\xBB\x25\xEC\x39\xE4\x91\xC4\x97\x8D\xE7\x84\xCD\xC7\xE7\xC5\x0E\x26\xE9\x6E\x54\x9C\xE7\xCE\xE3\xE2\xE7\xE3\x50\x4B\x00\xB8\x28\xE0\x14\xE6\x96\xC5\xCE\x9F\xE7\x4D\xE5\x95\xE5\xB8\x12\x29\xE9\xC6\xDF\x9E\x43\xC2\xCA\xE0\x95\xE7\xE3\xE2\x79\xE3\x80\xB4\x15\xED\x9D\xF5\xCA\xAF\xE7\xC0\xE6\xD9\xE7\x6D\x0F\xFE\xD5\xFE\xC5\x9D\xFA\xBF\xC9\xE7\x7E\x3A\xE4\xE0\x73\x18\x2D\xEA\x38\xFD\x9C\xDE\x88\xB0\xE7\x69\xCE\xE9\xE7\x62\x02\x01\xE6\x33\xF6\x9D\xF2\xC6\xA8\xE7\xEB\xE3\xDA\xE3\x63\xE6\x32\xBD\x17\xF2\x8C\xFB\xCB\xDF\xE7\xD1\xE7\x8E\xE5\xAB\x0F\x30\xEF\x01\xF2\x8B\xEC\x6B\xC7\xE7\x5C\xE0\x1F\xAB\x67\xE2\x7B\xE8\x02\xE7\x09\x3D\xCE\x83\xB4\xC7\xE4\xF0\xE5\xCC\xD2\x7C\xE5\x06\x1A\x8C\xDD\x11\x67\x00\xE6\xE7\xC5\xE1\xF6\xE3\x79\xEF\x9F\xA4\x8D\xEE\xCF\xBE\xE7\x9E\xE6\x42\xB8\x01\xEF\x08\xEA\xD5\x29\xA0\xFA\xCF\xB3\xE3\xFC\xE6\xEA\x18\x6E\xE7\x81\xE0\x40\xFF\x9D\xD2\xD0\xF2\xE7\x58\xE0\x67\x12\x16\xE6\x7A\xED\x00\xF8\x9E\xD0\xC0\x8C\xE8\xCC\x1A\xE5\xE2\x40\x04\x7B\xE4\xA0\xB8\x87\xDC\x88\xC7\xCB\x42\xE4\xE9\xE3\x49\x05\x79\xE6\x0D\xFE\xA0\xF5\x7E\x89\xE1\xDC\xE2\x0E\xEA\x80\xB1\x80\xE0\x3C\xEC\x98\xC7\x30\x7D\xE0\xA2\xDE\x73\x36\x7A\xE7\x72\xEC\x1E\xE0\x8D\xFE\x79\xA7\x02\x9A\xD6\xB4\xBB\x3F\x00\xC2\x1A\xDF\x1D\x5F\xC6\x7A\xFA\xBE\xBC\xE0\x85\xDD\x87\xCA\x18\xE4\x41\xCA\x95\xC2\x04\x3E\xCD\xCF\x1A\x66\x1C\x2B\x04\x21\xD4\x89\x1B\xA2\xD2\xCD\xC4\xDD\xC2\x1F\x28\x57\xD8\xD6\x8A\xE1\x10\x1A\x32\xCF\xD1\xC6\x36\x5C\xE9\x93\x01\x9B\x47\x3C\xCC\xEF\xAC\xF8\x83\x93\xA9\xE5\xFA\x1A\x33\xE8\xF6\xBA\x68\x01\x45\xF9\x98\xD6\x90\xE1\xBD\x46\x1A\x20\x37\x9A\xD1\x1C\xEC\x47\xEB\x84\xFF\x67\xDC\x7D\xF2\xCD\x3E\xEA\x20\xE8\x15\xE2\xF9\xC9\x08\x16\x61\x83\xE9\x88\xE9\x08\xE4\xC6\x1C\xDB\x73\x2A\xE4\x9C\xF6\xA9\xEF\x09\xE4\x34\xC0\xDC\xA5\xE1\x91\xEA\xA0\xD6\x9B\xC9\x04\x2C\xE5\x2D\xE9\x81\xCB\x82\x26\xD8\x38\x29\xFC\x1D\xD4\xD2\xC6\xE1\x26\xD5\x93\x02\x1E\x20\x6F\xEA\xD6\x0E\x92\xEE\xA9\xB7\x15\x4F\x28\xCD\x0B\x24\xEA\xB1\x4D\x1F\x40\x2E\xA5\xCD\xC5\xD3\x9F\xE9\x58\xEB\x94\xDD\x74\xB5\x0D\xFA\xC7\x1B\xC7\xFF\xB3\x87\xE9\x81\x00\x21\x24\x94\xE8\xA0\xB0\x61\x08\x89\x4F\x55\x38\xE6\x6B\xD7\x77\xDF\x71\xE3\x39\x39\x71\x2D\x06\x2B\xE9\xB2\xE9\x5B\xE8\x73\x1B\x94\xE6\x10\x1F\x95\xC7\x68\x81\xB6\xC7\x16\x73\x3E\xD6\xE0\x44\xE9\x4C\xF7\x84\xE4\xD1\xFB\x1B\xB6\xE8\x81\x03\x74\xE1\x5A\xE4\xA5\xA5\x68\x21\x8C\x13\xE6\x54\x28\x62\xE8\x11\x0E\x52\x17\xB6\x20\x28\x56\x91\xD9\xE9\x01\x03\xF4\xCD\x35\xEB\x9D\xE3\xC0\xBB\xA5\xC6\x04\x10\xD0\xF2\xE4\x03\xB6\x37\xED\x27\x00\x37\x53\xA6\xC3\xD3\xA9\xBD\xB5\x48\xAA\x4A\xC7\x0C\x75\x3B\x06\x08\xA6\xEB\xD3\xFF\xE9\x70\xE0\x1D\xE4\xB2\xC0\xA0\xEC\x4E\xFF\xCF\x80\x7A\x86\x02\xC7\x21\x60\xE4\x40\xD3\xBA\x19\x79\x0C\x57\x52\x66\xA7\xAF\x4D\xA4\xB9\x03\x7F\xB2\xE8\x77\x5F\x65\x95\xC7\x89\x89\xE7\x7B\xB5\x01\x39\xE2\x2F\x24\x17\x0C\x03\xD6\xB5\x41\xEF\x83\x17\x04\x82\xE9\x0E\xEA\x93\xAC\x4B\xE4\x2E\xD8\xD4\xC5\xB4\x95\xAF\x96\x12\x0F\xEF\x73\x1C\x6E\xCD\xAA\x9D\xD6\x04\xE9\xCC\x1B\x6D\x10\xBC\xE4\xA0\xE0\x4A\xED\x26\xF6\xD1\xBE\xD6\x7C\xB4\xD6\xE6\xDC\xDA\x4F\xD6\xF5\xCF\x74\xF7\xB8\x94\xDC\x15\xDB\xC9\xD9\x64\xDD\xB2\xD9\xEF\xCD\x79\xFB\xBB\xAF\xDE\xFD\xDD\x98\xDF\xBF\xDB\xE6\xD1\xF0\xC4\x65\xC3\xBC\xA6\xD2\x38\xDE\x7C\xD2\x7A\xCB\x96\xC2\x45\xFE\x39\xF5\xC7\x9B\xCC\x6A\xD5\x0E\xCF\x82\xE6\x68\xBB\x1F\xE7\x74\xFA\x0F\x7E\xE3\xA6\xD5\x7C\xB5\x80\xE0\x61\xE7\x20\xFE\x10\xFA\xD4\xFE\xE0\x08\xDD\x77\xDC\x59\xD8\xD8\xDD\x74\xD8\x7A\xDC\xBD\xBE\xD1\x42\xEA\xDD\xD8\x51\xEE\xEB\xD6\xE9\xC0\x7B\xE5\xAF\xE2\xDE\x25\xD7\x0D\xDC\x55\xD0\xBF\xD3\x85\xC8\x7B\xD5\xA1\xEA\xDE\xED\xD2\x6B\xDE\x4A\xCD\xAC\xEA\x97\x9E\x54\xC1\xD3\xCB\xE5\x5B\xEA\xD4\xB5\xE1\xBC\x54\xDE\x20\xF6\x9F\xE9\xC8\x8A\xB4\xE3\xE0\x87\xE2\x22\xDF\x48\xC7\x56\xE1\xA2\xF6\xA2\xBA\xD9\x13\xD2\x5E\xDB\x79\xD8\xA8\xE9\xBA\xD3\x74\xC1\xB3\x95\xDD\xFA\xDD\xE0\xD8\xBF\xDB\xB8\xD7\xBC\xBB\x74\xE2\xB2\xF5\xDB\x8A\xB7\xA7\xE9\xD7\xD1\xAA\xE8\x92\xCB\x72\xE1\x9F\xEF\xC5\x1B\xE6\x13\xDD\xB4\xD7\xF6\xB5\x56\xDE\x90\xF6\xD3\xDE\xDD\x15\xBF\xDF\xBE\x8A\xD5\xB0\xD0\xCD\xB5\xAC\xCB\xBF\xE9\xEA\x8D\xDC\x41\xD6\x4F\xEB\xDE\xDB\xD6\xD5\x77\xF1\xB1\x8E\xD8\x7D\xD6\xF7\xD9\x1D\xDB\x59\xD7",
"\xC7\xC3\x59\xD9\xB8\xF9\xEA\x64\xDE\x0E\xDF\x4C\xBE\xC3\xDE\x57\xF8\x4A\xC0\xD6\xFE\xD5\x82\xEB\x43\xD3\xCB\xE4\xD0\xC3\xB0\xCB\x91\xE2\x2D\x24\xE6\xD0\xB5\x1A\x97\x1B\xEA\x98\xEE\xED\xD3\x86\xDE\xD5\xE6\xD0\xC4\xCA\xDF\xEA\x0B\xE7\xB2\xE2\xCE\xDE\x3C\xF1\xBB\xED\xD8\xC4\xEA\x31\xDC\xBB\xD1\x3F\xC0\x46\xE3\x73\xD6\xB6\xE5\xDC\x98\xDB\x33\xDE\x66\xD9\xCD\xD5\xDC\xD4\x2C\xDD\xBA\xE7\xD3\x9F\xDC\x53\xC1\x75\xEB\x3D\xD7\x5D\xED\x5C\xCC\xB9\x8E\xCF\xB1\xEB\xB7\xDD\x8C\xE2\xB9\xC8\x5E\xF9\x3D\xEA\xD7\xD6\xDA\x3C\xEA\xB5\xE9\x79\xDF\xBD\xED\xCB\xDC\xAC\xE9\xB7\xEA\xDA\xF2\xEB\xA9\xCD\x51\xEF\xB2\xDE\xF2\xD9\x6C\xF1\xB7\xFC\xEB\x9C\xDA\x4E\xDC\x6A\xEB\x86\xB9\xDC\xD6\x4D\xC3\xD8\xFC\xD5\x05\xEC\x0F\xDB\x81\xE8\x06\xD9\x60\xEC\x92\xD1\xC7\xD0\x1B\xD5\xE1\x2B\xE7\x71\x1F\x67\xD0\x00\x0F\xB0\xD1\xB9\xEC\xEB\xBE\xDD\xA5\xCC\x5B\xEB\x69\xD3\xD1\xD6\xB0\xD2\xB8\xEA\xDB\xF5\xEA\xB6\xD8\x99\xDA\xA3\xD6\xE6\xDC\x68\xE8\xB9\xFF\xD2\xCC\xDC\x08\xC2\x5D\xDE\xD3\xD5\x62\xF5\x54\xEC\xD6\x97\xD5\x7C\xDA\x56\xCD\x55\xEC\xF7\xC7\x55\xE6\xAC\xF2\x62\x90\x9F\x89\xEA\x43\xC1\x88\xCB\x70\xC3\x62\xD8\x5C\xC4\x82\xAA\xE6\xCB\x1A\x87\xD2\x8D\xED\x5C\xEE\xB6\xD2\xB0\xCE\xB8\x94\xEC\x9B\xEB\x1D\xDD\x50\xEB\xEB\xD3\x54\xFD\x7A\xE8\x9E\xA1\xEB\x97\xDC\x3B\xD9\xA6\xDE\xF6\xC6\x5A\xF3\x67\xE3\xD8\x91\xB8\x36\xDF\x63\xD6\xB4\xDD\xB3\xB1\x65\xFC\x39\xD3\xD9\xFF\xDB\xF6\xE5\xE0\xE6\x6E\xCB\x24\xCA\xD6\x12\x32\xC1\xCA\xD3\x1B\x83\xE5\xDB\xE9\xA1\xE7\x17\xC0\x66\xF3\xB1\xF9\xD4\xE7\xE0\x0F\xE5\x19\xDD\xC9\xDD\xC6\xD7\xF2\xC0\x73\xE9\xBC\x95\x93\x2B\xDF\xE4\xE8\x17\xD7\xBD\xDE\x61\xF0\x79\xF2\xB7\xC9\xD9\x81\xD2\x36\xDF\x60\xD5\xC9\xEE\xCC\xCF\xB2\xDF\xAD\xD4\xDD\x64\xD5\xEC\xE9\x63\xD1\x6A\xE7\x43\xF1\x8D\xC1\x49\xF1\xE4\x8A\xEC\x8A\xE4\xFF\xD5\xD1\xEC\x9F\xCF\xB4\xCD\xCB\xFF\xE3\x92\xEC\x1D\xEE\xC9\xD9\xD8\xD9\xF5\xC3\x76\xFE\xD8\x9D\xD6\x9A\xED\x97\xC8\xA7\xEA\xBF\xEF\x61\xE8\xB2\xFD\xD7\xB6\xCF\xFF\xEA\xA5\xD9\x80\xEF\x62\xCF\x8C\xC0\x2E\xFD\xD9\x84\xD1\x6C\xDF\x8C\xB6\xD8\xE1\x16\xC3\xC2\xD4\x35\xF9\x08\x7E\xE9\x89\xED\x4E\xEB\xD6\xE6\x50\xEA\x0A\xED\x48\xF6\xDA\xB0\xDB\x50\xDE\xCC\xE9\xE9\xD2\xB3\xE0\xE1\xDF\xB5\xD2\xBA\xC0\xEC\xE6\xED\x62\xDD\x5B\xDF\xD8\xDF\xD6\xC9\x76\xF1\xB5\xB2\xD7\x49\xEC\xED\xC2\x5E\xEF\x64\xD6\xF6\xDA\x57\xE7\xD8\x8B\xD7\x29\xEC\x28\xDB\x8A\xEC\x1A\xD3\x6D\xF7\xD1\x8E\xCA\xA4\x14\x57\xD9\x49\xE7\xA1\xE8\x17\xCE\x15\xC4\x93\xD2\xD2\xAC\xD8\x64\xC3\x4D\xE6\x81\xB5\x11\xD5\x63\xF0\xB4\xF6\xCF\xC2\xD2\x6B\xD9\x07\xDC\xA4\xD9\xDD\xEC\xC0\xC7\xAE\xD9\xBD\xAC\xDE\x1C\xED\xA3\xE9\xA7\xE9\xA9\xEF\x69\xF2\x79\xE1\xDA\xCB\xEC\x00\xEC\x52\xED\x5E\xDE\xD4\xEA\xBB\xC8\x69\xC9\x99\xFF\xEC\x3D\xDF\x40\xEE\xA8\xE1\x91\xDB\x70\xFF\xB6\xF8\xC1\x89\xDA\xED\xEB\xEA\xD0\x9A\xED\xDC\xEA\x66\xFD\xAC\xE8\xDB\xB5\xEE\x99\xED\xF6\xDB\xA6\xEB\xB9\xEC\x85\xCD\xAE\xD4\xB0\xCF\xEB\x16\xD9\x79\xEC\x06\xDD\xDE\xE9\xB2\xD7\xB7\xDC\xB0\xF9\xED\xAA\xD8\xD4\xDB\x4A\xD4\xD5\xEB\x0E\xD7\xA6\xF3\xCA\xF7\xE0\x06\xDB\xDE\xEA\xC3\xED\xA7\xE4\x6E\xF3\xB8\xF8\xDC\xBF\xEC\x18\xED\x20\xEE\x86\xEC\xAE\xE0\x67\xF6\xAB\xF8\xB1\xC0\xEE\x7A\xD8\xA1\xEC\x1F\xDC\xE8\xEA\xC1\xC6\xBA\xC0\xB2\xA8\xED\xCB\xD4\x9E\xDE\xC1\xDE\xE7\xD0\xAA\xCF\xBA\xD9\xC4\x93\xEB\xE9\xEB\xA9\xEE\x99\xEF\xCB\xD2\xEC\xD7\xB4\xE3\x65\xB9\xEE\xC6\xDC\x78\xD4\xB2\xDF\xC7\xDA\xEC\xDA\x74\xF1\xDB\xE0\xB7\x20\xEE\x65\xEE\xC8\xE8\xD4\xDD\x6C\xFD\x33\xCF\xDB\x99\xD5\xD1\xEC\xDF\xD5\xD0\xE0\x6A\xE1\x10\x11\x7B\xE8\xD5\x96\xE1\x21\xE5\xD2\xB6\x33\xE8\xB3\x0D\x53\xC7\x49\x23\xD9\x82\xE6\x11\xED\xE0\xEA\xC5\xD3\xB8\xEE\x56\xED\xB3\xF0\xD5\xEC\xEC\x72\xEA\x37\xED\x3B\xD2\x09\xDF\x39\xF5\xB3\xC6\xB7\xF7\xEC\x3A\xBE\xB2\xEE\x1F\xDE\xEC\xEA\xCF\xC8\xBB\xED\xAC\xAA\xED\x96\x92\x62\xE4\x71\xCD\xC0\xD6\x10\x17\xBC\xEF\xD2\x8F\xEE\x34\xDC\xE3\x88\x8F\xE8\xE5\xDE\x59\xEA\x67\xE0\xD6\xC6\xEA\xA2\xEA\xA4\xE8\x69\xEE\xFF\xCF\x77\xE2\x17\xCE\xBB\x86\xDE\xD0\xDC\x3D\xEC\xC9\xE8\x9A\xD7\x78\xF2\x66\xC9\xDE\x84\xD9\x81\xEC\xB2\xE5\xD5\xE3\x7F\xD8\xF1\x0A\xA7\xD4\xCC\x6B\xCF\x0E\xEC\xB9\xEE\xE6\xEF\x5A\xE4\x69\xFC\xB5\xEF\xD5\xDA\xDE\xF6\xDD\xEF\xEC\xC6\xE8\xBF\xED\x61\xE4\xB6\xDE\xDA\xA0\xEC\xF3\xDA\x11\xEF\xF1\xEE\xBE\xD9\x7C\xEC\x62\xFB",
"\xD9\xEB\xBB\xAE\xEE\xDE\xD7\xF3\xEC\x9A\xDB\x5D\xE9\x3B\xC3\xB6\x8D\xDB\x2D\xEE\xA9\xEF\xAD\xE8\x28\xD0\x71\xFB\x65\xD2\xDC\xBF\xEA\x57\xEF\x1C\xDF\xCD\xEC\xD2\xDD\x57\xD9\xBB\xE1\xAF\xFB\xEE\x98\xDD\xBE\xEC\x9D\xED\xF8\xE5\xB1\xA9\xB6\xED\xB9\xCB\xED\x3A\xC5\xE5\xEF\x49\xD8\xE9\xE9\xD2\xCF\xAD\xD2\xB7\xF5\xEF\x31\xD6\xD6\xD9\xB2\xC0\xEE\xE9\x7D\xFB\xBF\xD1\xDA\xFD\xEF\x99\xEB\xFF\xED\x7C\xEA\xEB\xE4\x7F\xD1\xAB\xF4\xBB\xF3\xEA\x6F\xEC\xE0\xED\x9C\xEC\xB9\xE3\x67\xF0\x42\xE6\xDE\xFE\xEB\xA8\xEE\x37\xC0\x5F\xEE\x2A\xDC\x7A\xE0\x71\xE6\xDC\xED\xC5\xFB\xEC\xDE\xD1\xBF\xEF\xC9\xDD\x0B\xFB\xA9\xF5\x8B\xB1\xE4\xDA\xDB\xB3\xC2\x59\xEA\xFB\xE2\x6E\xE8\x60\xD5\xDD\x80\xF0\x04\xF0\x9B\xED\xD6\xEC\xE2\xE6\x5F\xFB\xB0\xE4\xDF\x9A\xEE\xE6\xEE\x8E\xEC\xFA\xE8\xD4\xE5\x9E\xC1\xBC\xCF\xE0\x83\xEF\x02\xED\xC2\xED\xC4\xC9\xFE\xE2\xC8\xD3\xBF\xE4\xB8\xAD\xEC\xBA\xE4\x01\xDF\x22\xD1\x2C\xEA\x7F\xE0\xB7\xEB\xBB\xB9\xEC\x38\xD9\x5D\xED\x5B\xEC\x69\xDD\x6B\xF6\xBB\xCF\x87\xF8\xEE\xEB\xEC\xBD\xED\xBB\xEC\xEF\xEF\x6E\xE5\x6A\xC7\xDB\xD0\xD0\x0E\xF1\x51\xED\x9E\xEE\xFD\xE2\x81\xEE\x6A\xDC\xE1\xA2\xDC\x5E\xF1\x3A\xDC\x06\xF5\x6C\xD7\xE2\xD9\x97\xE1\xC9\xBC\xEB\x43\xF0\x0F\xF0\xEE\xEB\xD2\xEA\x7B\xE5\x67\xE3\xE0\xCC\xF0\xF3\xEA\x77\xD6\x01\xF4\x8E\xD8\x80\xF2\xB3\xCA\xE0\xAE\xF0\x0C\xF1\xE3\xB5\x1E\xF4\x36\xD8\x85\xEC\xB6\xC7\xA6\xD0\xD1\x53\xEA\x69\xD1\x0E\xF7\x3D\xD1\x7D\xFD\xC1\xCF\xDE\xD4\xE9\x23\xEA\xFF\xD6\xB7\xED\x0C\xFF\x72\xE9\x74\xE4\xBC\xBA\xED\xDD\xEF\x35\xF1\x8F\xE9\x00\xF7\x6E\xEB\xC2\xF4\xE2\xEA\xED\x43\xEC\xB7\xD9\x91\xE8\xAE\xD7\x64\xFE\x68\xF7\xE1\xA6\xDB\x9B\xF0\xDB\xD4\x04\xF6\x19\xDF\x89\xEE\xB6\xE1\xE2\xFA\xD1\xA3\xF0\x10\xDB\x0E\xF0\xD5\xD4\x18\xF4\x89\xE7\xC7\xFE\xE9\x06\xD2\x06\x58\x38\xED\xE1\x26\x3B\xD4\xB5\xDE\xCB\xDC\xCF\xB6\xEF\xE9\xEF\x22\xF0\x16\xFD\x88\xE6\x6B\xDD\xDE\xA1\xEF\x9F\xEF\xF0\xEE\xE7\xEA\x13\xD7\x5F\xE4\xB2\xF9\xD7\xC6\xEC\xFB\xEA\x63\xED\x88\xEF\xB4\xEB\x7E\xE9\xAD\xF3\xE0\xE0\xD4\x1F\xDC\x31\xD7\x0D\xF1\xDC\xCA\x74\xEE\x56\xC3\xE2\x86\xD9\x2B\xEA\xC8\xE7\xED\xEE\xD5\xD9\xCF\x15\xEE\xB5\xA4\x87\xEE\x49\xDE\xEA\x1A\xAD\xDF\x91\xEC\x8A\xE3\x82\xF6\xB2\xC5\xF0\x8E\xDD\x23\xF3\x23\xF7\x16\xF5\x71\xF4\xAF\xD0\xE2\xDB\xEE\x29\xF1\x8C\xED\xF0\xEB\xE3\xE3\x7C\xF0\x47\xD9\xE2\xC2\xB6\xC1\xF1\x22\xDF\x30\xF2\x41\xCD\x87\xFB\x6B\xC7\xE3\x8A\xD3\x28\xEF\xB5\xED\xA0\xEF\x6C\xE8\xC4\x1E\x25\xF9\xCC\xA1\xCB\xE8\xE0\xE3\xB3\x07\xCA\xDC\xD4\x34\xE2\x21\xD0\x37\x6B\xD2\x04\xF3\x44\xF2\x19\xF1\xEE\xC1\x73\xF7\x5E\xF3\xDC\xD6\xEE\x49\xF1\x0B\xEE\x09\xF5\xB8\xE8\x82\xE3\xBD\xEF\xB3\xA5\xEF\x17\xF3\x01\x8D\x0C\xF7\x40\xCB\x87\xE6\x6D\xE7\xB2\xB6\xF0\x14\xF1\x93\xED\x32\xF2\x8A\xDB\x8C\xED\x78\xC3\xCD\xAC\xDD\xBD\xE4\x41\xE6\x65\xD3\x3F\x18\x99\xD8\x27\xD0\xE5\xD4\xF1\xFF\xB2\xA6\xE5\x4C\xF4\xB2\xE4\x84\xF5\xC9\xD1\xDC\xB7\xF2\x48\xF1\xCF\xEB\x9A\xEA\x1C\xF0\x8E\xE4\xC7\xCE\xE1\xE6\xF1\xE5\xEE\x74\xF1\xB1\xEE\x17\xFB\x8E\xF6\xB3\xED\xE3\xA4\xEC\x45\xF2\x83\xDF\x51\xF2\x1E\xF9\x94\xF8\xC1\xD6\xE0\xCD\xDC\x4D\xF2\x23\xB8\x49\xF4\xDB\xDE\x93\xD0\x91\xC9\x92\xC6\xDE\x07\xE9\x69\xF2\x42\xD4\xB9\x1D\x35\xFA\x4B\x8F\xA7\xAE\xEE\x06\xF2\x98\xEC\x1A\xF3\x9C\xDB\x63\xEE\xC4\xDF\xE3\xA7\xF0\x78\xCF\x9D\xF1\x86\xED\x27\xF6\xE1\xC4\xBD\xD8\xB8\xF8\xEA\x41\xEF\xE8\xEB\x5E\xEA\xF5\xE9\xDF\xDA\xC2\xE4\xB6\xFF\xF0\x73\xDD\x40\xF3\xB5\xDB\xF1\xE1\x36\xFD\xF6\xBC\xCA\x8D\x2E\x7B\xF2\x93\xF3\xDB\xEC\xC1\x0C\x36\xF9\x8E\xFC\xCD\xF5\x99\x71\xE6\x46\xC8\x74\xE7\x88\xE9\x10\x09\x8A\x08\xA8\xB2\xE4\xCC\x1A\xFD\x19\x71\x96\x66\xD7\x12\x13\x06\x2D\x29\x8A\xEE\x00\x00\xDF\xF3\xCE\xB4\x5E\x09\x8F\xE1\x2F\x06\x37\x0A\xB2\x10\x5D\x6B\xEA\xF0\xAF\xB8\x1C\xEC\x15\x01\x3F\xE6\x98\xED\x57\xE9\x17\xB8\x71\xF0\x84\xE2\xAF\x07\x8F\xEC\xBD\x57\xE9\xA3\x7D\x33\xEA\x41\x02\x06\x0F\x9C\xF7\xBB\xC2\x04\x5C\xF3\xC3\xF3\x4D\x09\x71\xF1\x7D\xED\x97\xE6\xD1\x4B\xE5\x57\xE9\xA4\x90\xDE\xF1\x42\x06\x09\x9D\x6D\xF4\x44\x2C\xE7\xC2\xB8\xD3\xF3\x66\xF2\x23\xD6\x38\xFF\x6E\xC1\xEC\x57\xD3\xA8\xB0\xDA\xF3\x81\x03\x09\x05\x3B\xFF\x86\xE2\x08\x3B\xE7\xE1\xF3\x3D\x03\x2C\xB7\x3F\x18\xCE\x47\x9C\xF9\xC9\x90\x5A\x88\x5E\xD7\xE8\xE6\x81\x7E\xF6\xD5\x3C\x9F\xF4\x19\xF2\xBE\xD2\xF3\xE2",
"\xF2\xEA\xF1\x9F\x14\x3C\xF1\x72\xAC\x29\x3A\x37\x59\x91\x0B\xF5\x80\x03\x08\x05\x41\xFD\x35\xC3\x08\x1B\xE8\x80\xF4\x65\x01\x9A\xD5\xAB\xE2\xD6\x70\x88\x3E\xBD\xDB\x65\xB9\x17\xFA\x1B\x30\x3D\x16\xEF\x8F\x69\x46\xE9\x08\x22\x2C\xBD\xBA\xF1\xF3\xD0\xE4\x40\xD4\x3E\xFE\xFD\xD2\x65\xF5\x65\x43\x2C\xD7\xE9\xFF\xE4\x01\xCB\x28\x7A\x3B\xCE\xD0\xC2\x04\x3C\xF4\xF0\xF3\x08\xF6\x7C\xEE\xA1\x40\x44\xE2\xD0\xB2\x31\x09\x2F\xA9\xE6\x3F\x5B\x35\xE8\x43\xF8\xFD\xB1\x04\x2D\xE8\x86\x02\x4E\xF4\x10\xF6\x88\xF6\x32\x1D\x78\x26\xD1\xC6\x80\xA8\xF4\x27\x03\xFB\xAC\x73\xF1\xEF\x7F\xA4\xE3\x08\x3A\xFD\x37\xB7\x31\xF5\x71\xEC\xF5\x1B\xE3\x54\x44\xF4\xBC\xD0\x45\xC8\xA2\xD7\xE9\x78\xAB\x96\xF1\x21\x0A\x08\x1D\xD2\xC2\x04\x6D\xF4\x52\xF4\x94\xE9\xD4\x2C\xC4\x56\xDC\x15\x88\x94\xB8\x57\xE9\x56\x22\x01\xB4\xB3\x19\x10\x0E\xA6\xE1\x08\x3C\xE9\xF1\xF4\xAD\xB4\x74\x16\xD6\x20\x0C\xEA\xDF\x1D\x04\x6B\xE8\x89\x02\x8E\x9A\xB7\xCE\x8F\xF1\x20\x09\xA8\xF0\xD1\xC2\xE9\xDC\xB0\xDA\x1E\x1D\x15\x91\xF4\x0B\xBE\x09\x24\x29\x79\xCE\xFC\xB0\x5F\xF3\x4E\xC4\x10\x5C\xB8\x3F\xCF\x03\x62\x7A\xCE\x85\xF5\x03\xB4\x66\x1C\x1F\x03\xB7\xE3\x6F\xC2\x08\x23\xEA\xA0\xF4\x59\xB5\x48\xF6\xE0\x0B\x52\xF3\xDD\x15\xD4\xD7\x92\x26\xE0\x82\xBE\x25\x16\x1C\x58\x28\x0F\xCF\x01\xA9\xA0\xC0\xAA\xE7\xFA\x1A\x70\xAA\x7A\xF6\x20\x09\x07\x1D\xD3\xC0\x00\x3D\xF5\xA8\xF4\x09\xF4\x8D\xF5\x52\xE0\x08\x92\x3B\x64\xB6\x57\xE9\x18\x24\x2E\xB0\xB3\x18\x0F\x0E\xAB\xEC\xD6\xC1\xEB\xEE\xBD\x08\x14\xC7\x6F\x79\xE1\xA2\xE1\x12\x1A\x6F\x39\xE9\xCA\xF5\x27\x03\xA9\xA9\x1D\xE9\xBE\x47\x2B\xF4\x17\x13\xE9\x82\xF5\x0C\x2C\x42\xF5\xA3\xEC\xD9\x10\x81\xDB\xD6\xEB\x3C\x5D\xF5\x8F\xF4\x3B\xE6\x5C\x1F\x19\xF6\x45\xD9\x71\x39\xC2\xA7\x02\xDB\xE9\x47\xCD\x87\xF2\x9B\xE8\xAE\xE1\xD0\xC2\xEB\xE4\xF3\xB5\xC6\x77\xF7\xA1\xF5\x99\xEE\xAB\xF3\xBC\xEA\x77\xE1\xF4\xC2\xE6\x85\x18\xBE\xF5\x5D\xF7\x12\x19\x8C\x3A\xE9\xA7\x02\x0E\xE9\xF2\x18\x70\xF1\x61\xFF\xAF\xE9\xD7\xC1\xEC\xEA\x1A\xC3\xF5\x93\xF1\xAB\xDB\x40\xB0\xC3\x11\x02\x58\x79\x5A\xED\xD7\xD5\x6B\xE8\x50\x27\x60\xFB\x9E\xFE\xD5\xC3\xCE\x8D\xF6\x3D\x02\x2A\xEA\x71\xB8\x67\x0A\xDF\x1F\x12\x99\xE8\x80\x00\xDC\xE6\x73\xF5\x40\x04\x85\xE1\xF4\xA0\xD8\xC3\xDA\xAA\xF3\xEA\xE7\x98\x02\x7E\x1B\x8D\xEB\xAB\xE0\x96\xE5\xD2\x8B\xF5\x92\x0D\x7A\xF5\x19\x03\x3C\xF5\xA6\xED\x97\xFC\xE3\xAA\x1A\xFA\x19\x4D\x09\x3D\xE9\xD1\xC8\x65\xF8\xA7\xC9\x58\xD4\x4A\x06\xE8\x09\x34\x90\xB2\xBF\x19\x70\x87\xD9\xDB\x23\x2A\xF6\x6B\xE7\x67\xF6\x8C\xF5\xB9\xC1\xB1\xEB\xCD\xD1\xED\xC1\xC9\x6D\xE6\xB9\x02\x7E\x1A\xD7\x87\xB2\xED\x2E\x10\xED\xAD\xE0\xE3\xC8\x97\xF7\x71\x1D\x75\x17\x7B\xF7\xA6\xC3\x46\x1C\xF6\x42\xE0\x79\xF5\xA9\xF6\x46\xF1\xA4\xF6\xD7\xF2\xE7\x8F\xD2\x55\xF7\x6E\xDF\x66\xD6\xC4\x1D\xDF\x00\x15\x9C\xD3\x8F\xC3\x01\x03\x55\x00\x84\xF6\x6D\xF4\xA9\xFF\x61\x23\x7B\xCB\xE7\xFD\x1B\x25\x3F\xB6\xBC\xE5\xE0\x00\x1A\xDB\xD2\xED\xAD\xF5\x7E\xF7\x16\x18\x18\xE5\xBF\x1B\x10\x25\xA9\xF2\x28\x23\x84\x7B\xF7\x9D\xF4\x1E\xED\x15\x8F\xB7\xE5\x8B\xC2\x7C\x86\x02\x14\x22\xC7\xF6\x91\x10\x72\xF7\xB8\xEF\x6E\x22\x7B\x8A\xF7\x80\xF7\x93\x03\x5C\xAB\x70\xFF\xEB\xB9\xDB\xD1\xEE\xA9\xF3\x69\xE7\x9E\xE1\x4C\x05\xBF\x19\x87\x49\x97\xE5\xEE\x85\xF7\xA7\xF7\xB5\xDA\xB1\xBD\x2C\xE4\x53\xF1\xA5\xFA\xC8\xD3\xAA\xB5\xF7\x62\xE2\x25\xEE\x20\x0D\x3E\xE4\xDD\xDE\x88\xAC\xF6\x94\xC4\xFC\xE5\x6B\xDD\x9E\x9E\x37\xF5\xF1\x24\xE7\x81\xE7\x85\xE8\x83\x03\xC7\xF1\x93\xE0\xCD\xA0\xDE\xEF\x8D\x90\xDF\x88\xE6\xFF\xE6\x50\xE1\xF7\xCE\xBC\xE1\xDB\xDB\x12\x13\xE8\xCE\x11\xC9\xE4\x09\xEA\x04\xE7\x3B\xF6\x9C\xD7\xEA\xCA\xF4\xB0\xDE\xE9\xF7\xE2\xE4\xFB\xC5\xBD\xF4\x2A\xC6\x33\x53\xF6\x5C\xE3\x02\xE9\xCE\x14\xF7\xD5\x3C\xFD\x40\x82\xEF\xA4\xE2\x17\xE8\xF4\xE5\xCF\xF2\x77\xEF\x9F\xBA\xA9\xFA\xE8\x90\xF5\x7C\xB5\xF2\xF5\x85\xCF\x7C\xFA\xAE\xEE\x7E\xF9\x23\x4C\x3F\x16\xE9\x3C\xAB\xFE\xE0\x85\xEF\x13\xE2\xDF\xDE\xCF\xC7\xC4\xFA\xF7\x85\xCC\xFF\xF7\x61\xF5\x18\xE5\x03\x04\xCF\x81\xF8\x9D\xE3\x01\xFA\xE5\xF7\x3F\xB4\x43\xF7\xDF\xD3\x37\x47\xE5\x09\xF8\x58\xF6\x84\xF6\xFE\xDE\x15\xF5\x9E\xFE\xB1\x6F\xE4\x0A\xE9\x13\xEB\x04\xFB\x7B\xE6\xC0\xEE\x9D\xD4\xEF\xBA\xF6\x04\xE8\xF2\xE4\x52\x00\x82\xF9\xB7\x12\xDF\xDF\xEF\xE8\x56\xEB\xE7\xD2\xB5\xEF",
"\xF5\x7B\xE6\xC2\xE4\xDF\xE8\xF0\x9B\xF8\x1F\xE3\x9C\x16\x07\xE3\x87\x4F\xC1\xE4\xC3\xE7\xCF\xB8\xE7\x19\xE8\xC8\xE1\x09\xFF\x79\xE7\xC2\xE0\xD1\xC4\xD0\x86\xE8\x68\x06\x16\xFA\x40\x02\x82\xFA\xBA\xE3\xE0\x8C\xEC\x96\xF8\xCF\x1A\x0C\xFB\x0D\xFF\x6D\xF6\x04\xEE\x8D\xD5\xD0\xDB\xF7\x36\xE0\x13\xE8\x3C\xE3\x84\xF0\xDD\x1B\xA0\xCE\xCF\xDF\xE5\x08\xF9\x29\xF8\xFA\xF6\x63\xE1\x39\xED\x2E\xE3\xD0\xBD\xF8\xAE\xED\xF8\xF4\x10\xFC\x80\xF4\xDD\x0A\xA1\xEB\xEC\xD5\xE3\xC4\xCB\x0C\xFA\x79\xE7\xC5\xE4\xDD\x11\xD7\xF8\x9D\x70\xF8\x45\xF8\x30\xF4\x79\xF2\x99\xEF\x37\xD2\x82\xE3\xEF\xA7\x12\x72\xF9\xB2\xE1\x3E\xF2\xCF\xD4\xBB\xF6\xAC\xC9\x7A\x43\xE8\x2F\xF8\xE3\xE7\x1E\xF9\x77\xF9\x09\xFF\xCF\xB3\xC1\xF8\xF8\x52\xF1\x85\xEA\x33\xF4\x55\xFE\x47\xE9\x55\xF7\xCD\xAE\xE5\xD0\xB9\xE5\xF5\xCB\xF3\x91\xF3\xBC\xE2\x6B\x85\xEF\xA3\x2E\x49\xF4\x18\xFB\x79\xE2\x70\xE0\xC9\xE7\x49\x1A\xF2\xC1\xF7\xF2\xE1\xE8\xF6\x1F\xFF\x80\xF4\x5C\xC7\xE5\xCF\xEF\xD7\xF7\x38\xF9\xAE\xE0\x9F\x12\x7B\xF8\xC6\xE6\x9D\xFF\xF0\xDE\xF7\x41\xF8\xCB\xB3\xE6\xE4\x86\xF4\xC4\xFC\x3E\xEE\xF2\xD6\xF7\xC0\x0D\x58\xFA\xFA\xF5\x32\x9C\xBE\xEA\xE2\xFA\x0F\x18\xE8\x6C\xF8\x8C\x1E\xFD\xF3\x7A\xFE\xCB\xE2\xE3\xFD\xEF\xF1\xE2\xB4\xE6\x84\x5E\x31\xF9\x72\x18\xCC\xFC\xE2\xD4\x37\x3C\xE7\xCC\xF8\x53\xFA\x33\xFC\x81\xFE\x8C\xEF\xE0\xD8\xF1\xC8\xE7\xDD\xF6\xE5\xE6\x35\xF8\xE3\x15\xC1\xF9\xE6\xD3\xBE\xDB\xF9\xCB\x1B\xD6\xE0\x9F\x17\x2B\xE5\xCB\xF7\x9E\xE1\xF3\x8B\xE8\xE3\xF8\xCB\xB0\xF7\xE0\x8A\xFB\xDC\x07\x96\xFF\xF2\xE6\xF7\xB0\xF8\x2A\xFB\x01\x1A\x85\xFD\xBE\xEB\xD3\xAF\xEF\xB9\xE2\x6A\xF8\x5C\xF9\x32\xFC\x7D\xE3\xC4\xE0\xE3\xED\xF2\xE8\xF9\x63\xF6\xDD\xDE\x0E\xF8\x31\xEF\xCD\xF9\x9F\xC2\xF0\xD5\xF9\x4D\xF9\xFF\xB3\xC7\xF4\x9E\xF7\xDC\x16\xE7\xC8\xF4\xC6\x1B\x8F\x10\x24\xFA\xAE\x03\x9A\xFC\xC4\xF8\x9C\xCE\xF1\x85\xFA\xEF\xE7\x23\xC7\x3D\xFB\x7F\xF9\xCF\xE3\xE3\xD5\xF1\xFC\x14\xAF\xE3\x76\xF9\x09\xEF\x9D\xF2\xC2\xF1\xE8\xCC\x37\x5E\xF8\xBC\xF8\x83\xF9\xEE\xCB\xA4\xFA\xC0\xE5\xE9\xCF\xF3\x8D\xF8\xC2\xE2\x78\x10\x47\xF8\xA2\xFE\xD1\xE9\x8E\xE7\x04\x01\xF9\xAC\xCE\x6D\xF8\x88\xF4\x8E\xF8\xF1\x16\xE3\xF4\xD0\xCC\xF7\x1E\xC4\x9A\xF8\x25\xFF\x18\xEE\xC8\xE0\xE9\xD0\xD0\xC9\xFA\x3A\xF7\x41\xF9\x79\xE5\x90\xFF\x5B\xF5\x0E\x48\xF2\xCB\xFA\x07\xB5\xDD\xF6\x7E\xF6\xA2\xE4\x5C\xCC\xD8\xE7\xE2\xFE\xF2\x45\xDF\x76\xE3\xB4\xD7\x24\xE8\x39\xE8\x6E\x09\xEF\x83\x02\x4A\xFA\xEC\xBF\x49\x16\xAB\xF6\xC8\xF0\xBC\xEA\xF2\xAA\xE0\xAC\xF9\xDC\xCC\x5B\xFD\xAA\xF7\xAD\xD8\xDE\xF3\xF2\x8C\xE2\x0D\xFA\xC9\xEB\x43\xFE\x85\xF9\xCB\xE5\xDD\xBB\xF2\x94\xFA\xC6\x1B\x63\xE7\x5C\xFB\xBD\xEC\x3B\xC7\xE2\xEB\xEF\xA1\xE2\x81\x11\x9D\xF8\x5F\xFB\xA0\xF5\xBA\xAB\xE6\xFF\xF1\x88\xF6\x0E\xEE\x02\xE9\x34\xFD\xCD\x0A\xD8\xEB\xE3\xF1\xF3\xA5\xB7\xD8\xF9\xC7\xFA\x21\xE1\xB2\xF2\xCC\xFE\xE6\xEA\xF4\xDC\xF7\xB7\xF8\x71\xFA\x4B\xF8\xBA\x15\xCE\xFA\xEC\xC6\x04\x03\xFB\x10\xEC\xE6\xDE\x30\xFC\x7A\xEB\x14\xFF\xEC\xD9\xF1\xAC\xFA\x5B\xF9\xD1\xFB\x59\xE6\xA9\xFD\x41\xF0\xE6\xA8\xF6\xB7\xEC\x85\xFA\x61\xF8\x3F\xFD\xB2\xF2\xD0\xF7\xEC\xFB\x37\x33\xF8\x80\xFB\x9E\xD7\x5A\xFC\xB3\xFA\xCF\xF9\x8C\xCB\xF4\xF5\xE7\xBC\xFA\xD1\xF9\x4F\xFC\xB9\x13\xD1\xE6\xE7\xDB\xF6\x8A\xF1\x86\xFB\xCA\x90\x0D\xE1\xAF\xF0\xBF\xFB\xEB\xD6\xF6\xB2\xFB\xA3\xE2\xDA\xFB\x0E\xEC\x4F\xB7\xDB\xE4\xB3\xEF\xC0\xAB\xFB\x56\xF8\xA3\x01\x72\xF8\x9E\xF8\xDD\xF7\x8D\xDA\xF7\xF8\xF7\xB6\xFA\xE2\xFA\x49\xF9\x84\xEC\xA7\x07\xE3\xE2\xF2\xA0\xF8\x01\xFA\xE5\xF9\x11\xE9\x0C\xEF\xD3\xE5\xE5\xD0\xF6\x8A\xF1\x44\xFA\xCB\xB2\x51\xFE\xBE\xFF\xDC\xF3\xC9\xF3\xCC\x81\xEA\x4D\xFB\x55\xF9\x0D\xFB\xB8\xFA\x88\xF2\xEA\xDF\xCC\xAA\xF7\x5F\xFA\x05\x1A\xEC\xC4\xA7\x33\xBF\xED\xE8\xC3\x70\xF8\xE4\x5A\xDB\x93\x00\x4C\xF9\xC1\xF3\x9D\xDE\xCA\xFE\xDF\xE0\xF2\x0B\xF3\x9C\xF0\xD6\xEA\x32\xF4\x82\xE2\xBD\xD5\xE6\xBF\xF2\x97\xF3\xED\xBE\xA8\xEC\x13\xF1\x97\xF6\x6F\xF3\xE5\xF1\xDC\xF3\xF0\x8A\xCF\x52\xF7\x65\xD5\x65\xEB\x92\xFA\xCA\xD9\xEC\xC1\xC1\xC5\xE8\x7F\xE1\x4E\xDE\x58\xE2\xAB\xC1\x94\x8A\xE5\x84\xEA\xE2\xCB\x84\xFD\xAD\xF7\xAD\xD4\xBA\xE2\xE0\x8F\xF3\x3C\xF3\xC8\xF0\xE8\xE8\x32\xF8\xEF\xDC\xBA\xEA\xE0\xDE\xEE\xCE\xEA\xCC\xF1\xD8\xEA\x33\xF4\x6F\xF3\xAE\xE7\xBD\x9E\xF3\xCD\xDA\xD0\xF3\xCE\xD8\xF6\xEC\xB3",
"\xB9\xF1\xEC\x94\xD6\xEC\x6B\xD4\x18\xFE\xFB\xC2\xC6\xF7\x5E\xE5\x55\xD1\xDA\x8F\xEB\x67\xD6\x4B\xFA\x5E\xF8\xA7\xE0\xCD\xBB\xF1\xF4\xF5\xDF\xDB\x3E\xFC\x0C\xFC\x90\xFB\x32\xF2\xE4\xE4\xCB\xC4\xF9\xE6\xF2\x46\xFC\x89\xF3\x0A\xF5\xE7\xED\x82\xE6\x6D\xEF\xE0\xC8\xED\x43\xF2\x2E\xBF\x46\xF6\x30\xD9\xD7\xA8\x4C\xDF\xE4\xFD\xDA\x21\xF2\xFB\xD8\xDB\xEA\xC1\xE3\x5B\xE3\x2B\xFA\x33\x63\xFA\x82\xF3\x98\xD1\xE4\xEB\xBF\x13\x22\xFC\xC0\xDC\x9F\xE6\xFC\x84\xFB\x01\xDB\xDC\xEF\xEA\xDC\x86\xFF\xBE\xFE\xDA\x8C\xF2\x4D\xF1\x38\xFF\x13\xF3\x22\xF1\x85\xF5\xC8\xC2\x1A\xC1\xF2\xB5\x8D\x3C\xFD\xDB\xC5\xC4\xF6\x62\xF0\xF2\xFB\xB7\xD2\xFC\x06\xDE\xB5\xEE\xA0\xFA\xE5\xEA\x22\xFD\x2B\x1F\xD7\xF0\x16\xE1\xEB\x44\xFD\xB5\xB6\xBC\xEB\x63\x02\xC2\xC7\x89\x90\xFD\xA9\xFA\xE0\xE8\x42\xF2\xB8\xEA\x90\xEB\xF3\xDD\xF8\xE1\xF1\x16\xEE\xF1\xED\xB0\xEC\xB2\xC3\x6C\xEA\xCB\xE7\xDF\xEA\xF1\xE9\xEE\x76\xF3\x88\xFA\x18\xFD\x89\xF1\xC0\xF1\xE3\xA8\xFC\x75\xF2\x7A\xF3\x2F\xB9\xB5\xD4\x9A\xF1\x17\xCB\xD8\xBD\xD6\xF0\xFB\xDC\xCC\xAE\xF8\xB7\xF2\xE9\xFB\xBE\xF8\xDF\xEA\xF0\xBB\xEE\x4B\xED\xEF\xE8\x38\xF8\x8B\xE5\xC7\xFA\xE2\xE7\xF1\xBC\xF1\x74\xF0\x5B\xF1\xD9\xFE\x96\xEB\xF6\xDA\xE4\xCD\xFD\xC4\xF1\x3E\xFC\x28\xF2\xC9\xD4\x55\xEB\xF1\xCB\xBC\xF9\xF2\x67\xBB\x18\xE8\x8C\xE8\xC7\xF9\x24\xE5\xF3\xDD\xE5\x8B\xF3\xEE\xEB\xC6\xF2\x37\xF5\xD2\xF3\x8E\xF7\xF4\xDA\xF8\xC0\xED\x3A\xEE\x61\xEC\xCF\xEF\xA5\xCE\x73\xFE\x77\xE0\xDD\x80\xDE\x62\xEE\x81\xDF\x3B\xF4\xE0\xDF\xEC\xE6\x78\xFA\xBC\xA9\xFD\x54\xFC\xB0\x41\x8B\xFA\x72\xDA\x20\xF9\x8F\xDC\xD5\x96\xD7\x83\xC0\xEA\x1A\xE6\xD2\x44\xF5\x6B\xFE\xF7\xCA\xE2\xE9\xFC\x02\xFF\xC7\xDA\xAF\xFF\x21\xF5\x82\xE3\xF2\xC1\xF9\xC5\xFC\x11\xF3\x4D\xFF\x9C\xFC\xE1\xF5\xE7\xE6\x78\xF7\xF9\xF8\xF0\xA2\xFC\xA1\xB5\xFB\xEE\x28\xFF\x7E\xF3\x03\xFF\xF9\xD2\xEC\xF6\xFD\xF8\xD4\xBE\xFC\x63\xBF\x6F\xE1\x7A\xDD\xC9\xC4\xD7\xB6\xC1\x81\xEC\x95\xCD\xE0\xEA\xC2\xC0\xC8\xE6\xC9\x8C\xED\x3C\xE6\xDA\xEF\x40\x03\xDB\xFE\xDD\xF8\xB1\xEF\xE2\xE9\xF0\xB1\xF1\x70\xFD\xDD\xEB\xDC\xF0\x9D\xE8\xF8\xD3\xE2\xCA\xEB\x95\xF0\x16\xF3\x25\xF6\xCE\xF0\xEA\xF6\x33\xF9\xFC\xF6\xC8\xF0\xFC\x8E\xF1\xC5\xF9\xE7\xD9\xE2\xF0\x6E\xF7\xE5\x88\xEC\xF7\xF1\x3D\xEA\x0F\xFF\xD5\xEF\x0E\xD8\xD8\xD9\xBC\x8D\xCD\xD6\xF1\x4E\xFB\x49\x14\xEA\xF8\x79\xF6\xFA\xF9\xDA\xD8\xFE\xDD\xF0\x95\xFC\xC1\xFD\x2C\xF6\xF0\xE2\xCB\xFF\xB4\xF1\xF0\x07\xF1\x39\xF1\x02\xF5\x0E\xFB\xEC\xDF\xC5\xC6\xBC\x99\xF2\xCF\xDD\x3D\xFF\x9E\xCE\xD4\xF2\xEA\xC8\xF5\xFD\xB7\x99\xFE\x0B\xD0\x30\xF0\x62\xED\xDA\xEC\xBC\xA0\x94\xC3\xCC\x88\xED\x4C\xFE\x5D\xC1\xAC\xE8\xDE\xCC\xDC\x18\xA2\xEA\xED\xAF\xF3\x8F\xFD\x7F\xFF\xD5\xFC\x31\xF0\xEE\xEE\xCC\xC3\xFE\xEF\xFC\x85\xFE\x2B\xF4\x1C\xF1\x17\xFC\x6E\xFB\xC5\xEE\xDB\xBD\xF1\x72\xDA\xC7\xFE\x7D\xD8\xF2\xF8\x7C\xF2\xFC\xCF\x9C\x94\xFF\x69\xDE\xCB\xFC\xA9\xD9\xE8\xFE\xCF\xC3\xFA\xDA\xC9\xA3\xD8\x01\xEE\x6C\xED\xE8\xFE\xCA\xC6\xF7\xFA\x99\xC9\xDC\xDD\xFE\x26\xC6\x3E\xB4\xDF\xFF\xF6\xE8\xF2\xED\xFD\xC3\xFC\xB3\xF1\x07\xFF\x5A\xF0\x87\xFC\xE5\xFE\xE1\xFF\x7A\xD6\xE6\xE1\xDE\x22\xFC\x2B\xF2\x1E\xF2\xB5\xE8\xBB\xDD\xC8\xC9\xB9\xB0\xBF\xAE\xEB\x55\xD8\x6C\xE9\xEE\xFD\x61\xCB\xB9\xEF\xEE\xD9\xFD\xA9\xFF\x93\xFF\xA4\xFC\xF3\xEF\xFA\xEF\xF9\xE0\xDF\xC1\xFD\xE3\xF1\xF1\xEC\x5A\xF0\x0A\xF6\xEC\xF1\xE4\xEB\xFB\xD4\xF0\xB4\x6B\xEE\x7E\x91\x7F\x69\x7F\x7C\x7E\x9A\x5D\x7E\x7E\xF4\x7E\xA2\x78\x6F\x7F\x2C\x76\xEC\x7F\x6D\x77\x49\x5C\xAC\x72\x60\x7B\x2B\x7D\x1E\x62\xD3\x7F\xDA\x78\xD5\x7F\x59\x7F\xAE\x7F\xD8\x7F\x86\x7F\x3A\x79\x2E\x7F\x6C\x7E\x30\x7F\x3E\x79\xC2\x6D\x40\x79\xBA\x7F\x6B\x6E\xE2\x7F\x24\x7E\xE4\x7F\x4C\x6D\xE6\x7F\xD3\x6E\xCD\x77\xD5\x6E\xA2\x79\x65\x5B\x81\x76\x6E\x77\xAC\x79\xB3\x6C\xB7\x7E\xAA\x7F\x7F\x7F\xAC\x7F\x16\x80\xD7\x7F\xBC\x77\x03\x78\x19\x80\x40\x6C\xC3\x7E\xB6\x67\xC5\x7E\xE9\x7E\x6B\x79\xB9\x7F\x6D\x79\xA7\x77\x6F\x79\x78\x76\x25\x80\x47\x6E\x27\x80\x7C\x76\x3F\x7F\x7E\x76\xC4\x7F\x52\x6D\xC6\x7F\xB8\x72\xA6\x79\xF8\x7D\x8B\x7E\xFF\x00\xFE\x7A\x02\x74\x55\x7F\x3A\x7E\x32\x80\x20\x78\x62\x7A\x6A\x7E\xF5\x7F\x1C\x80\xF7\x7F\x0E\x79\x98\x7E\x42\x76\xE6\x7E\xB5\x7F\xE8\x7E\xB7\x7F\xEA\x7E\x40\x80\xEC\x7E\x42\x80\x02\x80\xBD\x7F\x04\x80\x93\x7F\xC5\x78\x86\x77\x49\x80\xD0",
"\x76\x81\x7E\x3F\x21\xB2\x77\xB9\x67\x52\x7F\x02\x01\x13\x80\x2D\x79\x8A\x79\xAB\x7F\x01\x7F\xD6\x7F\x82\x7F\x18\x80\xB2\x7F\x1B\x7E\x1B\x80\xBF\x7E\x70\x7E\x31\x7F\xFB\x7F\x9C\x7E\xFD\x7F\x9E\x7E\xD1\x1A\x37\x7F\xC0\x78\x67\x7F\xD4\x44\xBE\x7F\xA2\x6D\xC0\x7F\x7F\x75\xC2\x7F\x09\x6F\x4B\x80\x80\x76\x4D\x80\xF5\x72\xA6\x78\x3C\x7E\x77\x7F\x58\x6D\xCE\x5C\x51\x77\x12\x80\x57\x80\xB9\x77\x3F\x1B\x5A\x7F\x6D\x78\x5C\x7F\xDE\x79\x5E\x7F\x88\x7F\x94\x78\x8A\x7F\x96\x78\x8C\x7F\x7E\x77\x21\x80\xCD\x6E\x69\x80\xEC\x77\x8E\x80\xCB\x6D\x90\x80\xD6\x75\x92\x80\x6B\x6F\x71\x80\xD2\x76\x9A\x7F\xED\x72\xF7\x77\xB6\x6D\xF9\x77\x9E\x80\xF2\x7F\xDE\x7E\xBC\x80\x7C\x80\xB8\x6D\x2B\x7F\x5F\x80\xC6\x75\x5E\x80\xD9\x7F\xE5\x7E\x67\x79\xE7\x7E\x69\x79\x3E\x80\xC7\x7E\xFF\x7F\x1E\x77\x55\x78\x34\x6F\xC8\x6D\xA4\x7E\x4E\x76\x6B\x7F\x52\x75\x08\x80\xC8\x78\x0A\x80\xFC\x76\xB9\x80\x21\x7F\x18\x0F\x03\x75\xAC\x74\x8E\x7E\x7B\x7F\x9F\x80\x8C\x78\xA1\x80\x17\x80\x37\x80\xB6\x78\xC8\x80\xEC\x6D\x5F\x7F\x3B\x77\x61\x7F\x74\x7E\x63\x7F\x36\x7F\x65\x7F\x75\x6D\xD2\x80\x4C\x76\xD4\x80\xA5\x76\xD6\x80\xAD\x75\xF5\x7E\xDA\x80\x3A\x78\xDC\x80\x87\x4F\xD2\x77\x78\x80\x7C\x6E\xE7\x72\x22\x6A\x9D\x80\x31\x80\xBF\x80\xBB\x7E\x9B\x77\xBD\x7E\x5B\x80\x82\x80\xB1\x7F\xE4\x7E\xEA\x80\xA7\x80\x60\x7F\xA9\x80\x62\x7F\xAB\x80\x0B\x78\xAD\x80\x4A\x76\xF3\x80\x21\x77\xF5\x80\x23\x77\xF7\x80\x50\x76\x6F\x80\x88\x77\xB7\x80\x8A\x77\x4C\x77\xAE\x6C\x8A\x68\x25\x63\xF0\x7F\xE2\x80\x05\x81\x16\x7E\x21\x78\x5A\x80\x7E\x80\x0C\x81\x70\x6C\xC7\x80\x39\x80\xA6\x80\xB4\x7F\x72\x78\xB6\x7F\x74\x78\xB8\x7F\xF0\x76\x14\x81\xF2\x76\x4C\x7E\x43\x77\x4E\x7E\xF6\x76\xB3\x80\x04\x76\xB5\x80\x81\x75\x2B\x80\xDA\x75\xD5\x7E\x7B\x73\xF8\x72\xD0\x0D\x29\x6E\x13\x6F\x11\x7E\x09\x01\x77\x80\x57\x79\x1F\x6F\x27\x81\x59\x80\x29\x7F\xC3\x80\x09\x81\xDC\x7F\xC0\x7E\x2D\x81\x7F\x80\x2F\x81\x61\x80\x31\x81\x63\x80\x33\x81\x65\x80\x35\x81\x41\x80\x30\x78\x43\x80\xA9\x77\x3A\x81\x45\x77\x3C\x81\x28\x76\x3E\x81\xD8\x75\x40\x81\xAB\x76\x4D\x66\xB0\x72\x07\x5F\x50\x80\x51\x80\x05\x73\xDC\x6A\x04\x81\xFE\x7D\xFC\x77\xA0\x80\xD1\x1A\xA2\x80\x96\x7E\x6E\x78\x38\x7B\xC9\x80\x9A\x7E\x85\x80\x33\x7F\x94\x65\x0D\x7F\x4A\x75\x0F\x7F\x4C\x75\x11\x7F\x4E\x75\x13\x7F\x50\x75\x1A\x81\xA7\x76\x29\x80\xA9\x76\x67\x81\x4C\x66\x64\x5D\x4C\x64\xC5\x7D\xFA\x78\xDA\x78\xB0\x63\x7E\x6E\xAC\x5D\x28\x04\xB2\x7E\xDA\x5D\x83\x6E\x79\x7F\x1B\x78\xDA\x7E\xE3\x80\xDC\x78\xE5\x80\x36\x80\xE2\x7E\x38\x80\x55\x81\x75\x69\xFA\x7F\xCB\x80\xFC\x7F\xCD\x80\xFE\x7F\x66\x80\x00\x80\x43\x6E\xAF\x80\xEE\x78\x9C\x79\x7D\x75\x63\x81\xF8\x76\x65\x81\x06\x76\xFA\x80\xA4\x78\x96\x80\xB6\x19\x06\x7E\xEC\x7A\x9F\x7F\xCF\x0D\x23\x73\x70\x0B\xE8\x63\x4E\x7F\x28\x73\x38\x69\x98\x81\xFD\x21\x70\x81\xAD\x78\xE1\x76\x4D\x81\x46\x78\x3F\x7E\x51\x81\xC5\x80\x2D\x7F\x6E\x7E\xF6\x7F\xA3\x81\x62\x80\xCC\x80\x64\x80\x3F\x80\x5C\x81\x67\x80\x5E\x81\xAB\x81\x70\x79\x45\x80\x6F\x6E\x86\x81\x25\x77\xD1\x7E\x2A\x7E\xB3\x81\xCA\x78\xFC\x80\xF3\x5D\xA8\x7B\x54\x73\xFF\x80\x94\x69\x45\x71\x35\x73\xB8\x16\x95\x81\xE4\x6E\x23\x64\xC1\x81\xE0\x80\x9A\x81\x26\x81\x00\x7F\x32\x77\x4F\x81\xF2\x6E\xC4\x80\xE9\x80\x2C\x81\x92\x78\x0E\x81\xEC\x80\x10\x81\xEE\x80\x12\x81\x98\x78\x36\x81\x80\x77\x16\x81\x82\x77\x18\x81\x84\x77\x6D\x80\x5B\x78\x88\x81\x69\x77\x98\x7F\x42\x21\x23\x79\x4F\x79\x12\x7B\x51\x79\xA0\x7F\x2A\x33\x48\x73\xCD\x7F\x8B\x76\x4B\x73\xEC\x81\xF5\x4C\xC3\x81\x89\x79\xAE\x78\x33\x80\x7B\x80\x35\x80\x7D\x80\xE7\x80\xDB\x7F\xCA\x81\xDD\x7F\x75\x75\xDF\x7F\x77\x75\xE1\x7F\x00\x82\x57\x78\x02\x82\x59\x78\x04\x82\x9F\x79\x06\x82\xAF\x77\x8A\x81\x43\x5C\xB5\x81\xFC\x20\xE2\x81\xB8\x81\x99\x6F\x61\x7D\x58\x73\x47\x6F\xBE\x81\x4A\x73\xD4\x0D\x85\x79\xF5\x64\x87\x79\x26\x7F\x71\x81\x1F\x78\x73\x81\x36\x6E\x19\x7E\x2E\x81\xDA\x7F\x81\x80\x52\x81\x83\x80\x1E\x80\xA3\x75\x20\x80\x5D\x81\x78\x7E\x5F\x81\x32\x78\xAD\x81\x34\x78\xAF\x81\x47\x77\xB1\x81\x2A\x76\xDE\x81\x4C\x79\xE0\x81\x00\x6D\x98\x80\x67\x7E\x60\x66\x31\x82\x75\x6F\x73\x73\xFB\x69\xD7\x78\xCB\x02\xFF\x3C\x7B\x6F\xB2\x58\xD0\x71\xB3\x74\xFB\x0D\x10\x7E\xE1\x80\x27\x01\x6E\x7C\x3E\x78\xBA\x7E\xC6\x81\x09\x79\xC8",
"\x81\x2A\x81\xD0\x7F\x3C\x6D\xA0\x81\x2B\x81\x60\x80\xCA\x80\xCF\x81\xA5\x81\xD1\x81\xCE\x80\xA8\x81\xD0\x80\x01\x80\x23\x80\xCC\x7E\x27\x82\x9E\x78\xF2\x7E\xC6\x78\xD8\x80\x20\x79\x94\x80\x3D\x6F\x1B\x7F\x59\x75\xF8\x71\x6D\x6A\x0C\x72\x50\x5F\x60\x75\x5F\x7E\x36\x7E\x54\x5F\x64\x75\xFD\x7E\x1E\x62\x6B\x82\x14\x7E\x90\x68\x06\x81\xDC\x77\x81\x7F\x50\x81\x71\x82\xA5\x80\x44\x82\xCC\x81\x5C\x80\xCE\x81\x58\x81\xD0\x81\x5A\x81\xD2\x81\x76\x78\x4B\x82\x38\x7F\x4D\x82\x44\x79\xD8\x81\x37\x6F\xDA\x81\xCC\x77\x1C\x81\xCE\x77\x1E\x81\x84\x6C\x89\x82\x6F\x41\x59\x7E\x1E\x7F\x8A\x75\x5D\x75\xB5\x7E\xE4\x0A\x12\x21\xB8\x76\x60\x7E\x18\x6A\x91\x75\xD5\x7D\x64\x7E\x95\x82\x9B\x81\x80\x7F\x9D\x81\x1C\x82\x9F\x81\xE8\x80\x43\x82\x79\x81\x84\x80\xA4\x81\x86\x80\xA6\x81\x88\x80\xE4\x64\xFE\x81\xC6\x77\xD6\x81\x44\x80\x84\x81\xAB\x75\xAE\x82\x13\x78\x53\x82\xFA\x76\x55\x82\xA6\x6E\x2F\x82\xDF\x70\x15\x0B\xBB\x03\xAE\x04\x88\x7E\xA3\x7F\x21\x73\x31\x72\x8D\x7E\x88\x78\x47\x62\x96\x82\x99\x80\xBA\x6E\x99\x82\xDF\x7E\x1B\x82\x9C\x82\x1D\x82\x45\x82\x1F\x82\x1D\x80\x1F\x7E\x1F\x80\x21\x7E\xF6\x6A\x38\x81\x63\x77\x61\x81\x65\x77\x51\x82\x67\x77\x2B\x82\xF2\x77\xB2\x82\xF4\x77\x42\x81\xD0\x6A\x02\x5A\x97\x65\xE0\x75\x06\x6B\x11\x82\xAD\x6E\xB4\x7E\x40\x6B\xCB\x70\xD0\x5C\xEA\x82\x5A\x82\x15\x7E\xF0\x81\x36\x79\xF2\x81\xF0\x75\xF4\x81\xCA\x82\x0D\x79\xF7\x81\x30\x81\x89\x7F\x32\x81\x8B\x7F\x34\x81\xA7\x82\xD4\x81\x4C\x82\xD4\x82\x60\x81\x58\x5D\xD4\x75\xFD\x82\xAD\x77\xFF\x82\x5D\x78\x01\x83\x5F\x78\x0C\x80\x0A\x76\x3A\x72\x22\x7B\x0E\x7D\xDC\x67\x0F\x83\x91\x7E\x3D\x7E\xF3\x7F\x08\x81\x9D\x82\xFD\x79\x02\x78\xC9\x82\xA1\x81\xCB\x82\x48\x82\xC2\x77\x4A\x82\x20\x83\xA9\x82\x22\x83\x4E\x82\xFB\x82\xAB\x77\x26\x83\x48\x79\xDA\x82\x49\x77\xD3\x7E\x4B\x77\x69\x81\xAD\x76\x03\x5A\x4E\x60\xFC\x7E\x5C\x58\x34\x76\x32\x83\xB9\x7E\xDD\x7E\xED\x82\xC1\x80\xEF\x82\xF3\x81\xC9\x81\xF5\x81\x91\x78\x72\x6C\xEB\x80\x0A\x7F\xED\x80\x34\x7F\xEF\x80\xF6\x6D\x8A\x80\x8F\x7F\x8C\x80\x87\x6B\xAC\x82\xCA\x77\xD8\x82\x7E\x78\x28\x83\x80\x78\x2A\x83\x41\x5D\xB4\x82\x60\x61\x45\x7B\x8C\x82\x1F\x7F\x50\x72\xFD\x7C\x90\x5E\x25\x66\x14\x82\x62\x4D\xE9\x82\xC4\x82\x34\x80\x9B\x82\x59\x83\x37\x83\x78\x81\x18\x83\x5D\x83\xF8\x81\x5F\x83\xFA\x81\x61\x83\xFC\x81\x64\x7F\xD2\x82\x0D\x78\x66\x83\x0C\x67\x81\x82\xCE\x7E\x35\x78\x74\x79\x48\x83\x15\x78\xEA\x7F\x17\x78\x03\x83\x8E\x73\x9C\x7F\x7C\x0A\x86\x76\xB9\x81\x4B\x7F\x29\x6C\xA2\x7F\x09\x83\xA4\x7F\xD0\x0D\x5A\x66\x24\x7F\x4B\x6F\x31\x83\x7C\x83\x1A\x82\x7E\x83\x15\x83\x5A\x83\x17\x83\xF6\x81\x83\x83\x1A\x83\xA8\x80\x1C\x83\xAA\x80\x1E\x83\x8D\x7F\xA8\x82\x8B\x80\xAA\x82\x7A\x7E\x6B\x80\xBF\x7F\x29\x82\x51\x7E\x6C\x83\xA1\x79\x6E\x83\xA3\x79\x20\x81\x99\x62\xF0\x7F\x80\x01\xB0\x76\x9F\x83\x58\x79\xCC\x0D\xFD\x6B\xA3\x83\x7A\x7F\x6A\x82\xA6\x83\xF1\x81\xC2\x80\x7F\x83\xF1\x82\xA0\x82\x82\x80\xA2\x82\x1B\x83\x59\x81\x1D\x83\x5B\x81\x1F\x83\xA9\x81\xEA\x77\x42\x83\xAB\x82\xD6\x82\xE5\x7F\x6A\x83\x1E\x79\x85\x82\x80\x7E\x87\x82\x22\x79\xDE\x82\x45\x7F\x68\x73\x47\x7F\x7F\x72\xD7\x76\x4A\x7F\xB7\x66\xCB\x7F\xAE\x79\xDA\x78\x2D\x61\x79\x83\x0E\x69\x53\x83\xDC\x7E\x34\x83\xC0\x80\xF0\x6E\x14\x83\x15\x76\xF3\x82\x5D\x80\x19\x83\x57\x81\xD4\x83\xA4\x82\xD6\x83\xA6\x82\xB3\x83\x40\x83\xB5\x83\xDB\x83\xB7\x83\x8E\x83\xF1\x7E\x06\x80\xF3\x7E\xE8\x7F\xF9\x80\x94\x83\x78\x79\x57\x82\xFE\x76\xC8\x7F\x59\x61\xFA\x5B\xEB\x83\x2D\x75\x9D\x83\xCC\x7F\x37\x82\xDB\x76\xCF\x7F\x9E\x82\x24\x81\xCB\x83\xEF\x81\x7A\x80\xCD\x83\x58\x83\xA9\x83\x80\x83\xF3\x7A\x39\x83\x1E\x82\x5B\x83\x10\x79\x3D\x83\x14\x79\x3F\x83\xD9\x83\xCA\x7E\x7F\x82\xEF\x7E\x07\x84\x6A\x7F\x90\x83\xD0\x7E\x92\x83\x4A\x79\xDC\x82\xF7\x7E\x0F\x84\x36\x65\xEE\x7F\x78\x7B\xD1\x7F\x0E\x83\xCC\x83\x13\x83\xCE\x83\x22\x84\xD0\x83\xF8\x7F\x65\x79\xD3\x83\xAF\x83\xD5\x83\xB1\x83\xD7\x83\x02\x84\x2C\x84\xED\x7E\x2E\x84\x03\x80\x30\x84\x05\x80\xC1\x5D\xC1\x7F\xBC\x83\x53\x7E\x2D\x82\x80\x6D\x38\x84\x00\x72\x0E\x80\xB6\x6F\x3C\x84\xC3\x82\x1E\x84\x19\x82\x20\x84\xA8\x83\xF9\x83\x27\x84\xCB\x81\x43\x84\x6F\x7E\x45\x84\x0F\x81\xB0\x83\x11\x81\xB2\x83\xAC\x80\xB4\x83\x65\x83\xB6\x83\xA3\x7E\x68",
"\x83\x7C\x78\xDF\x83\xE7\x7F\x47\x60\xE9\x7F\xF5\x78\xAC\x6C\x96\x83\x84\x66\x2E\x80\x57\x7B\x48\x81\x06\x01\xF3\x83\x55\x80\x55\x83\x6E\x82\xBC\x7E\x70\x82\x42\x84\x54\x81\x75\x82\x28\x84\xF5\x82\x49\x82\xF7\x82\xE7\x6B\x3E\x60\xD3\x80\x70\x84\x3C\x7F\x47\x80\xF0\x77\x53\x84\x18\x7F\x55\x84\x99\x7F\x2C\x83\x4C\x72\xFE\x80\x4B\x81\x8A\x7E\x04\x6D\x8C\x5C\xD6\x6D\x27\x09\x7E\x84\x7D\x7F\x6D\x82\x12\x83\x99\x7A\x40\x84\x61\x84\xAB\x83\x5C\x83\xC8\x75\x09\x7F\xC4\x7E\x0B\x7F\x7D\x81\x35\x7F\x63\x83\xF1\x80\x1E\x65\x4D\x84\x6A\x80\x4F\x84\x6C\x80\x83\x82\x6E\x80\xE1\x83\x40\x7F\x36\x84\xAE\x66\x73\x80\xDC\x67\x75\x80\x01\x01\x9F\x84\xD4\x7F\x35\x83\x83\x84\xC8\x82\x26\x84\xA6\x84\x87\x84\xDE\x7F\x20\x7E\xE0\x7F\xF8\x82\x8C\x84\xF4\x80\x8E\x84\x72\x79\x3D\x7F\x3F\x5F\xDC\x81\x6E\x7F\x0D\x84\x70\x7F\x78\x84\x27\x72\x59\x82\x33\x83\x9A\x80\xD0\x0D\xD6\x77\xE1\x47\xD8\x77\xA5\x83\x5D\x84\x58\x80\xC7\x81\x29\x81\x84\x84\xFC\x83\x77\x82\xA3\x82\x79\x82\xA5\x82\x7B\x82\xD3\x81\x4B\x84\x68\x80\xB1\x84\xB0\x80\xB8\x83\x8F\x80\xBA\x83\xA7\x7E\x92\x84\x97\x7F\x94\x84\x09\x82\xDE\x82\xBB\x80\xF7\x83\x5B\x84\x7B\x83\xDF\x84\x40\x82\x95\x76\x5B\x7F\x74\x82\x72\x82\x0D\x81\xAE\x83\x67\x84\x47\x84\x69\x84\x49\x84\x6B\x84\x03\x84\x6D\x84\x05\x84\x6F\x84\xDD\x83\x26\x80\x72\x84\x28\x80\xB0\x82\x2A\x80\xBE\x83\x2C\x80\xF7\x84\xDD\x72\x9D\x7C\xBD\x84\x00\x00\xBF\x84\x14\x80\xC1\x84\xE2\x84\xC3\x84\xF2\x82\x62\x84\x20\x82\x5D\x77\x22\x82\x5F\x77\x4A\x7E\x10\x7F\xF9\x82\x12\x7F\x4F\x82\xF0\x78\x32\x84\x16\x7F\x6D\x7F\xA7\x6D\x4A\x83\xF6\x78\xD5\x84\x37\x72\xD7\x84\x54\x83\xC4\x70\x01\x81\xC7\x29\xDD\x84\x9E\x84\x3E\x84\xA3\x84\x21\x84\xA5\x84\x3B\x83\x82\x83\xA8\x84\x5E\x83\xAA\x84\x60\x83\xAC\x84\x62\x83\x27\x5B\xEB\x84\xD5\x81\xED\x84\xAC\x81\x44\x83\x9D\x79\xF1\x84\x95\x7F\xF3\x84\xC3\x7F\xB9\x84\xC5\x7F\x57\x84\x77\x83\x22\x81\x04\x6E\x73\x7F\xC4\x65\x1A\x85\xE4\x81\x67\x78\x1F\x84\x3F\x84\x3C\x85\x69\x76\x20\x85\x53\x81\xE4\x84\x7A\x81\xCD\x82\x7C\x81\xB6\x67\x7E\x81\x1D\x77\x4B\x75\x1F\x77\x25\x82\xE3\x7F\x0D\x85\x46\x80\x0F\x85\x48\x80\xB7\x84\x4A\x80\x51\x85\x4C\x80\x53\x85\xBE\x82\x4A\x74\x28\x6E\xFA\x72\x18\x85\x59\x85\x99\x84\x79\x80\x5E\x84\x5D\x85\x60\x84\x5F\x85\xC5\x84\x63\x84\x85\x84\x01\x85\x99\x7E\xCC\x82\x78\x82\xCE\x82\x7A\x82\xA7\x81\xEA\x84\x7D\x82\xAA\x81\x49\x85\xD7\x81\x6D\x85\xD9\x81\x2B\x85\x6C\x7F\xD1\x84\x2E\x85\xE2\x5C\x0B\x80\x31\x85\x58\x72\x33\x85\xF4\x83\x60\x7D\x04\x73\xF1\x83\x7C\x5A\x7B\x85\x0C\x82\x88\x6D\x81\x84\x07\x81\xC2\x84\xFF\x84\x3A\x83\x86\x84\x94\x79\xC7\x84\xF6\x82\xC9\x84\x8B\x84\xE9\x6B\xCD\x84\x26\x7E\xCF\x84\x07\x6F\x34\x84\x76\x79\xD3\x84\x98\x85\xC0\x83\xD9\x6E\xC2\x7C\xFB\x78\x10\x73\xD2\x08\x12\x73\xE4\x82\x83\x79\x15\x73\x9F\x85\x3D\x84\xFC\x84\xE4\x80\x74\x81\xE6\x80\x1E\x85\xD1\x83\x46\x82\x66\x84\xF9\x81\x68\x84\xFB\x81\x6A\x84\x13\x81\x6C\x84\xBB\x7F\x8C\x83\xEA\x64\xB0\x85\xA5\x7E\x4D\x85\x52\x84\x11\x85\x89\x81\x13\x85\x41\x81\xB8\x85\x21\x63\xB7\x81\xBB\x85\x22\x73\xAF\x6E\xBC\x81\xFF\x78\xE3\x75\x72\x7B\xB2\x76\x18\x0F\x03\x79\x6F\x81\x58\x85\x3A\x85\x17\x7E\xF8\x83\x81\x85\x3E\x85\xAC\x83\x40\x85\x84\x83\x42\x85\x86\x83\x44\x85\x88\x83\xF0\x80\x8A\x83\x9A\x78\xD3\x85\xB2\x67\x91\x85\xAD\x82\x93\x85\xD7\x80\x0B\x84\x09\x80\xB6\x85\xDB\x80\x96\x84\xBA\x72\x5C\x82\x90\x81\x04\x71\x2A\x79\xE1\x6E\xE9\x81\x01\x5E\x3B\x73\xDD\x76\xA8\x7F\x39\x85\xC4\x85\x9C\x81\xC6\x85\x9E\x81\xA7\x85\xC4\x84\xF0\x85\x76\x82\x63\x85\x88\x85\x65\x85\x50\x68\x67\x85\x53\x78\x8D\x85\xDA\x83\x8F\x85\xD5\x82\x29\x85\x14\x7F\xFF\x85\xF8\x80\x02\x86\x76\x84\xEB\x7F\x99\x85\xF8\x78\x0B\x82\xE4\x75\x28\x79\x12\x6F\x47\x73\x15\x6F\x0C\x86\xCE\x72\xCC\x0D\x5A\x79\xEA\x85\xB9\x67\xA1\x85\x2E\x86\x98\x82\xA4\x85\x9A\x82\xC6\x82\xF0\x82\xC8\x85\x64\x84\xCD\x81\x3B\x80\x50\x68\x3D\x80\x8A\x85\xD0\x82\x24\x68\x47\x85\x21\x83\x22\x86\x23\x83\x36\x5E\x2A\x85\x46\x83\x91\x83\x4F\x85\x93\x80\x73\x85\x95\x80\x75\x85\x5F\x69\x53\x73\x32\x82\x3F\x78\x34\x82\xFD\x21\x59\x73\xC5\x83\xC0\x85\x39\x82\xA4\x83\x52\x64\xFB\x84\x3E\x82\xDB\x78\xC5\x82\x14\x86\xC7\x82\x16\x86\x1F\x85\x82\x85\x21\x85\x47\x7E\x23\x85\x49\x7E\x24\x82\x4D",
"\x75\x23\x6D\xD5\x85\xD5\x80\x26\x86\x1B\x81\x71\x85\x70\x80\xE3\x83\xAB\x7E\xDE\x82\x98\x84\xA2\x85\x3B\x17\x07\x86\x6A\x73\xB4\x02\x7F\x6F\xE5\x85\xC7\x0D\xFD\x69\x63\x82\x5D\x82\xD8\x71\xEE\x66\xB9\x75\xD0\x0D\x68\x82\xE8\x82\xC4\x65\xA3\x70\x63\x86\x15\x80\x80\x85\x34\x77\x60\x85\xFB\x83\xAD\x83\xFD\x83\x46\x84\xFF\x83\x48\x84\x01\x84\x08\x85\x49\x86\x41\x83\x4B\x86\x43\x83\x24\x83\x4F\x7E\xD7\x85\x91\x80\x51\x86\xB6\x80\x78\x86\x31\x5A\x56\x7E\x1A\x66\x58\x7E\x5A\x75\xB7\x82\x5A\x76\xB9\x82\x0C\x83\xFD\x71\x31\x21\x90\x82\x46\x5D\x92\x82\x37\x75\x18\x85\x8E\x86\xC4\x81\x5B\x85\x7E\x85\x3B\x85\x91\x86\x38\x79\x6A\x86\x61\x85\x95\x86\xE5\x84\xFE\x83\xE7\x84\x00\x84\xE9\x84\xD8\x83\x20\x86\x2D\x84\x6B\x85\x24\x80\xFD\x85\x69\x83\x74\x86\x87\x81\xD9\x85\x07\x82\xF5\x84\xD5\x70\x8E\x76\x08\x72\x1C\x7F\x4C\x72\x5A\x7E\x3E\x0D\xAE\x86\x6F\x08\x21\x0B\xBC\x82\x61\x75\x48\x72\x61\x7E\x82\x6F\x63\x7E\xB6\x86\xEC\x85\x28\x81\xEE\x85\x92\x86\xBE\x86\x94\x86\xF2\x85\x03\x85\xCC\x85\x05\x85\xCE\x85\x07\x85\xD0\x85\x09\x85\xD2\x85\x6E\x84\x3A\x7F\xB1\x80\xDB\x5C\x90\x84\x3E\x7F\x76\x86\x1D\x81\xA6\x86\xB8\x80\x05\x86\xCB\x72\x1A\x72\xE1\x82\x1C\x72\xA3\x5A\xD4\x6A\x82\x86\xDA\x68\xAA\x5A\xA4\x7A\xE2\x86\x12\x86\x65\x86\x41\x82\x16\x83\x18\x86\xC6\x80\x62\x85\x87\x85\xE6\x84\x89\x85\xE8\x84\x8B\x85\xC6\x86\x69\x85\xD1\x80\x70\x86\x35\x6F\x72\x86\xF6\x80\xCD\x86\xDB\x81\xB4\x85\xD2\x7E\x97\x85\x04\x86\x2B\x86\x72\x7F\x05\x83\x04\x6B\x2D\x72\xD1\x5A\x18\x84\xD7\x6D\x0B\x83\xDA\x86\x0D\x83\x1E\x62\xB7\x86\x17\x82\xC5\x81\xA2\x84\xED\x85\xA4\x84\xEF\x85\xA9\x85\x6D\x7E\x41\x86\xA1\x82\x43\x86\xA6\x6D\x45\x86\x12\x87\x47\x86\x50\x65\x9C\x86\x04\x84\x9E\x86\xDC\x83\x24\x86\x85\x81\x1B\x87\xAF\x82\xF8\x86\xB1\x82\xFA\x86\x1F\x81\x4C\x83\x8B\x61\x2E\x83\xB6\x7E\x8D\x86\xE3\x86\x4E\x81\x32\x87\xE6\x86\x0C\x87\x83\x85\x0E\x87\x29\x84\x9D\x7E\x2B\x84\xC7\x86\x4C\x84\xC9\x86\x80\x82\x19\x87\x19\x81\x44\x87\xD9\x82\xA4\x86\x3F\x81\xDB\x85\x68\x81\x8C\x81\x4C\x60\xFA\x7E\xD4\x0D\x31\x76\x9A\x74\x47\x62\x2D\x87\xC3\x70\x68\x7E\x1C\x85\xE5\x86\xBD\x86\x53\x87\x35\x87\x84\x85\x9E\x82\x3C\x83\x88\x84\x3E\x83\x8A\x84\x63\x6F\xCB\x84\x17\x81\x5D\x87\x03\x82\xB5\x84\x05\x82\xCF\x86\x2C\x82\x63\x87\x96\x49\x70\x83\x8C\x64\x72\x83\xA2\x6A\x95\x6B\x75\x83\xDD\x80\x96\x59\x23\x7F\x43\x6A\x2C\x87\x4F\x87\xE1\x84\x70\x87\x61\x79\x72\x87\xBF\x86\xE9\x86\x96\x86\x04\x85\x98\x86\x06\x85\x9A\x86\xEF\x86\x3E\x87\x0A\x85\x40\x87\x06\x84\x7D\x87\x28\x82\x7F\x87\x2A\x82\x81\x87\x00\x83\x48\x87\xD0\x77\xE5\x83\x98\x83\x85\x76\xC5\x6B\x9B\x83\xEC\x83\x16\x84\xEE\x83\x5A\x85\x34\x86\xA1\x83\x79\x83\x34\x76\x6C\x87\x6C\x82\x80\x84\x30\x87\xE4\x86\x51\x87\x71\x87\x34\x87\x95\x87\x17\x77\x38\x87\x06\x6F\x3A\x87\xC4\x86\x13\x87\x4A\x84\x59\x87\xEC\x84\x5B\x87\x2F\x84\xA1\x87\x82\x82\x09\x84\x84\x82\x01\x86\xD9\x80\x03\x86\xFB\x80\xFC\x86\x3E\x7B\x57\x85\x79\x54\xC4\x83\x27\x87\xD9\x84\xB3\x76\x51\x7F\x7F\x79\xD0\x5C\xB6\x87\x97\x82\x31\x6D\x3C\x86\xEE\x82\xBC\x86\x93\x87\xBD\x87\xE8\x86\xBF\x87\xA9\x84\x3C\x80\xAB\x84\x66\x85\xAD\x84\x46\x85\xC6\x87\x48\x85\xC8\x87\x4E\x84\xCA\x87\x8F\x83\x4F\x86\x33\x84\x61\x87\x66\x81\x83\x87\x2E\x82\x55\x86\x44\x7F\xAA\x87\x00\x69\x26\x6C\x33\x82\x52\x79\xAF\x87\x88\x86\x7C\x85\x96\x81\xD0\x0D\xA6\x7F\xAA\x78\x10\x86\xA2\x70\x90\x87\x6F\x82\x1D\x85\x68\x86\xC9\x85\xFA\x83\xCB\x85\x85\x83\xCD\x85\x87\x83\xCF\x85\xFD\x81\xD1\x85\x22\x80\xEF\x87\xB2\x84\xF1\x87\x08\x84\x51\x84\xA3\x86\xA5\x87\x29\x83\xA7\x87\x02\x83\xDD\x85\x4C\x63\xE6\x83\x25\x79\x56\x6C\x12\x84\xEA\x66\x14\x84\xFA\x72\x29\x03\x97\x72\xD7\x87\xCE\x7F\xD0\x0D\x60\x6C\x4D\x87\xB9\x67\xDD\x87\xEB\x82\x11\x83\x5C\x85\xBB\x86\x3E\x86\xCF\x83\x40\x86\x74\x87\x38\x83\xA2\x81\xC0\x87\xF6\x6D\xC2\x87\x99\x86\xC5\x86\xC5\x87\x15\x87\x7E\x82\x17\x88\xEE\x84\xB3\x84\xB9\x83\xA3\x87\xBB\x83\x1D\x88\x6D\x83\x1F\x88\x2B\x83\x21\x87\xED\x7F\x1A\x67\x84\x7B\x1C\x84\x09\x01\x32\x88\x10\x83\x3B\x86\xB9\x87\x50\x87\x5E\x85\x52\x87\xE4\x87\x0B\x81\x85\x85\x19\x86\x0F\x87\xC2\x86\x11\x87\xC3\x87\x3C\x87\x1B\x65\xF9\x85\x18\x79\xFB\x85\xF7\x6D\x42\x87\xD7\x82\x5F\x87\x6B\x83\x4B\x88\xBD\x83\x4D",
"\x88\x82\x78\x4F\x88\x0D\x80\xBC\x61\x5A\x84\x53\x88\x06\x01\x55\x88\xD8\x84\xEC\x82\xE0\x87\x57\x83\xE2\x87\x42\x82\x94\x87\xE5\x87\xC2\x7E\xE7\x87\x44\x86\xE9\x87\x1D\x86\xEB\x87\x0B\x5D\x66\x88\x42\x79\xF2\x86\x68\x7F\x47\x88\xF0\x84\x49\x88\xF2\x84\x6E\x88\x54\x84\xF7\x87\x56\x84\xD2\x87\x40\x5A\xAC\x72\xCE\x71\x68\x6A\x7C\x5A\x78\x88\x34\x85\x6E\x87\xF6\x83\x6B\x75\xBB\x87\xE3\x87\x5E\x88\x0D\x87\xC0\x86\x1A\x86\x10\x87\x1C\x86\xA6\x6D\x1E\x86\xC8\x7E\x9D\x87\xF1\x86\x0B\x85\xF3\x86\xEF\x84\xB2\x80\xA2\x86\xB4\x80\xF5\x87\xB2\x81\xD0\x87\xB4\x81\xF9\x87\x6C\x72\x9B\x85\x7F\x84\x20\x72\x9B\x84\x2F\x74\xC3\x70\x27\x09\x9A\x88\x9C\x85\x7A\x88\x58\x88\x91\x87\x9F\x88\x7E\x88\x5C\x88\x77\x81\x24\x84\x3C\x88\x82\x88\x39\x87\x84\x88\xA7\x88\x86\x88\xB5\x65\x88\x88\xA1\x7E\x8A\x88\x8D\x80\xAE\x88\xF5\x86\x6F\x85\x91\x84\x90\x88\x93\x84\x92\x88\x4B\x21\xBB\x84\x27\x09\x07\x87\x8F\x86\x6F\x87\xC4\x88\x0B\x87\xC6\x88\xA4\x80\x3B\x88\x76\x87\xAB\x85\x89\x84\xAD\x85\x7A\x87\xAF\x85\xCB\x86\x71\x84\x6C\x88\xE0\x83\xCE\x87\x86\x82\x53\x86\x29\x77\x7A\x86\xB8\x88\xA0\x84\x19\x84\xDA\x84\xD0\x72\xBD\x80\x6B\x87\x09\x88\x82\x84\x0B\x88\xA3\x80\x00\x85\x75\x87\x02\x85\x97\x87\xEB\x86\x99\x87\xED\x86\x9B\x87\x14\x88\xF0\x86\x16\x88\x17\x87\x8D\x84\xEC\x88\x8F\x84\xD6\x88\xF7\x86\xF0\x88\xE2\x83\xF2\x88\xE4\x83\xB6\x88\xB9\x19\xF8\x84\x9E\x88\x76\x88\x03\x01\xBF\x88\xB9\x88\x9C\x88\x56\x83\xF9\x84\x5A\x88\xBC\x87\xA1\x88\x54\x87\xA3\x88\x60\x88\x97\x86\xC3\x86\x40\x88\xC4\x87\x9B\x86\xED\x87\x4A\x86\x45\x88\x4A\x85\xA0\x86\x3B\x81\xB0\x88\x3D\x81\xB2\x88\x54\x82\xB4\x88\xDF\x81\x94\x88\x52\x72\xCC\x0D\xDF\x80\x15\x82\x69\x82\x54\x88\xFC\x88\xA5\x85\xFE\x88\x76\x81\xE4\x88\x81\x83\x86\x85\x56\x87\x87\x80\x58\x87\x43\x88\x8E\x85\x2D\x89\x90\x85\x6A\x88\xDE\x83\xEE\x88\x73\x84\xB4\x61\x77\x86\x13\x89\x79\x86\x15\x89\x97\x80\x4F\x80\x63\x86\x51\x80\x41\x78\x2B\x87\xFB\x88\x08\x87\x7D\x83\x37\x88\x41\x84\x39\x88\x55\x87\x77\x87\x2A\x84\x79\x87\xD0\x75\x7B\x87\x01\x82\x19\x88\x31\x84\xF3\x87\x2C\x85\x95\x85\xAA\x7E\x6D\x6F\x54\x89\x33\x68\x55\x85\xF1\x72\xD4\x87\xDC\x67\x1B\x89\xF6\x88\xF5\x83\x1E\x89\x9E\x88\x20\x89\xA0\x88\x01\x89\xF1\x85\xE6\x87\x41\x85\xE8\x87\x43\x85\xEA\x87\x45\x85\x87\x88\x15\x88\xAE\x80\x9F\x87\x0C\x85\x4C\x89\x0E\x85\x4E\x89\x10\x85\x46\x87\x12\x85\x70\x88\xBF\x83\x4A\x87\x30\x74\x12\x5F\xB1\x68\x87\x78\xC2\x82\x5B\x89\xDF\x88\x9D\x88\x13\x76\x92\x87\xC5\x88\x22\x89\x73\x87\x61\x89\xE7\x88\x78\x87\xE9\x88\x65\x89\xEB\x88\x89\x89\x6E\x85\x8B\x89\x70\x85\x11\x89\xB8\x84\x35\x89\x56\x82\x37\x89\x63\x73\xF5\x88\xE0\x85\x9E\x85\xDA\x87\x5A\x86\x4E\x87\x5C\x89\xA7\x83\x5E\x89\x3D\x85\xE3\x88\x00\x89\xE5\x88\x02\x89\xC1\x86\x26\x89\x62\x88\x28\x89\x64\x88\x64\x83\xAB\x88\x87\x89\xAD\x88\x8C\x88\xAF\x88\x8E\x88\x4E\x85\xD8\x88\xF4\x84\xDA\x88\xF6\x84\x6F\x89\x30\x82\xBA\x85\x08\x86\x02\x5A\xD1\x78\xB3\x63\xBF\x85\x2E\x79\xD4\x0D\x16\x73\x2B\x6E\x74\x89\x3E\x89\x3D\x86\x66\x86\x3F\x86\x0C\x88\x36\x87\xD2\x83\x3D\x88\x41\x4F\xCC\x88\x06\x6F\xA8\x88\xCF\x80\x48\x89\x21\x86\x4A\x89\x23\x86\x4B\x85\xAE\x81\x31\x89\x64\x81\x33\x89\xDB\x82\xAB\x89\xDD\x82\xCE\x89\xC0\x69\x37\x7D\x93\x7C\xD1\x89\x5C\x58\xBB\x81\xE7\x03\xBD\x81\x03\x87\x08\x77\xC0\x81\xB2\x89\x6F\x73\xB4\x89\x98\x89\x78\x89\x9A\x89\xE1\x88\xAA\x83\x7F\x88\x5D\x88\x7C\x89\x5F\x88\x45\x89\xCF\x82\x47\x89\x80\x81\x6A\x85\x0B\x89\xCC\x84\x0D\x89\xCE\x84\xF6\x86\xD0\x84\x1D\x87\xDD\x81\xF2\x89\x37\x84\xAD\x89\x1E\x60\x7E\x86\x02\x88\xE5\x81\xCF\x71\xE7\x81\x37\x73\xB2\x58\x37\x69\xD4\x0D\x30\x79\x37\x86\xDA\x89\xB5\x89\x5F\x84\xB7\x89\x33\x87\x9D\x89\xBE\x87\x81\x88\x7F\x89\x83\x88\x81\x89\x85\x88\x83\x89\xCF\x88\x85\x89\x15\x81\x11\x8A\x7C\x87\x13\x8A\xB1\x85\x15\x8A\xB3\x85\xF0\x89\x49\x83\x1F\x87\xD1\x87\x72\x88\x6F\x6F\x1D\x8A\x7C\x86\x8A\x7E\xFF\x87\x53\x64\x32\x86\xD5\x89\x69\x69\x35\x86\xC2\x85\x8F\x87\x29\x8A\x7F\x85\x2B\x8A\x5B\x88\x2D\x8A\x80\x88\xF9\x7F\xE2\x89\xE7\x33\x3F\x88\x9A\x87\x41\x88\x2A\x89\xE8\x89\xC8\x86\x38\x8A\x67\x89\x3A\x8A\xD6\x85\xC8\x89\xD8\x85\x8D\x89\xDA\x85\x8F\x89\x14\x85\xF4\x89\x44\x8A\x3A\x86\x0D\x82\x3B\x69\x80\x79\xFE\x5D\xEF\x83\x8F",
"\x64\xCE\x69\x1C\x6F\x4E\x8A\x03\x8A\x7B\x88\x1F\x89\x7D\x88\xE2\x88\x53\x8A\x09\x8A\xBB\x89\x44\x89\x62\x89\x57\x87\x64\x89\x99\x79\x66\x89\x26\x82\x68\x89\x50\x84\x07\x80\xA9\x89\x72\x85\x19\x8A\x42\x7F\xF4\x89\x7B\x86\x6A\x8A\xA8\x79\x2D\x86\x2F\x80\xFB\x70\xDB\x70\xA8\x7F\x61\x82\x78\x5E\x89\x66\x65\x82\x8C\x7C\x16\x6A\xB4\x79\x06\x01\x07\x75\x44\x81\xD4\x0D\x84\x5E\xA1\x7A\xF0\x62\x50\x7B\x8B\x5E\x79\x88\xA1\x65\x2F\x83\xD6\x6C\x92\x5E\xE0\x82\x77\x7B\x1C\x67\xC0\x5E\xA7\x79\x7D\x86\xB2\x7B\x9D\x5E\xEF\x83\xA1\x5E\x5C\x7D\x8F\x7B\x56\x89\xB8\x86\xBC\x64\x5C\x58\xAA\x5E\x65\x09\x65\x7B\xFD\x0D\x07\x40\xF1\x74\x9B\x7B\xB4\x8A\x2E\x87\x44\x13\xC4\x5E\x63\x59\xB3\x7B\x1E\x8A\xBB\x5E\x27\x01\xBD\x5E\xAC\x86\xB3\x8A\x6B\x81\x63\x86\xC2\x8A\xCF\x61\xC4\x8A\x45\x8A\xF3\x5E\x09\x01\xCB\x5E\xC9\x8A\xBE\x8A\xCB\x8A\xB5\x8A\xB5\x5E\x37\x5E\xD4\x5E\xB0\x8A\x89\x03\xB2\x8A\xD5\x8A\xF3\x62\xD7\x8A\x66\x73\x93\x7B\x1D\x43\x95\x7B\xC5\x8A\x01\x5F\xFD\x0D\x1D\x54\xBD\x8A\x97\x5E\xAC\x8A\x79\x70\x0B\x5F\x16\x0C\x4A\x8A\x79\x5B\xFD\x0D\xF5\x5E\xE9\x8A\xAF\x89\xDA\x78\x6D\x74\xEE\x8A\x5D\x86\xAE\x5E\x03\x5F\xDD\x8A\xEA\x8A\x05\x7E\xED\x8A\x72\x0A\x5A\x14\xB0\x89\x97\x8A\x25\x6A\x36\x75\x60\x73\x96\x89\xC4\x65\x43\x24\x1A\x71\x5E\x82\x6B\x78\xE0\x84\x0A\x88\x9B\x89\x78\x8A\x0A\x8A\xA2\x88\x96\x87\xBD\x89\x98\x87\x27\x89\x59\x8A\x29\x89\x9C\x87\x2B\x89\x9D\x86\xEA\x89\x4C\x86\x25\x83\xEE\x89\xB0\x81\x3E\x8A\x93\x83\x29\x86\x40\x5E\x85\x87\x44\x7B\x22\x6C\x73\x83\xB8\x82\xFD\x64\xB1\x86\x35\x7E\xB3\x86\xD0\x0D\x75\x6A\xC2\x60\x7C\x5A\x08\x8B\x07\x5A\x96\x71\x90\x86\x51\x8A\x21\x89\x10\x8B\x23\x89\x12\x8B\xA4\x88\x61\x88\xA6\x88\xE5\x89\xCE\x88\x81\x67\x36\x8A\x37\x81\x81\x8A\x6C\x85\xA5\x89\x92\x85\x6A\x89\x94\x85\x17\x8A\xD2\x84\x22\x8B\xF3\x64\xA8\x86\x9D\x6A\x2E\x7E\x9B\x7F\x27\x8B\xAD\x86\x0D\x72\xDC\x86\xB2\x86\xBF\x69\x8A\x74\x96\x59\x13\x72\x3C\x89\x06\x01\x31\x8B\xFA\x70\x01\x6A\x97\x20\x34\x8B\xDD\x89\x38\x88\xDF\x89\x3A\x88\x43\x89\x0B\x8A\x7D\x8A\x46\x89\x7F\x8A\x4B\x7E\x42\x8B\xCA\x86\x44\x8B\xFE\x85\x46\x8B\x00\x86\x74\x84\x0C\x84\x4A\x8B\xD4\x84\x21\x88\xF4\x71\x85\x7E\x1B\x72\x87\x7E\xB5\x75\x94\x20\xF8\x8A\x10\x5F\xE6\x82\x06\x87\xA8\x86\x27\x09\x5B\x8B\x05\x5A\x33\x8B\xE0\x88\x7A\x89\x9C\x89\x37\x8B\x9E\x89\x24\x89\x0C\x8A\x46\x86\x0E\x8A\x25\x85\x81\x81\x27\x85\x83\x81\x6C\x8B\xCC\x86\x6E\x8B\x27\x86\xCF\x87\x72\x8B\xB7\x85\x91\x89\xC1\x83\xAD\x7E\x90\x05\xAF\x7E\x75\x16\x99\x65\xEF\x8A\x48\x5E\x29\x87\xE9\x6E\x63\x7E\x80\x8B\xA8\x71\x90\x8A\xEA\x70\xA9\x83\x0C\x8B\xFD\x88\x0E\x8B\x07\x8A\xB9\x89\xA8\x85\x53\x8A\x0F\x88\xF4\x85\x11\x88\xF6\x85\x13\x88\x89\x83\x40\x8B\xFF\x81\x5E\x8A\x82\x8A\x60\x8A\x73\x86\x93\x8B\x75\x86\x86\x8A\x51\x89\x88\x8A\x52\x85\x1B\x8A\x9F\x5A\x4C\x87\x5A\x89\x07\x8B\xA5\x8B\x5D\x8B\xDB\x70\x5F\x8B\x0A\x87\xAC\x8B\x79\x8A\xC7\x88\x6B\x7B\xC9\x88\x30\x8A\xCB\x88\x32\x8A\xCD\x88\x34\x8A\x3F\x8B\x09\x89\x86\x89\x1B\x8B\x9F\x86\x4D\x86\x25\x86\xBC\x8B\xCE\x86\x64\x8A\xD0\x86\xCC\x89\x83\x7E\x2E\x76\x67\x87\x20\x5B\x50\x83\xD3\x0D\x34\x76\x81\x8B\x29\x79\xC8\x8B\xA7\x8B\xCA\x8B\xFE\x84\xFF\x88\xAE\x8B\x87\x8B\xF4\x82\xA0\x89\x63\x89\xA2\x89\x80\x8A\xA4\x89\xEC\x89\x50\x82\x1E\x8B\x52\x82\x20\x8B\x35\x84\xC0\x8B\x54\x76\x4C\x8B\x91\x6B\x8A\x82\x1D\x7F\x50\x8B\x31\x7E\x70\x00\x20\x7F\x38\x89\x5F\x76\x00\x8A\xDE\x68\x30\x8B\xC7\x8B\x7E\x6F\x5E\x8B\x84\x8B\x77\x8A\xCC\x8B\xF1\x8B\x54\x8A\x44\x84\x56\x8A\x57\x3B\x58\x8A\x06\x89\x5A\x8A\x18\x8B\x5C\x8A\x5A\x87\xB8\x8B\x43\x8B\xF8\x8B\x4E\x86\xFA\x8B\xFE\x82\xCA\x89\x50\x85\xFE\x8B\x54\x86\xC2\x8B\x36\x65\x23\x88\x84\x76\x00\x69\x9A\x83\xFE\x87\x0E\x82\x5B\x6C\x06\x77\xFD\x89\x01\x79\x18\x0F\xA2\x83\x6A\x87\xC6\x8B\xD7\x71\xA6\x8B\x06\x71\x50\x81\xA9\x8B\x3F\x89\xAB\x8B\x23\x84\xCF\x8B\x73\x82\xF0\x8B\x7B\x8A\x65\x8B\xF3\x8B\x7E\x8A\xF5\x8B\x69\x8B\xF7\x8B\x2F\x89\x62\x81\x22\x8C\x27\x83\x24\x8C\x52\x86\x26\x8C\xF3\x88\xF4\x89\xC2\x83\xAE\x04\x75\x7F\x2C\x88\x12\x82\xD9\x87\x0F\x86\xDB\x87\x1E\x62\xE9\x8B\x09\x86\xEB\x8B\x3A\x8C\x59\x83\x3C\x8C\xDC\x89\xCB\x8B\x3F\x8C\x3C\x61\x9F\x89\x21\x82\xC8\x84\x23\x82\xCA\x84\x49\x8C\xDB\x8B\x43\x87\xDD\x8B\x1C\x87\xFC",
"\x8B\xB5\x85\x96\x8B\x20\x87\x74\x8B\xB1\x73\xFB\x87\xCD\x65\xFD\x87\x59\x86\x47\x8A\x13\x6F\x2B\x88\x32\x8C\x4F\x7F\x04\x88\x4D\x8A\x47\x62\x5C\x8C\x34\x73\x87\x86\x77\x65\x61\x8C\xE1\x87\x35\x8B\x7B\x89\x43\x8C\x11\x8B\x7E\x89\xF3\x85\x80\x89\xF5\x85\x82\x89\xF7\x85\xAE\x84\xD0\x88\x66\x7F\xD2\x88\x67\x83\xBA\x8B\x1A\x87\x6E\x8C\x45\x87\xBE\x8B\xF9\x86\x52\x89\x6E\x89\x28\x8C\x9A\x5B\x2A\x8C\x90\x72\xB4\x19\x92\x72\xCA\x7F\x00\x88\x33\x86\x8C\x66\x1A\x84\x3B\x88\x19\x89\xC9\x70\x38\x8C\x5E\x8C\x59\x7B\xA8\x8B\xFD\x84\xDE\x77\x05\x7F\xCE\x8B\xEB\x6C\x3A\x8B\xBE\x89\x3C\x8B\xF6\x6D\xE6\x89\x7C\x82\x1C\x8C\xC7\x87\x1E\x8C\x6B\x8B\x20\x8C\xDC\x8B\x4C\x8C\x47\x83\x70\x8C\x1E\x87\xD4\x7E\x74\x8C\x02\x6B\x51\x88\xEF\x7F\x73\x89\xA4\x8B\xAD\x8C\x0E\x8C\xC9\x8B\x10\x8C\x88\x8C\x86\x8B\x8A\x8C\x38\x8B\x8C\x8C\xEA\x86\x10\x88\xEC\x86\x12\x88\xEE\x86\x08\x89\xAA\x88\x0A\x89\x82\x81\x71\x86\x97\x8C\x5E\x87\x99\x8C\x60\x87\x4E\x8C\xA5\x86\x9D\x8C\xFB\x86\x42\x8A\x70\x74\x74\x88\x35\x7A\xFA\x84\x37\x8C\xE0\x71\x84\x8C\x59\x60\x86\x8C\x7C\x88\xD1\x8C\x0F\x8B\xD3\x8C\x88\x8B\x39\x8B\x25\x89\x14\x8B\xBF\x89\x16\x8B\xC1\x89\xAF\x84\x21\x6D\xBE\x8C\x5C\x87\xE0\x8C\x7E\x87\xCC\x87\xB6\x84\x9B\x8C\x47\x87\xE6\x8C\x49\x87\x65\x87\xC3\x72\x96\x88\x36\x8C\xB9\x67\x82\x8C\xE6\x81\xEF\x8C\x0B\x8B\xB1\x8C\xB2\x78\xE3\x84\x89\x8B\x66\x8B\x0D\x8A\x68\x8B\x26\x85\x6A\x8B\x00\x8D\x91\x8B\xED\x88\xE2\x8C\x6D\x88\xDF\x8B\x82\x87\x66\x8A\xDC\x85\x98\x8B\xE4\x67\xF4\x8A\xB1\x87\x33\x73\xBB\x88\x36\x7B\x97\x67\x27\x01\x0E\x8D\x20\x8A\x10\x8D\x4B\x6B\xF1\x8C\x76\x8A\xF3\x8C\x12\x8C\xF5\x8C\x2E\x8A\x55\x8A\xCA\x88\xC1\x87\xE4\x89\xB9\x8C\x3E\x8B\x4C\x68\xD7\x8B\x37\x8A\xDE\x8C\x18\x87\x01\x8D\xA2\x87\x03\x8D\x80\x87\x20\x8D\xA6\x87\x07\x8D\x84\x6C\xDC\x88\x0C\x8D\xDC\x67\x2D\x8D\xCF\x0D\x83\x8B\x99\x89\x67\x76\x3E\x8C\x14\x8D\xF7\x8C\x8A\x8B\x3B\x87\x8C\x8B\x6F\x86\x40\x8D\x0C\x89\x1C\x8D\x0E\x89\xA7\x89\xD7\x88\x46\x8D\x1E\x88\x48\x8D\x20\x88\x24\x8D\x09\x73\xBF\x8A\x6D\x87\x2D\x88\xD4\x0D\xDB\x84\xD3\x06\xAB\x8C\x34\x0E\x0D\x8C\x8F\x8A\x81\x86\x03\x7F\x31\x8D\x79\x89\x11\x8C\x64\x8C\xBF\x6C\x42\x89\xC8\x88\xE6\x88\x67\x8C\xAC\x85\x69\x8C\xAE\x85\x65\x6F\xC0\x8C\x6D\x8C\xC2\x8C\x50\x86\xE4\x8C\x62\x87\x22\x8D\x64\x87\xA2\x8A\xF6\x77\xE8\x5C\xD7\x72\x6B\x8D\x77\x0E\x6D\x8D\x57\x7B\x6F\x8D\x82\x7F\x71\x8D\x05\x8A\x85\x8B\xF4\x8C\x64\x8B\x8B\x8C\x2F\x8A\x8D\x8C\x31\x8A\x8F\x8C\x33\x8A\x91\x8C\xEC\x87\xBC\x8C\xEE\x87\xFF\x8C\xC9\x87\x42\x8D\xCB\x87\x1B\x88\xB1\x88\x82\x8D\xF6\x87\x84\x8D\x8B\x81\x86\x8D\x19\x78\x16\x85\x99\x81\x06\x8B\x0D\x8D\x8C\x8D\x80\x86\x0F\x8C\x50\x8D\x74\x77\xEF\x8B\x17\x86\xE4\x87\xB0\x8B\x8E\x8C\xB2\x8B\x90\x8C\xB4\x8B\xF8\x85\xB6\x8B\xD3\x82\xC4\x89\x8B\x88\x83\x8A\xB4\x84\x44\x8D\xA4\x87\x5F\x8D\x4C\x88\x61\x8D\x4E\x88\xC7\x8C\x32\x85\x65\x8D\xB7\x87\x35\x85\xFF\x59\x59\x89\x0D\x76\x4C\x8D\xAF\x8D\xAD\x79\xA2\x58\xED\x8B\xB2\x8C\x84\x7F\xB4\x8C\xBF\x77\x72\x7E\x48\x7E\x3F\x77\x8D\x8B\x10\x8A\x59\x8D\x12\x8A\x5B\x8D\x14\x8A\x0F\x89\x16\x8A\xC4\x8C\x18\x8A\x72\x8C\x41\x8A\xC9\x8D\x65\x6B\x62\x78\x23\x81\xCB\x8C\x2C\x8D\xD2\x8D\xA1\x58\x85\x8C\x12\x8D\x75\x81\xB3\x8C\x76\x8D\x40\x8C\xBC\x89\xB6\x8C\xF9\x8C\xB8\x8C\xB3\x47\x3C\x8D\xF1\x6C\xBD\x8D\x8B\x83\x95\x8C\x8D\x83\xC1\x8D\x48\x88\xC3\x8D\x4A\x88\xC5\x8D\x6F\x88\xC7\x8D\x71\x88\xE9\x8D\x86\x6C\x85\x78\x45\x81\x79\x85\x7F\x8B\xEE\x8D\xCD\x8C\x6E\x8D\xB1\x8D\x04\x8A\x51\x8D\x06\x8A\x74\x8D\x63\x79\xE0\x89\xCA\x85\x16\x8C\x71\x44\x18\x8C\xD9\x8C\x07\x89\xB5\x8B\x3E\x8D\x41\x8B\x6B\x8C\x1D\x8B\x62\x8A\x1C\x88\x06\x8E\x91\x88\xA7\x8D\xF8\x87\x9F\x8C\x90\x5E\x8B\x8A\xE6\x85\x51\x79\xA9\x78\xC9\x83\xAC\x8D\xCC\x8C\xEE\x8C\x39\x8C\xAF\x8C\xD5\x8D\x13\x8D\x60\x89\x15\x8D\x45\x8C\x67\x8B\x47\x8C\x19\x8D\x23\x8E\xA1\x86\x25\x8E\xA4\x8D\x27\x8E\xD9\x88\x29\x8E\x93\x88\xE8\x8C\x06\x86\xD0\x89\x27\x8D\x56\x73\xAA\x5D\x92\x81\x0B\x7E\xD3\x1F\x17\x6F\x8C\x8A\x5E\x86\x18\x0F\xD8\x89\xAE\x6D\x5B\x8C\xEF\x8D\x58\x7B\xD9\x71\x37\x8E\xF3\x8D\xD7\x8D\xF5\x8D\xB5\x8C\xF8\x8C\x04\x89\x15\x8B\x19\x8C\x17\x8B\xDB\x8C\x19\x8B\x3F\x87\xD9\x8B\x41\x87\x7E\x8D\x6B\x88\x1E\x8D\xEF\x88\x70\x8B\x28\x86\x2F\x85\x77",
"\x84\x0A\x8E\x6B\x6A\xDF\x85\xF8\x89\xD3\x0D\xFA\x89\xB1\x6E\x80\x6E\xE5\x8A\xA8\x8C\xFF\x89\x59\x8C\xB3\x89\xAE\x8D\x11\x8E\x8D\x8D\x13\x8E\x75\x8A\x72\x8D\x33\x8D\x17\x8E\x4A\x78\xB5\x8D\xAF\x8B\x1B\x8E\x3E\x47\x3A\x8D\xFB\x8D\xD5\x8B\x3D\x8D\xDC\x8C\xD8\x8B\x9F\x8D\xF0\x87\xA1\x8D\xF2\x87\x80\x8D\xF4\x87\xA5\x8D\xB3\x88\xE7\x8D\xB5\x88\x2B\x8E\x7A\x79\x8E\x8A\xE5\x79\x2F\x86\x83\x8C\x0A\x86\x36\x73\x6E\x8A\x4A\x8E\xD4\x77\x96\x59\x26\x8A\xD9\x89\x33\x8E\x09\x8B\x2F\x8D\xAE\x7F\x90\x8D\x15\x8E\x92\x8D\x34\x8D\x94\x8D\xD4\x8C\x96\x8D\xD6\x8C\xB1\x8B\xD8\x8C\xB3\x8B\xDA\x8C\x20\x8E\x8F\x8E\x3F\x8D\x8F\x8B\xDF\x8C\xE1\x8D\x3B\x8A\xE3\x8D\x3D\x8A\x97\x8E\x34\x89\x99\x8E\x36\x89\x47\x8E\xCB\x72\x69\x8A\x2E\x8E\xE5\x82\x2F\x8C\x13\x6F\x10\x82\x56\x8C\xE7\x85\x96\x59\x36\x86\xA8\x8E\x10\x8E\x34\x8E\xAE\x8C\x59\x8E\xD0\x8C\x60\x8B\x5F\x89\x62\x8B\x66\x8C\x22\x85\x68\x8C\x24\x85\x58\x8D\xBC\x8E\x41\x8D\xBE\x8E\x61\x8A\x04\x8E\x8F\x88\x43\x8E\xCB\x89\x45\x8E\x95\x84\xC6\x8E\xED\x72\xC8\x8E\x9E\x8E\x13\x7B\x7D\x8E\x62\x4D\x5C\x86\xCE\x8E\xA0\x83\x5F\x86\x71\x8A\xFF\x6B\x0C\x8C\x7F\x8E\xB0\x8D\xCF\x8C\xB2\x8D\x94\x7E\x85\x8E\x1A\x80\x0D\x88\x93\x86\xB7\x8D\x98\x8D\xB9\x8D\x9A\x8D\xBB\x8D\x92\x8C\xFE\x8D\xFA\x85\x00\x8E\xD4\x85\x93\x8E\x1A\x88\x85\x8A\x6D\x8E\x95\x8B\x6F\x8E\x2A\x86\x71\x8E\x1D\x66\x2D\x8E\xED\x8E\x54\x14\xEC\x8E\x96\x8A\x01\x8A\xB0\x79\x2D\x19\x72\x73\xAB\x8E\x50\x8E\x02\x8B\x95\x7C\x7D\x7C\x06\x01\x46\x81\xCF\x74\xB1\x6B\x21\x6A\xB4\x72\x12\x8E\x91\x8A\x38\x65\x04\x8B\x3F\x73\x6A\x6B\xD0\x5C\xD2\x86\xC5\x75\xC3\x20\x27\x09\xC5\x00\xC3\x5A\x61\x50\x5A\x8E\xC7\x85\xDA\x8E\x3A\x8E\x79\x8D\xE8\x88\x7B\x8D\xEA\x88\x7D\x8D\x4A\x8C\xFC\x82\x95\x8E\x6B\x89\x48\x8B\x96\x85\x62\x5D\x24\x8B\x80\x6F\x87\x87\xA6\x74\x8D\x82\x70\x6A\x8F\x82\x2B\x8B\xBF\x69\x63\x75\xB5\x86\x5A\x8C\x47\x62\x2F\x8F\x19\x76\x31\x8F\x27\x01\x33\x8F\xDA\x5B\xD1\x4B\x81\x45\xC2\x88\x0D\x8B\x16\x8E\x53\x8D\xD5\x8C\x03\x89\xD7\x8C\x05\x89\x1E\x8E\x1A\x8C\x64\x8E\x9D\x8D\x2C\x89\x91\x8E\x18\x88\x0B\x8F\x69\x89\x41\x8F\x47\x8B\xE5\x8D\x49\x8B\x10\x8F\x23\x8B\x00\x8C\xF6\x71\xD5\x86\x2F\x7E\xD4\x8A\xD8\x86\x52\x8B\x74\x5A\x89\x5F\x75\x73\xC0\x82\x00\x7D\x2D\x8F\x1E\x62\x53\x8F\x5A\x77\x55\x8F\x09\x01\x57\x8F\xA9\x5B\x1D\x4E\x73\x07\x36\x8F\x15\x86\xB4\x8D\x69\x86\x7F\x88\x01\x8F\xD2\x8B\x99\x8D\xD4\x8B\x9B\x8D\x84\x89\x21\x8E\xB7\x8B\xDF\x8D\x39\x8A\xE2\x8E\xBB\x8B\x6C\x8F\x6F\x8B\x50\x89\x9C\x8C\x50\x8C\x14\x89\x9B\x8E\xF9\x7E\x02\x5A\xD2\x6A\x79\x8B\x67\x65\xF2\x8E\xE5\x82\xA1\x74\x7C\x0A\xD2\x8E\x09\x01\x80\x8F\x0F\x79\x82\x8F\x06\x01\x84\x8F\x08\x5A\x35\x8F\xD7\x8E\x63\x8C\x5E\x8F\xB3\x8E\x60\x8F\xB5\x8E\x62\x8F\xB7\x8E\x1F\x8E\xBC\x8D\x93\x8F\xBE\x8D\x67\x8E\xA0\x87\x6A\x8F\x84\x8A\x0A\x84\x0E\x8F\xF1\x88\x9D\x8F\x53\x89\x9F\x8F\xDE\x86\xD3\x0D\x06\x83\xB0\x7E\x08\x83\xA5\x8F\x21\x5E\x4E\x77\x1D\x54\xAB\x8F\xCF\x0D\x9D\x72\x03\x01\xD1\x8F\x27\x84\xAD\x8F\x03\x01\xAF\x8F\x07\x5A\x61\x50\xB8\x79\x06\x6E\xAD\x8D\xDC\x67\xD5\x8F\xC5\x84\xD7\x8F\x02\x01\xD9\x8F\x06\x5A\xB1\x8F\xFB\x8E\xF4\x7F\xFD\x8E\x80\x80\xFF\x8E\xE7\x86\x8D\x8F\x39\x8D\xD3\x8B\x3D\x8B\x8D\x8E\xFD\x8D\xBC\x8F\xFF\x8D\xAC\x88\xC0\x8D\xC0\x8F\xC2\x8D\xA3\x8D\x32\x89\xC2\x8E\xF1\x89\xC4\x8E\xAC\x89\xEA\x8E\x8B\x87\xA5\x5B\xF5\x5E\x7C\x2B\x4E\x63\x67\x7D\x5B\x64\x30\x80\xC4\x65\xE0\x8F\x0C\x87\xE2\x8F\x01\x01\xE4\x8F\x05\x5A\xE6\x8F\x14\x8E\xB3\x8D\x41\x89\xBA\x89\xB1\x8E\x6B\x86\xDA\x8D\x6D\x86\xDC\x8D\xDF\x8E\x1A\x8D\xA0\x8D\x97\x8F\x98\x8C\x99\x8F\x94\x8B\xC4\x8F\xFD\x8F\xF3\x89\xC7\x8F\x55\x8B\xE4\x8B\x96\x59\x69\x87\x5B\x79\x08\x90\x7E\x5A\xFD\x58\x6B\x00\x32\x8F\x34\x8F\x86\x8F\x0C\x6E\xB2\x8F\xEE\x8B\x12\x90\x42\x8C\x14\x90\xF2\x8B\x3A\x8F\xA1\x89\x3C\x8F\xA3\x89\x3E\x8F\x6C\x8C\x6A\x8E\x1E\x90\xBD\x8B\xC3\x8F\x12\x89\xC5\x8F\xA7\x86\x94\x82\x85\x75\x4E\x8B\xED\x72\xD7\x86\x70\x5A\x06\x8C\x8A\x87\x08\x8C\x22\x7F\x79\x83\x86\x6E\x02\x01\x09\x90\x86\x84\x0B\x90\x00\x00\x0D\x90\x8C\x5D\x2F\x90\x55\x6F\x31\x90\xD6\x8D\xB0\x7F\xD8\x8D\x05\x78\x97\x8D\x8E\x8F\x03\x8F\x90\x8F\x05\x8F\x9C\x8D\x0F\x8A\x16\x87\x95\x8F\x5F\x8A\x1C\x90\xE1\x8C\x3E\x90\xDE\x8B\x05\x8D\x8E\x89\x08\x8E\x90\x89\x09",
"\x8D\xC0\x6B\x76\x8C\x8E\x68\x2D\x8C\x79\x8C\xCB\x8E\x96\x72\x31\x8C\x1E\x8F\x15\x8F\xC6\x83\xB3\x87\x0A\x8C\x6C\x8A\x2E\x8F\x2A\x90\x56\x2F\x53\x90\x55\x90\xFE\x8A\x85\x28\xAA\x40\xE7\x8F\x36\x83\xB4\x8F\x37\x8D\xD1\x8B\xEE\x8F\x8F\x8F\xF0\x8F\x91\x8F\x35\x8A\xF3\x8F\x08\x8F\xF5\x8F\xD3\x88\xC6\x89\xD5\x88\x5D\x8D\x10\x89\x40\x90\xAA\x89\x21\x90\x1A\x8A\xFF\x8F\x7A\x8F\x69\x7C\xD5\x87\x55\x8C\x7D\x8C\xBF\x81\x58\x8C\xBF\x66\x72\x8A\x52\x8F\x80\x90\xBE\x49\x82\x90\x2E\x90\x59\x8F\x02\x09\x88\x8F\x67\x86\x8A\x8F\xEB\x8F\x8C\x8F\x89\x8E\x64\x5A\x1D\x8E\xB9\x8F\x64\x8F\xB9\x8E\x65\x8E\x9E\x87\xBE\x8F\x88\x89\x69\x8E\x4D\x89\x6B\x8E\x4F\x89\x29\x69\x9B\x90\x89\x8A\x23\x90\xFA\x64\x57\x86\xD6\x76\x02\x77\xAD\x87\x15\x84\x30\x8C\x4D\x7F\xA2\x90\x38\x82\x18\x0F\x05\x88\x31\x8E\x47\x81\x29\x90\xCF\x66\xAA\x90\x58\x8F\x67\x45\x5A\x8F\x35\x88\x31\x87\xAF\x8E\xE9\x8F\x25\x84\x8B\x8F\xB6\x8D\xB3\x90\x15\x5B\xB5\x90\xBA\x8D\xB8\x8E\xBB\x8F\xBA\x8E\x22\x8E\x3B\x90\x24\x8E\xE4\x8E\xC9\x89\xE6\x8E\x25\x8C\xC2\x90\xC1\x8B\x9D\x90\x54\x6C\xC1\x69\xA2\x8C\xAB\x33\xA4\x8C\x28\x88\x95\x89\x2A\x88\x78\x90\x56\x79\xD0\x8A\x03\x88\xD4\x0D\x2F\x88\x07\x90\xB9\x67\x51\x90\xA1\x88\xD5\x90\x85\x8F\xAC\x90\x01\x08\xAE\x90\xDE\x89\xB0\x90\x19\x8E\x0E\x88\xE0\x90\xC7\x5B\xE2\x90\x04\x8F\xE4\x90\x06\x8F\x91\x90\x67\x88\x09\x8F\xFC\x85\x68\x90\x02\x8D\xF9\x8F\xEF\x89\xFB\x8F\x3F\x8A\xC6\x8C\x63\x8D\xAF\x68\xC9\x8C\x3B\x84\x18\x85\x01\x91\x10\x8B\x03\x91\xB0\x8F\x57\x90\xAD\x7D\x10\x90\xFC\x8E\x89\x90\x15\x8C\x38\x8D\x3E\x88\x8B\x8E\x04\x47\xFC\x8D\xC4\x6D\x07\x8F\x13\x91\x93\x90\x96\x8C\x16\x91\x43\x8D\x18\x91\x1F\x8B\x1A\x91\x21\x8B\x70\x8F\x0E\x84\xC4\x90\xC4\x19\x4E\x77\x0F\x80\x4B\x8D\x27\x09\x22\x91\x8A\x8C\x24\x91\xDA\x8F\x26\x91\x76\x83\xAD\x8E\x11\x90\xF4\x8D\x13\x90\x77\x8D\xF7\x8D\x5F\x8E\x61\x8F\x61\x8E\x63\x8F\x63\x8E\xB8\x90\x66\x8F\x1A\x8B\x68\x8F\x46\x88\x02\x8E\x8D\x88\xEA\x90\x63\x8A\x6C\x90\x65\x8A\x6E\x90\x67\x8A\x3E\x91\x33\x68\x0B\x8D\x28\x90\x00\x91\xA8\x90\x66\x5F\x46\x91\xE5\x8F\x48\x91\x07\x91\x61\x8B\x09\x91\x63\x8B\x4E\x91\x7C\x8A\x3B\x8E\x17\x8D\x3D\x8E\x8E\x8B\x1A\x90\x92\x8E\x36\x91\xA2\x8D\x0D\x8F\x9B\x8F\x06\x8D\x42\x90\xE7\x8C\x12\x8F\xA0\x6A\x14\x8F\x32\x6A\xD0\x0D\x53\x80\x30\x88\xDF\x8F\x67\x91\xD8\x62\x69\x91\x0E\x90\x6B\x91\x59\x90\x38\x8E\x38\x8F\x54\x8D\x16\x8D\x8B\x8B\x18\x8D\x75\x91\x3F\x8E\x30\x89\x41\x8E\xFA\x8F\xEC\x90\x4F\x8C\xEE\x90\xBC\x67\x4A\x8D\x65\x91\x86\x91\xD4\x90\x9A\x17\x2D\x90\xD6\x90\x85\x90\xD8\x90\xBA\x86\xDA\x90\x73\x8D\x2A\x91\x65\x84\x0C\x91\x42\x5B\x0E\x91\x61\x90\x10\x91\x63\x90\xDD\x8D\x65\x90\xE0\x8E\x5A\x8D\xBD\x90\x8A\x89\xBF\x90\x8C\x89\x5E\x91\xE0\x8B\xE8\x8E\xCD\x89\x62\x91\x5D\x68\xCB\x8D\xDE\x87\x7B\x90\x68\x8D\xF9\x88\xDE\x8F\x43\x91\x87\x91\xC6\x63\x89\x91\x56\x90\x05\x91\x87\x8F\x8C\x91\x5B\x8E\x5B\x90\x5D\x8E\xD9\x8D\x32\x7F\xDB\x8D\x0E\x7F\xB0\x91\x44\x88\x58\x91\x2E\x89\x3C\x90\xBE\x90\x6A\x90\x6F\x8C\x3A\x91\xFD\x8B\x9A\x91\x27\x8C\xF0\x90\x1E\x60\x17\x89\x05\x8A\x21\x91\xC5\x91\xFA\x63\xC7\x91\x84\x90\x38\x30\xA4\x91\x4A\x91\x29\x91\x39\x8E\x8F\x91\x72\x91\x91\x91\x74\x91\xDE\x8D\xB2\x91\xE0\x8D\xB4\x91\xA6\x89\xB6\x91\xA8\x89\x99\x90\x87\x8A\xDD\x91\x51\x8C\xBC\x91\xEE\x72\x96\x59\x3A\x89\x7A\x83\x55\x8E\xA7\x90\x9F\x91\x40\x19\xA1\x91\x04\x91\xD7\x90\xAD\x90\xCB\x91\x37\x8F\x6E\x91\xDB\x8E\x6C\x86\xDD\x8E\x6E\x86\x6A\x8C\xE8\x90\x40\x8E\x5C\x91\x26\x8E\xB8\x91\x21\x8D\x60\x91\x23\x8D\x70\x90\x8C\x77\x00\x00\x8E\x77\x33\x88\x13\x7B\x36\x85\x3A\x30\x7C\x84\xD4\x8F\xE4\x91\x35\x66\xE6\x91\xD0\x7A\x07\x92\x06\x91\x09\x92\x89\x8F\x33\x90\x87\x8E\x13\x8C\xED\x8F\x2D\x91\xEF\x8F\x3B\x8D\xF1\x8F\x31\x91\x12\x91\x89\x88\x34\x91\x01\x8E\xF7\x8F\x03\x8E\x38\x91\xFB\x8B\xDB\x91\x71\x8C\x3C\x91\x73\x8B\x1D\x91\xD6\x6C\x71\x89\xD6\x6A\xE3\x91\x03\x92\x86\x01\x05\x92\x25\x91\xC9\x91\x30\x90\x87\x90\xA6\x85\x0B\x92\x39\x8F\xDC\x8E\x7A\x8D\xDE\x8E\x10\x92\xD2\x75\x3F\x8F\x45\x83\xD9\x91\x9A\x8C\xF8\x91\xBF\x8B\xFA\x91\x9E\x8F\xDF\x91\x67\x5C\x49\x5C\x76\x7B\x0B\x05\xDD\x8A\xC4\x91\x45\x92\x2C\x90\x56\x8F\xAB\x90\x27\x92\x8C\x0C\x5F\x92\x9F\x10\x61\x92\x27\x01\x44\x91\x94\x8D\x25\x92\x5C",
"\x58\xDB\x8F\xFF\x59\x82\x7B\x52\x45\x9A\x7B\x62\x92\x52\x67\xC3\x20\x53\x8C\x51\x01\xAB\x30\x07\x59\x9C\x80\xD4\x4C\x02\x03\xFF\x59\x8D\x7B\x06\x01\x51\x45\xBD\x8A\x76\x92\x19\x6B\x78\x92\x30\x86\xC5\x7A\x2A\x02\x49\x31\x7C\x92\x74\x62\xE8\x91\xDD\x0C\xFF\x59\x99\x7B\x06\x01\x78\x12\x0A\x75\xD3\x90\x77\x92\x9A\x17\x03\x5C\xA3\x7B\x00\x00\x89\x5D\x48\x7D\x02\x92\x96\x92\x40\x19\x03\x5C\xAD\x7B\x91\x1E\xFC\x7D\xD4\x70\x23\x92\xCE\x20\xC3\x20\x03\x5C\x5F\x42\xED\x63\x84\x92\x6C\x92\xA5\x92\xF9\x27\xA0\x91\x65\x92\xA2\x91\x8E\x92\x01\x08\x31\x72\xB6\x79\x06\x01\x3A\x82\xBE\x7B\x9D\x92\x86\x92\xAF\x92\x83\x8F\x66\x92\xA3\x91\x4F\x59\x31\x72\x34\x7B\x1F\x07\xA3\x92\x22\x92\x63\x92\x03\x5C\x09\x47\xDA\x71\x04\x8C\x9E\x91\x9E\x92\x46\x92\xB0\x92\x06\x92\xBE\x92\xB3\x92\x03\x5C\xBA\x46\x25\x47\x9C\x92\x95\x92\xBA\x92\x40\x19\x56\x8B\xA5\x5B\x23\x8F\xC5\x7A\xA9\x8F\xA4\x92\x63\x92\x47\x92\x47\x91\x49\x92\x58\x90\x4B\x92\x40\x89\x4C\x91\x34\x90\x70\x91\x44\x8C\x37\x90\xF4\x8B\x39\x90\xF6\x8B\x11\x92\x95\x91\x13\x92\x42\x8E\x15\x92\x47\x8D\x7D\x91\x08\x8D\xA9\x8D\x9A\x85\xBE\x91\x1D\x92\xF3\x8E\x18\x0F\x03\x90\x71\x00\x6B\x92\xAA\x8F\xAD\x92\x96\x55\x04\x92\xCD\x92\x48\x92\x67\x92\x21\x75\x03\x5C\x51\x45\x0E\x58\x03\x7E\xAC\x92\xDE\x92\x02\x93\xE0\x92\x04\x93\x8C\x01\xCD\x8A\x34\x63\x63\x4E\xE7\x71\x04\x59\x8C\x01\xB1\x89\x7C\x8E\x7A\x8C\xD5\x92\x68\x6D\x6F\x92\xD3\x0D\x0F\x90\x82\x8E\x91\x8D\xA7\x91\xEC\x91\x5F\x8F\x13\x8B\x60\x8E\xFA\x8C\x62\x8E\xFC\x8C\x93\x8C\xF2\x80\xD5\x91\x4B\x89\xF4\x91\x45\x8B\x56\x92\xE3\x8C\x98\x91\xE5\x8C\xF3\x92\xA8\x87\x68\x8A\x49\x8E\x79\x8E\x4B\x8E\xCF\x0D\xD3\x89\x94\x81\x9F\x8B\x0D\x86\x97\x81\x7D\x90\x9C\x83\x7F\x8F\xFF\x92\xF4\x3D\xBB\x92\xAE\x8F\xBD\x92\xB2\x92\xCA\x91\xE3\x92\x52\x8D\x21\x93\xB5\x8F\x23\x93\x51\x91\x25\x93\x53\x91\x27\x93\x32\x91\x35\x92\xBF\x8D\x94\x90\x5A\x91\xC7\x89\xEF\x92\x97\x91\xF1\x92\x60\x8D\x32\x93\x62\x8D\x19\x92\x77\x74\x8E\x81\x84\x7C\x36\x93\xB0\x74\xE1\x85\xFD\x78\x34\x69\x26\x73\x7B\x8B\xFC\x90\xE8\x85\x4E\x90\x7C\x5A\x6D\x92\xE7\x92\xC7\x28\xDF\x92\x6A\x91\xE1\x92\x27\x91\x1E\x93\xAE\x8E\x20\x93\x8E\x91\x22\x93\xF8\x8D\x24\x93\xFA\x8D\x2F\x91\x32\x92\xA5\x75\xFD\x8C\x0C\x66\x14\x91\x69\x88\x2C\x93\x6D\x8B\x2E\x93\x1F\x8D\x59\x93\xC6\x8D\x5B\x93\xC8\x8D\x40\x92\x84\x66\xEC\x8E\xFE\x74\x65\x69\xA2\x8E\x67\x69\xA4\x8E\x99\x73\xA6\x8E\x6A\x93\x7F\x90\x0B\x93\xBC\x92\xB1\x92\x7E\x92\xE9\x91\xF2\x8D\x0A\x92\x2B\x92\xDE\x90\x88\x8E\x2C\x91\xE3\x89\x30\x92\x8C\x8E\x8F\x90\xD6\x8B\xE6\x90\x94\x8F\xF2\x91\x96\x8F\x82\x93\x92\x8B\x84\x93\x6C\x8E\x7B\x91\x6D\x90\x88\x93\x09\x8E\x8A\x93\x77\x6E\x9D\x8E\xA5\x8C\x48\x8A\x54\x79\x16\x6F\xFA\x90\x51\x8E\xD6\x89\x18\x0F\xD1\x8E\xA6\x90\x19\x93\x91\x6D\x1B\x93\xCF\x0D\x1D\x93\x5B\x8F\xAA\x8B\x5D\x8F\x4A\x93\x8A\x90\x5E\x90\x8C\x90\x60\x90\x8E\x90\x62\x90\x92\x8F\xA6\x93\xBD\x8F\x2A\x93\xEB\x89\x54\x92\x4C\x85\x96\x91\x19\x91\x30\x93\x83\x8D\x17\x92\x85\x8D\x8D\x81\xF2\x90\xA9\x7B\xFB\x90\x1F\x8A\x7E\x90\x35\x82\x81\x79\x3B\x93\xB2\x87\xF4\x8E\x5E\x73\x32\x8B\x6B\x93\x41\x93\x6E\x93\x0C\x93\x70\x93\x0E\x93\x72\x93\xC4\x93\x3D\x8C\xC6\x93\x76\x93\x4B\x93\x78\x93\x4D\x93\x7A\x93\x57\x3B\xBA\x8C\x8C\x85\x56\x91\x66\x8E\xD1\x93\x1C\x8B\x12\x92\x3A\x92\x23\x8C\xD7\x93\xA6\x8D\xD9\x93\xA8\x8D\xE6\x5C\x81\x91\x1F\x6A\xDC\x93\xE3\x81\x27\x8F\x80\x8E\x29\x8F\xEF\x8E\x93\x8A\xFE\x69\x82\x86\x18\x8F\x1F\x8F\x0C\x8E\xB1\x70\x55\x24\x25\x6A\x4C\x74\xFF\x56\x9F\x8A\x13\x64\x50\x7B\x40\x8A\x69\x67\xA5\x8A\xFC\x68\xD7\x74\x05\x88\x27\x7B\x5E\x74\xED\x79\x27\x01\x23\x94\x42\x73\xF2\x75\x0E\x1B\x63\x74\x71\x74\x19\x94\x06\x01\xC1\x92\x50\x7B\xC1\x92\xDE\x85\xE7\x91\x14\x33\x00\x8B\x82\x6D\x2B\x94\x68\x7B\x05\x8B\x50\x7B\x32\x76\x72\x8E\xE2\x8A\x06\x5F\x22\x1A\x22\x87\x12\x94\x8D\x7C\xEE\x71\x03\x01\x73\x00\x25\x6A\x49\x5C\xFA\x0D\x74\x00\x2C\x94\x7F\x7E\x50\x7B\xAE\x93\x00\x6B\x1E\x94\xAB\x68\xD7\x74\x75\x00\x49\x94\x02\x01\xE5\x00\xBE\x7A\x54\x94\xC2\x5B\x10\x93\x5D\x63\x29\x94\x61\x6B\x03\x5C\xFD\x0D\xCE\x3C\xB8\x92\xA4\x72\xE1\x8B\x24\x79\xDA\x8A\x56\x75\x40\x94\x41\x94\xA0\x70\x43\x94\xDD\x8A\x92\x8A\xFB\x05\x74\x8F\x6B\x77\x48\x90\xF7\x05\x4A",
"\x90\x83\x63\x6E\x01\x72\x80\x46\x94\x27\x01\x48\x94\x37\x94\xE1\x83\x3D\x69\xFA\x06\xAE\x74\xAE\x66\x6E\x94\x4E\x5F\xDA\x0F\x72\x94\xF4\x5A\x94\x08\x4C\x94\x2F\x6B\x4E\x94\xBA\x69\x50\x94\x52\x94\x01\x01\x56\x94\x37\x7B\x7E\x8F\xAD\x74\xDA\x45\x63\x6B\x7D\x94\x5B\x76\xA0\x62\x80\x94\x99\x5A\x94\x08\x8A\x94\xB3\x5F\x58\x94\x0F\x65\x5A\x94\xEF\x6B\x5C\x94\x9A\x1B\x4D\x73\x8E\x87\x8D\x94\x46\x90\x3F\x21\x90\x94\x70\x94\x92\x94\x19\x01\xE2\x29\xD1\x86\x62\x94\x34\x1F\x63\x6B\x65\x94\xAC\x94\x2A\x8F\xCC\x0D\x09\x75\x10\x45\x12\x94\x0F\x7E\xE6\x8B\x98\x88\xD0\x5C\xB9\x74\xC0\x8A\x34\x79\xEF\x93\x62\x8C\x32\x90\xE5\x92\x2C\x92\x35\x8D\x47\x82\x90\x91\x56\x8D\x92\x91\xF1\x91\x76\x91\x69\x8F\x78\x91\x94\x8E\xD5\x93\x39\x91\x01\x94\x98\x8E\x3E\x92\x12\x62\x46\x8F\x82\x86\x48\x8F\xD2\x8F\x6E\x6A\x29\x8B\xB9\x94\x00\x72\x37\x7E\x93\x82\x51\x83\x7C\x5A\xB7\x94\x66\x8D\x34\x88\xA5\x91\xBA\x87\xDB\x90\xA8\x91\x42\x86\xA0\x93\x57\x8A\x2E\x91\xF7\x93\x30\x91\x7D\x93\x28\x93\xB0\x84\xBB\x90\xC5\x89\x55\x93\x96\x90\xF6\x91\x5E\x8D\x86\x93\x07\x8E\xB0\x93\x78\x60\x72\x8F\x58\x75\xB5\x82\xAB\x86\xC9\x92\x77\x8F\x33\x65\x53\x8B\x4D\x8F\x6E\x72\x7B\x8F\x62\x7E\xC1\x82\x18\x85\xDB\x94\xCC\x8D\x1D\x89\x73\x93\x4B\x91\x5C\x8E\x4D\x91\xF6\x8D\x71\x91\xE9\x92\x46\x8C\xEB\x92\x48\x8C\xED\x92\x4B\x8C\xC9\x94\x3B\x92\xCB\x94\xC3\x8E\xCD\x94\x73\x8C\xB2\x93\x19\x72\x76\x8B\xFF\x86\x78\x8B\x1D\x72\x7A\x8B\xCD\x8F\x46\x8A\xA7\x8F\x8B\x94\xC3\x91\x27\x01\x03\x95\xBF\x91\x4C\x81\xBA\x94\x87\x8C\xD8\x8E\xB8\x89\xCD\x8B\xCE\x91\x5D\x90\xB4\x8E\xB8\x8D\xB6\x8E\xE3\x90\xBA\x8F\x11\x91\xCF\x93\xF4\x8F\x53\x93\x35\x91\xAA\x93\x1D\x8D\xAC\x93\xC0\x90\x75\x84\x16\x95\xE8\x8D\x18\x95\x84\x78\x9A\x8B\xA2\x05\x9C\x8B\xDA\x03\xB1\x7E\xE3\x93\xBD\x5F\xA1\x8B\x85\x91\x27\x09\x25\x95\xF8\x92\xA3\x85\x28\x95\xF2\x8C\x2A\x95\x2C\x8A\x13\x8C\x7A\x8A\x35\x90\xC0\x94\xEE\x91\xC2\x94\xF0\x91\xB1\x91\xC5\x94\x59\x91\x38\x92\x5B\x91\xFF\x93\x4D\x8C\x14\x95\xFC\x8F\x3E\x95\x9A\x8E\x5C\x92\x39\x84\xC4\x8B\xD0\x8D\x4B\x95\xDB\x89\x29\x95\xB3\x8F\xC7\x93\x2B\x91\x8B\x90\x2F\x92\x8D\x90\x31\x92\xA4\x93\x8E\x8E\xB9\x90\xC3\x89\xEB\x94\xF6\x8F\xC7\x94\x0C\x8F\xC2\x8F\x83\x94\x16\x92\xF3\x94\x61\x91\x65\x95\xD6\x94\xCC\x0D\x9B\x8A\xF6\x60\x24\x8F\xC5\x8B\x79\x54\xDD\x1E\xCD\x90\x90\x77\x4E\x83\x43\x72\x50\x8F\x44\x90\xC4\x65\x4C\x95\x56\x88\xDF\x87\x4F\x95\x32\x8D\x51\x95\x52\x8A\x53\x95\x5C\x90\x87\x7F\x2F\x95\x02\x8F\x31\x95\x0F\x91\x33\x95\xAF\x91\x19\x90\x94\x91\x11\x95\x57\x93\xD6\x93\xF1\x94\x28\x8E\x03\x94\x55\x7E\x8E\x95\x57\x7E\xA1\x94\x26\x8B\x88\x87\xFA\x71\x07\x8C\x5E\x76\x4D\x90\x3E\x93\x83\x86\xDA\x94\x6A\x95\x50\x95\x6C\x95\xF2\x93\xC8\x93\x9A\x95\x5F\x90\x9C\x95\xAD\x91\x9E\x95\xCE\x93\x75\x95\xDD\x8C\xA8\x93\x67\x90\x39\x95\x5C\x8D\xEF\x94\x98\x90\x7C\x95\xF2\x92\x5A\x92\xC6\x8F\x80\x95\x90\x5E\xA1\x8C\x50\x66\x99\x83\xAC\x87\x2E\x8C\x04\x77\xA6\x8C\x47\x95\xD7\x5E\x67\x72\x17\x93\xE7\x8B\xB4\x95\x4F\x8A\x36\x88\x95\x95\x36\x8B\xBF\x94\x54\x95\x6D\x93\xAA\x85\x0C\x95\x3C\x8E\x0E\x95\x3E\x8E\x10\x95\x40\x8F\x12\x95\x00\x94\xA5\x95\x44\x8E\xA7\x95\x46\x8E\x7F\x91\x84\x7E\x9F\x90\x9D\x71\xD6\x87\x89\x95\x19\x7B\x78\x7F\xB2\x95\x25\x7F\x1E\x62\x90\x95\xA3\x8A\x57\x88\xD9\x90\xDF\x94\x75\x93\x4D\x92\xED\x91\xE3\x95\x73\x91\xE5\x95\x93\x91\xE7\x95\x55\x92\xE9\x95\x60\x95\xEB\x95\xE7\x8E\xED\x95\xE9\x8E\xEF\x95\xD6\x86\x72\x90\x0F\x69\x78\x8C\x9E\x74\x88\x92\x32\x44\x63\x72\xCC\x90\x79\x90\x24\x8A\xCF\x90\x80\x8C\x8F\x95\xB5\x95\x94\x95\xB7\x95\x00\x96\x77\x93\x50\x91\xB7\x8F\x52\x91\xB6\x90\x54\x91\xE5\x90\xC0\x95\x90\x8E\x66\x90\xB9\x8B\x79\x95\x6B\x8F\x08\x96\xC3\x8C\x3C\x92\xC5\x8C\x4B\x83\x5D\x93\xB0\x66\x11\x84\x91\x72\x13\x84\xC9\x90\x29\x88\x27\x0A\xF9\x90\x6E\x73\xDE\x93\x3C\x93\x2E\x88\xC0\x79\x8A\x8D\xFA\x95\x9B\x88\xC1\x88\xFD\x95\x59\x88\xFF\x95\x9D\x93\xB1\x90\xDF\x90\xE3\x94\x17\x8C\xE5\x94\xA3\x46\xE7\x94\xC4\x77\xE9\x94\xFE\x8C\x2A\x96\x1F\x8C\xD3\x93\xED\x89\x2E\x96\x81\x8D\x61\x95\x1B\x91\x32\x96\xF5\x92\x0B\x8E\x1F\x91\xAA\x8A\xFA\x88\x1C\x96\xDB\x95\xA6\x91\x84\x8E\xE1\x94\x37\x87\x4B\x96\x1C\x8E\x4D\x96\x15\x47\xF8\x93\x14\x87\x64\x90\xD4\x91\x53\x96\xBF",
"\x8C\x55\x96\xF9\x8B\x57\x96\x96\x8E\x59\x96\x3B\x91\x1C\x94\xC5\x8E\x0E\x96\x61\x78\x59\x84\xEB\x8C\x41\x96\x1D\x96\x83\x8E\xDD\x95\x89\x8C\x55\x95\xE0\x95\x0A\x95\xE8\x92\x4F\x92\x3B\x8F\x51\x92\x7C\x8D\x53\x92\xD7\x91\xB5\x91\x3B\x95\xB7\x91\x58\x92\x9C\x8F\xCA\x95\x9E\x8C\xCC\x95\x46\x5C\x7A\x84\x97\x88\xCB\x0D\x34\x76\x42\x96\xC0\x88\xDD\x94\xEA\x91\xE8\x8F\x65\x96\xE1\x89\x67\x96\x8A\x8E\xA2\x93\x7B\x93\x73\x95\xF2\x8F\x35\x95\x92\x90\x37\x95\x37\x92\x2C\x96\xC1\x8F\xCD\x87\x8F\x96\x7C\x91\x91\x96\x7E\x91\x40\x95\x86\x6C\x06\x94\x03\x6D\x95\x67\x9C\x84\xBD\x88\x24\x95\x7E\x96\x1F\x93\x64\x96\x6D\x95\xA9\x91\xA0\x96\xB4\x90\x69\x96\x64\x5A\x6B\x96\x42\x88\x6D\x96\x49\x89\xFC\x93\xDA\x8B\xE9\x90\x5F\x95\x2F\x96\x75\x96\xDC\x91\x63\x95\x66\x6A\x9C\x91\x2F\x8B\xB6\x94\xB9\x96\x74\x93\xBB\x96\xB8\x95\x6E\x95\xC9\x93\x70\x95\xCB\x93\x72\x95\xCD\x93\x90\x90\xA6\x96\x33\x91\xA8\x96\x0A\x8F\xAA\x96\xF8\x8F\x7A\x91\xC1\x90\xCD\x96\xFE\x8F\x79\x96\xCB\x72\xB3\x96\x7E\x8C\xC1\x91\x7D\x92\xEC\x8C\xB9\x67\x99\x96\x1C\x89\x44\x96\xDE\x94\x46\x96\xD4\x96\x20\x96\xF3\x93\x22\x96\x30\x95\xB8\x8F\x32\x95\xB7\x90\x27\x96\xFA\x93\xBA\x90\xC6\x96\x68\x8E\x71\x96\x21\x8C\x73\x96\x42\x8F\x6E\x8F\x44\x8F\x5B\x96\xE6\x5C\xE1\x91\x15\x8E\x7D\x96\x62\x96\xFE\x95\xF4\x96\x48\x96\x0A\x91\x00\x8F\xAA\x91\xC6\x45\xAC\x91\xCC\x93\xAE\x91\xBF\x95\xFD\x96\x76\x95\xFF\x96\xBF\x8F\xE1\x96\x39\x92\xE3\x96\x3D\x95\x77\x96\xE6\x96\xB1\x96\xDC\x72\x39\x89\xD7\x78\x02\x95\xD2\x96\x07\x95\xCD\x91\x09\x95\x5E\x8E\x55\x8D\x63\x88\x57\x8D\x52\x92\x9B\x79\xC4\x95\xE2\x8D\x97\x90\xE4\x8D\x30\x96\xE6\x8D\xE5\x96\x22\x90\x93\x96\xF9\x5A\xE9\x96\x3F\x78\x1F\x92\x26\x5D\x03\x81\x61\x96\x74\x8A\x93\x95\x7F\x96\x1F\x96\x0F\x97\x6F\x91\x84\x96\xC6\x84\x02\x96\xEF\x91\x04\x96\xC4\x94\xA1\x95\xE8\x95\xA3\x95\xCA\x94\x0A\x96\xED\x90\x37\x97\x9C\x90\xE7\x96\xBA\x80\x42\x92\x39\x68\x0B\x97\x41\x97\x45\x96\xC3\x88\xE0\x94\xBC\x96\xE2\x94\x6F\x95\xA1\x93\x71\x95\xA3\x93\xDB\x96\xA5\x93\x28\x96\xBB\x8E\x5B\x95\xD6\x91\xC8\x96\x1E\x97\x71\x8B\x53\x97\xC3\x90\x39\x97\xC8\x8F\x77\x85\x86\x78\xC4\x7A\x23\x95\x86\x74\x27\x97\xEB\x91\xD5\x96\xBD\x96\x60\x97\xE4\x94\xA2\x96\xE6\x94\x7C\x93\x50\x96\x51\x93\xD1\x88\x36\x92\xE0\x96\x31\x97\xBF\x8E\x33\x97\xC1\x8E\xCB\x96\x3D\x92\x20\x97\x38\x97\x55\x97\x00\x73\x26\x8D\x61\x93\xAB\x6E\x30\x8E\x9F\x94\x40\x97\xE0\x8A\x3F\x82\xC5\x85\x44\x97\xBD\x94\x9E\x93\x2D\x92\x12\x97\x3F\x1B\x14\x97\xDA\x96\x16\x97\xDC\x96\x66\x97\xE7\x90\x8A\x96\x6A\x97\x7B\x95\xE4\x96\x8A\x97\x54\x97\x22\x97\x1C\x73\x5F\x93\x53\x7D\x8F\x97\x91\x81\x11\x73\x93\x81\x4F\x8E\xB9\x93\xC9\x8E\x52\x8E\x96\x59\x54\x8E\x8C\x94\x93\x97\xB8\x94\xB8\x76\x9C\x96\x88\x90\x5E\x97\x66\x96\x7A\x97\x4C\x96\x7C\x97\x4E\x96\x7E\x97\x16\x79\x51\x96\x7F\x93\x82\x97\x15\x91\x84\x97\xE3\x8E\xC9\x96\x58\x96\x51\x97\x99\x91\x6D\x97\xEF\x90\x8C\x97\x0B\x73\x35\x93\x3D\x96\x44\x6F\xF9\x89\xE2\x85\xFB\x89\xE4\x85\x18\x96\xFE\x89\x02\x79\x1B\x96\xEE\x96\x76\x97\x9D\x96\xBD\x97\x9F\x96\xBF\x97\x68\x96\xC1\x97\x6A\x96\x4F\x96\xC4\x97\x80\x97\x94\x8C\xC7\x97\x81\x93\x01\x97\xC1\x8C\x03\x97\x6D\x8F\x35\x97\x6F\x8F\xA7\x97\x6E\x97\xD1\x97\xE1\x81\xB4\x93\xF6\x90\x0A\x94\xDD\x08\x8F\x93\x2C\x79\x8F\x97\x02\x5E\xDD\x97\xDC\x67\xEF\x96\x76\x89\x05\x95\x42\x97\xBA\x96\x80\x96\xD2\x8C\x82\x96\x98\x95\xB3\x7F\xB6\x8F\xF8\x96\x24\x96\xFA\x96\x26\x96\x34\x95\xA1\x97\xA7\x93\x68\x97\x2B\x93\xED\x97\x7F\x8D\xEF\x97\x9A\x8F\xA6\x97\x1C\x91\x33\x96\x31\x94\x57\x86\x01\x8B\xD3\x95\xB6\x93\xCE\x0B\x55\x79\x3C\x96\xBA\x93\x4B\x8A\x13\x82\xF7\x95\xD7\x78\x69\x95\x0C\x97\xF3\x96\x06\x98\x93\x8D\xE1\x95\xF6\x8C\x21\x96\x2C\x97\xC0\x89\x2E\x97\x89\x96\x30\x97\x15\x98\x3D\x90\x17\x98\x1F\x90\x41\x90\xAF\x96\xF4\x92\xDB\x93\x9E\x63\x7C\x79\xFE\x74\x8A\x64\xE2\x93\x67\x93\xEA\x81\x4A\x6F\xF5\x8E\x05\x5A\x4F\x90\x01\x01\x01\x98\xC0\x84\x48\x93\xF1\x93\xF5\x96\xB9\x95\x0B\x98\x9B\x95\xF9\x96\x9D\x95\xFB\x96\x10\x98\x18\x97\xC1\x95\x13\x98\xD2\x93\x8B\x96\xF5\x91\x8D\x96\xF7\x91\xC8\x95\x5A\x93\x3B\x98\x33\x93\xFC\x91\x3B\x97\xBC\x63\x17\x8F\x0A\x8B\xD0\x70\x60\x82\x18\x09\x62\x82\x1C\x8F\x35\x8E\xB0\x87\xAD\x94\xF9\x7D\xA5",
"\x5B\x6E\x81\xF7\x70\x25\x8F\xAE\x70\xAD\x97\x6E\x98\x71\x97\x21\x8F\xA5\x90\x8E\x74\x34\x81\x26\x8F\xD4\x97\xFF\x7D\x67\x94\x96\x59\x8B\x86\x74\x97\x06\x01\xCC\x74\x94\x97\x64\x86\x5D\x89\x2C\x98\xB0\x8E\x2E\x98\x36\x8D\xD6\x96\xBA\x95\xCA\x93\xBC\x95\x15\x97\xBE\x95\xA0\x97\x56\x98\x29\x96\xC2\x95\x2B\x96\xC9\x97\x98\x8F\x38\x98\x3F\x90\x5E\x98\x87\x93\x60\x98\x19\x5E\xCF\x94\x79\x90\xD1\x94\xCB\x0D\xA3\x6A\x33\x7E\x4C\x8F\x00\x90\xFB\x0D\x2E\x8B\x21\x92\x02\x01\x84\x98\xB9\x97\x72\x81\x96\x97\xBC\x94\x08\x95\xE6\x92\x47\x97\xE2\x95\x86\x96\x38\x90\x88\x96\x3D\x8F\xA3\x97\xFE\x93\x6B\x97\x6E\x8E\xF3\x97\x64\x94\xA9\x95\xA9\x86\xAB\x95\xF1\x90\x49\x8F\x5C\x75\x78\x8F\xBD\x82\xA0\x8F\xDF\x86\x12\x72\x30\x83\x18\x85\xAB\x98\xDC\x94\xFC\x95\xF2\x96\x5C\x97\x47\x96\x98\x97\x49\x96\x9F\x93\xE3\x97\xA1\x96\x62\x97\xA3\x96\x64\x97\x74\x95\x93\x98\x67\x97\x4D\x97\x07\x96\x4F\x97\x13\x95\xCD\x97\x31\x93\x9D\x98\x89\x93\x1B\x98\x04\x83\x5C\x58\xA2\x8F\x1D\x95\xA4\x8F\xF4\x95\x9D\x85\x21\x95\x92\x7C\x8C\x86\xB9\x67\xCB\x98\x04\x95\xF1\x96\xBB\x97\x4C\x92\x45\x97\x0C\x92\x16\x90\x0E\x92\x18\x90\x2F\x97\x4D\x7E\x36\x98\xD8\x91\x99\x98\x6B\x90\xAD\x96\xAF\x93\xE2\x98\xB1\x93\xE4\x98\x75\x8B\x23\x87\xDE\x75\xED\x5F\x07\x83\x9E\x8B\x43\x98\xF3\x5F\xD7\x5A\xDD\x6D\x60\x96\xEF\x98\xDF\x97\xBC\x97\x78\x97\x5F\x97\xD7\x96\x61\x97\xD9\x96\x63\x97\x9F\x97\x65\x97\xDA\x98\xA2\x97\x35\x98\x5A\x98\x2D\x93\xFE\x98\xDA\x91\x88\x97\x31\x96\x30\x85\xF5\x97\x1E\x60\xD7\x7E\x83\x63\x38\x85\xA2\x74\x11\x99\xF4\x98\xD1\x98\x10\x97\xEC\x8F\x9B\x97\x20\x47\xC0\x96\x15\x5B\xC2\x96\x5B\x8A\xC4\x96\xE9\x89\x1A\x97\xBC\x90\xFC\x98\x8C\x96\x20\x99\x57\x92\x9B\x98\xF2\x94\x02\x99\x6F\x90\x5C\x96\x3F\x94\xD8\x92\xFB\x0D\x27\x90\xD0\x96\x1E\x62\xF0\x98\x26\x95\x07\x79\x06\x95\x77\x97\x4E\x98\x8C\x98\x50\x98\xBB\x95\x52\x98\xBD\x95\x54\x98\x9F\x95\xFA\x98\x39\x81\x3A\x99\x5B\x98\x3C\x99\x2F\x93\xE0\x98\xD8\x93\x7E\x95\xFF\x5C\x9F\x98\xB2\x97\x47\x90\x76\x8F\x49\x90\xAF\x95\xE0\x91\x53\x72\x27\x98\xCA\x83\x09\x01\x49\x99\x4D\x95\x27\x95\x5B\x97\x5C\x8F\x5D\x97\x13\x99\xBE\x97\x15\x99\x7B\x97\xD6\x98\x7D\x97\xA4\x96\x33\x92\xDD\x96\x52\x93\x77\x95\x54\x93\x5D\x95\x56\x93\xCB\x97\x74\x96\x5C\x99\x02\x94\x5E\x99\xDA\x93\x1F\x74\xC6\x90\x48\x7F\x5F\x72\xF8\x97\xD2\x90\xC5\x7A\x7C\x8C\xDA\x97\x33\x8C\x7B\x5B\xB4\x87\x7C\x5A\x6B\x99\x91\x95\x4E\x95\x6E\x99\xC5\x93\x70\x99\x4E\x99\x79\x97\x73\x99\xC0\x97\x75\x99\xC2\x97\x77\x99\xE8\x94\xE9\x97\x29\x93\x6F\x96\x1B\x8D\x97\x98\x1D\x90\x5A\x99\x85\x93\x00\x99\x5F\x91\x83\x99\x04\x94\x66\x87\xF1\x95\xC3\x83\xA1\x90\x8D\x99\xEA\x96\x18\x0F\xC8\x83\x92\x97\x10\x99\x2A\x98\xCF\x98\x0E\x97\x2D\x99\x46\x97\x2B\x97\xC1\x94\x2D\x97\xC3\x94\x5A\x95\xDC\x98\xD4\x93\xDE\x98\xEA\x95\xA8\x99\xB9\x91\x0C\x96\xBB\x91\x6F\x97\xC7\x7F\x86\x99\xE9\x83\xC8\x90\xD2\x95\x3F\x93\x7B\x8C\x3B\x96\x87\x75\x7A\x90\xB4\x97\xA5\x5B\xD0\x90\xB4\x99\xDC\x67\x92\x99\xFB\x95\x92\x95\x95\x99\xF0\x93\x97\x99\xF5\x98\x4E\x92\x0D\x92\x50\x92\x0F\x92\x34\x98\xFB\x98\x1E\x99\x83\x93\xA6\x99\xAD\x93\x19\x98\x07\x97\x85\x99\x08\x94\x4D\x8F\xF5\x90\x38\x96\xF7\x90\x3A\x96\x17\x96\x61\x99\x19\x96\x96\x59\xFE\x90\x68\x95\x2A\x99\xB6\x99\x6F\x99\xD0\x98\xB0\x98\xBE\x94\x55\x95\x2E\x92\x16\x99\x8F\x98\x9E\x97\x91\x98\x1A\x99\x36\x99\x5D\x8A\xA2\x99\x1B\x90\xA4\x99\x69\x90\xE7\x99\x3C\x95\x6C\x97\xBC\x98\x74\x85\xFC\x91\x3A\x84\x5F\x96\xED\x96\xD7\x99\x2B\x99\xE4\x92\xFC\x99\x99\x97\xBF\x94\xFF\x99\x74\x99\x17\x99\xD7\x98\x19\x99\xD9\x98\x05\x9A\x1D\x8C\x07\x9A\x77\x91\x09\x9A\x17\x91\xBA\x98\x0F\x8F\x0E\x9A\xDE\x91\x25\x99\x5D\x92\xEA\x8C\x69\x7B\x13\x9A\x27\x09\xD8\x99\x43\x96\x9B\x96\x9B\x93\x2A\x92\xB9\x99\xF6\x98\xD0\x91\x17\x90\xD2\x91\xA0\x95\x06\x96\xC1\x99\x7F\x99\x04\x97\xF1\x97\x06\x97\x24\x99\xA9\x97\x6D\x77\x64\x91\x47\x99\x47\x62\x30\x9A\x9A\x96\xCD\x98\xF3\x98\x16\x9A\x29\x97\xB1\x98\xBB\x99\x57\x95\xBD\x99\x59\x95\x6E\x96\x95\x98\x54\x96\xE5\x99\xAB\x93\x0B\x9A\x8E\x96\x3E\x99\xA6\x95\xAA\x99\x2A\x8E\xC8\x99\x4E\x80\xD6\x8A\xAC\x98\x62\x93\x29\x8D\xBD\x04\x95\x77\xF8\x99\x5A\x97\xCE\x98\xFA\x99\xB8\x99\x17\x9A\xD2\x98\x9A\x97\xBE\x96\xE1\x90\x32\x99\xC7",
"\x5B\x34\x99\x1B\x8C\x20\x9A\xBD\x8C\x22\x9A\xC6\x94\x24\x9A\x37\x91\x26\x9A\x20\x90\xCF\x97\x9B\x91\xBE\x67\x45\x62\x0F\x8E\x6A\x99\x15\x9A\x49\x93\x71\x99\xE2\x97\x9A\x99\xE4\x97\x9C\x99\xE6\x97\xC3\x97\x9F\x7E\xC5\x97\xBC\x7F\x5C\x95\x1C\x97\x5E\x95\x79\x9A\x3A\x98\x7B\x9A\x29\x9A\x42\x9A\x6F\x6F\x63\x98\xF7\x88\xEB\x96\x8D\x92\x0F\x99\x14\x9A\xF9\x99\x96\x99\xFB\x99\x4C\x9A\xFD\x99\x8A\x98\x56\x95\x49\x97\x58\x95\x4B\x97\xBF\x99\x3B\x9A\x56\x96\xC2\x99\x09\x96\xC4\x99\x7D\x95\x40\x99\x7F\x95\x2A\x9A\x73\x6A\x88\x8D\xDF\x7E\x8A\x8D\x47\x9A\xF0\x96\x32\x9A\xAE\x98\x5A\x90\xF6\x7F\x83\x96\x4E\x9A\xA3\x9A\x50\x9A\xA5\x9A\x52\x9A\x58\x98\xFD\x93\xEE\x92\x3D\x9A\xF0\x97\x22\x99\x36\x97\x28\x9A\xFB\x91\x5D\x9A\x3F\x91\xAB\x8D\xC2\x81\x59\x8B\x03\x01\xB4\x9A\x02\x98\xF2\x98\x33\x9A\xAF\x90\xDE\x99\x01\x96\xB4\x98\xEA\x92\xB6\x98\x3A\x90\xB8\x98\xC2\x9A\x90\x9A\x9A\x90\x92\x9A\xC8\x9A\xAF\x9A\x9A\x5B\x96\x9A\xCD\x8D\xF7\x62\xE8\x72\x3F\x97\xB5\x99\x66\x9A\x4A\x9A\x82\x9A\x98\x99\x14\x99\x8D\x98\xD8\x96\x01\x9A\x18\x99\x03\x9A\x1F\x9A\xD3\x91\xC5\x96\x75\x9A\x8D\x9A\x77\x9A\x79\x91\xA5\x97\x1F\x97\x1A\x98\x42\x99\x82\x6D\x57\x97\x3E\x69\xB3\x9A\x81\x9A\x4D\x98\xD4\x9A\x30\x98\xBC\x99\x32\x98\xBE\x99\xBF\x9A\xC0\x99\xA8\x9A\xC3\x9A\x18\x98\xFA\x9A\xEA\x99\x4D\x83\x04\x90\x72\x97\x8A\x99\x82\x98\xCE\x9A\x01\x9B\xDD\x99\x35\x9A\xDF\x99\xF7\x98\xE1\x99\xF9\x98\xE3\x99\x57\x99\x55\x9A\x3A\x95\x57\x9A\x5D\x98\xE9\x99\x41\x9A\x04\x99\x17\x72\x5F\x9A\xCC\x98\x2F\x8E\x01\x7E\xD8\x95\xE0\x93\x46\x9A\x15\x9B\x9E\x9A\xB9\x9A\x09\x98\x3A\x80\x6D\x9A\x0D\x91\x6F\x9A\x42\x5B\x71\x9A\x65\x8F\x73\x9A\x9E\x8D\xF5\x9A\x69\x97\xB9\x98\xF9\x9A\x0D\x9A\xFB\x9A\x3D\x98\xDC\x7C\xE9\x7B\x1E\x98\xCB\x0D\x39\x93\xB1\x97\x23\x98\xB3\x97\xBB\x93\xB5\x97\xFF\x97\x2F\x9A\x2D\x9B\x69\x9A\x9F\x9A\x18\x9A\xFE\x99\x30\x99\xCD\x47\x34\x9B\xC6\x45\x36\x9B\x55\x91\x38\x9B\x67\x8F\x3A\x9B\x14\x98\x1E\x9B\xC5\x95\x5C\x98\xF0\x94\xAB\x9A\xC9\x95\xDE\x9A\x5B\x92\xE0\x9A\x4E\x79\xAB\x97\x07\x7E\x7D\x98\x37\x93\xCB\x0D\x76\x8E\x25\x73\x78\x8E\x68\x9B\xA5\x8E\xA5\x5B\xE9\x85\xDC\x92\x14\x9B\x9C\x9A\xDC\x99\x2E\x9B\x5C\x80\xBA\x9A\xCF\x91\x7B\x81\xD1\x91\x7F\x81\xF3\x9A\x37\x99\x5A\x9B\x59\x98\xA4\x97\xAC\x96\x59\x9A\xEC\x95\x5B\x9A\xEE\x95\x94\x9A\x4C\x72\x8C\x93\x89\x99\x56\x7B\xFA\x97\xE8\x81\xD5\x95\x6F\x9B\xFB\x0D\xA7\x8E\x01\x92\xC4\x65\xCF\x9A\x4B\x98\x28\x91\xE0\x97\x83\x9A\x1A\x8E\x32\x9B\xAB\x91\x54\x9B\x3F\x1B\x56\x9B\xFC\x96\x58\x9B\x57\x91\x7F\x9B\xC1\x9A\xA2\x95\x0B\x9B\x39\x98\xDD\x9A\xC7\x9A\x63\x9B\x87\x9B\x48\x8E\x1D\x98\x74\x8E\x1F\x98\xCC\x8E\x49\x8A\x0B\x99\xE4\x93\xBC\x93\x4B\x9B\x65\x9A\x85\x98\x6C\x91\xD9\x8E\xEB\x9A\x72\x99\xED\x9A\x00\x9A\x52\x99\x90\x98\x54\x99\x17\x97\xA0\x9B\xFB\x93\xA2\x9B\xC7\x96\x3C\x9B\x82\x9B\x22\x9B\x70\x8E\xAA\x9B\xC7\x8E\xF7\x97\xEF\x99\xAC\x8D\x5B\x04\x36\x82\xEA\x98\x67\x8D\x18\x0F\xB7\x92\x1A\x66\x3C\x82\x48\x99\x4D\x9B\x88\x98\xDC\x90\x9F\x82\x2E\x99\xB2\x90\x9A\x9B\x13\x97\x9C\x9B\xD1\x1A\x9E\x9B\x55\x98\xC1\x9B\xFE\x96\xC3\x9B\x00\x97\x5C\x9B\x32\x97\xC6\x95\x34\x97\xC5\x9A\xF2\x97\x3F\x9B\x6A\x81\xDF\x8A\x60\x9A\x92\x7B\xAC\x9B\x7F\x86\xD3\x8D\x74\x73\x68\x98\xD3\x02\x1B\x8F\xB2\x79\x66\x98\x6F\x74\xB3\x94\xD8\x94\xD9\x95\xD0\x5C\xEE\x74\xB6\x9B\x29\x92\xD3\x9A\x17\x9B\xD5\x9A\xE0\x99\x87\x96\xE2\x99\xB7\x98\x1D\x99\x81\x9B\x04\x8D\x60\x9B\x5F\x98\x62\x9B\x82\x7E\x60\x99\x47\x9B\x62\x99\xF9\x94\x49\x90\xD4\x94\xC5\x98\x2C\x8B\xD4\x0D\xA8\x98\xCD\x9A\x02\x01\x00\x9C\xF0\x9B\xB7\x9B\x2B\x95\x97\x95\x2D\x95\x99\x95\x50\x99\x8E\x98\xBD\x9B\x02\x9A\xBF\x9B\x92\x98\xE3\x9B\x19\x97\xE5\x9B\x1B\x97\xF7\x9A\xC8\x94\xA9\x9A\xCA\x96\x81\x99\xCC\x94\xA8\x9B\x10\x9C\xF5\x94\xAA\x86\x8B\x82\xAD\x95\xC3\x98\xFB\x94\x79\x8F\xF3\x5D\x44\x99\xFF\x00\x58\x8B\xEE\x98\xDC\x67\x1D\x9C\x27\x9B\x94\x99\x67\x9A\x9D\x9A\x4E\x9B\x2F\x9B\x22\x9C\x0A\x98\x4C\x93\x23\x96\x4E\x93\x25\x96\x50\x93\x34\x92\x81\x97\xDF\x96\xC8\x97\x58\x99\x1F\x99\x30\x9C\xCC\x97\x0D\x9C\x9C\x98\x0F\x9C\x92\x96\x64\x9B\x76\x85\xCB\x0D\xE7\x98\x01\x87\xBF\x54\x23\x8A\x81\x72\xEC\x98\x8A\x7A\x41\x9C\x27\x09\x43\x9C\xF1\x98\xB6\x9A\x13\x86\x97\x97\x6A\x9A\xDB\x9B\x4A",
"\x96\xD4\x98\xBF\x96\xE5\x97\xC1\x96\xE7\x97\x8A\x9A\xA0\x99\xEA\x94\x38\x99\xEC\x94\x7D\x99\xEE\x94\x5E\x9B\xC7\x95\xC7\x9B\x11\x8F\xC9\x9B\xD3\x87\x06\x99\xAE\x7E\x08\x99\xCB\x8F\x0A\x99\x1F\x95\xB3\x7E\x0D\x99\xDD\x8F\x8A\x8D\x69\x9C\x4A\x99\x7D\x85\xE9\x9A\x02\x9B\x04\x9C\x04\x9B\x4F\x9A\x06\x9B\x51\x9A\xF4\x9A\x53\x9A\x70\x96\xE7\x9B\x85\x97\xE9\x9B\x87\x97\x32\x9C\x15\x95\x34\x9C\x5C\x9C\x81\x9C\x75\x5A\x67\x95\x29\x99\x09\x01\x8D\x9C\x6C\x99\x4B\x99\x04\x98\xD3\x96\xD8\x9B\x9E\x96\x99\x9B\x71\x9C\x6E\x9A\x73\x9C\x33\x99\x75\x9C\x89\x80\x7E\x93\x8C\x9A\x3B\x9B\xDB\x9A\x3D\x9B\xBB\x98\xED\x9B\x0F\x9B\xFF\x94\xFB\x7E\xFD\x9B\xB5\x94\x1E\x62\xA7\x9C\x93\x99\x6D\x99\x46\x9C\x75\x9B\x48\x9C\x77\x9B\x30\x9B\x56\x81\x4C\x9C\x0C\x98\x4E\x9C\x0E\x98\x50\x9C\x79\x99\x52\x9C\x7B\x99\x38\x95\x55\x9C\xE6\x99\x57\x9C\x80\x99\x59\x9C\x3F\x99\x5B\x9C\x9B\x6A\x36\x9C\xC0\x98\xD4\x76\x14\x9C\x6F\x94\x65\x99\xC6\x62\x99\x6B\xB4\x9B\xA6\x9C\xD7\x9B\x6D\x9C\x4F\x9B\x6B\x9A\x19\x9A\x52\x9B\x28\x47\xDF\x9B\x93\x46\xB3\x9C\xD1\x82\x77\x9C\x52\x96\x98\x9C\xA3\x99\xD4\x9C\x56\x9A\xD6\x9C\x3E\x9A\xEB\x9B\x40\x9A\xC8\x9B\x24\x9B\xE1\x73\x10\x96\x35\x05\x74\x90\x13\x96\x46\x73\x8B\x99\xD0\x99\x63\x9C\x8E\x99\xA5\x5B\x35\x8C\xFF\x90\x42\x9C\xE6\x9C\xAF\x98\xE8\x9C\x6F\x9C\xD3\x98\x85\x9A\xD5\x98\x1C\x9A\x76\x99\xD8\x98\xA5\x96\x11\x98\xD0\x93\x2C\x9C\x39\x99\x9A\x9C\xCA\x97\xDC\x9A\xF9\x91\xDA\x9C\x3C\x98\xAC\x99\xB6\x7C\x74\x7F\x88\x66\x88\x9C\x68\x93\x96\x59\xB3\x99\x9D\x91\x68\x9C\x0B\x9D\xB8\x9A\xC8\x9C\x4A\x9C\x31\x9B\xAF\x9C\x33\x9B\xB1\x9C\x70\x9A\xEF\x9C\x48\x86\x16\x9D\x36\x95\xD2\x9C\xA9\x96\x2E\x9C\x7A\x95\xC6\x9B\x0D\x9B\x23\x9B\xFC\x9A\x38\x9C\x3E\x98\x7E\x72\x25\x6C\x9E\x7F\xCD\x99\xAE\x87\xCB\x90\x9E\x83\x24\x9D\x44\x98\xD4\x0D\xD5\x99\x28\x9D\xC2\x0D\x2A\x9D\x8D\x91\xB9\x9B\x84\x9A\xBB\x9B\x1B\x9A\xEF\x9A\x1D\x9A\xF1\x9A\x15\x9D\x1B\x99\x12\x98\x09\x9B\x72\x96\xF7\x9C\xC4\x9A\x9E\x9C\x62\x95\xA0\x9C\xB0\x96\xFC\x9C\x03\x74\x35\x96\xA3\x8C\x37\x96\x44\x9D\xCA\x90\xCF\x99\xF2\x99\x12\x9C\xF4\x99\xA5\x5B\xF6\x99\xA5\x9C\x06\x01\xC2\x9C\xD9\x99\x45\x9C\x90\x9C\x16\x9B\x6E\x9C\xBA\x99\x79\x9B\x64\x85\x7B\x9B\x68\x85\x2A\x9C\x57\x98\x5A\x9D\x02\x97\x5C\x9D\x0C\x9B\x3E\x9B\x0E\x9B\x4B\x87\xFF\x59\x8D\x74\xDE\x8A\xE6\x9A\x0A\x9D\x74\x9B\xBB\x94\x2B\x9D\x0A\x81\xC9\x9C\xD0\x8B\x10\x9D\x72\x9C\x87\x9A\x74\x9C\x89\x9A\xB4\x9C\x8B\x9A\x68\x88\x3B\x7F\xE8\x9B\x7D\x9C\xEA\x9B\x5E\x9D\x5A\x96\x3D\x9D\x08\x97\x7B\x96\x2D\x9A\x8C\x9C\x4E\x9D\xCC\x91\x49\x9C\x2A\x97\x78\x9D\x1B\x86\x7A\x9D\x1F\x86\x58\x9D\x17\x9D\xF3\x9C\x08\x9A\xF5\x9C\x1F\x9B\x80\x9D\xA6\x9B\x1D\x9D\x60\x9D\x1F\x9D\x0A\x8D\x6B\x67\x13\x9B\x1C\x9C\xA3\x9D\x9C\x93\x92\x9C\xF6\x96\x31\x98\xFB\x8C\x33\x98\x09\x9C\xE4\x99\x0B\x9C\x45\x8D\x9C\x9D\x76\x96\xBB\x9C\xE1\x72\xEF\x9B\x44\x9C\x45\x73\x62\x9A\x66\x7A\x94\x64\x29\x9D\x8A\x9D\x6B\x95\x0C\x9D\xA5\x9D\x4D\x9A\xA7\x9D\xA5\x88\xA9\x9D\xA9\x88\x35\x9D\xA7\x96\x37\x9D\x83\x97\xAF\x9D\x5D\x9B\x20\x9B\x5F\x9B\x83\x9B\x0B\x96\x85\x9B\xDB\x88\x7D\x9A\x2D\x6D\x7F\x9A\x70\x9D\xBA\x9D\x34\x9A\x76\x9D\x36\x9A\x7A\x9B\x38\x9A\x7C\x9B\x3A\x9A\xDA\x9A\xA4\x9B\x1C\x9D\x59\x92\x1E\x9D\x61\x98\xC9\x9A\xFE\x72\xF7\x92\xC3\x9C\x49\x9B\xA5\x5B\x69\x8D\x4A\x95\x4D\x9D\xD0\x9D\xB6\x95\xD2\x9D\x2C\x9D\xA6\x9D\x2E\x95\x24\x9C\xEE\x9A\x26\x9C\xF0\x9A\x28\x9C\x04\x9A\x7D\x9B\x06\x9A\xAD\x9D\x23\x9A\xDD\x9D\x99\x9D\xDF\x9D\x7E\x9C\x3C\x9D\xFB\x9C\x3E\x9D\x6F\x6F\x09\x97\x71\x06\xA2\x9D\x00\x9E\x1E\x96\x02\x9E\x8D\x9D\x2D\x9D\xCA\x9C\xF4\x93\x4D\x9C\xF6\x93\x9D\x99\x14\x9D\x78\x99\xD9\x9D\xDE\x96\xDB\x9D\x54\x9C\x1A\x9D\x98\x98\xB1\x9D\x9A\x98\x7F\x9C\x95\x83\x5D\x9C\x91\x82\xD0\x0D\xFF\x91\x59\x04\x18\x85\x71\x9D\x31\x9A\x49\x9A\xD2\x9A\x08\x91\x03\x9B\xBD\x9D\x05\x9B\xBF\x9D\x07\x9B\x97\x9C\xC0\x9A\xC4\x9B\xB8\x9C\x3B\x9D\x82\x9D\x9E\x9D\xEE\x9B\xAB\x8A\x50\x80\x3D\x97\xF9\x62\x6F\x9D\xBA\x74\xE9\x9D\x03\x9C\xEB\x9D\x18\x9B\x37\x9A\xF8\x98\x39\x9A\x56\x99\xFA\x82\x10\x9E\x9B\x9C\x9A\x9D\x9D\x9C\xD8\x9C\x5A\x9A\xAD\x9A\x18\x92\x16\x9E\xA9\x72\xFE\x9A\x0C\x0A\x1A\x9E\xE8\x9A\x3A\x9E\x6D\x91\x3C\x9E\x4F\x98\xCB\x9C\x51\x98\x0D\x98\x53\x98\x0F\x98\x55\x99\x1C",
"\x9B\x57\x9E\x2B\x9E\xA5\x99\x2D\x9E\xFF\x98\xE1\x9D\x52\x97\xB4\x9D\xF6\x9D\x31\x9E\x70\x97\x30\x75\x0D\x8E\x95\x89\x36\x9E\x4F\x9E\x3B\x9E\xBC\x9D\x69\x9E\x21\x9E\xCC\x9C\x23\x9E\x88\x9A\x9E\x99\x7F\x97\x51\x9C\xEA\x97\x53\x9C\xEC\x97\x72\x9E\x0A\x9A\x74\x9E\x21\x99\xC5\x9D\xCC\x96\x78\x9E\x5C\x93\x60\x9E\xBA\x72\xE2\x9A\xEB\x98\x29\x9B\x79\x98\xAB\x78\xC1\x9C\x80\x9E\x67\x9E\x82\x9E\x4F\x99\x6A\x9E\x51\x99\x6C\x9E\x53\x99\x6E\x9E\xC0\x9B\x0C\x9E\x21\x9A\x0E\x9E\x76\x9A\x58\x9E\x1B\x9D\xB9\x9C\x27\x9A\xC7\x9D\x6C\x74\xD3\x97\x24\x98\x7C\x6E\xD2\x89\x4D\x8E\x07\x69\xA7\x8C\xD6\x95\x3D\x93\x2A\x9B\x61\x76\x7C\x5A\x37\x9E\x48\x9A\xDA\x99\xC5\x9C\x8B\x9D\x4F\x9D\x68\x9E\xA1\x9E\x84\x9E\x6B\x9E\xCD\x9C\x6D\x9E\xCF\x9C\x27\x9E\x7A\x99\x79\x9C\x78\x95\x39\x9D\x2D\x96\x90\x9E\x3D\x99\x2F\x9E\x3D\x91\xF7\x9D\xCF\x89\x66\x9B\x58\x86\x01\x9D\xD6\x97\x64\x93\x24\x73\xFC\x89\xB0\x99\xA3\x90\x69\x93\x68\x99\x32\x8E\xFF\x9D\x65\x9E\xB7\x9A\xC3\x9E\xA0\x9E\x99\x99\x52\x9D\x9B\x99\x12\x9D\x24\x9E\x1E\x9A\x57\x9D\x7C\x9D\x94\x98\x42\x9E\xE6\x9B\xC3\x9D\xC4\x8D\x92\x9E\x89\x97\xB0\x9E\x5E\x93\xEC\x99\x43\x9B\xC7\x0D\x8E\x93\x8D\x9B\xB1\x9B\x7A\x8E\x25\x8A\xE4\x9C\xE8\x9D\x1B\x9E\x43\x97\x1D\x9E\x46\x82\x78\x9B\x05\x9E\xA2\x9E\x25\x9C\xA4\x9E\xBE\x9B\xA6\x9E\x29\x9C\xA8\x9E\x74\x9A\xAA\x9E\xF6\x9A\xAC\x9E\x2C\x9E\xA5\x9B\x2E\x9E\x14\x9E\x80\x9C\x62\x9D\x65\x6B\x89\x9B\xCC\x9B\x12\x9B\x29\x03\xCD\x8E\xD0\x9B\x57\x8C\xB3\x9B\xE1\x9E\xCC\x9A\xB9\x67\xBE\x9E\xB5\x9A\x39\x9E\xE5\x9E\xA4\x9D\x03\x9E\xD4\x9D\x08\x9F\xC6\x9E\xA3\x9E\xC8\x9E\xA5\x9E\xCA\x9E\xAB\x9D\x36\x9D\xCD\x9E\x7C\x99\x8E\x9A\x7E\x99\xF3\x9D\x90\x96\xF5\x9D\x95\x9E\x40\x9B\x2F\x7B\xDD\x93\xB3\x9E\xDF\x93\xBC\x9E\xC1\x08\xF1\x8E\x20\x9F\xCF\x8E\xA5\x5B\xD3\x9B\xAF\x06\x61\x86\xC4\x65\x26\x9F\xD0\x9A\x6B\x9C\x09\x87\x05\x9F\xFA\x83\x07\x9F\x23\x9C\x09\x9F\x07\x9E\x0B\x9F\x27\x9C\x0D\x9F\x0B\x9E\xF0\x9D\x0A\x9C\xC5\x9B\x0C\x9C\x76\x9E\xCE\x97\x94\x9E\xE3\x98\x96\x9E\xE8\x96\x8E\x97\x6E\x9B\xF1\x9B\xF9\x9E\xB7\x9D\xF9\x8E\xA7\x8B\x6A\x94\xF7\x9B\x6A\x98\xF9\x9B\x1D\x8F\x61\x99\xD2\x70\xB8\x74\xE3\x9E\xAE\x7B\x09\x5A\xBE\x74\x65\x22\xFC\x97\x65\x9F\xE2\x74\x58\x01\xB7\x0A\x33\x1B\xFE\x74\x83\x74\x5A\x7D\xFE\x79\xFD\x92\xFC\x7A\x6C\x81\x19\x8F\x9E\x7C\x63\x7D\xA1\x7C\x8A\x7C\x3D\x7B\xA4\x7C\x94\x92\xB9\x67\xFE\x7A\x8E\x9C\x00\x81\xFF\x59\x89\x73\xC1\x7D\x28\x99\xC4\x65\x8E\x9F\xA8\x9C\xC5\x15\x76\x7D\x6A\x0D\xB4\x7C\xEF\x7D\x73\x89\x2D\x7C\xD7\x7D\xCB\x7D\xD0\x0D\x7F\x7D\xCE\x7D\x83\x9F\x63\x86\xD1\x7D\x63\x59\xC5\x7C\xD4\x7D\x7D\x8F\x11\x7C\x3C\x7D\xF3\x7D\xF5\x7B\xE7\x7D\x17\x7C\x7C\x5A\x96\x9F\xFA\x9D\x98\x9F\xC2\x7C\x93\x7D\xB1\x01\xE3\x7D\x2D\x7D\xA0\x9F\xD7\x7C\xAF\x9F\x51\x7C\xB1\x9F\xEA\x7D\xF6\x89\xE9\x7B\x9E\x7D\x9C\x9F\xAD\x99\x4B\x7C\xAC\x9F\x31\x7B\xCC\x73\xBC\x9F\xF5\x7C\xBE\x9F\xD0\x7D\xE0\x7D\xEB\x7C\x1E\x7C\xC3\x9F\x21\x9D\xF1\x7D\xE4\x7D\xBA\x9F\x18\x0F\xF3\x7C\xA3\x9F\x03\x01\xB2\x9F\x72\x9D\x44\x70\xBA\x7D\x59\x61\x0B\x70\xA9\x9F\x76\x71\xD2\x9F\xB9\x9F\xAD\x9F\xCC\x0D\xC0\x7D\xD7\x9F\x02\x01\xD9\x9F\x38\x9E\xE1\x74\xC2\x7C\xF4\x73\x3C\x7C\xD0\x9F\xEE\x7C\xA1\x7D\xD3\x9F\xE3\x9F\xFD\x73\x02\x7E\xBD\x7C\x27\x09\xE8\x9F\xBF\x9E\xE0\x6F\xEB\x9F\x33\x70\x9B\x71\xDF\x9F\x8A\x71\xE1\x9F\xB1\x7D\xD4\x9F\x96\x59\x4F\x7C\xE6\x9F\x01\x01\xF7\x9F\x27\x9F\xEA\x9F\xD7\x9E\x14\x74\xE2\x7D\xFD\x9F\x9D\x71\x21\x7C\x00\xA0\xF2\x9F\x1A\x74\xC9\x9F\x15\x7D\xCB\x9F\xA5\x9F\xCD\x9F\x6A\x0D\xEE\x7D\x89\x9F\xE7\x71\xE0\x7C\xF0\x9F\xE2\x9F\xC7\x9F\x3E\x7D\x63\x70\x8C\x9F\xDC\x67\x06\xA0\x4D\x9F\xEE\x8E\x8B\x95\x32\x74\xA4\x12\xC3\x92\xE7\x9F\x0E\x77\x8A\x70\xA9\x78\x93\x9F\x3D\x7A\x8D\x9F\x0E\x77\x73\x8E\x54\x7D\xFB\x95\x57\x7D\x73\x7C\x10\x9B\xE0\x86\xBC\x7B\x82\x9F\x03\x01\x76\x7C\x8F\x9F\x41\x9F\xB3\x95\x62\x7D\xA3\x8F\x0F\xA0\x31\x7B\x66\x7D\x33\x6A\xE7\x7C\x21\xA0\x27\x09\x3C\xA0\x97\x9F\x90\x9F\xCC\x0D\x92\x9F\x04\xA0\x00\x00\x49\xA0\xB3\x9F\x3E\x16\x99\x9F\x92\x73\x78\x7D\xAE\x7D\x1B\xA0\x0E\xA0\x64\x7D\x10\xA0\x9A\x73\x12\xA0\x81\x7D\x7C\x5A\x50\xA0\xDA\x9F\x5E\x18\xA6\x9F\xCF\x61\xA8\x9F\x56\xA0\x30\x83\x9E\x9F\xBD\x7D\xE5\x7D\x8D\x7D\x5C\xA0\xC2\x7D\xF0\x7A\xBF\x9F\x41\x9B\x64",
"\x7C\xB6\x9F\x0A\x04\xB8\x9F\x42\xA0\x74\x6D\x4F\x70\x96\x59\x99\x7D\x71\x7D\xDC\x67\x5F\xA0\xE9\x9F\xF9\x9F\xD7\x9E\xC2\x9F\x19\xA0\x79\x92\xD4\x7C\x8B\x7D\xBE\x7D\xFF\x00\xA5\x7D\x79\xA0\x48\xA0\x6E\xA0\xE9\x7C\xC1\x71\x1D\x7C\xEE\x93\xFE\x7C\x9C\x7C\xC1\x82\x67\xA0\xF2\x7D\x1E\xA0\x24\x7C\xF4\x9F\x32\x7D\x7A\xA0\x89\xA0\x09\x7D\xAA\x6E\xBB\x7D\x0C\xA0\xC6\x71\xF1\x9F\x93\xA0\xD0\x0D\xE5\x9F\xA6\x7D\x3B\xA0\x98\xA0\x18\x7D\x0A\x7D\x95\x49\x3B\x7C\xB7\x7A\x65\xA0\x63\x7E\x91\xA0\x9E\xA0\x75\xA0\xB6\x71\xA5\x5B\xCD\x7D\xA2\xA0\xF4\x7A\xCC\x9F\xD7\x9E\x1A\x7D\x08\x74\x9C\xA0\x5A\x7C\x59\xA0\x9F\xA0\x3C\x70\x6B\xA0\x94\x9F\xB9\x67\x7B\xA0\xF8\x9F\xDB\x9F\x09\xA0\xE1\x7D\x72\x00\x73\xA0\xBA\xA0\xAE\xA0\x31\x7C\xFB\x0D\x30\x7D\x2E\xA0\x28\x64\x47\x62\xC0\xA0\x07\xA0\x7D\xA0\xEB\x7D\x9F\x0B\x39\x7D\xC4\x71\xB8\xA0\xB0\x7D\xC7\xA0\xF4\x7B\x29\x74\xF5\x7D\x47\xA0\x6D\xA0\x84\x9F\x3E\x9C\xFB\x7D\xDC\xA0\x09\x01\xCF\xA0\x24\xA0\x6B\x8A\x4C\x7D\xCC\x0D\x8F\x7C\xB2\xA0\x01\x01\xE3\xA0\xB7\x77\x32\xA0\x08\x7E\x1D\x92\x35\xA0\x33\xA0\xA7\x70\x4E\x77\xD5\x70\xEB\xA0\x79\x83\xF3\x74\xFD\x22\x22\x8A\xB7\x77\x7A\x9F\x00\x13\x51\x17\xD8\x22\xF4\x02\xB5\x63\xD5\x70\x77\x00\x03\x8B\xE3\x9C\x23\x9F\x84\x95\xE0\x68\x6F\xA0\x35\x0C\x58\x01\xE4\x74\xCF\x22\x49\x7F\x1C\x9F\xE3\x03\xF9\x0C\xD8\x2A\xB8\x9E\x62\x93\x02\x8B\x80\x9F\x01\x01\x33\x7C\xAB\x92\xFF\x27\x2B\xA0\x51\x8F\x7D\x73\x87\x9F\xC7\x7B\x58\x7C\x8B\x9F\x8F\x70\xD0\x5C\xF0\x74\x4A\xA0\x1C\x64\x6F\x7D\xDD\x71\x21\x7D\xC4\x65\x23\xA1\x51\xA0\x19\x70\x16\xA0\x54\xA0\x05\x02\xC6\xA0\x88\x9F\xEE\x7B\xAF\xA0\xFB\x0D\xA2\x9F\xE9\xA0\x2F\x52\xA4\xA0\xA4\x7A\xF3\x73\x87\x7D\xA4\x73\xAA\xA0\x90\xA0\xC5\x9F\x83\xA0\x69\xA0\xFB\x0D\x8E\x7D\x87\xA0\x27\x01\x2A\xA1\x60\xA0\xB4\x9F\xD7\x9E\x71\xA0\xFD\x94\xFF\x7C\xE0\x9F\xD6\x7D\x68\xA0\x01\xA0\x98\x7D\xBD\xA0\x2F\xA0\xDC\x67\x46\xA1\x7C\xA0\xC2\xA0\xD2\xA0\x90\x73\x7F\xA0\x32\xA1\x3D\x7B\x57\xA0\xFF\x9F\xD8\xA0\xAA\x73\x14\x7C\x52\xA1\xCD\xA0\x29\xA1\x38\xA1\xA8\x8F\xCE\x78\xAC\x7D\x76\x83\xF0\x45\x4C\xA1\xFE\x9F\x4E\xA1\x92\xA0\xC8\xA0\x92\x93\xA5\x5B\xD6\x9F\x36\xA1\x55\xA1\xC1\xA0\x61\xA0\xDC\x9F\x91\x72\xDE\x9F\x3D\xA1\xAA\x9F\xAC\xA0\x1D\xA0\x6F\xA1\x03\x5C\xA1\xA0\x44\xA1\x19\xA1\xB4\xA0\x58\xA1\x32\x70\xA7\xA0\x0C\x7D\x7A\xA1\x4D\xA1\xAB\x9F\x40\xA1\x50\xA1\xFB\x0D\xB1\xA0\x81\xA1\xEF\x74\x65\xA1\x22\x95\x3A\xA1\xD2\x7D\xFC\x9F\x88\xA1\x6C\xA1\x8A\xA1\x9F\x9F\x5A\xA0\x02\xA0\x62\xA1\x06\x90\x1E\x62\x74\xA1\xD0\xA0\x57\xA1\xC0\x9F\x64\x7C\x0A\xA0\xC5\xA0\xD6\xA0\x1C\xA0\x74\xA0\xD9\xA0\x5D\x7C\x9C\xA1\x0A\x7B\x22\xA1\x91\xA1\xED\x98\xA3\xA1\x22\x74\xC3\x71\x30\xA1\x1E\xA1\xE0\x7B\xDA\xA0\x20\xA0\x21\xA1\x9E\xA1\x1A\xA1\xE2\x70\x27\xA0\x6B\x70\xE1\xA0\x90\xA1\xDE\xA0\x3E\x6A\x2D\xA0\x4E\xA0\x9F\xA1\xE4\xA0\x8D\x8A\xD7\x9E\x58\x7D\xE4\x5E\xF0\xA0\xEE\xA0\x98\x8A\x06\x75\x27\x01\xB0\x94\x72\x98\x66\xA1\xCB\x0D\x0D\x75\xC8\x2F\x7C\x9F\x6E\x17\xD4\x7A\x03\x5C\x14\x75\x85\x56\x3A\xA0\x11\x05\x7E\x5A\xD4\x7A\x1C\x75\x1E\x75\x2E\x75\xE1\x58\x76\x94\xFF\x74\xA9\x78\x99\x54\xD8\x72\xD0\x5C\xFF\x91\x19\x75\xA7\x59\x2A\x75\xB2\x9E\xDB\x92\x62\x72\x41\x3E\x93\x89\xFF\x59\xA9\x07\xCE\x7A\x76\x98\xD1\x70\x03\x5C\xA9\x07\xC0\x7A\xF5\xA1\xFA\xA1\x71\x9F\xE7\xA0\x51\x36\x90\x7C\x02\x7A\xB5\x24\xEF\x4E\xF9\xA1\x99\x9A\x75\x53\x93\x59\xAE\x94\x8A\x86\xB4\x94\x97\x96\x7C\x5A\x33\x75\x06\x5A\x6F\x4F\x10\x4D\xBE\x17\x1F\x9C\x52\x95\xDF\x95\x8E\x9D\x78\x8D\xD6\x9A\x0D\x95\xD8\x9A\xEC\x92\xF1\x9D\x4E\x97\x15\x9F\x75\x9E\xD3\x9E\x89\x61\x11\x9C\xD1\x99\xA1\x98\xC7\x0D\xA3\x98\xE7\x75\x34\x7E\xA6\x98\xFF\x00\x1A\x9C\x67\x9C\x27\x01\x0C\xA2\x05\x5A\x0E\xA2\x76\x0D\x11\xA2\x96\x95\x13\xA2\x1F\x9E\x8F\x9D\xE9\x9E\x86\x9A\xEB\x9E\x87\x9E\x25\x9E\x9F\x99\x8A\x9E\xA1\x99\x11\x9F\xB7\x9C\xF2\x9D\xAE\x9E\x7A\x9A\x60\x9F\x6F\x83\xDC\x9C\x6C\x94\x13\x9C\x39\x9C\x28\x8B\x3B\x9C\x17\x9C\x24\x90\x90\x75\x00\x95\xAA\x9F\x18\x85\x2C\xA2\x04\x5A\x2E\xA2\x43\x16\x30\xA2\xDE\x95\x08\x98\x33\xA2\x15\xA2\x06\x9C\xB5\x98\x08\x9C\xD9\x9A\x5B\x9F\x44\x9E\x5D\x9F\x1E\xA2\x97\x8B\x19\x9F\x0B\x8E\x1A\x95\x88\x04\xE2\x82\x41\xA0\x62\x9C\xB0\x89\x65\x9C\x07\xA1\x2A\xA2\x09\x01\x50\xA2\x03\x5A\x52",
"\xA2\xC7\x17\x54\xA2\x81\x96\xA1\x9A\x52\x9F\x4B\x9C\x2E\x9F\x0A\x9F\x30\x9F\x0C\x9F\x32\x9F\xEF\x9E\xDB\x98\xA7\x9A\x5B\x9D\x1C\xA2\x91\x9E\x5C\x9E\x84\x9B\x5E\x9E\x84\x99\xBC\x9C\xCB\x0D\xCA\x8F\x9D\x8B\x2E\x72\x8E\x9B\x63\x12\x49\x95\x86\x95\xDC\x67\x6E\xA2\x46\x7A\xEA\x4C\xE9\x49\x72\xA2\x07\x98\x74\xA2\x14\xA2\x4F\x91\xBE\x9D\x26\x93\xC0\x9D\x5C\xA2\xC2\x9D\x5C\x9F\xC4\x9D\x82\xA2\xE2\x9D\x84\xA2\xAB\x99\xB5\x5F\xA4\x9C\x88\x9D\x27\x09\x90\xA2\x5C\x58\x70\xA2\x10\xA2\x02\x9C\x81\x9E\x51\x9E\x05\x9C\x19\x9B\x07\x9C\x1B\x9B\xC1\x9D\x1D\x9B\xF3\x9E\x05\x8E\xF5\x9E\x23\x99\x15\x9E\x61\x65\x25\x90\xB4\x74\x09\xA2\xD3\x86\x1E\x62\xA8\xA2\xD3\x0D\xAA\xA2\x19\x0A\x94\xA2\x2D\x98\xB2\x98\x2F\x98\x3D\x9E\x94\x9C\x3F\x9E\x96\x9C\x7E\x9B\x3D\xA2\x5B\x9B\xB5\xA2\xE5\x8E\xB7\xA2\xC6\x9A\x45\x8F\x44\xA2\x02\x8C\x0F\x96\xDF\x9C\x7E\x94\x4B\x90\xB0\x95\x18\x0F\x8D\x87\x4C\x9D\x6D\xA2\x7E\x5A\xC2\xA2\xED\x9F\x4C\x99\x97\x9B\x50\x9D\xAE\x9C\x90\x9D\xB0\x9C\x92\x9D\xB2\x9C\x94\x9D\xF0\x9C\x3B\xA2\x78\x9C\x18\x9D\x7A\x9C\x37\x9F\x7C\x9C\x12\x9E\x9B\x9D\xA0\xA2\x77\x9E\xF7\x9E\x34\x96\xCA\x99\xAB\x87\x0D\xA1\x67\x9D\x39\x96\x17\x03\x04\x9D\x65\x7B\xD7\x95\x9B\x9E\x4F\xA2\xDF\xA2\x92\xA2\x0F\xA2\xC3\xA2\xAC\xA2\x9F\x9E\xAE\xA2\x93\x9C\xBC\x9A\x95\x9C\xBE\x9A\x41\x9E\x7E\x9D\xEE\x97\xD1\x9E\x5B\x99\xF4\xA2\x5F\x9F\xF6\xA2\x43\x81\xC4\x9F\x81\x04\xAF\x99\xF3\x99\xDB\x97\xB2\x99\x01\x9F\x03\x01\xC0\xA2\xCF\x0D\xE0\xA2\xA9\xA0\x96\x9B\x12\x99\xE4\xA2\x0B\x91\xDD\x9B\x9C\x97\xED\x9C\xB6\x47\x33\x9D\x3D\x87\xCB\x9E\xD1\x9C\x35\x9F\xD3\x9C\x8E\x9E\x25\x9A\x40\xA2\x91\x9A\x42\xA2\x41\x99\x4E\x66\xF8\xA2\xFC\x87\x43\x9D\x75\x90\xAE\x9B\x77\x90\x6A\x9D\xD1\x99\x6C\x9D\xD7\x5B\x1D\xA3\x45\x08\x03\xA3\x74\x58\x05\xA3\xE1\xA2\xAA\x9C\x28\x97\xD3\x9D\xA0\x9A\xC6\xA2\x36\x90\x16\xA2\xE4\x95\x18\xA2\x0F\x95\x1A\xA2\xDD\x98\x80\xA2\xD2\x9E\x17\x9F\x30\x9E\xA2\x9C\xAC\x95\x40\x9D\x25\x88\x36\x96\x27\x88\x0E\xA1\xEE\xA1\x03\x9D\x3E\xA3\x05\x9D\xB1\x99\xF5\x99\x40\x96\xED\x8D\xDE\xA2\x54\x5A\x21\xA3\x86\x98\xB6\x89\xAC\x9C\xE1\x97\xE5\xA2\x35\xA2\x11\x9D\x54\x9D\x13\x9D\xED\x9E\x26\x9E\x33\x9F\xDA\x9D\x2F\xA3\x38\x9D\x13\x9F\x73\x9E\x54\xA3\x12\xA3\x5E\x9F\xE1\x98\x3B\x9F\x61\x9F\x61\x65\x5E\x96\x60\x94\xF7\x99\x67\xA3\x09\x5A\x69\xA3\xC4\xA2\x89\x98\x4C\xA3\x14\x8C\xE8\x9E\x06\x9E\xBC\x9B\x56\x9F\x09\x9E\x58\x9F\xF2\x9A\x5A\x9F\x9D\xA2\x5E\xA2\x9F\xA2\x7D\xA3\x5D\x99\xA2\xA2\x5C\x9A\x7A\x9E\x4E\x8F\xA0\x9D\x50\x77\x9A\x9A\xA7\xA2\x44\xA3\x4C\x54\x29\x24\x88\xA3\xD9\x9B\x41\x8C\x4B\xA3\xBB\x9A\x4E\xA3\x03\x96\x50\xA3\xE6\x95\x52\xA3\x3C\x9A\x39\x9F\xAE\x96\x7F\xA3\x03\x99\x62\x9F\xBA\x80\x44\x9A\xA9\x98\x7C\x02\xA1\xA3\x23\x6A\x93\xA2\x07\xA3\xB8\x9B\xC4\x9E\x8C\xA3\x54\x9F\x8E\xA3\x79\xA2\x57\x9F\x7B\xA2\x0F\x9F\x39\x9B\xCD\xA2\x80\x9B\x9E\xA2\xF4\x9E\x13\xA3\x7E\xA3\x35\xA3\xAE\x9A\x58\xA3\xAE\x89\xF9\x9D\x47\xA1\xB4\x9E\xCC\x9D\x39\x7B\xC2\x61\xA0\xA3\x68\xA3\x04\xA3\x2F\xA2\xBB\xA3\x20\x9C\x32\xA2\x04\x9E\x53\x9F\x77\xA2\x55\x9F\xC1\xA3\x90\xA3\xC3\xA3\x93\xA3\xB4\xA2\xC8\xA3\xB6\xA2\xCA\xA3\x98\xA3\xB1\xA3\xA6\x5C\xCF\x96\xB6\xA3\xC2\x08\xB8\xA3\x93\x54\x6C\x4F\x06\xA3\x4C\x98\x75\x9D\x0D\x9D\x77\x9D\x2D\x9F\xF7\x96\xC7\x9E\x86\x9E\x93\x9D\x88\x9E\xE8\x97\xEC\xA2\xF2\x9C\xF1\x9E\x2D\x9C\x79\xA3\x8F\x9E\x7B\xA3\xA7\x99\x97\xA3\x82\x99\x99\xA3\x86\x9B\x62\xA2\x6B\x6A\x98\x9E\xD1\x9B\x96\x59\xFD\x9D\x8E\xA2\xD6\xA3\x86\xA3\xD8\xA3\x53\xA2\xDA\xA3\x12\xA2\x56\xA2\xDD\xA3\x76\xA2\xF8\xA3\x2F\x9F\xFA\xA3\xE9\xA2\xFC\xA3\x76\x9C\xFE\xA3\xC6\x97\x8C\x9E\x98\x9D\x59\x9E\xF2\xA2\x5B\x9E\x06\xA4\x33\x9C\x15\xA3\x4C\x63\x18\x9E\xFE\x9D\x85\xA3\x08\x5A\x87\xA3\x15\xA4\x31\xA2\x17\xA4\x2C\x9F\xDE\xA3\x1A\xA4\x78\xA2\x1C\xA4\x32\x9D\xEA\xA2\x34\x9D\x75\xA3\x28\x9E\x77\xA3\xDC\x9D\x31\xA3\x78\x9A\x33\xA3\xA7\x9B\x29\xA4\x41\x92\x24\x97\x17\x85\xE7\x9D\x1E\xA3\xEF\xA3\xF9\x62\xF1\xA3\x47\xA3\xDB\x99\xC2\x9E\x2A\x9F\x1E\x9E\x18\xA4\x2E\x9D\xE6\xA2\x30\x9D\xE8\xA2\x38\xA4\x1E\xA4\x95\x9D\xF1\x9C\x21\xA4\x29\x9E\x8D\x9E\xCF\xA2\xEB\x90\xD1\xA2\xEC\x9B\x83\x9D\x1A\x92\x1C\x92\x2B\xA1\x88\x64\x4B\x9E\x65\x68\x4D\x9E\x43\xA3\xD7\xA3\x45\xA3\xD9\xA3\xF3\xA3\x76\x9B\x50\xA4\x33",
"\xA4\x19\xA4\x99\xA2\x4F\x93\x9B\xA2\x19\xA2\x5D\xA2\x3F\xA2\x45\x9E\xBA\x9C\x61\xA4\xAB\x6D\x62\x9E\x2C\xA4\x06\x01\x1F\xA3\xCB\x0D\x2F\xA4\x6D\xA4\xC7\x9C\x6F\xA4\xA7\xA3\xD5\x9D\x3B\x8B\xD7\x9D\xE7\x89\x7C\xA2\x1C\x99\x94\xA3\x77\xA4\x5F\xA2\x56\xA3\xD4\x9E\x9B\xA3\xFE\x94\xF1\xA1\x11\x9B\x62\x72\xED\xA3\x7F\xA4\xC7\x0D\x81\xA4\x23\xA3\x2C\x99\x09\xA3\xC8\xA2\x0B\xA3\xCA\xA2\x0D\xA3\xCC\xA2\x00\xA4\x19\x9D\x5D\xA4\x5D\x91\xE8\xA3\x07\xA4\xEA\xA3\xCD\xA3\x0A\xA4\x13\x8F\x64\x9F\x40\x9F\x6F\x70\x16\x93\x01\xA3\x1B\xA1\xB9\x67\x97\xA4\xC6\x0D\x99\xA4\xE2\xA2\x24\xA3\xBD\xA3\xEC\x9A\x8D\xA3\x53\x9D\x08\x9E\x55\x9D\x0A\x9E\x92\xA3\x56\x9E\x28\x85\xCF\x9E\xAB\x96\x8E\xA4\x46\x9E\xB9\xA2\x5F\x74\xA2\xA1\x0D\x73\xAD\x9B\x44\x9B\xB6\x9E\xD2\x78\x8B\xA2\xD5\x78\x05\xA1\x3B\x89\xB2\xA4\x49\xA4\x65\x68\x4B\xA4\x22\xA3\xB6\xA4\x9B\xA4\xF5\xA3\xEC\x9D\x79\x9D\xEE\x9D\x7B\x9D\xC4\xA3\x59\x9B\xC6\xA3\xA3\x9B\x1B\xA2\xAF\xA3\x01\x99\xA8\xA4\x5F\x9E\x3D\x9F\x99\xA0\x71\x71\xFA\x9E\xEF\x59\xD7\x97\x77\x8E\x12\xA1\x70\xA1\xFB\x0D\x71\x9B\x92\x9B\xD2\xA4\x6A\xA4\xA2\xA3\xBA\xA3\x82\xA4\x6C\xA3\x98\x9B\x26\xA3\x2F\x9D\x9B\x9B\x31\x9D\x35\x9B\x2B\xA3\x65\x88\x59\xA4\xB6\x9C\xCE\xA2\xE6\xA3\xD0\xA2\xA6\xA4\x28\xA4\x7A\xA4\xB9\x85\xF2\x9B\x75\x98\xA0\x8E\xC0\x64\x2B\x79\xEE\xA4\xFE\x97\xD0\xA4\x00\x92\xF3\xA4\x12\xA4\x6B\xA4\x14\xA4\xF7\xA4\xE7\x9C\x4A\xA3\x50\x9B\xA1\x9A\x1A\x9A\xEA\x9E\x71\xA3\xEC\x9E\x56\x9D\x74\xA3\x8A\xA4\x59\x9D\x7E\xA2\x7F\x9D\x04\xA4\xE8\x99\x8F\xA4\x3F\x92\xAA\xA4\xA0\x6A\x1B\x9F\xFB\xA2\xF0\x99\xF2\x09\xB7\x93\x0F\xA5\x59\x79\x42\xA3\xB7\xA3\xF4\xA4\xB9\xA3\x46\xA3\xD6\xA4\x48\xA3\x4D\x99\xB8\xA4\xBA\x9B\xBA\xA4\x1D\xA5\xBC\xA4\x72\xA3\x20\xA5\x3A\xA2\xD0\x9C\x8B\x9E\x5B\xA4\x23\xA4\xAD\x9E\x78\xA4\xAF\x9E\x08\xA5\x1C\x98\x67\x9F\x91\x93\x6B\x9F\x79\x0C\xA3\x8E\xFD\x97\x70\x8A\xE6\x93\xF6\x8E\xD0\x5C\xB3\xA4\xE5\x9A\x4A\xA4\xA3\xA3\x30\xA4\x55\xA2\x96\xA2\x57\xA2\x98\xA2\x3E\x9E\x9A\xA2\x40\x9E\xA1\xA4\x0F\xA3\x16\x98\x11\xA3\x05\xA4\x60\xA2\x17\x95\x2A\xA5\x95\x9A\xAC\xA4\x48\x9B\xC5\x15\x65\x98\x6F\x9F\x12\x9C\xF8\x95\x70\x73\xF8\x9B\x95\x8A\xFA\x9B\x1E\x8F\x03\x5C\x45\x0A\xCC\xA0\x33\x95\xBA\x0D\x26\x2D\x04\x2C\x4A\x37\xB4\xA1\xEE\x9F\xFB\xA1\xBD\x9C\xD4\x0D\xAB\x06\x79\xA5\x54\x98\x38\x0C\x57\x2D\x7D\xA5\x31\xA1\x8E\xA0\x5C\xA1\x81\xA5\x93\xA4\xD0\x0D\x91\x06\x85\xA5\x0F\x98\x72\x0C\x86\x14\x71\x24\x0D\x7E\x96\xA1\x8D\xA5\x4C\xA2\xD0\x0D\x1D\x54\x7B\x00\x98\xA5\xFC\xA1\xDA\x6A\x27\x01\xA7\x7A\x9D\xA5\x2C\xA0\x7C\x8F\x02\x01\x7D\x00\x90\x7C\xEA\xA1\xB2\x3E\x76\x2B\x96\xA5\x80\xA5\xA2\xA5\x26\xA0\x9F\xA5\x88\x7A\xAD\xA5\xBA\x7B\xCD\xA1\x09\x01\x7F\x00\xB1\xA5\xB6\xA5\x35\x75\xCC\x0D\x07\x40\x7F\x7A\xE6\xA0\xD0\x0D\x83\x95\xA5\x37\xB7\xA5\x88\x70\x03\x5C\xDA\x5E\x31\x7D\xC0\xA5\x3E\x9C\x81\x98\x4F\x7D\x47\x62\x30\x94\xE5\x98\xFE\x9B\x7A\x60\xDD\x9C\x10\x84\xD7\xA2\x5C\x7E\xBA\x82\xB0\x86\xD5\x94\x54\x85\xB4\x86\x05\x8B\xC8\xA5\xC4\x65\xCA\xA5\x05\x99\xD9\x94\xD4\x86\xD5\xA2\x75\x8F\xD0\xA5\xD9\x86\x18\x05\x5E\x7E\xFD\x94\xF0\x65\x82\xA5\x18\x0F\x40\x9C\x28\xA1\xB9\x67\xDA\xA5\x25\x9B\xD5\x9E\xDF\x82\x86\x7E\x1B\x95\x9F\x7C\x02\x87\xDE\x9E\xD9\x9E\x6A\xA2\x0F\x69\x09\x93\x68\x74\x48\x9E\xCE\xA3\x26\x99\x42\x95\xA8\x0A\x44\x95\x0C\x20\x8A\xA2\xFE\x9E\x51\x64\x8D\xA2\x98\x7C\x1E\x62\xEB\xA5\xD6\x84\x52\x8C\xA5\xA2\x5F\x94\xEA\xA5\xC0\x73\xAC\x7E\xBB\xA1\xBE\x9C\x8D\x95\xE8\x7D\x05\xA6\xC0\x73\x20\xA2\x57\x76\x59\xA3\xD2\x94\xAE\x95\xD9\xA2\x66\x99\x04\xA1\xBB\x9E\xE8\xA4\xC9\xA5\x0C\xA6\xA9\x87\x38\xA3\xCD\x65\x00\x9D\x8A\x95\x18\x93\x60\xA3\x47\x9D\x45\x9F\xF9\x92\x8F\x99\x11\xA5\xC7\x72\x06\xA6\xCA\x8D\x10\x9A\x9D\x9F\x54\x8C\x23\x9D\x28\xA6\xC0\x91\x1C\xA3\x11\xA5\x4E\x73\x8E\x0E\x1F\xA6\xF4\x89\xCE\x95\xE8\x83\x42\x9D\xEA\x83\x5E\xA3\x15\x96\x69\x9D\x27\xA6\xF3\xA5\x97\x9A\x1A\x96\x36\xA6\x7C\x5A\x2D\xA6\xF6\x92\xFC\x91\x3B\xA6\xED\x99\x66\x9D\x3B\xA3\xCE\x99\x3D\xA3\x42\xA6\x1A\xA3\x06\x9D\xFB\x0D\x6E\x9D\xA9\x8A\xD9\xA5\x39\xA6\x10\x9A\x82\xA3\xCA\x8A\x74\x9F\x1E\xA6\xF9\xA5\x69\xA5\xE9\x8C\x42\x67\x75\x88\xD4\x8A\x27\x09\x48\xA6\xB2\x96\xF7\x84\xB5\xA3\xF5\x9F\x6A\x74\x58\xA6\xED\xA5\x0C\xA4\x9F\x8E\xD3\xA3\x54",
"\x80\x6B\x7A\x12\xA6\x84\x5C\xEC\xA3\x69\xA6\xF8\xA5\xD3\x72\x6C\xA6\x6B\xA5\xD2\x99\xFB\x9D\xFB\x0D\x0F\xA4\x04\xA6\x5D\xA6\x77\xA6\x91\xA4\xCA\x9A\xD6\x72\xB2\x9A\x63\xA6\x6A\xA6\x5E\xA6\xB3\xA3\x27\xA2\x34\x9E\x4E\xA0\x65\xA6\x0B\xA4\xF4\x88\xD0\xA3\x56\xA1\x31\x69\x66\xA4\xDB\x6D\x85\xA6\x76\xA6\xC8\x9D\x81\xA6\x70\x89\xCC\x0D\x2C\xA2\x63\x9E\x94\xA6\x2D\x94\x6B\xA6\x97\xA6\xF7\x72\x8E\xA5\xD4\x0D\xDA\x92\x40\xA6\x75\xA6\x9D\xA6\x87\xA6\x05\x94\x79\xA6\x04\x87\xFD\xA1\x46\xA6\xD0\x5C\x8C\xA6\xAB\xA4\x34\x93\xC7\xA1\xCA\xA4\xC7\x0D\x45\x9B\x6D\x9B\xAD\xA4\xB2\x9B\x4A\x9B\xAC\xA6\x72\xA6\x80\xA6\xFA\xA5\x37\x5A\xED\xA0\x65\x9F\x3F\x7B\x32\x0D\xFE\xA5\xDD\x9E\x52\xA6\x63\xA3\x70\x9B\x79\x83\x37\xA6\xAE\xA6\x80\x91\xDE\x82\x2C\xA5\x4E\xA6\xFB\x9E\x21\x8A\x50\xA5\x65\x9F\x10\xA5\x1C\xA6\xA5\xA0\xAD\xA6\x9E\xA6\xBC\xA6\x36\x65\xCC\xA6\xD9\x9E\x76\x90\xC5\x7A\x1F\x9F\x43\xA6\xF5\x95\x4C\x8A\xB9\xA6\x7F\xA6\x96\xA6\xD7\xA6\xCC\x78\x4C\xA5\x0B\xA5\x85\x9F\xCE\x9B\x42\x98\x48\x9D\x3E\x96\xE5\x93\x86\x79\x81\x5C\x6E\x22\xD6\xA6\x5F\xA6\x97\x9E\xA9\xA6\x07\x94\x5A\xA3\x09\x94\x00\x6A\xCE\x8C\x6A\x9F\xB1\xA4\x62\x4D\xB1\x79\x74\xA5\x6F\xA5\xD1\x99\x04\x6A\x05\x90\x01\x01\xD6\x20\xC5\xA5\x3F\x6A\x29\x87\x83\x00\x05\xA7\xD6\x74\x02\xA7\x00\x00\x6C\x56\x09\xA7\x06\xA7\xB3\xA5\xD3\xA6\xAD\xA5\x99\x8A\x03\x01\x85\x00\xA7\xA5\xFB\xA6\xC1\x02\xA4\x2D\x68\x9D\xEF\xA1\xED\x25\xFF\x00\x1A\x0E\xFA\x0D\x86\x00\x88\x94\x00\x00\xEF\x00\xD8\x7E\x17\xA7\x9B\x09\xD5\x56\x15\x93\xFC\xA2\xC6\x7A\x9D\x35\x94\x08\x23\xA7\x85\x6E\xE1\xA1\x6A\x50\x8C\x01\xDF\x7A\x51\x17\x25\x7A\x57\xA5\xD4\xA4\x4F\x2D\xD7\x74\x87\x00\x21\xA7\xC6\x00\x24\xA7\x0D\x94\x26\xA7\x20\x75\x28\xA7\x2E\xA5\x2A\xA7\xE2\xA1\x94\x08\x3B\xA7\x2E\xA7\x38\x50\xED\x25\x32\xA7\x71\x27\x34\xA7\xEB\x8C\xC6\x01\x07\x1C\xD7\x74\x20\xA7\x77\x94\x0C\x90\x3C\xA7\xE8\xA6\x3E\xA7\xAB\x57\x8A\x07\x1A\xA7\xC5\x7A\x41\x3E\x94\x08\xC5\x00\xB7\x6E\x47\xA7\xA4\x2D\x49\xA7\x24\x7A\x83\x7A\x35\xA7\xF7\x02\xC5\x3D\xA1\x07\x38\xA7\x21\xA7\xFF\x91\x79\x94\xC5\x64\x19\xA7\x29\xA7\x5A\xA7\x27\x01\xE9\xA1\x14\x96\xDE\x58\x48\xA7\x72\x7A\x4A\xA7\x62\xA7\x4C\xA7\xB6\x2F\x65\x09\x82\x5F\xD3\xA1\x81\x37\x79\x00\xD5\xA1\xD3\x1B\xD7\xA1\xFA\x0D\x39\xA7\x51\xA7\x00\x00\x89\x73\x6A\xA7\x22\x09\x6C\xA7\x41\xA7\x6E\xA7\x7E\x12\x5D\xA7\x85\x54\x41\x3E\x60\xA7\x44\x67\x4B\xA7\x2D\x9A\x4D\xA7\x89\x17\x7A\xA7\xE8\x0A\x0E\x75\xF9\x08\xCA\x2F\x73\x00\xD4\x7A\x0E\xA7\x7C\x9E\xD4\x0D\xDB\x08\xD2\x36\x9C\xA7\x0A\xA7\x45\xA0\x09\x01\x89\x00\xA1\xA7\xB7\x79\xFF\x59\x07\x40\x70\x7A\x95\x74\x8A\x9C\x06\x01\x8B\x00\xA6\xA7\x37\xA0\x9E\xA7\x27\x01\x8C\x00\x38\x74\xAC\xA7\x03\x01\x8D\x00\x29\xA0\x01\x01\xE9\x79\x6A\x9C\xB3\x3E\xD9\x2E\xB1\xA5\x03\x5C\x20\x06\x5F\x7A\xAF\xA7\xAB\xA7\xCC\x0D\xAF\x06\x8F\x00\xC2\xA7\xA2\xA7\xD0\x0D\x07\x40\x51\x7A\xBC\xA5\xD4\x0D\xBE\xA5\x00\x00\x90\x00\xC7\xA7\x59\x7D\xFF\x59\xDB\x08\x92\x00\xD1\xA7\xA3\xA5\xCC\x0D\x1D\x54\x5F\x49\xD6\xA7\x08\x5A\x03\x5C\xAD\x05\x94\x00\xCC\xA7\x18\x0F\xD0\x8F\xB8\xA7\x00\x00\xC9\x7A\x6D\x5D\x13\x6A\xAB\x5E\x34\x75\x06\x93\x52\x27\xDB\xA1\x04\x01\xDD\xA1\x29\x75\x65\x09\xBE\xA6\x43\x97\x6B\x3A\x03\x5C\x93\x92\x98\x2F\xE3\xA7\xE5\xA7\x07\x5A\x9B\xA7\x9C\x8A\x18\x0F\xAD\x05\x96\x00\xDB\xA7\xA1\xA6\xE7\xA5\x97\x7C\x5C\xA6\xC4\x65\xB8\x7B\x9B\x7C\x8C\xA5\x9D\x7C\x94\x04\x1D\xA1\xAB\xA5\x80\xA0\x42\x94\x96\x59\xF5\x70\xE3\xA7\x05\xA8\xA8\x7C\xC9\xA0\xFF\x00\xCE\xA7\xBA\x4E\xB0\xA7\x18\x0F\x4D\xA0\x36\xA1\x11\xA8\xAF\x7C\xC1\x7C\xC3\xA0\x77\x7D\x2F\xA1\xA6\xA1\x58\xA0\x8A\xA5\xF7\x73\x33\xA1\xFF\x00\x35\xA1\x8F\xA1\xDC\x7A\x46\x7C\xFA\x9F\xC4\x7C\x88\x7D\xBD\x6F\x21\xA8\x5E\xA1\x23\xA8\x6A\xA1\x25\xA8\x43\xA1\xF7\xA5\x06\x01\x1B\xA8\xC0\x7C\x65\x7C\x8A\xA0\xFE\x7B\xFD\xA0\xD0\x6F\x2F\xA8\x6D\xA1\xAD\xA0\xA9\xA1\xBB\x9F\x95\xA0\xE9\xA5\xDC\x67\x37\xA8\xF8\x7C\x1D\xA8\x84\xA1\xE3\x6F\x45\x11\xCF\x9F\x0C\xA8\x17\xA3\x82\xA0\x99\xA1\xBB\xA0\xE4\x7C\xAB\xA1\x3B\x72\x47\x62\x46\xA8\x24\x7D\x48\xA8\xC8\xA4\xEC\x7D\x6A\x0D\xEC\x7C\xAC\xA5\xAF\x7D\xA7\xA1\x5F\xA1\xB5\xA1\x00\x70\x53\xA8\xC7\x72\x56\xA8\x35\x7D\x58\xA8\x08\xA1\xFB\x7C\xDD\x9F\xE5\x73\x3E\xA8\x98\xA1\x4F\xA1\x9A\xA1\x32",
"\x7C\x63\xA8\x7C\x5A\x65\xA8\x1A\x7C\xB5\xA0\xC7\x7D\x4C\xA4\x24\xA8\x07\xA8\x3E\xA1\xC7\x7C\x8B\xA1\x6F\xA8\x8D\xA1\x71\xA8\xD0\x5C\x73\xA8\xE6\x71\x62\xA0\x34\x63\xD3\x7D\x97\xA5\x9D\xA0\x7D\xA1\x41\xA8\xD9\x7D\x43\xA8\xD8\xA5\xB9\x67\x81\xA8\x65\x71\x53\xA0\xCD\x65\x29\x7D\x5D\xA8\x5D\xA1\x3F\xA8\x88\xA8\x60\xA1\x2F\x7D\x7F\xA8\x1E\x62\x8E\xA8\xAA\x7B\x90\xA8\x8E\x68\x18\xA0\x5B\xA1\x1A\xA0\x66\xA0\x3F\xA1\x50\xA8\x7E\xA1\x1F\xA0\x06\x01\x40\x7D\xD3\x67\x27\x09\x9B\xA8\x65\x7D\xBB\xA2\xFB\x0D\xE0\xA0\xB8\xA1\x55\xA8\x3A\x7B\xD7\xA7\x78\x98\x3A\x74\x11\xA6\xB1\xA8\x9D\x7B\x3A\xA8\xE9\xA4\x36\xA0\x56\x88\xCA\xA1\xAC\xA8\xCC\xA1\x82\x95\x6F\x38\xD6\xA7\x13\xA7\x02\x01\x9E\x00\x16\xA7\x4E\xA8\xA5\x55\x8C\x92\x45\x91\x97\x92\xBA\x0E\xFA\x0D\x98\x00\x21\xA7\x0D\x90\x85\x94\x97\xA1\x22\x06\x40\x19\x76\x59\x23\x91\x9A\x17\x5B\xA7\x04\x63\xC3\x20\xD1\xA8\xC7\x0D\xDB\x8F\xFA\x0D\xA4\x00\x21\xA7\x2D\x3A\x53\xA1\x81\xA0\xC8\xA8\xBF\x92\x02\x91\xD7\xA8\x27\x01\xE1\xA8\xD6\x92\x86\x01\xF6\x8A\x72\x0A\xFB\x47\x5D\xA0\x83\x63\x19\x27\xD7\x74\x9F\x00\x21\xA7\x9B\x00\xB6\x0E\x3D\x69\xBA\x0D\xE4\xA8\xB3\x92\x52\x90\xE7\xA8\x09\x01\xF5\xA8\x63\x92\x59\x5A\xBE\x0D\x40\xA7\x73\x97\xDE\x58\xDE\x3F\x4E\xA5\xDC\x55\xC9\xA8\x95\xA4\xEF\xA1\xDE\x3F\xD7\x74\x9C\x00\x21\xA7\x97\x00\xB6\x0E\xDB\xA8\xF8\xA8\x0A\x28\xFA\xA8\xE6\xA8\x40\x19\x94\x08\x0F\xA9\xFF\xA8\x74\xA7\xB2\x3E\xC6\x20\xC6\x9C\x27\x28\x20\x32\xD7\x74\x9A\x00\x21\xA7\x96\x00\x10\xA9\x85\x91\xD3\xA8\x24\x06\x08\xA9\x6D\x93\xC3\x20\x94\x08\x23\xA9\x19\xA9\x81\x7A\x51\x17\x1C\xA9\xC2\x91\x50\x05\xD9\x4B\xD7\x74\x9B\x00\x21\xA7\x3F\x00\x24\xA9\x8E\xA2\x26\xA9\x94\x01\xE5\xA8\xD6\xA8\x16\xA9\x27\x01\x37\xA9\x2D\xA9\xD1\x9F\x79\x54\xCC\x3F\x02\xA9\xEA\x67\x46\x93\x3C\x02\xFA\x0D\xBF\x3F\x27\x7B\x34\x00\x38\xA9\xD0\x8D\x3A\xA9\xD5\xA8\xCA\xA8\x3E\xA9\xE9\x46\xD9\xA8\x9A\x17\x59\x5A\x8D\x0E\x57\x4C\x11\x01\x58\xA7\x15\x96\x42\x4C\x98\x01\xFA\x0D\xA3\x00\x21\xA7\xFB\x00\x53\xA7\xEF\x9F\x41\x52\xF9\xA8\x73\x07\x0A\x90\xFC\xA8\x06\x01\x61\xA9\x41\xA9\x0C\x75\x84\x09\x28\xA9\x67\xA4\xF0\xA3\x37\xA7\xFA\x0D\x10\x3B\x27\x7B\xDF\x00\x62\xA9\x11\x80\x64\xA9\x13\xA9\x66\xA9\xFB\xA8\x52\xA9\x06\x01\x75\xA9\x6B\xA9\xB7\x99\x46\x11\xD4\x3A\xEF\xA8\xA0\x62\xF1\xA8\xFA\x0D\x21\xA9\x83\xA7\xD6\x00\x76\xA9\xA0\x7D\x78\xA9\xD4\xA8\x6E\xA9\x2B\x90\x94\x08\x89\xA9\x7F\xA9\x42\x9F\xE8\x08\xAE\x39\x7A\xA9\xEC\x96\x32\xA9\x02\x03\x5E\xA9\x21\xA7\xC4\x00\x8A\xA9\x5E\xA8\x8C\xA9\x27\xA9\x3C\xA9\x51\xA9\x86\x01\x94\x08\x9C\xA9\x92\xA9\xC7\x0D\x01\xA9\xE2\x58\x63\xA7\xC9\x38\xAD\x1F\xD7\x74\xA1\x00\x21\xA7\xF4\x49\xE2\xA8\x30\xA6\x51\x01\x79\xA9\x21\x75\x7B\xA9\xA3\xA9\xF3\x49\xE9\x93\xC3\x20\x00\xA9\x6D\xA9\xA1\xA9\x43\x97\x01\x36\xD7\x74\x49\x9F\xD8\x5F\xB8\x3E\xAF\xA1\xE3\xA8\xB4\xA9\x45\xA9\x6E\x92\x68\xA9\x03\x01\xC3\xA9\x1A\x93\x55\xA9\x1A\xA9\x44\x67\x30\xA9\xF3\x9B\xF0\x8D\x5F\x82\xEF\xA5\x65\xA2\xF6\x0A\x0C\x0B\xEA\x27\xB5\xA6\x8F\x8A\xD5\x8E\xA2\x58\xD7\x74\x74\x4E\x71\xA6\x37\x35\x9D\xA9\x94\xA8\x9D\x71\x65\xA9\xB5\xA9\x15\xA9\xB7\xA9\x09\x01\xF1\x3E\xF4\x6E\xBA\xA9\xCE\xA9\x36\x7A\xD0\xA9\xB6\x95\xF3\xA7\xFA\x0D\x9D\x00\x21\xA7\xFC\x92\xBE\xA0\x13\x9A\x4F\xA9\x8E\xA9\x81\x90\xC9\xA9\x02\x01\xF4\xA9\xCB\x92\x6B\x00\xBB\xA9\x2F\xA9\x6E\xA9\xEE\x58\x8C\x0C\xFA\x0D\x99\x00\x21\xA7\x25\x47\x11\xA9\xCC\x70\xC6\xA9\xA9\xA9\xE6\xA9\x6B\x00\x94\x08\xD3\x92\x30\x8F\xCD\xA9\x0C\xA5\xF8\x69\x71\x45\x83\x39\x14\xA9\x04\xA2\x98\xA9\xDB\x07\xFA\x0D\xDF\xA7\x83\xA7\xF8\xA7\xAC\xA1\x4E\xA9\x90\x01\x0A\xAA\xE3\xA1\x3D\xA9\xE7\xA9\x06\x01\x1D\xAA\xBA\x6D\xEB\xA9\x2E\xA9\x71\x27\xEE\xA9\x9E\xA3\xAD\x72\x4E\xA7\xFA\x0D\xC1\xA9\x04\x64\x5D\x07\xF7\xA8\x09\xAA\x8D\xA9\xBD\xA9\x29\xA9\xFA\xA9\x5F\xA3\x27\xAA\x11\xAA\x5C\x58\xA8\xA9\x22\xAA\xF8\xA6\x28\x8F\xFA\xA6\xA1\x8F\x15\x0B\x93\x19\xD8\xA9\x6B\x98\xDB\xA9\xF5\x9B\xFF\xA7\x81\xA5\xA9\x78\xA6\x00\xFF\xA1\xED\xA1\x23\x7A\x44\x67\x15\x28\xBE\x17\xFB\xA7\x96\x59\xAD\x05\x87\xA9\x49\xAA\x0D\xA8\xA5\x5B\xC7\xA5\x47\xA4\x02\x01\xF5\xA7\x03\x93\xCF\x92\x47\x93\x9A\xA4\x4B\x9A\x19\xA5\xE9\x9C\x51\x9B\x27\xA3\x31\x99\xFD\xA4\x55\x9B\xFF\xA4\xC2\x89\x7D\x9D\x24\xA5\x10\xA3\x26\xA5\x0C",
"\x9A\x79\xA4\x18\x66\xD4\xA2\xF7\x94\x3F\x9D\x17\xA6\x3A\x9C\x4B\x8F\x2A\x8B\x27\xA2\x29\xA2\xB8\x9D\x01\x01\x5D\xAA\x0D\x93\x5F\xAA\x4A\x92\x61\xAA\xEA\x9A\x3B\xA5\x51\x9D\x3D\xA5\x36\xA2\x1E\xA5\x38\xA2\x73\xA3\x42\xA5\x2D\xA3\x44\xA5\x3D\xA4\x2A\x9E\xA4\xA4\x14\x92\x06\xA5\x9F\x9C\xD3\xA2\xBE\x98\x4D\x8B\x45\xA2\x22\xA2\x3A\x5A\xD3\x94\x49\xA2\xDD\x86\x4B\xA2\xC7\x98\x01\xA8\xE1\x86\x5B\xAA\x7D\xAA\x05\x5E\x71\x93\x49\x91\x66\x9E\xBC\xA3\xE7\x9E\xB9\xA4\xBF\xA3\xBB\xA4\x8F\xA3\xBD\xA4\x91\xA3\xEE\x9E\xDE\xA4\xA1\x9B\xE0\xA4\x43\x9E\x8D\xA4\x96\xA3\x67\xA5\x3F\x95\xF2\xA6\xFD\x86\x64\xA2\x92\x07\x66\xA2\xE8\x98\xF2\xA5\xC4\xA6\xF5\x62\xDD\xA7\x27\x01\x56\xAA\xD0\xA1\x45\x9A\xF5\x64\x82\x28\xEC\x10\x50\xA9\x26\x28\x80\xAA\x28\xA7\xF5\xA5\x3D\x69\x34\x76\x7E\xAA\xEC\x93\xCB\xAA\x8D\xA0\xC1\x9E\xD1\x9D\x8C\x9D\x06\x9F\x97\xA2\x0B\x95\xA9\xA3\x4A\x97\xAB\xA3\x05\x96\xAD\xA3\x0A\x9B\xE3\xA4\xA9\x99\x08\xA4\x0D\x96\xE4\xA6\x90\x5E\xDD\x75\x84\x9C\x05\x6B\x87\x9C\x33\xA6\xCE\x8F\xB5\xA7\xD2\xA5\x68\xA4\xA2\xAA\x98\x93\x75\x53\x86\x90\x82\xAA\x91\x9C\x9C\xA4\x83\x9E\x35\xA4\xE0\xA3\x37\xA4\xFE\xA4\x39\xA4\x2C\xA3\x3B\xA4\xCC\x9E\xEE\xA2\xCE\x9E\x02\xA4\x32\xA3\x48\xA5\x41\xA2\x43\xA4\xDC\x75\x09\xA6\x2E\x9A\x27\x01\xD0\xAA\x8A\x91\xA4\xAA\xA4\xA3\xAD\x9C\xFA\xA4\x53\xA4\xFC\xA4\x55\xA4\xFA\xAA\x57\xA4\xEB\xA2\x43\xA5\x3C\xA2\xA2\xA4\xEF\xA2\xC2\xA4\xE2\x96\x41\xA4\xB3\x9D\x05\xAB\x02\x6B\xAD\xA8\xFF\x00\x46\x99\xED\xA3\x0A\xAB\xC8\x91\xED\x93\xA5\xAA\x29\x9F\xBB\x9D\xF5\xAA\xC5\x9E\xF7\xAA\xC0\xA3\xF9\xAA\x69\xAA\xFB\xAA\x00\xA5\x20\xA4\x02\xA5\xC7\xA3\x95\xA3\xC9\xA3\x27\xA4\x93\xAA\xC2\x5B\x14\xA6\xB6\x82\xE0\xA5\xE1\x9C\xB0\x9A\x1B\xA6\xB0\xA4\xEF\x8E\x27\x09\x24\xAB\x32\x94\xF1\xAA\x9A\x93\x28\xAB\xEA\x9D\xD9\xA4\x52\x9E\xED\x9D\x54\x9E\xEF\x9D\xC0\xA4\x90\x8B\x1A\xAB\x1D\x97\x1C\xAB\xF4\x9D\xCC\xA3\xE6\xA4\xEB\x99\xF6\xA6\x39\xA8\x0F\x69\x23\xA6\xD4\x74\xDB\xA6\x15\x96\x8C\x99\xBF\xAA\xCE\x90\x2A\xA6\x11\xA7\x46\x98\x42\xAB\xA3\xAA\x26\xAB\x0D\xAB\x6D\xA3\x0F\xAB\x6F\xA3\x91\x9D\x37\xA2\xFB\xA3\x39\xA2\x89\x9E\x16\xAB\xED\xA2\xB2\xAA\xF2\x9E\x04\xA5\x5E\xA4\x92\xAA\x5F\x9D\x1E\xAB\x19\x95\x4E\xA8\xF3\x95\xDE\xA6\xD8\x87\x35\xA6\x62\xAB\xE2\x9E\x09\x01\x43\xAB\x26\x92\xD2\xAA\x27\xAB\x6C\x9C\x50\x9F\x93\x86\x75\xA2\x52\xA4\x6A\xAB\xE7\xA2\x6C\xAB\x1D\xA4\x6E\xAB\xFD\xA3\x70\xAB\xFF\xA3\x63\xA5\x37\x98\x65\xA5\x27\xA5\xC5\xA4\x18\x9F\x88\xA6\x16\xA6\x3E\x9F\x3C\xA6\x39\xA3\x3E\xA6\x2D\xA5\x03\xA9\xF1\x99\x51\xA6\x6B\x9D\x1B\xA3\x96\x59\x4B\x9D\x27\x8A\x64\xAB\xF0\xAA\x18\xAA\x08\x92\x17\xA5\x87\xAB\xE7\x86\x89\xAB\x20\x9E\x2C\xAB\xAB\xAA\xE1\xA3\xAD\xAA\xE3\xA3\x4E\xAB\xBD\x8E\x50\xAB\x8F\x9A\x52\xAB\x3A\x9F\x54\xAB\x85\xA2\x71\x90\x57\x86\xC9\x7F\x8A\x9B\x39\xAA\xF8\x90\x61\xA3\xFF\xA2\xA9\x8C\x38\x7B\x8A\x8D\x82\xAB\x70\x92\x8B\x91\xAC\xAB\xD6\xAA\x51\x9F\xD8\xAA\x85\x96\x59\xA2\xD7\x9A\x5B\xA2\x75\xA4\x8C\xA4\xE2\xA4\xBA\xAB\xB0\xA3\xBC\xAB\xA3\xA2\x84\x9D\x88\x6C\xCA\x8C\xF1\x95\xA8\xAB\xCE\x92\x47\xA9\xE2\x92\xF3\xAA\xF4\xA3\x63\xAA\x0E\x9D\x6C\x9A\xFB\xA4\xDE\x9B\x68\xAA\x9D\x9B\x6A\xAA\xB5\x9C\x97\x9D\xF4\x86\x27\x7E\xF8\x9C\x5F\xA4\xFA\x9C\x98\xAB\x9F\x9D\x2C\x9A\x2C\xAA\xC8\xAB\x65\xAB\x84\xAB\x67\xAB\xF9\xA4\x11\x97\x66\xAA\x53\x9B\xEA\xAB\xE0\x9B\xEC\xAB\x96\x9D\x80\x93\x46\xA5\x14\x9F\xE0\xAA\xC5\x99\xE3\x9D\xC7\x99\x9F\xA6\x6A\x67\x6A\x73\x18\x85\xC9\xAB\x1C\x93\xCB\xAB\xE3\xAB\x6E\xA4\xD7\xAA\x5D\xA5\xD9\xAA\xD1\xAB\x17\xA2\xD3\xAB\x51\xA3\x76\xA4\xD6\xAB\x03\xAB\x34\xA3\x78\xAB\x49\xA6\xC9\x9D\xBB\xA7\xBD\x72\x6F\xA6\x64\x9A\x81\xAB\xF9\xAB\xE1\xAB\xD3\xAA\x74\x9D\x13\xAC\xCE\xAB\x15\xAC\xD0\xAB\xB0\xA2\x5A\xA2\xB2\xA2\x9C\xA2\xE5\xA3\x35\xAB\xE7\xA3\x37\xAB\x77\xAB\xC2\x5B\x74\xA6\x6C\xA2\x92\x92\x27\xAC\x99\x93\xAB\xAB\x12\xAC\x83\xA4\x14\xAC\x51\xA4\xB0\xAB\x72\xA4\x4F\x9C\x74\xA4\x1A\xAC\xD5\xAB\x53\xA3\x07\xAC\xAC\x9A\xE5\xA4\xBD\xAB\x62\xA4\xEB\x8A\x25\x98\x98\x9A\x46\xA9\x9F\xA3\x09\xAB\x3C\xAC\x45\xAB\x3E\xAC\xD7\xA4\x62\xAA\x2B\x9F\x85\xA4\xF7\xA3\x44\xAC\xCE\x9C\x46\xAC\xAC\xA3\x1B\xAC\x49\xAC\xD7\xAB\xE4\xA4\xD9\xAB\x9A\xA3\xE4\xAA\x94\x96\xB1\x9A\xC1\x80\xF8\xAB\xA9\xAB\xE6\x79\x57\xAC\x39\xA5\xE3",
"\xA2\x84\xAA\x6E\xA3\x86\xAA\x70\xA3\x3F\xA5\x1F\xA5\xBE\xA4\xAF\xAA\xE4\xA3\x71\x9E\x90\xAA\xF0\x92\x76\xAB\x9D\x9D\xC6\xA4\xC3\x72\xCB\x9A\xED\x81\x7C\xAA\x00\x00\x0F\xAC\xC2\x93\x11\xAC\x58\xAC\x83\xAA\xA8\xAA\x3C\xA5\xAA\xAA\x3E\xA5\xAC\xAA\x40\xA5\x77\xAC\x21\xA5\xB0\xAA\xC2\x9B\x72\xAB\x01\xA4\x3F\xA4\xF8\x9A\x1D\xAC\x42\xA4\x4A\xA5\xE3\x72\xF4\xA6\x27\x6C\x92\xA6\x7D\xA4\x03\x01\x85\xAC\xCB\x0D\xC3\x93\x4D\xA4\xD5\xAA\xE6\x9E\x2A\xAB\xBE\xA3\xDF\xA3\x2D\xAB\x88\xA4\xBB\x8C\x22\xA5\xAC\x9D\x18\xAB\x00\xAB\x96\xAC\x2F\x9C\x6F\xAA\x58\x9A\xB6\xAA\x64\x95\x0B\xAC\xEB\x8D\x56\x85\xDE\xAB\x54\xAC\x6C\xAC\x5E\x51\x46\xAB\x86\xAB\xCD\xAB\x88\xAB\xCF\xAB\x48\x97\xDA\xAA\xA4\x9A\xDC\xAA\x4C\x97\x6D\xAA\x64\xA5\xB3\xAC\x21\x9B\x28\xA5\x61\xA2\x99\xAB\x3D\x9C\x53\xAA\xD9\x92\x0E\x8E\xBE\x98\xDF\xAB\x5E\xAA\x28\xAC\x85\xAB\x4F\x9F\xC0\xAC\xAE\xAB\xC2\xAC\xB3\x98\x17\xAC\x4F\xA3\x19\xAC\x60\xAC\x48\xAC\xAE\xA3\x63\xAC\xE1\xAA\x4C\xAC\xDA\xAB\x4E\xAC\x84\x9F\x91\x97\xDD\xA2\x3B\xAC\xBC\xAC\x15\x33\x60\xAA\x88\xAC\xF4\xAA\x49\xAB\xAF\xA2\x53\x9E\x1A\x9B\x55\x9E\x70\x9E\xC1\xA4\x01\xAB\x40\xA4\x98\xAC\x1D\xAB\x9A\xAC\x30\x73\xB1\xA6\x4D\xA5\xBC\x85\x6C\x0A\xBE\x85\x01\xA6\x8F\x9B\xFF\x00\xB6\x97\x9C\x9E\x47\x62\xA1\xAC\xDC\xA8\x87\xAC\x6F\xAC\xB7\xA4\x8A\xAC\x85\xAA\x8C\xAC\x87\xAA\x75\xAC\x89\xAA\x41\xA5\x6F\xAB\x8C\xAA\x17\xAB\x93\xAB\xFD\x98\x95\xAB\x70\xAA\x49\xA5\x47\x9E\x8F\x69\x4E\xAA\xFE\x74\x6B\x9B\xC3\xA6\xA3\xAB\x53\xA6\xFF\x00\xF1\xA4\xB7\x97\xB9\x67\x09\xAD\x75\x7A\x0B\xAD\xA4\xAC\x01\x9E\xD9\xAC\x08\x8A\xDB\xAC\x15\x90\xF3\xAC\xB1\xA2\xF5\xAC\xB3\xA2\x7A\xAC\x74\xAB\xA5\xA4\x36\xAC\x7E\xAC\xF4\xAB\xC7\xA4\xD4\x63\x3F\x98\xC1\xAB\x7B\x84\xF8\x69\x0E\xA5\xCE\xA4\x0E\x86\x40\xAB\x85\x9F\xD4\xAC\x7F\xAA\xD6\xAC\xFB\xAB\x25\xA3\xFD\xAB\xE8\xAB\x28\xA3\x00\xAC\xEE\x9C\x30\xAB\x6B\xAA\xF0\x9E\x18\xAD\x3B\x99\x1A\xAD\xB4\xAC\xCC\xAC\x68\xA5\xCE\xAC\x1C\x8A\xCB\x9B\x9F\xAB\x1D\x9F\xFA\x09\x21\x98\xB8\x93\x23\xAD\xC5\xA6\xFB\x0D\xBD\x93\x27\xAD\xDC\x67\x29\xAD\x31\xA9\x6D\xAC\x28\x92\xCC\xAB\xA6\xAC\xF1\xAC\x0A\xA3\xC4\xAC\xBD\x9A\xC6\xAC\xA6\x9A\xDE\xAA\x7F\xA2\x4A\xAC\x61\x9B\x65\xAC\x09\xA4\x5A\xAD\xBD\xA6\x5C\xAD\xCD\xA6\x71\xA5\x8A\x25\x44\x9F\x7C\xAB\x0D\xA4\x47\x9F\x60\x86\x14\x96\x47\xAD\xD1\xAA\x49\xAD\x5A\xA5\x73\xA2\x8A\xA3\xAF\xAB\x34\xA2\x73\xAC\x6B\xAB\x88\xAA\x6D\xAB\x8A\xAA\x15\xAD\xFD\xAA\x2E\xA3\xFF\xAA\x36\x9F\xB8\xAB\x38\x9F\xE3\xAC\x08\xAC\xE2\xAA\x0A\xAC\x67\xAC\x3A\x97\x9C\xAC\x7A\x6A\x6E\xA5\x6C\x98\x01\x88\x0B\x8C\x22\x09\x73\xA5\x80\x6F\x11\x94\xFC\x9B\x10\xA6\xCC\xA5\x47\x62\x9B\x92\x44\xAB\xAA\xAB\x6B\xAD\x3F\xAC\xF8\xA4\x4B\xAD\x2F\x99\xFE\xAB\xEC\x9C\x4F\xAD\x2A\xA3\x51\xAD\xED\xAB\x04\xAC\xEF\xAB\xB2\x85\x17\x7F\xA1\xA2\xE5\xAC\xA8\x95\xDC\xA5\xCD\xA5\x97\xAA\x9A\xAB\x23\xA2\x9A\xAA\x78\xAA\xD4\xA5\x68\xAC\xD6\xA5\x2C\x8F\x83\xAC\xAE\xAD\x83\xAB\x88\xAD\x6C\xAD\x4F\xA4\x41\xAC\x70\xA4\x8A\xAB\x8E\xAD\x8C\xAB\x90\xAD\x8E\xAB\x92\xAD\x90\xAB\x16\xAD\x71\xAB\xAF\xAC\x97\xAD\xF8\xAC\x97\xAC\xC4\xA4\x71\xAA\xB3\x5F\x3A\xAB\xF8\x94\x47\xA2\x51\x8B\x9B\xAA\x54\x8B\x92\xA4\x9E\xAA\x57\x8B\xC9\x98\xA1\xAA\x9A\x92\x55\xAC\xB0\xAD\xEE\xAC\x0C\xAD\xD8\xA4\xE5\xAB\xF6\xA3\x34\xA4\x5D\xAC\xC9\x9E\x5F\xAC\xDD\xAA\x61\xAC\xE2\xAC\xFA\xAC\x53\xAB\x1F\xAC\x63\xA2\x42\xAA\x86\x7E\xF1\xA5\x68\xA2\xF8\x89\xCD\xAA\x42\x91\x27\x01\xCF\xAD\xCA\xAB\x0C\xAB\x89\xAD\x95\xA2\x8B\xAD\x30\xAD\x4D\xA3\xDD\xAC\xAA\xA3\xDF\xAC\xFD\xAD\xE1\xAC\xDF\xAA\x9A\xAD\x4B\xAC\x78\xAD\xE3\xAA\xB8\xAA\x82\x9C\x5C\x58\x88\xA2\x45\x95\xCC\x8F\xEA\xAA\xA8\x5A\x03\xA6\xEE\xAA\xF1\xAD\xEC\xAC\xD9\x4B\x4A\xAD\x71\xAC\x69\xAB\xD7\xAD\x54\xA4\x8D\xAB\x56\xA4\x8F\xAB\x1F\xA4\x91\xAB\x5A\xA4\x8E\xAA\x5C\xA4\x37\xAD\x91\xAA\x39\xAD\xC6\x9D\xFC\xAC\x06\xAB\x0B\xA7\x08\xAA\xD0\x5C\x0C\xAE\x10\xAC\x0E\xAE\xD2\xAD\x29\xAB\x6E\xAD\x9D\xA4\x70\xAD\x0C\xA3\x72\xAD\x08\x9B\xC8\xAC\x94\xAB\xCA\xAC\xE0\x9D\xB5\xAC\x78\x96\x9E\xAD\x7B\x9E\xED\xAD\xBC\xA2\xBF\x9C\x0A\xA2\x40\xAE\xF2\xAD\x6A\xAD\xF4\xAD\x2C\xAD\x1C\x9E\x2E\xAD\xAD\x8B\x5B\xAC\xF9\xAD\x5F\xA5\x73\xA4\x61\xA5\x0D\x9E\xDF\xAD\x30\xA3\x7B\xAC\x58\x93\x7D\xAC\x3B\xAE\x72\xAA\x95\xAA\x01\x8C\x74\xAA\x03",
"\x8C\xE8\xAD\x05\x8C\x3D\xAB\x81\x95\x09\x8C\x7F\xAB\x24\x9F\xDC\x67\x41\xAE\x86\xAC\x43\xAE\xB2\xAD\x18\xA5\x5A\xAC\x1A\xA5\x8A\xA3\x1C\xA5\x11\xAD\x8E\xAC\x76\xAC\xAE\xAA\x91\xAC\x79\xAC\xF7\xAC\xB1\xAC\x3A\x9D\xE3\xAD\x1C\xAD\x7F\xAC\xBE\xAB\xEC\x99\x5E\x72\xB5\x93\x41\xA6\x17\x84\x24\xAE\x50\xAC\x34\x8C\x90\x99\x58\xAE\x29\xAE\xF2\xAA\xEF\xAC\xE4\xAB\x7E\xAE\x64\xAA\x1B\xA5\xEB\x9C\x19\x01\x9D\x97\xE2\xA3\xFC\xAD\xC7\xAC\x74\xAD\x25\xA5\x76\xAD\x0E\x9C\x1C\xAE\x9D\xAD\x1E\xAE\xF3\x6B\x42\xA9\xF2\x95\x19\xA3\x62\xAD\xDF\x9E\x26\x9D\x33\xA5\x28\xAE\xE0\xAB\x3D\xAC\xB1\xAD\x9B\xAE\x2B\xAC\xC1\xAC\x2D\xAC\xC3\xAC\x14\xAE\xDB\xAA\x16\xAE\xA5\xAE\xFE\xAD\x19\xAE\x00\xAE\xBB\xAB\x02\xAE\x3B\xAB\x8F\xAE\x9D\x7F\x9E\xAB\x7D\xAD\x29\xA7\x5E\xAB\xB1\xAE\x60\xAB\xD4\x99\xB4\xAE\x79\xAE\xA2\xAC\x2B\xAD\xD4\xAA\x2D\xAD\x6D\xAD\xF7\xAD\xDA\xA4\xA8\x9D\xDC\xA4\xAA\x9D\xAD\xAC\x34\x9F\x96\xAD\x67\xAE\x38\xAE\x7C\xAC\x3A\xAE\x93\x9E\xC6\xAE\xE7\xAD\x57\xAB\xC0\xAB\x3F\xA6\xD9\x76\xEB\xA6\xB7\xA6\x6D\x9D\x65\xA3\xBA\xAC\x7D\x19\x59\xAE\xBD\xAC\x6E\xAC\x5C\xAE\x04\x9F\x5E\xAE\x2C\x95\x42\xAC\x8D\xAD\x10\xAD\x74\xAC\x83\xAE\x13\xAD\x90\xAC\x8B\xAA\x94\xAD\x8D\xAA\xDF\xAE\x78\xA3\x89\xAE\xD0\x9E\x4E\xAE\x13\x9E\x97\xAB\x57\xA3\xAC\xAE\x89\x5F\x5A\xA6\x87\x9D\x53\xAC\xF0\xAE\x99\xAE\xBE\xAC\xD8\xAC\xD7\xAE\x9D\xAE\xE6\xAB\xEA\x9C\xB6\xAD\xA1\xAE\x29\xA3\x8C\x46\x02\xAC\x01\xA5\xEE\xAB\xD4\x88\xF0\xAB\x5D\x9D\x6A\xAE\xE4\xAE\x3C\xAE\xF6\x77\x9D\xA3\x44\x67\x27\xAE\xD2\xAE\x0A\xAD\x7B\xAE\xB9\xAE\x40\xAC\x2C\xAC\xF8\xAE\x58\xA2\x2F\xAC\xD2\xAB\x31\xAC\xD4\xAB\x33\xAC\xB4\xAA\x36\xAB\x50\xAE\x21\x97\x0A\xAF\xBA\x61\x68\xA6\x3A\xAC\xB5\x20\xF1\xAE\xED\xAC\x81\xAA\x2B\xAF\xB3\xAD\x2C\xAE\x4C\xAD\x10\xAB\xE9\xAB\x12\xAB\x2F\xAB\x14\xAB\x3A\xA4\xDD\xAE\x76\xA3\x02\xAF\x3E\xA4\x68\xAE\xA4\x95\x21\xAF\xF6\x9E\x23\xAF\x2E\xA6\x21\xAC\x3D\xA0\x6F\x70\x24\xAC\xD5\xA3\x0B\xAE\x3E\xAF\x2A\xAE\x0F\xAE\xC5\xA2\x65\x8C\x4A\xAB\xDB\xA4\x4C\xAB\xDD\xA4\x87\xAE\x4F\xAB\xE1\xAD\xB2\xAC\xA8\xAE\x5A\x9C\xAA\xAE\xBD\x67\xBC\xA1\xC5\x72\xF0\xAD\x28\xAF\x2A\xAD\x2A\xAF\xF5\xAD\x59\xAC\x84\xA4\x7F\xAE\xA8\xA3\xBE\xAE\xC5\xAC\xC0\xAE\x73\xAD\xC2\xAE\x75\xAD\x1A\xAE\x77\xAD\xE5\xAE\xCA\xA6\x8F\xA6\x75\xA1\x95\xAE\x0E\xA4\xC2\x91\x8A\x8D\x6F\xAF\x69\xAD\xF2\xAE\xB8\xAE\x72\xAF\x89\xAC\xA7\xAC\xA9\xAA\xA9\xAC\xB2\xAB\x2E\xAB\xEB\xAB\xBA\xAD\x03\xAC\xEB\x97\x05\xAC\x7A\xA3\x68\xAF\xD9\x9C\x6A\xAF\x2D\x80\x69\xAC\xF9\x84\x86\xAF\x5B\xAF\x9A\xAE\x8B\xAF\xF0\xAC\xD8\xAE\x60\xAF\xDA\xAE\x62\xAF\xDC\xAE\x92\xAC\xE4\x9B\x94\xAC\xA3\xA4\xE1\xAE\x69\xAE\xE3\xAE\x52\xAF\x1D\xAD\x4D\x77\x81\xAC\xD1\xA4\xCE\xAD\x9F\xAF\x11\xAF\x87\x98\x7D\xAE\x74\xAF\x9E\xAE\x80\xAE\xA0\xAE\x70\x00\xA2\xAE\xB4\xAB\xA4\xAE\x7A\xAF\x18\xAE\x7C\xAF\xC4\xAE\xD8\xAB\x7F\xAF\x6A\xA5\x81\xAF\xA0\xA1\x91\xA6\xCE\x8D\x35\xA7\x9E\xAF\x10\xAF\xF3\xAE\xD5\xAE\x5D\xAE\x13\xAF\xB9\xAF\x15\xAF\x65\xAA\x4D\xAD\x67\xAA\x47\xAF\x92\xAF\x49\xAF\xFC\xAA\x4B\xAF\x3C\xA4\x4D\xAF\x8F\xAA\xAC\xAF\x50\xAF\xAE\xAF\xB8\xA2\x3B\xAD\x80\xAC\x99\xA6\x63\x78\xEF\xAE\x06\x01\x87\xAF\x97\xA9\x5A\xAE\x40\xAF\xA1\xAF\x9C\xAE\xD3\xAF\xF8\xAD\x71\xA4\x62\xAE\x45\xAC\x64\xAE\xA9\x9E\x66\xAE\x03\xAF\x4F\xAF\x50\x97\x51\xAF\xE3\xAF\x09\xAF\x7A\xAD\x39\x84\xD0\xAC\xFB\x0D\xA3\xA6\x5D\x07\x18\x85\xEA\xAF\x17\xAA\xEC\xAF\xE2\xAB\x41\xAF\xB8\xAF\xD4\xAD\x60\xAE\xF2\xAF\xC9\xA2\x60\xA5\xCB\xA2\x65\xAE\x54\xAD\x59\x99\x56\xAD\xCB\xAC\x08\xAF\x90\xA4\x52\xAE\xB7\x88\xC8\xAF\xC5\xA1\x45\x73\xAF\xA4\x06\xA1\x07\xAD\xC4\x65\x05\xB0\x52\xAC\x56\xAC\x8A\xAF\xF4\xAE\x05\x98\x0A\xB0\x2D\xAF\xD5\xAD\x43\xAC\xF3\xAF\x5E\xAC\xF5\xAF\x10\x9F\xF7\xAF\x4E\xAF\xE0\xAF\xFA\xAF\xE2\xAF\xD2\xA2\x53\xAF\x1A\x9F\x1F\xAD\x3F\xAD\xB4\xA6\x31\xA5\xBA\x9E\x45\xAD\xA5\xAD\x1E\x62\x21\xB0\xCA\xAA\xD1\xAD\x7C\xAE\xAD\xAB\x2F\xAD\xBC\xAE\xDC\xAC\x30\xAF\x18\xAC\x32\xAF\x47\xAC\x34\xAF\x1C\xAC\x8B\xAE\x04\xAB\x35\xB0\x2C\x86\xFE\xAC\xE7\xA6\x75\x8E\xEC\xA4\x6C\x9B\x3A\xB0\x7B\x8E\x3C\xB0\x2B\x9B\x20\xB0\xB5\xAF\xCF\xAF\x2A\xAC\x2C\xAF\xBB\xAE\x2E\xAF\x5E\xA5\x0E\xB0\x63\xAE\x10\xB0\xF6\xAF\x12\xB0\x56\x9C\x06\xAF\xF3\xA2\x33\xB0\x60\xA4\xB0\xAF\xB1\x9E\x0A\xA5\xBF\xA6\x5D",
"\x8C\x41\xAD\x0B\x86\x43\xAD\xEB\x81\x11\xA5\x0E\x69\x3F\xB0\xD7\x77\x41\xB0\x09\xB0\x43\xB0\x5F\xAE\x75\xAF\x86\xA4\xB7\x8C\xAB\xAC\xF9\x93\xDC\xAF\xFE\xAA\xAA\xAF\x19\xAB\x66\xAF\x8A\xAE\xB5\xAA\x58\xAD\xB7\xAA\xFE\xAF\xE5\xA6\x57\xAB\xEA\xA4\x29\xA7\xDD\xA6\x5F\xAB\x44\xA6\xD0\x8E\xD1\xAE\x5B\xB0\x24\xB0\xD0\xAF\xF5\xAE\xD2\xAF\x0B\xB0\x7D\xB0\x5C\xAC\x2B\xB0\xFB\xAD\x2D\xB0\xC5\xA3\x2F\xB0\xDF\xAF\x34\xAC\x05\xA5\x6A\xB0\xF3\xAB\xFD\xAF\xE7\xA4\x4B\x66\x3E\xAD\x3F\xA6\x41\x98\xD0\xA6\xB6\xA6\xFF\x9E\xD2\x9B\x84\xAD\x02\x9D\x78\xAE\x95\xB0\x5B\xAE\x97\xB0\x26\xB0\x7B\xB0\xF7\xAE\x29\xB0\xF9\xAE\x8F\xAF\x8D\xAC\xB3\xAB\x8F\xAC\x85\xAE\xFF\xAE\x82\xB0\x95\xAD\x84\xB0\xB0\xAC\xF9\xAF\xDF\x98\xFB\xAF\x34\xB0\x6C\xB0\xA5\x79\x26\x9B\x22\xAC\xC6\xA1\xE6\xA6\x3F\xAA\x0B\x94\x41\xAA\x54\xA7\x6C\x9F\x94\x8A\xA8\xAD\x75\xA5\xFA\x90\xAA\xAD\xD7\xA5\xF0\xAD\xB5\x2C\x25\xAB\xFA\xAB\x5D\xAF\x89\xA3\x5F\xAF\xF2\xAC\x4B\xAB\xF4\xAC\x4D\xAB\xF6\xAC\x65\xAF\x04\xAF\xC3\xA4\x88\xB0\x16\xB0\x1F\xA2\x73\xAA\x71\x83\xC6\xAD\x99\xAA\x4A\x8F\xA4\x98\x79\xAA\x4C\x90\x18\x0F\x7B\xAA\x18\x85\xDC\xB0\xAF\xAD\x07\xB0\x29\xAC\xA6\xAA\xDB\xA3\x32\xA4\x0C\xB0\xD6\xAD\xFA\xAE\x8F\xAD\x12\xAD\x91\xAD\x14\xAD\xDC\xAD\x00\xAF\x17\xAD\x4C\xAE\x19\xAD\x68\xB0\x26\xA4\x37\xAF\x2C\x7E\xED\xB0\x86\x87\xEF\xB0\x0C\x69\xFA\x94\x8C\x75\xFC\x94\xAD\xAE\xBF\x82\x4D\xA2\x89\xA1\xF7\xB0\xB4\xB0\xED\xAF\x25\xB0\xAB\x9C\x27\xB0\x5F\xB0\xBA\xB0\x2F\xAF\x32\xAD\x30\xAC\x34\xAD\x32\xAC\x36\xAD\xA3\xB0\x75\xAB\xA5\xB0\x6D\x89\x61\x9D\x8B\xB0\xE5\xAA\xBA\xAA\xAA\x07\xBC\xAA\x61\x9C\xEE\xA4\x31\x72\x55\xAA\xC6\xA8\x20\xAE\xEC\x5F\x4C\x30\x4D\x28\x14\x31\x20\x01\xC9\xAA\x78\xB0\xB7\xAE\x7A\xA9\x09\xAE\x09\x9D\x27\x09\xF8\xB0\xD0\xAD\x3F\xB1\x1C\xB1\xB6\xB0\x1E\xB1\xB8\xB0\x21\x9C\x60\xB0\x16\xAC\x47\xB0\xDE\xAC\x49\xB0\xE0\xAC\x4B\xB0\x62\xAC\xC4\xAF\x64\xAC\xC6\xAF\xE3\x8B\x83\x9C\x9B\x8B\x85\x9C\x89\xA2\x26\x87\x94\xAE\x63\x69\x26\xAE\xA6\xA2\x7A\x4D\x1B\xB1\x08\xB0\xEE\xAF\xBA\xAE\xDA\xAC\x45\xB0\x31\xAD\xE3\xB0\x33\xAD\xE5\xB0\x35\xAD\x88\xAE\xC6\xB0\xC3\x99\x2A\xB1\x08\x82\xE2\x8B\xBA\x72\x27\x99\xB1\xA9\xE8\xAF\xA0\x19\x62\xB1\xFB\xB0\x47\xAB\x50\x9E\x46\xAE\xF6\xAA\xFA\xAD\x31\x9F\xC0\xAF\x4B\xAE\xA6\xAE\x6E\xAA\x98\xAF\x5D\x9E\xC1\xAD\x79\xAD\xBA\xA2\x0E\xA6\x68\x87\xBD\xA2\xD4\x59\x7C\x5A\x44\xB1\x0D\xAE\x66\xAB\xDF\xB0\xA5\xA3\x3F\x85\x6F\xAD\x77\xAF\x71\xAD\x79\xAF\x81\xB1\x7B\xAF\xA7\xAE\x7D\xAF\xA9\xAE\x94\xAA\xC3\xAD\x45\x90\xC5\xAD\xC1\x98\x76\xAA\xB8\x82\x73\xAE\xD5\xA5\x75\xAE\x58\xB0\x93\xA9\x47\x62\x8E\xB1\x42\xAE\x90\xB1\x44\xAE\x48\xAB\xA3\xAF\xE2\xB0\x61\xAF\xE4\xB0\x63\xAF\xB6\xAB\xE1\x8E\x98\xAD\xF1\xA2\x14\xB0\x4F\xAE\x89\xB0\xB6\xAC\x18\xB0\xC5\x90\xC8\xAE\xD0\x95\xFA\xA2\xCB\xAE\x41\xA7\xCD\xAE\x3F\xA3\xA4\xAB\x07\x9D\x97\xAE\x1E\x62\xAA\xB1\x7A\xAE\xAC\xB1\x42\xB0\xF6\xAE\x4B\xB1\x21\xB1\x61\xB0\x9E\xA4\x0F\xB0\xA0\xA4\x11\xB0\x09\xB1\x55\xAD\x0B\xB1\xBF\xAD\xF5\xA2\x4F\xB0\x43\x99\x77\xA9\x3E\x54\x7B\xAB\x91\xB0\xDF\xA6\xD0\x0D\x27\x9D\xA7\xAB\x61\xB1\xCE\xAF\x96\xB0\x5D\xB0\x42\xAF\x0E\xAD\x72\xAC\x01\xB1\xD8\xAD\x03\xB1\xDA\xAD\x05\xB1\x33\xAE\xDD\xAD\x92\xAB\xD5\xB1\x13\xB0\xD7\xB1\x2D\x85\x2B\xB1\xB5\x9D\x8E\xAE\x57\xAB\xC7\x90\x91\xAE\x50\xA6\x93\xAE\x81\xAD\x21\x9F\xA5\xAB\xB4\xAE\xC9\xB1\xD3\xAE\x71\xAF\x1D\xB1\x49\xA3\x14\xAF\xF1\xAF\x00\xB1\xBC\xB0\x82\xAE\xBE\xB0\x84\xAE\xB5\xAB\xE6\xB0\xB7\xAB\x86\xB0\x05\xAF\x84\xB1\x83\xA2\x86\xB1\x1D\xAE\x2D\xB1\x7E\x60\x64\x9D\xF4\x90\x4D\xA6\xDA\xA6\x3C\xA3\x26\xA6\xFE\xB1\xDF\xB1\x7D\xAB\x64\xA3\xD0\x7F\x8A\x8D\x03\xB2\x29\xAF\xCB\xB1\x7A\xB0\xCD\xB1\xDC\xA3\xCF\xB1\x4D\xB1\x23\xB1\x31\xAF\x25\xB1\x33\xAF\x27\xB1\x35\xAF\x35\xAC\x0D\xB1\xA8\x97\x39\xAF\x26\x99\x0C\xAF\x45\x0A\x25\xB2\x78\xB1\xD7\xAC\xB7\xAF\x4A\xB1\x2B\xB2\xFF\xB0\x2A\xB0\x62\xB0\xF4\xAF\x64\xB0\x2E\xB0\x66\xB0\xD5\x9C\xF5\xB1\x6C\x89\x71\xB1\x2D\x80\x25\xAF\x6C\x7B\x60\xB1\xDC\x18\x3C\xB2\x2B\xAE\xE9\xB1\x2D\xAE\xEB\xB1\x2F\xAE\xD9\xAD\x31\xAE\xDB\xAD\xF0\xB1\x07\xB1\xDE\xAD\x47\xB2\xF6\x9C\x49\xB2\x43\x8F\xF7\xB1\x79\x9E\xBC\xB1\x3F\x91\x3B\xAF\x83\xAC\x26\xB2\x70\xAF\x28\xB2\x64\xB1\x5E\xB0\x66\xB1\x4C\xB1\x2E\xAC\x2E\xB2\x48",
"\xB0\x30\xB2\x4A\xB0\x32\xB2\x4C\xB0\xEA\xB0\xE4\xAD\xE4\xAF\xE3\xA6\x1B\x92\x4F\xAC\xD2\xA3\xB5\x96\xBC\x88\xCC\x8D\x43\xB1\x51\xB2\x91\xB1\x0E\xAB\x44\xAF\x8B\xAB\x56\xB2\xED\xB1\x58\xB2\xEF\xB1\x58\xA4\x32\xAB\x1D\xAF\x95\x90\x1F\xAF\x81\x9D\x76\xB2\x40\x5E\x39\xAC\x66\xB2\x80\xB2\xAD\xB1\x7B\xB1\xAF\xB1\x94\xB1\x4E\xB1\x15\xAE\x50\xB1\x17\xAE\x52\xB1\xFF\xAD\x4D\xB0\x1E\xAC\xDA\xB1\xAF\xA6\xCC\xB0\x56\xAF\xEC\xAE\x7C\xA6\x85\xAF\x66\xA3\x06\x01\x67\xB2\x88\xAF\x3F\xAF\x63\xB1\x06\xB2\x3A\xA5\x53\xB2\x83\xB2\x2E\xAE\x11\xAB\x30\xAE\x13\xAB\x32\xAE\x89\xB2\x34\xAE\x33\xAB\xE1\xA4\x53\xB1\x9E\xB2\x99\xAC\xCA\xB0\xF1\x62\x2B\xA4\x10\xA4\xE4\xB1\xB6\xAE\x23\xB0\xB5\xB0\xE7\xB1\x1F\xB1\x6C\xB2\x2C\xB2\x6E\xB2\x69\xB1\x24\xB1\x6B\xB1\x26\xB1\x6D\xB1\x31\xB0\xC7\xB0\x70\xB1\xD1\x86\x9B\xAF\x45\xA4\xAC\x8D\x1A\xB1\xE5\xB1\xC4\xB2\xFC\xB0\x16\xA4\x5C\xA5\x6D\xB2\xBD\xAE\x98\xB2\xBF\xAE\x9A\xB2\xC1\xAE\xC2\xAF\x9A\xB1\x54\xB1\xE4\xAC\x9A\xAF\x8E\xA6\xA2\xB2\x24\xA1\x65\xA4\xCB\xAF\x02\x81\x0E\xAF\xA8\xB2\x93\xB2\xCC\xB1\x99\xB0\x28\xB0\x41\xB2\xBB\xB0\xB1\xAB\xBD\xB0\x91\xAF\x01\xAC\x93\xAF\x1C\xAF\xBC\xAD\x1E\xAF\xBE\xAD\xF6\xB1\x4B\xB2\x15\x85\xE6\xAF\xEC\x8D\x76\xB1\xA2\x92\xD7\xB2\x47\xB1\xC5\xB2\x3F\xB2\xFE\xB0\x9B\xB0\x61\xAE\x43\xB2\x2C\xB0\x45\xB2\xA0\xB0\x5D\xB2\xB0\x9D\x5F\xB2\x05\x97\x61\xB2\x3C\x9F\x20\x9D\x17\xA8\x96\x59\x02\xB0\x0A\xAE\x50\xB2\x05\xB3\xAC\xB2\x48\xB1\x07\xB2\xF0\xAF\xD9\xAE\xD6\x9D\xDB\xAE\xD8\x9D\x5B\xB2\xF2\xB1\x82\xB1\xC9\xAC\x14\xB2\xC0\xAD\xE6\xB2\x8A\x8A\xA0\xAD\x79\x8C\xE9\xAC\xE3\xB1\x1B\xB3\xC2\xB2\xF3\xAD\x06\xB3\xD9\xB2\x31\xA4\xDB\xB2\xC8\xB2\xDD\xB2\x6F\xB2\x4F\xB1\x71\xB2\x51\xB1\x73\xB2\xBA\xB2\x75\xB2\x8C\xAE\x77\xB2\x6D\xB0\x49\xA8\x67\x9B\xAE\xB0\x69\x9B\xB3\xA6\xCC\xA4\xD4\x89\x03\xAD\xEF\xA4\x05\xAD\x02\xB2\xEF\xB2\x29\xB2\xF1\xB2\x20\xB1\xF3\xB2\x22\xB1\xCA\xB2\x2F\xB2\xCC\xB2\x31\xB2\xCE\xB2\x28\xB1\x38\xAD\x35\xB2\xF4\x97\x63\xB2\xB6\x81\x37\xB0\x3F\xA6\x21\xAD\xD9\x97\x21\xB2\x82\xAD\xF0\xA4\x4E\xB3\x1C\xB3\x79\xB1\xBF\xAC\x51\xB3\xC7\xB2\x53\xB3\xD0\xB1\x48\xAE\x9F\xA4\x4A\xAE\x0E\xA3\xF3\xB1\x67\xB0\x29\xB3\xD9\xB1\xBD\xB2\x4B\xA5\x8D\xB0\xB2\xA6\x86\x86\xA1\x8E\xFD\x9E\xEB\xAE\xAF\xB0\x93\x93\x75\xB0\x8D\xB1\x4F\xB3\x6A\xB2\xE8\xB1\x8D\xAF\x8B\xAC\x0B\xB2\xFB\xAE\x0D\xB2\xFD\xAE\xC0\xB0\x93\xAD\xC2\xB0\x01\xAF\xC4\xB0\xE0\xAD\xE8\xB0\x1B\xAB\xE4\xB2\x9B\xAD\x16\xB2\xAB\xAE\x18\xB2\x56\x86\xCF\xB0\x46\xB3\x13\xA1\x5C\xAB\x1E\x9F\xB0\x9B\x7E\xB3\xB9\x9E\x26\x98\x76\xAE\x82\xAC\x7F\xB2\x68\xB3\x3D\xB2\x6B\xA3\xC6\xB2\x44\xB0\xDC\xB2\x46\xB0\x3A\xB3\x99\xB2\x3C\xB3\x9B\xB2\x3E\xB3\x9D\xB2\x40\xB3\x4E\xB0\x77\xB3\x4C\x63\xD9\xA6\x24\xA6\x3D\xB0\x5B\x86\xCF\x9B\xFF\xB1\x46\x9F\xFB\x0D\x48\x9F\x8C\xA7\xA9\xB1\x83\xB3\xAD\xB2\x70\xAC\xAF\xB2\xB5\xAD\xD6\xAF\xFF\xAB\xD8\xAF\xF8\xB2\xDA\xAF\x31\xAB\xB7\xB2\x8B\xB2\xED\x94\x8D\xB2\xB2\x9D\x01\xAE\xA0\xB2\x80\xAF\xE8\xB2\x64\xA4\xB6\x8A\x79\xB3\xD1\xA9\x58\x8E\xA4\xAD\x59\xB0\x1A\x8F\x6D\x9F\xFE\xA6\xA3\xAD\x48\xAA\xD2\xA7\xA3\xA7\x2F\x60\x57\xAA\x66\x94\xA1\x70\x09\x01\xA8\x00\xE5\xB3\x9D\xA7\xE1\xA7\x0A\x93\xB0\xA8\xC4\x65\x0F\xAA\x45\xB1\xC3\xB2\xE5\xA9\xC7\xA7\x3A\x72\xA9\x00\xEA\xB3\x77\x98\xE7\xB3\xB2\x40\xF7\xB3\xB7\xA5\xA9\x78\x6A\x57\x7A\x98\x5B\x81\x9E\x10\x85\x33\x5A\xA9\x04\xA9\x4F\x33\x17\xB1\x08\xA2\x56\xAE\xBE\xA2\x47\x62\x08\x93\xBE\x93\x59\xA7\xDE\x3F\x52\xB2\x86\xB3\x0F\xAD\x88\xB3\x02\xB1\xFC\xAE\x04\xB1\xFE\xAE\x8D\xB3\xA8\xAF\x2B\x9C\x90\xB3\xE0\xAE\x5A\xB3\x39\xAE\x5C\xB3\xBD\x98\x9E\xB1\xF5\x64\x37\x9C\x70\xAE\xC2\x98\x48\xA2\xC9\xAD\x4A\xA2\x16\x89\xD7\x94\xAB\xAD\xC0\x9C\x0A\xB4\xC0\xB3\x0A\xA9\x4F\x33\x0F\xB4\x7C\xB1\x2B\xAB\x7E\xB1\x7A\xA2\x80\xB1\x72\xB3\x27\xB3\x4D\xAE\x75\xB3\x14\xA3\x39\xAB\x0F\xB1\x25\x8B\xA1\xB1\xA2\x98\xC8\xAD\xFC\x71\xE3\xA5\x16\xB1\x07\xA2\xC8\x98\xA0\xAA\xD3\xAC\x52\x53\x46\xA7\x8D\xA7\x0E\xB4\x81\xB2\x68\xAB\xB0\xB2\x55\xB2\xB2\xB2\x57\xB2\xB4\xB2\x59\xB2\xB6\xB2\xF1\xB1\x35\xAE\xDE\xAF\x37\xAE\x1C\xB4\xE2\xAE\x1E\xB4\x0F\x9A\xED\xA5\xFE\x86\xD5\xA9\x1C\x95\x32\xB1\x8B\xA2\x34\xB1\x27\x01\xF3\xA8\x21\xA0\xAE\x97\xD2\x08\xE6\x31\x24\x4C\x16\xAA\x5E\xAD\xA1\x58\xF1\x58\x41\xB1\xC5",
"\xAA\xB9\x67\x0B\xB4\x54\xA5\x4A\xB4\x2F\xB4\x4C\xB4\xFC\xAB\xC6\xB3\x45\xAF\x4E\xAD\xC9\xB3\x50\xAD\xCB\xB3\x52\xAD\x7D\xA2\x37\xB4\x0A\xB1\x39\xB4\xCB\xA3\x56\xB1\x73\xB1\xFC\xA5\xBB\x0B\xFE\xA5\x46\x95\x4B\xB3\x31\x72\x33\x72\x84\xA3\x0F\x58\x2D\xB4\x0D\xB4\x75\xB4\x94\xB2\xAD\xA2\x31\xB4\xA8\xAC\xF5\xB2\x0C\xB2\xF7\xB2\x7C\xB4\xB5\xB2\x15\xAB\x55\xB4\xB8\xB2\xB3\xAA\x74\xB2\x36\xAF\xBA\xB1\x51\xAE\x37\xB2\xC3\x8B\x3E\xAE\x9F\xAC\x5C\x0A\x8F\xB4\x5B\xA9\x4B\xB4\x92\xB4\x08\xA3\x94\xB4\x8E\xAF\x96\xB4\x89\xB3\x98\xB4\xB9\xAD\x7D\xB4\xBB\xAD\x95\xAF\xBD\xAD\x3C\x8A\xD8\xB1\x3A\xB4\xB5\xB3\xDB\xA5\x3E\x9C\x22\xAB\x1B\x9C\x9A\x0A\xA8\xB4\x04\xB4\x63\x4C\x30\xB4\x96\xB2\x47\xAE\x95\xB1\x49\xAE\x97\xB1\x36\xB4\x99\xB1\x83\xB1\x9B\xB1\x69\xAF\x9D\xB1\xAC\xAD\x21\xB4\xCE\xA5\x29\x8C\x63\x99\xE0\x9C\x19\xA6\xE2\x9C\xA6\xB1\x1E\xB0\x07\x88\x09\x01\x72\xB4\x47\x98\x8C\x4E\xB2\x55\x34\xB3\x7A\xB1\x93\xB4\xC4\xB4\x7D\xB1\x9D\xB0\x7F\xB1\x9F\xB0\xDF\xA4\xA1\xB0\x58\xB4\x33\xB2\xA4\xB0\x5B\xB4\x93\x9A\xA3\xB4\xD2\xB4\x21\xA6\x73\x90\xD1\x95\xC1\xB1\xA0\xAB\xFD\xA2\xC4\xAB\x6F\x8A\x50\x7F\xA3\xB3\x2C\x65\x2C\xB4\x49\xB4\x13\x6F\x5C\xA9\xA7\xB3\x2A\x8A\x85\xB3\xAD\xB4\x87\xB3\xAF\xB4\x13\xB4\x8A\xB3\x15\xB4\x8C\xB3\x06\xB1\x8E\xB3\x08\xB1\x80\xB4\xD6\xB1\x82\xB4\xE9\xA3\x2B\xB3\x2F\xA6\x7A\xAB\xB0\xAE\xC4\xB1\x24\xAD\xE2\xB1\x72\x9B\xA7\xB4\xFC\xB4\x2E\xB4\xC2\xB4\x76\xB4\xB4\xAD\xDC\x9B\xC7\xB3\xB7\xAD\x7B\xB4\xB2\xB4\x9A\xB4\x4A\xAF\x18\xB4\x6C\xAA\x0C\xB5\xF4\xB1\x0E\xB5\xA7\xA4\x10\xB5\xED\xA5\x4B\xA6\xFB\xB1\x3F\xAD\xEA\xAE\x5D\xB1\x49\x9D\x45\xA6\xF9\xB4\x12\xA5\xDC\x67\xDB\xB4\x4A\x9F\x90\xB4\x1B\xB5\xAB\xB4\xA7\xAA\x10\xB4\xEA\xB1\x12\xB4\xEC\xB1\x14\xB4\xEE\xB1\x16\xB4\x09\xB5\x25\xB5\x53\xAD\x73\xB3\x48\xB2\x29\xB5\x07\xA5\xBA\xB4\x75\x8C\xBF\xAB\x26\x88\x58\x6C\x5D\xAD\x09\xA9\x1F\xB2\x6D\x98\xD1\xA6\x9A\x72\x24\xB2\xA7\xB2\x03\x01\x37\xB5\x71\xA7\xD3\x8D\xA0\xAF\xC3\xB3\x0D\xAD\x3D\xB5\x54\xB2\x3F\xB5\x85\xB2\x41\xB5\x87\xB2\x43\xB5\x5A\xB2\x0A\xB5\x5C\xB2\x47\xB5\x5E\xB2\x49\xB5\x38\xAB\x4B\xB5\xC8\x8C\x85\x9D\x52\x88\x57\xB5\x18\xB5\x09\x5A\x14\x93\x69\xB3\x12\xAF\xD3\xAD\xF2\xB2\x0A\xB3\x0D\xB0\xD1\xB1\x63\xB0\xD3\xB1\x65\xB0\x69\xB5\x11\xB3\x6B\xB5\x37\xAC\x6D\xB5\x19\x78\x4D\xB2\x4F\xAA\xED\xB2\x58\xB5\xC0\xB4\x5B\xB5\xB6\xAF\xA8\xB3\x08\xB3\x37\xB3\x6D\xB3\x2D\xB2\x55\xB3\x70\xB2\x57\xB3\x72\xB2\x59\xB3\xEA\xB4\x29\xB1\xEC\xB4\xDF\x9A\x5E\xB3\x0E\x68\x65\xB2\x18\x85\x59\xB5\xB2\xB0\xC1\xB4\x59\x4E\xFF\xB4\x50\x8A\x01\xB5\xE2\xB4\x32\xB4\xE4\xB4\x34\xB4\xE6\xB4\xB1\xAA\xE8\xB4\x96\xAF\x03\xA4\x81\xB5\x3A\xAD\xA7\xB0\x5E\xA6\x63\xA4\xD1\xA3\x94\x69\x58\xAF\xCE\x9D\x48\xB4\x73\xB5\xDD\xB4\x5C\xB5\x1E\xB3\xAE\xB2\x5F\xB5\x4E\xB4\x61\xB5\x50\xB4\x86\xB2\x52\xB4\x88\xB2\x9B\xB4\x25\xB3\x56\xB4\x1A\xB4\xF8\xAF\xCF\xB2\x6F\xB1\x98\xB5\x6B\x77\x91\xB2\x9D\xB5\x89\xB5\x6D\xB4\x8B\xB5\x00\xB5\xA9\xB3\x7C\xB0\xBA\xAF\x76\xAF\xDE\xB2\x78\xAF\xE0\xB2\xC1\xAF\x9C\xB2\xC3\xAE\xBB\xB2\xFB\xAC\x83\xB5\x20\xAC\x49\x9E\x63\x86\x72\x62\xA6\xB2\x03\xB3\xBF\xB4\x19\xB5\x39\xB5\xA1\xB5\xC3\xB4\x08\xB2\x21\xB3\x87\xA4\x23\xB3\x89\xA4\x45\xB5\x7F\xB4\xCA\xB4\x28\xB3\xCC\xB4\x99\xAF\x84\xB4\xCB\x72\xBF\xB2\x8D\xB4\x88\xB5\xE7\xB5\xA9\xB4\x91\xB4\xF0\xB2\x77\xB5\x52\xB3\x79\xB5\x0A\xB2\x04\xB5\x40\xB5\x06\xB5\x42\xB5\x08\xB5\x66\xB5\xF0\xB5\x8B\xA4\xDB\xB5\xC3\xAF\xDD\xB5\xD2\xB3\xDF\xB5\xB2\x72\xB2\xAF\x35\xB5\xCE\xB5\xFB\xB5\xA0\xB5\x6E\x4E\x75\xB5\x3E\xB2\x2A\xB2\x09\xB3\xD5\xB5\x7E\xB0\xF9\x8D\x80\xB0\x6C\x96\x09\xB6\x23\xA5\x27\xB5\x74\xB3\xF4\xB5\x85\xB1\x2B\xB5\x0B\xAC\x6D\xA6\x1E\x92\xEB\xB2\x37\x85\x4F\xB2\x8E\xB4\x14\xB6\x8A\xB5\x5C\xB0\x35\xB3\x5B\xA5\x11\xAE\x67\xB1\x13\xAE\xD7\xB5\x96\xB1\xD9\xB5\x98\xB1\xE2\xB2\xCB\xB4\x94\xB3\x1B\xAE\xF6\xB5\x56\x97\x01\xB3\xB9\xAC\xAE\xAE\x27\x09\x9E\xB5\x25\xA6\xFC\xB5\x3A\xB5\xFE\xB5\x45\xAE\xA5\xB5\x95\xB4\x33\xB4\xC2\xA3\x35\xB4\x62\xA5\x7F\xB5\xDE\x9D\xB8\xB1\x07\xAF\x8F\xB2\x17\xB0\xEE\xB4\x10\x72\x00\xB0\xFF\x00\x19\xB3\x42\xB1\xB7\xB5\xD5\x9B\xFD\xB4\xAA\xB4\x48\xB6\xAE\xB1\xEB\xB5\xA4\xAF\x22\xB3\xA6\xAF\x24\xB3\x67\xB5\x26\xB3\xF2\xB5\x38\xB4\x24\xB6\x15\xB2\x26\xB6\x9A\xB5\xCC\x72\x57",
"\x89\x89\x86\xD4\x0D\x71\x98\xF2\xA4\x36\xB5\xCF\xB5\xDA\xB3\xBA\xB5\x07\xB3\x19\xB6\x8E\xB5\x01\xB6\x42\xB2\x7B\xB5\x44\xB2\x7D\xB5\x46\xB2\x50\xB6\x11\x9E\x52\xB6\x69\xB0\xCB\xB5\xCB\x95\x0B\xAC\xF1\xA7\x6C\xA5\xB4\x9E\x5C\x58\x39\xB0\x73\xB0\xC1\x85\x81\xB3\xD0\x5C\x44\xB6\x9D\xB3\x2F\xB6\xE6\xB1\x31\xB6\x8A\xAD\xE1\xB0\x97\xB2\xAD\xB3\xDF\xB2\xAF\xB3\xE1\xB2\x0B\xB6\xE3\xB2\x0D\xB6\xC5\xAE\xD3\xB3\x43\x8A\x60\xB3\x50\xB5\xAD\x04\xDB\x9E\xE3\x85\x66\x93\xA0\xB3\x04\xAD\x26\xAD\x1F\xB0\x71\xB4\x76\xB6\xFE\xB4\xEA\xB5\x20\xB3\x63\xB6\xED\xB5\x65\xB6\xEF\xB5\x64\xAF\x11\xB2\x92\xB3\x51\xAB\x3C\xB6\x7E\xAF\xA2\xB6\x88\x9B\x7C\xAD\x1D\xB2\xCB\x0D\xFC\x9E\xF9\xA0\xF7\xB4\x2F\x79\xB4\xAE\x92\xB6\x1E\xB2\x46\xB6\xE9\xB5\x1C\xB5\x43\xAF\x78\xB4\x84\xB2\xC0\xB5\x63\xB5\xC2\xB5\x65\xB5\x54\xB4\xC5\xB5\x9D\xB4\x73\xAB\x59\xB4\xAD\xAF\x86\xB6\xA1\x9C\x56\xB6\x65\x9B\x9A\xB3\x8A\xB6\x3E\xA0\x03\xB4\x5F\xAD\xAC\x16\x8E\xB6\xD4\x0D\x65\xAD\xAD\xB6\x75\xB6\x2E\xB6\xD0\xB5\x30\xB6\xE0\xB4\xAC\xB4\x4A\xB6\xAE\xB4\x4C\xB6\xA3\xAE\xA9\xB5\x93\xAC\xAB\xB5\xB6\xB4\xC0\x8E\xB8\xB4\x83\xB4\xBD\xB6\xAB\x9B\xDD\xB6\x7A\xA6\x7C\x8B\xB9\xB3\x7F\xAD\xBB\xB3\x64\xB3\x00\xB2\x83\xAD\x46\x98\x38\xB5\xE7\xB6\xB8\xB5\x38\x50\x5F\xB6\x50\xB3\xFF\xB5\x6C\xB3\x7C\xB6\xF4\xB2\xEF\xB6\xBF\xAF\xF1\xB6\xA9\xAF\xF3\xB6\xFC\xB2\xB7\xB4\xFE\xB2\xD2\xB2\xE7\xB2\x55\xAF\xE9\xB2\xD7\xB3\x3D\xAD\x30\x7B\x40\xAD\x40\xAA\x5F\x8C\xC8\x92\x08\xA8\x69\x98\xD5\xB0\x10\x94\xD7\xB0\x70\xA5\x3E\x9C\xAD\x05\xF2\xA9\xBF\xA8\x9A\xA5\xED\xB3\xC4\xAA\x47\x62\xFC\xA9\x2E\xA4\x6E\x55\x6E\xA9\x14\xA1\xFF\x59\xAB\x06\x26\x94\xFB\xB3\x37\xB7\x7F\x98\x8B\x7E\xAE\x00\x45\x94\xB9\x79\x52\x5A\x21\xA7\x7A\x5D\x50\x7B\x0B\xB1\x32\x00\xDB\xA8\xED\x6B\xD7\x74\xB0\x00\x21\xA7\x16\x00\x1C\x7A\xCF\x8B\x49\xB7\xEC\x5B\x98\x94\x01\x06\x62\x74\xAA\x66\x9C\x94\x67\x5B\xFB\x8A\x6C\x89\xA9\x94\xED\x05\x2D\x6B\xC2\xA7\xC3\xA8\x01\x01\x3B\xB7\xB7\x79\x74\x94\x8B\x5B\x3F\xB7\x4A\xB7\x94\x08\x42\xB7\x44\xB7\x51\xB7\xFA\x0D\x47\xB7\x83\xA7\x4C\xB7\x24\x94\xD5\x07\xE0\x5C\x4E\xB7\x61\x74\xA8\x09\x45\xB7\xFF\x59\xFD\x0D\xAD\x00\x54\xB7\x60\xB2\x56\xB7\x58\x01\x58\xB7\x38\xB7\xAE\xA5\xF9\xB3\x03\x01\xB2\x00\x7F\x9F\xFF\x59\x69\x9C\xB1\x00\x79\xB7\x06\xB4\xB1\x95\x34\xB5\xFA\x0D\xFB\xA0\x2F\x6A\x2D\x1F\xF2\xB4\xC0\xB6\xC7\x0D\xF7\xA0\x31\x23\xCE\xAE\xB8\xB3\x8C\x7C\x15\xA1\x80\x12\xEC\xA7\xDB\x0F\xEE\xA7\x1A\x75\xE8\xA7\x3D\xA7\x00\x87\x8D\x6F\x31\xA8\x3F\x24\x44\xA0\xF4\x70\x46\xA0\xEE\xB3\xB9\x67\xF4\xA1\xE6\xA7\x50\xAA\x14\x6A\x31\x72\x19\xA8\x28\xA8\x02\x01\xA3\xB7\xF9\xA7\xEF\xA7\xEA\x02\x9D\xA8\x0F\x69\x9B\x9F\x4D\xA8\xAE\xAE\x7C\xA1\xA8\xA1\x97\xA8\xA1\x9F\x99\xA8\x47\x62\xAB\xB7\xAB\x5C\xAD\xB7\x9F\x08\x75\xA8\x2C\xA8\x3C\xA1\x93\xA8\xA2\xA8\x7B\xA8\xA4\xA8\x89\xA8\x96\x59\x34\xA8\xA5\xA6\x03\x01\xBA\xB7\x05\x5A\xD4\x7A\x92\x7D\xFF\x7B\x3D\xA8\x86\xA8\xB9\xA0\x9C\xB7\x97\x2C\x4C\xB3\x78\xA0\x35\xA8\xC9\xB7\x96\xB7\xEB\xA1\x79\xA7\x9D\x7D\x4B\xA8\xD3\xAA\x32\xA8\x79\xA8\x7B\xA1\xA3\xA8\x6E\xA8\x51\xA8\x96\x59\x86\xA0\xD6\xB7\xAA\xB7\xD8\xB7\xE7\xA7\xDA\xB7\x1E\xA8\x5B\xA8\x4C\xA8\xA0\xA8\x81\xA0\x1D\x7D\x7D\xA8\xFF\x00\x72\xA1\xA9\xB7\x01\x01\xCA\xB7\xA8\xA5\xA5\xB7\x2D\x09\x29\x7C\x6A\xA8\x2B\x7C\x6C\xA8\xB4\xB7\x60\xA8\xA2\x7C\x7F\xA1\xB8\xB7\xC4\x65\xF6\xB7\xEC\xA9\x2D\xAA\x94\xA7\x2B\xA8\x63\x59\xA8\xA0\x4B\xA1\x8F\xA0\xE0\xB7\xC3\xB7\xE2\xB7\xA5\xA8\xCC\x7D\x02\xB8\xA2\xB7\xE8\xB7\xF8\xB7\xEA\xB7\x44\xB3\xC3\x7C\x63\x59\x85\xA8\xC1\xB7\xAB\xA0\xE1\xB7\x6E\xA1\xC5\xB7\xA5\x5B\x03\xA0\x36\xA1\x04\xB8\x29\xAA\xE9\xB7\xAE\xB7\x2D\xA1\x91\xA8\x57\x7C\xD0\xB7\xD7\xA0\xD2\xB7\xB6\x24\x25\xA8\xCB\xA0\x4E\xA0\x23\xB8\x3C\xAA\xBC\xB7\x5A\x71\xEB\xB7\x00\x69\x9F\xA8\x8B\xA5\xA1\xA8\x1C\xB8\x0E\xB8\x1E\xB8\xB6\xB7\x6D\x7C\xDB\xA0\xA1\xB7\xDC\x67\x31\xB8\x6C\xA9\x97\xB7\xB9\x8A\x20\xAB\xAF\xA8\x2D\xB7\x03\xB8\x14\xB8\x36\x7A\x07\x1C\xB3\xA8\x72\xB6\x12\xB8\x41\xB8\x4A\xB8\x06\xB8\xEC\xA1\x51\xB0\xBE\xA8\x34\xA0\xB0\x97\x0D\x2C\xC8\xA1\x20\xAB\x07\x08\x17\xA1\x9C\xA6\x03\x01\x03\xA2\x0C\xB4\x5B\xA9\xED\x25\x4E\xA5\x06\xAE\x2C\xB8\x4E\x1B\x9E\xB7\x7B\xB7\x02\x01\x69\x7D\x04\x64\x27\x09\x5F\xB8\x73\xB4\xFD\xB4\x62",
"\xB8\xA7\xB7\x4F\xB8\x6C\xB8\xAF\xB6\xED\x25\xAF\xB7\x35\x05\xB1\xB7\xEE\xB7\xB2\xA9\x4F\xA8\x0F\xB8\x1F\xB8\x34\xA1\x72\xB8\x27\x01\x6D\xB8\xDC\xB4\x5E\xA7\x9D\x35\x83\xA8\x5D\x63\x64\xA0\x1B\xB8\x7A\xA8\x7B\xB8\x3C\xB8\x61\xA8\xD4\x0D\xC7\xB7\x96\xA0\x73\xB8\xE8\xB6\x42\xA7\x30\xA7\x41\x09\xB5\x9F\xCE\xB7\x37\x71\xFD\xB7\x1D\xB8\x40\xA8\x3D\xB8\x18\x0F\xD5\xB7\xC8\xB7\x02\x01\x81\xB8\x04\xB7\x72\xA7\xA4\x2D\x04\x74\x5A\xA1\x38\xB8\xEF\xB7\xC6\x9F\x10\xB8\xA4\x7D\x7F\xB8\x09\x01\xA0\xB8\x5A\xB5\x70\x37\xA3\xB8\x27\xB8\x8E\x68\x5C\xA8\xB2\xB7\x63\xA9\x30\xA8\x7F\xA5\x19\xA0\x03\x5C\xF3\xB7\xE6\xB7\x01\x01\xAD\xB8\x9F\xB5\x78\xA7\xE2\xA1\xFA\xB7\x78\xA1\x6B\xA8\x2A\xB8\x5F\xA8\x65\xB8\x76\xA0\x70\xA8\x8B\xA8\xB5\x7D\x1E\x62\xBD\xB8\x45\xB6\xA2\xB8\x84\xB8\x08\xB8\xCF\x61\x0A\xB8\xB3\xA1\x0B\xA8\xA0\xA8\x03\x5C\x8E\xA1\xBB\xB8\xBF\x7A\x74\xB8\xB0\xB8\xBE\xB7\x19\xB8\x95\xA1\x88\xB8\x0D\xB8\x8A\xB8\x9A\xB8\x8C\xB8\x8A\xA8\x70\x7D\xD8\xB8\xCC\xB8\x93\xB6\xAF\xB8\xCF\xB8\x35\xB8\x28\xB8\x0B\xA0\xC4\xB8\x22\xA8\xB7\xB8\xD5\xB8\xFF\x59\x2F\xB8\x36\xA1\xE7\xB8\xC8\xB6\xCE\xB8\xC0\xB8\xB1\xB8\x0F\x69\x37\xB8\x78\xA8\x39\xB8\x89\xB8\xF0\xB7\xE3\xB7\xA5\x5B\x6B\x82\xA8\xA8\x58\x67\x90\xB8\x06\xB7\x8D\xA7\x70\xB8\x89\xB1\x45\x7D\x33\x74\xE3\xA7\xF5\xB8\x4F\xA6\x59\xA7\x08\xB9\x00\x7E\xAB\xA6\xE5\xB8\x9E\xB8\xBC\xB8\xDA\xB8\x9D\x35\x89\xB6\x6F\xA1\x97\x82\xBD\xA8\x45\x74\x00\xA8\x96\x59\xA9\x07\xF7\x32\x82\xB7\x6F\x98\xFB\x0D\xF5\x5E\x91\xA5\x01\x5B\xBA\x0D\x4D\x2B\x95\xA5\x89\x7C\x79\xB8\xC5\xA5\x92\xB7\x5C\xB8\xC9\x92\x27\x09\xA1\xA5\x6D\x7B\xFD\xB8\x77\xAE\x09\xA8\x67\xA2\xC6\xB8\x79\x71\xC2\xA5\x53\xA8\x86\xB7\xDC\x95\x9B\x7A\x9C\x24\xB5\x7A\x2A\x25\x9C\x71\xAE\x7A\x36\x25\x40\x74\x20\xA1\x48\xB8\xB9\x67\x31\xB9\x99\x5C\xD0\x7B\x91\x9F\xAB\xB8\x06\x01\x48\xB9\x8E\x7A\x67\xA8\xB9\xA8\x38\x7D\xD9\x7B\x55\xA0\xDF\xB8\x89\xA1\xFE\xB7\x37\xB9\x13\xA8\x27\xA8\xD8\xB8\x4E\xB9\x20\x7B\x58\xAB\xD4\xA6\xA2\x73\x3B\xA1\x89\x7D\x98\xB8\x3B\xB8\xE2\xB8\x00\xB8\xAE\x9F\xC9\xB8\xDB\x7D\xD0\x5C\x5C\xB9\x23\x7B\x36\x7D\x68\xA8\x9F\x0B\x4A\xA1\xD3\xB8\x2A\xB9\x38\xB8\xBB\x73\x4C\xB9\x03\x01\x6B\xB9\x06\xA8\x5E\xB9\x39\xA1\x07\x0C\xA5\xB8\xFC\xB8\xA7\xB8\x7C\xA8\x00\xB9\xFB\x0D\xE5\xB7\x14\xB9\x00\x00\x77\xB9\x12\xA8\x79\xB9\xD1\xA1\xB0\xA1\xCE\x9F\xDD\xB7\x9D\xB7\x7A\xB8\xFF\xB8\xA9\xB8\xB3\x7D\x68\xB9\xB6\xA8\xC4\x65\x85\xB9\x1C\xA8\x87\xB9\x92\xA1\x69\xA8\xC2\xB8\xFC\xB7\xEE\xB8\xB6\xB8\xD4\xB8\x73\xB9\x13\x70\x75\xB9\xA6\x7A\x17\x7D\x7A\xB9\xC6\x7D\x86\xA1\xC8\x7D\x63\xB9\xE1\xB8\x96\xA8\xE3\xB8\x96\x59\xD7\xB8\x83\xB9\x94\xB9\x38\xA8\x85\xB8\x0F\x65\x1A\xB8\xB4\xB8\xDC\xB1\x95\xA8\xB5\xB7\xAA\xB9\x20\xB8\xA0\xB9\x01\x01\xAE\xB9\x47\xA8\x96\xB9\xAF\xA1\x27\x7D\x6A\x0D\x92\xA8\xB3\xB9\x8B\xA9\x9C\xB9\x72\xB9\xFC\xB8\x03\x5C\xF3\xB8\xF4\xB7\x84\xB9\xA2\xB9\x88\xB9\xBF\xB9\x36\xB8\xB2\xA1\xA7\xB9\x8E\xB9\x7D\xB8\xFF\x00\x02\xB9\xE3\xA7\xBB\xB9\x57\xA8\x33\xB9\x14\x94\x75\x7C\x0B\xB9\xBE\xA1\x76\xB9\xB2\xA8\xB4\xA7\x12\xB9\x27\xA1\x8C\xA8\xDC\x67\xD6\xB9\x66\xA8\x66\x9F\x59\xA8\x2C\x75\xBB\xA8\x56\xB8\x4E\x8E\x58\xB8\xE9\xB9\xA6\xA7\xC2\xA1\x21\xA0\x18\xB9\x9C\x71\x83\xB7\x9F\xAA\x39\xA0\x75\x92\x90\x25\xDE\xB9\x99\xB7\x60\xB4\x9B\xB7\xF0\xB8\xA6\xB8\x66\x82\xFF\x00\xC3\xA5\x91\xA5\x3B\xB9\x63\x96\x00\x00\x3D\xB9\x4F\x09\x9D\x7A\x35\x55\x41\xB9\x3F\x0C\x96\x7A\x44\xB9\x0B\xA7\x6A\xB8\x41\x7D\xF7\xB9\x43\x7D\x71\xB8\x91\xB9\xB0\x9F\xD0\x5C\x8D\x7A\x5D\xB9\x76\xB8\xD2\x04\x54\xB9\xC2\xB9\x9E\xA9\xC4\xB9\x7D\x7D\x7E\xB8\x13\xBA\xBD\x9F\x15\xBA\xCB\xB9\x97\xB9\xA4\xB9\xA7\x9F\x2D\xA8\x69\xA1\x8C\xB9\x4E\xA8\xD1\xB9\x9B\xB8\xC6\xB7\xB9\xB9\x00\x00\x16\xBA\x6C\xB9\x50\xB9\x1D\xA6\xCE\x78\x70\xB9\xD0\xB9\xA8\xB8\xD2\xB9\x9D\xB8\x8F\xB8\x10\xBA\x7A\x7C\x32\xBA\x5F\xB9\x0D\x7C\x7C\xB9\xDE\xB7\xD8\xB9\xD2\xA8\x99\xB8\xA9\xB9\x66\xB9\xED\x6F\x2E\xBA\x30\xBA\x78\xB9\x18\xBA\x42\x0D\xED\xB7\xFD\xB9\x2A\xBA\x37\xBA\x2C\xBA\x71\xA1\x48\xBA\x23\xBA\xBE\xB9\x98\xB9\xA3\x8C\x79\xA1\x55\xB9\x43\xBA\x64\xB9\x45\xBA\xB8\xB8\x9F\xB9\x20\xBA\xCA\x9F\x22\xBA\x2A\xA8\xDC\xB8\xD1\xB8\x87\xA1\x59\xBA\x0D\xA0\x1D\xBA\x8C\x7D\x7E\xA8\x5F\xBA\x13\xA0\x61\xBA\x3C\xBA\xBD\xB9\x66",
"\x9C\x64\x7C\xB6\xA0\x71\xB9\x1E\xBA\xFF\x00\x21\xB8\xC9\xB9\x49\xBA\x86\xB9\x4B\xBA\xFB\x06\x29\xB8\x66\xBA\x87\xA8\xB6\xB9\x46\xBA\xAA\xA1\x6B\xBA\x83\xA9\x47\x62\x78\xBA\x95\xB9\x7A\xBA\xFB\xB8\x41\xBA\x7E\xB9\xC4\xB7\x51\xBA\xFB\x0D\xD4\xB9\xDC\xB9\x02\x01\x85\xBA\x38\xA8\x22\xB9\xFF\x00\x47\xB8\x85\x95\x1E\x62\x91\xBA\xBC\xB9\x4D\xB8\x72\x70\x53\xBA\xB8\xA8\x33\xBA\x42\x9B\xED\xB9\x48\x9A\x1B\xB9\x43\xA0\xD9\xB9\x66\x82\xB5\x92\x84\x70\x1D\x54\xD7\x74\xBB\x79\xDF\xA9\x02\x01\xC2\x79\x6A\xB7\x06\x01\xAD\xBA\x32\xB9\x3C\x7B\xE7\x71\xC8\x79\x76\x35\xCA\x79\x21\xA7\xCE\x79\x3C\x73\x94\x08\xB8\xBA\x6E\xBA\xB2\xBA\x83\xBA\x9D\xA1\x85\xA9\x27\x01\xD9\x79\xD8\x5F\xE0\x79\xAE\xBA\x03\x01\xC4\xBA\xB1\xBA\xF7\x7A\x3D\x7B\xBD\x57\xF4\x07\xFA\x0D\xBA\xA7\x27\x7B\xEF\x79\x1E\xB0\xEE\x79\xB1\x7B\x8E\x81\x71\x7B\x15\x8F\xF6\x79\xFA\x0D\xF8\x79\xD8\x5F\xFF\x79\xC5\xBA\xFE\x79\xD3\xBA\xB7\x8A\xB5\x24\x04\x7A\x05\x6D\xCD\x9D\xD8\x3E\x07\x7A\x6D\x06\x09\x7A\x21\xA7\x39\x38\xDC\xBA\xBF\x43\xDE\xBA\xE7\xB9\x13\x7A\x3D\x7B\x15\x7A\x4B\x7A\x21\xA7\x1F\x7A\xEA\xBA\x35\x76\x91\x7B\x8F\xA7\x36\x7A\x91\xA7\xD3\x8C\x58\x7A\xAB\x18\x21\xA7\x2F\x7A\xAA\x78\x94\x08\xFE\xBA\x31\xBA\xE6\xB9\x6E\xB9\xEE\xBA\xD3\x7A\xF5\x58\x7B\x0D\xFA\x0D\x14\x7D\xCC\x0E\x40\x7A\x9D\xA1\x3B\x88\x0C\xBB\x4F\xB9\x03\xBB\x5B\x83\x44\x7A\xA0\xBA\x80\xA4\x78\x0C\x48\x7A\xFC\xB9\xC6\xB9\x17\x7A\x21\xA7\xCB\xA7\x9B\x9E\x94\x08\x1C\xBB\x49\xB9\x9B\x04\xF7\xBA\xAD\x72\xF9\xBA\xB1\x8E\xFB\xBA\x06\x01\x5A\x7A\x27\x7B\xC1\xA7\xD1\xBA\x5C\x7A\x9D\xBA\x1D\xA9\x64\x7A\xB3\xBA\x06\x7A\xB4\x36\xF3\x1C\x69\x7A\x21\xA7\xAA\xA7\x1D\xBB\x27\x01\x36\xBB\x20\xBB\x3D\x01\x22\xBB\xC6\x01\x74\x7A\xAA\xB2\x14\x56\x6B\x0B\x78\x7A\x21\xA7\xBB\xA5\x37\xBB\x09\x01\x44\xBB\x3A\xBB\x21\x7A\x05\xB8\x32\x06\x76\xA7\x4D\x7C\xA0\x7A\x83\xA7\x16\xBA\xAB\x06\x94\x08\x98\xBA\xD7\xB9\xA9\x7A\x45\x11\x92\x7A\x14\xBB\xC7\x0D\x42\xB9\x58\xB9\x6F\xBA\x05\x98\x05\xBA\xB4\x7A\xB5\x24\x9E\x7A\xB8\x7A\x27\x01\x86\x7A\x35\x7B\xA1\xB9\x88\xB9\x94\x08\xE4\xB9\x26\x70\x55\xBB\x83\x63\x57\xBB\xF1\xA0\x9E\x7B\x0A\xBA\xAF\x7A\x82\xA8\x3C\xB9\xB3\x7A\x79\x00\x3F\xB9\xAC\x2E\x9F\x7A\xC3\x4B\x21\xA7\x81\xB8\x50\x7B\x0D\xB9\xE5\xB9\xBD\xBA\x6D\xA7\x1C\xA7\xFA\x0D\x26\xAA\x27\x7B\xCA\xB7\x50\x7B\x42\xB8\xBC\xB9\xEC\xA8\x61\x0D\xD2\x7A\xC6\x0D\x80\xA7\x27\x01\xD7\x7A\xEF\x7A\xF5\x23\xBE\x7A\xAB\xA8\x45\x74\x3C\xBB\x57\x09\xE1\x7A\xCB\x73\xFA\x7A\x65\xBB\xC7\x4F\xBE\x7A\xC4\xA1\x6A\xBB\xC9\xBA\xD8\x9E\x5B\x73\x99\xBB\xAB\xBA\xEA\xA0\xBE\x7A\xF5\xA0\x82\x7C\x9F\xBB\x65\x7B\xA2\xBB\x27\x7B\xFE\x7A\x50\x7B\x23\xA0\x9E\xBB\xD4\xBA\x03\x7B\x71\x62\xFA\x0D\x06\x7B\xD8\x7A\xFD\x7D\x63\xA1\xC8\x88\xDD\x7D\x7E\xBB\xA8\xBB\x7A\xB3\xE2\xBA\xD4\xA3\x41\x7B\x1A\x0D\xC5\x25\x31\xB5\x01\x5E\xFA\x0D\x1B\x7B\xB5\xBB\xCA\x7B\x1E\x7B\x3A\x7B\x64\xB7\x96\x7B\x25\x7B\x21\xA7\x29\x7B\xC0\x79\x03\xB9\x31\x7B\xEC\x8E\x78\xBB\x95\xA6\xFB\x7A\x2A\x8D\x70\xBA\x94\x08\x70\xA6\xAF\xBB\x58\xA1\xD5\xBA\x43\xB4\x6A\x9B\xDD\x07\x64\x20\x90\x93\x23\xB4\xCF\x0D\xFF\x0C\x48\x7B\xFB\x9F\x3B\x01\x1B\x7D\x24\x66\x4C\x7B\x21\xA7\x4F\x7B\xC0\x79\x96\x96\xBA\xBB\xB0\xBB\x3D\x7B\x96\x71\xD7\x74\x5C\x7B\xD8\x5F\x5E\x7B\xC0\x79\x10\x80\x54\xBB\xBB\xBB\x91\x93\x66\x7B\x21\xA7\xF6\xBB\xD0\x7F\xF8\xBB\xEF\xBB\xDB\xBB\xB1\xBB\x5E\x6C\x74\x7B\x27\x01\x69\x92\xF3\x8A\x09\x01\x86\x7B\xBC\xBA\x3C\x94\x83\xA3\xE4\x8A\x1E\x7D\x81\x7B\x74\xB7\x2D\x45\xEC\xBA\x6F\xBB\x94\x7B\xA0\x7B\x96\x7B\x8C\x7B\x11\xBC\x88\x48\x13\xBC\xCB\x0D\x9F\x7B\x96\xA9\x4D\x7C\xFD\x0D\x91\x92\x03\xA8\x5B\xA6\x6B\x57\x1B\xBC\x59\xBB\x89\x7B\x1E\xBC\x0F\xBC\xA2\x7B\x19\xBC\x24\xBC\x2D\xBB\x77\x63\x7C\x79\xBA\x73\xAC\x7B\x2B\xBC\xA6\x7B\x2D\xBC\x5E\x88\xCF\x8A\x1C\xB9\x21\xB9\xFE\xB9\xA9\x07\x0F\xBB\x38\xBC\x44\xB4\xF4\xB9\x5B\x7D\xF6\xB9\x46\xBB\xF8\xB9\xD3\xB0\xFA\xB9\xEF\x70\xFF\xB7\x1B\xBA\x45\xB9\x96\xBA\x47\x62\x47\xBB\x10\xBB\x51\x80\xA8\xB7\xD8\xB8\x4B\xBC\x17\xBA\xF9\xB8\x77\xB8\x1A\xBA\x2B\xB9\xB3\xB7\x44\xBA\x7F\xBA\x5D\xBA\x14\x71\x2E\xBA\x50\xBC\x02\xBB\xB0\xB9\xFF\x05\x87\xB8\x1B\xBA\xE2\xA9\x57\xB9\x18\xBB\x41\xBA\xAB\x73\x5B\xBC\x54\xBA\x70\xBA\xAD\x06\x35\xBA\x9B\xB9\xB5\xB9\x46\xBC\xF1\xB8\xCC",
"\x0D\x39\xBA\x44\xA8\x27\x09\x5C\xBC\x4A\xBA\xDB\xB7\x83\x63\x4D\xBA\x7D\xB9\x8D\xB9\x50\xBA\xB7\xB9\x81\xB9\x67\xBC\x62\xBA\x17\xB8\x68\xA1\x73\xBA\x69\xBA\xF2\xB7\x7E\xBC\x6E\xBA\xC1\xB8\x57\xBA\xC3\xB8\x7D\xBA\xD1\xB7\x64\xBC\x3F\x24\x01\xB8\x82\xBA\x6C\xA0\x41\xBC\x7F\xBC\xED\xBA\x85\xA1\x09\xB8\x65\xBA\x61\xBC\xC2\xB7\xA8\xB9\x58\xBC\x6F\xBC\xF3\x9F\x13\xB9\x3A\xBA\x91\xBC\x86\xBC\xD0\xB8\x84\xA8\xDE\xB8\x97\xBC\x3A\xB8\x99\xBC\x6E\xBC\x9E\xB9\xCC\x0D\x76\xBA\x4F\xBC\x68\xBC\x6B\xA2\x89\xB9\xC0\xB9\x7C\xBA\xA4\xBC\xFE\xB8\x7B\xBC\x80\xBA\x11\xA0\x8F\xBC\xF5\xA9\x73\xBC\xAC\xBC\xF6\xA5\x67\xA1\xB1\xA1\x3A\x7D\x36\xBA\x7F\xB9\x8F\xB9\x18\x0F\x8E\xBA\x40\xB8\xB8\xBC\x11\xBA\x09\xB9\xFA\x7D\xDB\xB9\xC3\xBC\x27\x01\x74\xBC\x86\xB9\x9A\xBA\x54\x6E\x85\xBC\xC8\xBA\x54\xB8\x37\xBC\xBC\xA8\x57\xB8\x5B\xBB\x05\xA7\x03\x5C\xCC\x41\xB5\x00\x36\xB1\x4C\x8E\x60\x0A\xD7\x54\x85\x86\x68\x9F\xF4\x9B\xD3\xA9\xC3\xA7\xD0\x0D\x34\x6B\xDA\xBC\xCF\x0D\x0A\x0B\x70\x18\xE9\x26\x33\xB1\x31\x72\xD9\xA1\x4A\x02\x94\xB7\x08\xA7\x5D\x84\x0E\x00\xD1\x90\xDA\xA9\x7E\x6F\x71\x3D\xA5\x5B\x49\x5C\x3A\x75\x5F\x3B\x93\x5B\x03\x01\xEF\xBC\x66\x9A\xF1\xBC\xF8\x8E\xA4\x18\x71\x3D\x27\x09\xE1\x00\xC3\x5A\x43\x59\x80\x51\xCA\x28\x82\x5F\xC7\x0B\xDC\x3C\x3D\x01\xD8\x58\xA4\x3D\xEF\x50\x8F\x73\x89\x08\x4A\xA1\xEF\x50\xFF\x00\x3A\x75\xBD\x00\x4E\xA0\xFC\xBC\x01\x9C\x9A\x01\xF2\xBC\x1D\xB7\x8D\x8D\x01\xBD\x7F\x34\x04\xBD\xBC\x59\x97\x42\x73\x51\x45\x59\x59\xA9\xDC\xA7\x85\xB5\x58\x3F\x17\x73\x7C\x5A\x17\xBD\x1E\x9C\x76\x01\x1A\xBD\x1A\x54\x58\x08\x1E\xBD\x54\x5A\x05\xBD\x22\xBD\x0B\x40\xBF\x09\x08\xBD\x78\x04\x0A\xBD\xE1\x52\xF0\x58\xA4\x3D\xBE\x56\x5E\x01\x7A\x84\xAC\x53\xD8\xB8\x2A\xBD\xCA\x9D\xA9\x9C\x15\x06\x2D\xBD\x27\x54\x85\x42\x02\xBD\x1F\xBD\x3D\x1E\x0E\x40\x33\xBD\xBF\x59\xBF\x09\xFE\xB9\x76\x7C\xDD\x88\xCA\xB8\x47\x62\x41\xBD\xCD\xB0\xC4\x9C\xFE\xBC\xD4\x8E\xF4\xBC\x47\xBD\xEF\x02\x1A\xBD\x29\x54\x11\x54\x4E\xBD\x39\xB7\xFB\x0D\x69\x92\x42\xBA\xBE\xBA\xB9\x67\x54\xBD\xA3\xB2\xB8\x76\x57\xBD\xAA\x8E\xF9\x69\x1D\xBD\x2E\x7A\x49\xBD\x06\x01\x09\x40\x4C\xBD\x19\x40\x96\x0C\x71\xB6\x18\x0F\x99\x92\xB0\xA9\x40\xBD\x32\x80\x69\xBD\xE7\x93\xAC\x20\x6C\xBD\xEF\x3B\x6E\xBD\xD7\x24\x4B\xBD\x41\x3A\x02\x54\x99\xA5\xD4\x0D\x2A\x7A\x01\x01\xF9\xBC\x5F\x73\x02\x01\x66\xBD\x19\xB7\x68\xBD\x45\xBD\x7C\xBD\x5A\xBD\x6D\xBD\x31\xBD\x20\xBD\x44\x59\x34\xBD\x11\x01\x36\xBD\xEC\x0B\x38\xBD\x52\x07\x67\x3E\xF5\x03\x0E\xBD\x12\x7A\x89\x08\xB7\x0A\xFC\x06\x12\xBD\xFF\x59\xAA\xBA\xBE\x00\x16\xBD\x79\xBD\x8E\xBD\x6B\xBD\x90\xBD\x7E\xBD\x92\xBD\x4A\xBD\x77\x51\x71\xBD\x99\x42\xCA\x28\x03\x5C\x6A\x7A\xBF\x00\xA6\xBD\xF0\xBC\xA8\xBD\x01\x6A\x7D\xBD\xAE\x41\x7F\xBD\x1D\x39\x81\xBD\x47\x3A\x74\x51\x86\x03\xFF\x59\xBA\xA7\xC0\x00\xB5\xBD\xFD\xBC\xB7\xBD\x59\xBD\xBE\x59\x76\x02\x48\xBD\xAC\xBD\x6F\xBD\xBD\xBD\x54\x3A\x95\xBD\x86\x03\x49\x5C\x28\x58\x7F\x53\xC9\xB9\x8B\xBD\xD6\xB3\x8D\xBD\xFF\xBC\x0C\x54\xC8\xBD\x24\x02\xCA\xBD\x09\x5A\x32\xBD\x82\xBD\xBF\xBD\xFF\x00\x28\x58\xC3\x00\xC4\xBD\x18\xBD\x81\x01\xC6\xBD\x6E\x8D\xB9\xBD\x9F\x04\x5C\xBD\x20\xBD\x17\x54\x03\x5C\x5A\x7A\x1F\x4A\xD4\xBD\xA7\xBD\xD8\xBD\xC7\x59\xB7\x43\x97\x07\xDC\xBD\x08\x5A\xDE\xBD\xBE\xBD\x23\xBD\xC0\xBD\xCC\x0D\xD9\x48\x19\x25\x28\xBD\xD0\x5C\xD5\xBD\xB3\xB5\xB9\x86\x7A\xBD\x5C\x8B\xC7\xBD\xC8\x59\x1D\x0B\x0F\xBD\x17\x06\x9A\x71\xBE\x11\x8A\x54\x1C\x07\xA3\xB5\xF6\x59\x3E\x01\xB4\xA4\x69\x56\x3D\x58\x76\x06\xFF\x59\xCB\x79\xFF\xBD\x08\x5A\x37\xA6\x02\xBE\x90\xA6\x7D\x85\x05\xBE\x82\x8B\x46\xBD\xDA\xBD\x34\xB8\x58\xA1\x89\x08\xFF\x0C\x53\x58\xE7\x36\x66\x07\x0E\xBE\x6B\x09\x10\xBE\xD5\x36\x13\xBE\xF3\x59\x15\xBE\x31\x72\x26\xAA\xD6\x57\x83\xB9\x1C\xBE\x82\xAF\x18\x82\x1F\xBE\xEA\x8B\x07\xBE\xF5\xBD\x00\x43\x30\xBD\xDD\xBD\x93\xBD\x06\xBD\x73\xBD\x74\xBD\x96\x59\xB4\x71\xC1\x00\xE4\xBD\x2B\xBD\x19\xBD\xF3\xBD\x01\x54\xF6\xBD\x3D\xBE\xF8\xBD\x3F\xBE\xAF\xBD\x67\x51\xCA\x28\xE6\xA5\x80\x98\x8B\xB1\xA4\x83\x27\x09\x0D\xA7\x47\xBE\x60\xB6\x95\xB2\x62\xB6\xB0\xB1\xA5\xAF\xB2\xB1\xA7\xAF\xB7\xB6\xB5\xB1\x12\xB2\xE9\xB0\xA0\xB4\xEB\xB0\xCE\x94\x3C\xB4\x47\x8F\x11\xB1\x3C\x73\x13\xB1\xF2\xB0\xCA\xAD\x32\x9E\x19\x9C\x54",
"\xBE\x63\xAB\xBD\x37\x9E\x9E\x3C\xB5\x02\xB5\x11\xB4\x03\xB6\x62\xB5\x05\xB6\x64\xB5\x07\xB6\xD3\xB6\x67\xB6\xC6\xB5\x12\xB7\x8C\xB2\xFD\xB2\x4A\xB2\xD1\x86\xE6\xAD\x75\xAA\x3F\xB4\xF1\xB0\x5D\x7E\x8D\x75\xDD\xBB\x58\xAA\xFB\x0D\xE8\xA5\x18\x85\x57\xBE\x42\xBD\x8F\x9C\x96\xB6\x10\xAE\x98\xB6\xC5\xB4\x36\xB6\xC7\xB4\x38\xB6\xC9\xB4\x3A\xB6\xF3\xB5\xBB\xB6\x9C\xB1\xF8\xB6\xB9\xAA\x04\xAE\x77\x8B\x06\xAE\xEA\xBC\x51\x80\xE7\x82\x83\xAC\x8F\xBE\x55\xBD\x43\xBD\xBB\xB5\xC4\xB3\xBD\xB5\xCD\xB6\xB1\xB2\x46\xAF\xB3\xB2\x48\xAF\x23\xB5\xDB\xAF\x20\xB6\xAE\xAC\x10\xB3\x51\xB6\x12\xB3\x3F\x9A\x14\xB3\x80\xA3\x16\xB3\xCF\x0D\x21\xAE\xFF\xA5\x5C\xB1\xBC\xB3\x89\x6F\x5F\xB1\x87\xB5\x02\x01\xA7\xBE\x67\xBD\xAD\x98\x6A\xB3\x0A\xB7\xAA\xB3\x38\xB3\xAC\xB3\x91\xB5\x3B\xB3\x93\xB5\x3D\xB3\x95\xB5\x9F\xB4\x34\xB2\xA1\xB4\x38\xAF\x98\xB3\x24\x5C\x07\xAB\x8A\x8D\xC6\xBE\x8C\xBD\xC8\xBE\x76\xB5\x49\xB6\x5B\xBE\x99\xB6\xCE\xBE\xAE\xB3\xD0\xBE\xB0\xB3\xD2\xBE\x3F\xB3\x64\xBE\x54\xB6\x29\xA5\xD7\xBE\x4E\x8F\x10\xA7\xA7\xB1\xA3\xBB\x20\xBE\x74\x19\x9A\x4D\xA3\xBE\xBC\xB4\x70\xBE\x53\xA5\xDC\x67\xDB\xBE\xD6\xBD\xDD\xBE\x18\xB6\x6B\xB3\xCB\xBE\x8F\xB5\xC9\xB2\xB1\xB1\x6A\xB1\xB3\xB1\x10\xB2\x61\xBE\xB9\xB6\xB9\xAB\x9C\xBE\xCD\xB4\x3B\xB4\x6D\xAE\x73\x8F\xDE\xA5\x4F\x8B\x71\xAE\x5B\x7E\xA4\x94\x28\x64\x5D\x76\x1A\xA6\xD7\xB4\xA7\x7F\xFB\xA6\x56\xBE\x73\xBE\xFD\xB0\x7B\xB6\x1B\xB6\x9C\xB0\x0C\xB3\x9E\xB0\x0E\xB3\xE7\xB4\xB6\xBE\x83\xB6\xB8\xBE\xF9\x9C\xBA\xBE\xB2\xA3\x37\xA3\xBE\xB1\xF9\xA2\x88\x99\xE9\xAE\xED\x83\xDB\xB3\xDE\xB6\xEC\xA6\x96\xAE\x11\xA5\x34\x76\xF8\xBE\x03\xBE\xD4\xA5\x79\xB6\xFC\xBE\xD4\xB5\xD4\xAF\x9F\xAE\x17\xAF\xBD\xAF\x19\xAF\x16\x47\x1B\xAF\x8A\xB2\xFB\xB2\x80\xBE\x14\xB7\x82\xBE\xE1\x8B\x0D\xA6\x56\xBC\x18\xA3\x32\xA6\xC1\xBE\x34\xA6\xB3\xAE\x90\xB6\x1E\x62\x33\xBF\x1D\xBE\x18\x82\x36\xBF\xCA\xBE\x38\xBF\x09\xB2\x7D\xB6\x6F\xB3\xD2\xB1\x71\xB3\x4F\xB6\x22\xB6\x48\xB5\x6B\xB6\x2A\xB3\x3E\xB6\x98\xAA\x2E\xBC\x41\x9D\x9D\xAB\xCC\x99\xF3\xB4\x6C\xB4\x16\x96\xA2\xAB\x14\xB5\x63\xAD\xFF\x00\xA6\xAB\x17\xB5\x01\x01\x4F\xBF\x36\xBE\x2F\x87\x5D\xB5\xF6\xAD\xE0\xBE\x95\xBE\x9A\xB6\xD8\xB5\x9C\xB6\xDA\xB5\xB1\xB3\xDC\xB5\xB3\xB3\x9F\xB2\x0F\xB6\xC7\xAE\xE7\xAE\x4E\xB5\x64\xBF\x8B\xB7\xE0\xB6\xF5\xB4\x68\xBF\x62\xA3\xB2\xAE\xED\xAE\x56\xB5\xE5\xB5\x0C\xA7\x18\xBF\xDA\xB2\x33\xB6\xAB\xB3\x68\xB1\x00\xBF\xCB\xB2\x02\xBF\x6C\xB1\xE7\xB0\x6E\xB1\xAA\x9A\xD1\xB2\x45\xBF\xDE\x82\x11\x9A\x83\xA3\x27\xAE\x6F\xBF\xC9\xAF\x91\xBE\xEB\xB6\x74\xBE\xED\xB6\x03\xB5\x0E\xB7\xBF\xB0\x0F\xB2\x95\xBF\xB8\xB6\x97\xBF\x31\x9C\xC8\xB0\x6B\xB0\x8D\xAE\xAE\x6C\x85\xB5\x00\xBC\xE2\xA9\x17\xBF\x03\x9F\xB7\xB0\x7A\xB6\x8F\xBF\xCC\xBE\x91\xBF\x5D\xBE\x01\xBF\x5F\xBE\xB4\xB1\xB3\x91\x62\xBE\x93\xB3\xA0\xB6\xC5\xAF\x9E\xBE\xB4\xA3\xB7\x9D\x8E\xBE\x8D\xBF\x36\xB3\xB8\xBF\xFE\xBE\x39\xB3\xE2\xBE\x9B\xB6\xE4\xBE\x9D\xB6\x7A\xBF\x0C\xB6\x7C\xBF\xBC\xB2\xAF\xBF\xCB\xB0\x18\xB7\xF9\xBE\x61\x9A\x7C\xB2\xD6\xBB\xB7\x96\x09\x01\x9F\xBF\x1B\xB0\xA9\xBE\x52\xBF\xDF\xBE\xB2\xB6\x5C\xBE\x64\xB6\x5E\xBE\x66\xB6\xB4\xBE\xDE\xAE\xC7\xB5\x30\xB0\xD7\xB6\xE1\xAF\xD9\xB6\xF4\x5A\xCD\xB5\xF0\xAD\xDE\xBF\x95\x9B\x09\xB7\xE2\xBF\x9A\xB0\x1B\xBF\x0B\xB3\x7E\xB6\x0D\xB3\x80\xB6\x0F\xB3\x82\xB6\x24\xA4\x84\xB6\x0C\xB1\xD5\xBE\x8B\x97\x6E\xB6\x28\xB6\x29\xA6\xFC\x9D\xE4\xB5\x42\xB6\x72\xBE\xB5\xBF\x49\xB1\xB7\xBF\x94\xBE\xE3\xB4\x1D\xBF\xE5\xB4\x1F\xBF\xAA\xB5\x21\xBF\xFE\xBF\x23\xBF\xF2\xAB\x25\xBF\x36\xA3\x73\xA6\x9C\xAF\x18\x89\x71\xB5\x6E\xBF\xC8\xBF\x32\xB6\x0D\xC0\xA6\xB5\x0F\xC0\xA8\xB5\x11\xC0\xF2\xB6\x13\xC0\x47\xA5\xC2\xBF\x55\xB1\xC4\xBF\x89\xA6\x25\x97\xF1\xBF\x1E\xC0\x97\xB6\x75\x8D\x90\xBF\x35\xB6\x76\xBF\x37\xB6\x78\xBF\x39\xB6\x9E\xB6\x3B\xB6\x28\xC0\xE5\xB2\x5F\xBF\xFD\x80\x2D\xB3\x13\x96\x9E\xAC\xC0\xB2\xDD\xBF\x2E\xC0\x93\xBE\x30\xC0\xB9\xBF\x32\xC0\xCD\xBF\x77\xBF\xCF\xBF\x79\xBF\xE6\xBE\xB2\xB3\xE8\xBE\x41\xB3\xB0\xB5\xE5\xAF\x23\x63\xE7\xAF\x08\xC0\x41\xC0\x0A\xC0\x1F\xB3\xF6\xBF\x39\xBF\xBB\xAF\x3B\xBF\xBE\xAF\xA7\xBF\x4E\xB6\xD4\xB1\x5B\xBF\x6A\xB5\x5D\xBF\x76\xB3\xD5\xBF\xD6\x7E\x58\xB6\x5A\xB6\x70\xB4\xF7\xBE\x42\xC0\x5E\xAF\x44\xC0\xCB\xBF\xCD\xBE\x92\xBF\x56\xB3\x94",
"\xBF\xCD\xB2\x96\xBF\xC9\xB5\x98\xBF\xEE\xBF\xF8\xB1\xE7\xAC\x70\xB6\x6D\x81\xB4\xAE\xF2\xBF\x1B\x85\x3B\xB5\x19\xBF\xCA\xBF\x0C\xB7\x54\xB3\x6E\xC0\x92\xB5\x70\xC0\x58\xB3\x72\xC0\xEC\xBF\x32\xB0\x75\xC0\x62\xB2\xDB\xB6\x9C\x8E\xD1\xBC\x2E\xBF\xD5\x97\xDB\xBC\xBD\x85\x57\xB8\x56\xB0\xD7\x89\x7A\xC0\x69\xC0\xE0\xB0\x6B\xC0\x80\xC0\x6E\xB3\xC6\xB4\x70\xB3\xC8\xB4\x5A\xBF\x69\xB6\x81\xB4\x61\xC0\xB9\xB4\x63\xC0\x78\xB3\x04\xBB\x60\x93\x6F\xB0\x63\x93\x40\x7B\xFE\x78\xA9\xB6\xC2\xBB\xA4\xB2\x25\xAD\x95\xC0\x55\xC0\xBC\xB5\x75\xBE\x3E\xB5\x77\xBE\xCF\xB6\x79\xBE\xD1\xB6\x7B\xBE\xC4\xB5\x7D\xBE\xD5\xB6\x95\xAC\xAB\xBF\x58\x9C\x99\xBF\xBA\x91\x72\xB1\xCA\x9B\x6E\xB0\x9B\xB3\x63\xBD\xC2\xB6\xAD\xB0\x8E\xC0\x7F\xB3\xA5\x5B\x91\x9B\x66\xAD\xB4\xBF\xE4\x9E\xC9\xBE\xF5\xBF\x78\xB5\xF7\xBF\x7A\xB5\x57\xBF\x7C\xB5\x59\xBF\x5E\xC0\x9F\xC0\x0D\xB5\xA1\xC0\xF7\xB6\x7E\xBF\xAA\x97\xFA\xB6\xFC\xB1\xDC\xA6\x9F\xB3\xAC\xC0\xC9\xC0\x64\xAD\xAF\xC0\xCE\xC0\xDE\xBE\x61\xB6\xE3\xBF\xE1\xBE\x82\xC0\xCF\xBE\x84\xC0\x94\xB5\x86\xC0\x96\xB5\x5B\xB3\x01\xC0\x36\xB2\xEB\xBE\xDF\x63\xBF\xB6\x90\xB7\xA8\xB1\xFE\xB6\xEA\xA6\xE2\xC0\xA1\xB3\xED\xA6\x3B\x82\x60\xB8\xCD\xC0\xE5\xBD\xF4\xBF\xE8\xC0\x57\xC0\x55\xBF\x0D\xB7\xA7\xB5\x4D\xB6\x10\xB7\x19\xB4\x7F\xBE\xCF\xB3\x81\xBE\x60\xB2\xFF\xB2\x2C\xB3\x1A\xB0\xEC\xA0\x9D\x8E\x11\x94\xDC\xB3\xFC\xA6\xA7\xAD\x24\xB7\xFF\xA6\x20\xB7\x21\xB9\x03\x5C\x07\x40\x5C\xA7\xC1\xA1\xED\xBE\x02\x01\xA5\xA9\x3C\xBC\x60\xBD\xFF\x00\x07\x40\x45\xA7\xE0\xA7\x96\x59\xCE\xA7\xCF\xA1\xC2\xA8\x2B\x8F\x4F\x73\x3C\xAF\x2D\x2F\x51\xB8\x4D\xA7\x6C\xA4\x59\xBE\xE1\xB4\x74\xBF\x0E\xC0\xF9\xBF\x1E\xBF\xFB\xBF\x20\xBF\xFD\xBF\x27\xC0\xD3\xBF\xDE\xB5\xE5\xAD\x67\xBE\xD0\x94\x69\xBE\xDD\x76\x6B\xBE\x25\xA2\xA5\x98\xF4\xB0\x96\x59\xF6\xB0\xF0\xAD\xA0\xA7\x4A\xBB\x97\x19\x16\xA5\x34\xC1\xEC\xB6\x36\xC1\x21\xC0\x38\xC1\x10\xC0\x3A\xC1\x12\xC0\x3C\xC1\x06\xAC\xDA\xC0\x0F\xB5\xCE\xB4\x2B\xB4\xD0\xB4\xA0\xB1\xDE\x9C\x0E\xBF\x45\xC1\xD2\xA5\x42\xB4\x9E\x90\x54\xAE\x8C\xBE\xEF\xAD\x47\xB4\x09\x01\x4C\xC1\x24\xB8\x50\xAA\x33\xC1\x02\xC1\x5A\xBE\xE9\xC0\x75\xBF\x47\xC0\x34\xC0\x49\xC0\x36\xC0\xD1\xBF\x9F\xB6\x3E\xC1\x0E\xB6\xA3\xC0\xCB\xA5\xE6\xBC\xB4\x75\xBD\xAA\x07\xAE\xFF\xAC\xA4\xBE\x7E\x8B\x69\xC1\xD2\x26\x31\xC1\x4E\xC1\x71\xA2\xCB\xB6\xC5\xB3\x1E\xB5\x79\xB4\xD7\xAF\xB0\xBE\xD9\xAF\xB2\xBE\xCC\xB3\x9C\xB4\xCE\xB3\x7B\x9C\xD0\xB3\x16\x9F\x65\xBE\x59\xAD\x88\xB1\x37\xB1\x07\x99\xE8\xAA\x00\xA6\xAA\xB6\x8C\xA2\xEC\xAA\xAF\x86\x27\xAE\x6B\xC1\x32\xB8\x0D\x28\x4F\xC1\x6F\xC1\x35\xC1\x71\xC1\x37\xC1\xD4\xC0\x7F\xB6\xD6\xC0\x7E\xB5\x5F\xC0\x80\xB5\x5A\xC1\x2A\xB5\x3B\xC0\x3D\x9C\xD9\xBE\x1C\xC0\xD3\x36\x86\xC1\x4A\x29\xA6\xC1\x84\xB3\xD3\xB5\xB9\xB0\x6C\xC0\xBA\xBF\xE5\xBF\xBC\xBF\xE7\xBF\x60\xBE\xBF\xBF\x05\xBF\x99\xAD\x07\xBF\xF5\xB5\x2A\xC0\x65\xC1\xF4\xBE\x08\xB4\x8C\xB1\xD0\x5C\xA3\xC1\x43\xB8\xF3\x38\x6E\xC1\xBB\xC1\x8D\xB5\x7F\xC0\xD2\xC0\x02\xB6\xA6\xBF\x0E\xB2\x5D\xC0\xAE\xC1\xD8\xC0\x28\xB5\xB1\xC1\x4A\xB5\x40\xC1\x0A\xBF\xF6\x94\xEE\xB0\x3E\xB4\xC7\xAD\x18\xA6\x5C\x76\x51\x72\xDA\xA2\x8C\x87\xB4\xAE\xCF\xC1\xCF\x0D\xAC\x50\x38\xA5\x72\xBF\x73\xAF\x04\xC1\xEC\xB5\x7F\xB0\xEE\xB5\xAC\xAC\xE8\xBF\x4C\xAF\xEA\xBF\xA2\xB0\xF0\xC0\x1D\xB4\xF2\xC0\x5D\xB3\x8B\xC0\x6A\x5B\xFE\x9C\xC8\x0A\x8A\xB7\xF7\xC0\x45\x9D\x92\xAE\x53\xB5\xC4\xC0\x03\x5C\x08\x9D\x67\xC0\x27\x09\xEC\xC1\xD2\xA1\x07\xBB\x77\xA8\xE1\xBF\x03\xC1\xD1\xC0\x58\xC0\xD6\xB5\x33\xC0\x97\xBE\x35\xC0\x99\xBE\x37\xC0\x9B\xBE\x39\xC0\x95\xB3\x6D\xB6\xFF\xC1\x53\xAE\x62\xBC\x31\xA6\xF7\x6B\xFB\xC0\x04\xAD\x16\xB5\x74\xB6\x0C\xC2\xB8\xC1\x37\x7A\x88\xC1\x7D\xC0\x8E\xBF\x20\xC0\x4B\xB6\x07\xC1\xF0\xB6\x24\xC0\x11\xB7\x26\xC0\x59\xC1\xC7\xC1\x25\xB6\xB3\xC1\x60\xC1\xFA\xB1\xC9\xAE\x82\xBF\x04\xC2\x84\xBF\x67\xBF\x20\xB2\x8F\xB7\xE0\xB1\x4A\x9D\xEB\xC1\x29\xC2\x51\xAA\xF2\xA3\x50\xC1\xA3\xBF\x52\xC1\x2F\xC2\x22\xC0\x08\xC1\x32\xC2\x0A\xC1\x34\xC2\x97\xAF\xDE\xC1\x6C\xB5\x7B\xC1\x97\x83\x4D\xB5\x5C\xA3\x4F\xB5\x65\xBF\x51\xB5\x5D\xAB\xFE\xA2\xC4\xB6\xFD\x90\xEE\xAE\x53\xC0\x85\xC1\x7E\x5B\x0F\xC2\xEF\xC1\xAA\xBE\x5E\xB5\xB2\xC0\x60\xB5\xB4\xC0\xAF\xBE\x51\xB4\xB1\xBE\x53\xB4\xB9\xC0\xF7\xC1\xDD",
"\xAF\xF9\xC1\xE9\xB4\xD3\xBE\xEB\xB4\xFD\xC1\xD0\x97\x6E\xB6\x9C\xBF\x23\xBC\xC4\xBE\xB8\x36\x45\xC2\xD2\xC1\xF0\xC1\x8C\xAF\x67\xC2\xBE\xB5\x69\xC2\x7A\xB4\x8E\xC1\xCA\xB3\x90\xC1\x7E\xB4\x0A\xB6\x77\xC1\x38\xC0\x79\xC1\xA1\xB6\xDC\xC0\x73\x88\x61\xA6\x7C\x96\xB6\xC1\x0D\xC2\xA7\xA9\x63\xC2\x6A\xA3\xD2\xB5\xD4\xC1\x2E\xC2\xEE\xB6\x30\xC2\x0F\xB7\x4E\xC2\x26\xB5\xDC\xC1\x23\xB6\x36\xC2\x6C\xB6\x38\xC2\x67\x5C\x9C\xB5\x4B\xC1\x7C\xC2\xBA\xC1\x7E\xC2\xA2\xAF\x4A\xC2\x99\xC2\x4C\xC2\x31\xC2\x56\xC1\x25\xC0\x58\xC1\x51\xC2\xA0\xC2\x5E\xBF\xC9\xC1\xCF\xA3\xD5\xB3\x34\xBF\x28\x8D\xDA\xBF\x63\x9A\x59\xAF\x6A\xC1\xA6\xC2\x2B\xC2\x48\xC2\x7E\xC0\x98\xC2\xA5\xBF\x9A\xC2\x5C\xC0\x09\xC1\x9D\xC2\x9A\xBE\x6A\xB6\xB2\xC2\x62\xC0\x2B\x6D\xE5\x9D\xC0\x67\xA5\xC2\x62\xC2\xA5\xC1\xBE\xC2\xA7\xC1\x51\xC1\xA9\xC1\x53\xC1\xAB\xC1\xFA\xBF\xAD\xC1\x81\xB6\xAF\xC1\xB7\xBE\xAE\xB5\x6B\xAE\x54\xC2\xEC\xA5\xE1\xB5\x85\x98\xE3\xB5\xEC\x96\x8A\x8D\x92\xC2\x8C\xBB\x94\xC2\xB1\xB6\xF2\xC1\xB3\xB6\xF4\xC1\xB5\xB6\xF6\xC1\xC3\xC1\xF3\x91\xC0\xBF\xBA\xB6\x1C\xC2\x3D\xB6\xB4\xC2\x13\xBF\xD4\x0D\x10\x68\x19\x9E\x91\xC2\xBD\xC2\xAB\xA2\x2C\xC2\xC9\xBF\xC1\xC2\x76\xBE\xD8\xC1\x8B\xB3\xA8\xBF\x71\xC0\xAA\xBF\x73\xC0\xAC\xBF\xBF\xC0\xC6\x99\xC1\xC0\x3F\xB6\x33\x9E\x2C\xC0\x84\xC1\x0C\x2F\xFA\xC2\x47\xC2\xD2\xC2\x49\xC2\xD4\xC2\x4B\xC2\x54\xC1\x23\xC0\xAE\xC2\x33\xC2\xB0\xC2\xAD\xB5\x52\xC2\x82\xB5\xDE\xC2\x07\xA6\xB6\xC2\x50\xBF\x25\xA1\x2A\xB6\x20\x92\x2C\xB6\x0E\xC3\xCF\xC2\xD1\xC1\xA7\xC2\x65\xC2\x73\xBF\x13\xC3\xAB\xC2\x15\xC3\x4D\xC2\x17\xC3\x4F\xC2\x19\xC3\x02\xAB\xF2\xC2\xBC\xB6\x8D\xC2\x17\x9E\x7C\xA4\x40\xC0\x61\xC2\x09\x5A\xEE\xC1\x95\xC2\xA3\xB5\xBC\xC1\xCE\xB1\xBE\xC1\x46\xC0\xEB\xC0\xE3\xBE\xED\xC0\xD1\xBE\xEF\xC0\x73\xC2\x97\xB5\x75\xC2\x5C\xB4\x0B\xAC\x13\x94\x18\x0F\x66\xC0\xED\xA3\xE5\xC2\x5A\x84\x32\xC1\x28\xC3\x11\xC2\x70\xC1\xE9\xC2\xE4\xBF\xB4\xB6\xE6\xBF\xB6\xB6\xBE\xBF\xEF\xC2\xC5\xC1\xB7\xB1\x15\xC0\xAD\xBF\xA6\xB0\x55\xB6\xF4\xC0\x55\x89\x1F\xC3\x70\xBF\xAE\xA4\x2F\xB3\x6D\xBF\xB7\xC1\x26\xC3\x81\x43\x7D\xC2\x29\xC3\xF1\xC1\x13\xC2\x05\xC1\x81\xC0\xBB\xBF\x93\xBF\xBD\xBF\x03\xBF\xC4\xC1\xBD\xC0\xD7\x9C\x07\xC3\x09\xAC\x09\xC3\x90\x4F\x18\xB9\xD0\x78\x49\xB3\x3A\x93\x4B\xB3\xCF\xA4\x34\xB5\x0E\x69\x50\xC3\x77\xA7\xB9\xC1\xD1\xC2\xD3\xC1\x0C\xC0\x98\xC0\xD6\xC1\x56\xBF\x9B\xC0\x58\xBF\x9D\xC0\xD7\xC0\xC7\xC2\xA0\xC0\xC9\xC2\xA2\xC0\x42\xB3\xF8\x9E\x93\xBC\xAC\x97\xA7\xC0\xDA\x9E\xA9\xC0\x65\x93\xD9\xA9\xFB\xB6\x25\x9D\xC6\xA6\x4D\xBF\x47\x62\x86\xC3\x92\xA7\x87\xC1\xFB\xC2\xBF\xC2\x2D\xC2\x8C\xC3\x14\xC2\x1C\xB6\x79\x93\x1E\xB6\xC3\x96\x6F\xC2\x83\xB0\x0B\xC1\x94\xC1\x0D\xC1\x13\xB3\x0F\xC1\xFC\x91\xB7\xB3\x5B\xAB\x4E\x8D\xCF\xA6\xE1\xBB\x54\xB5\x74\xB0\x84\xC3\x7C\x5A\xA5\xC3\x2C\xAA\x52\xC3\x89\xC3\xA8\xC2\xEF\xAF\x56\xC3\xEA\xC0\x73\xC3\x6F\xC0\x75\xC3\xA9\xBF\x04\xBF\x78\xC3\xF1\xAB\x60\xC3\x17\xC0\xA9\xA4\x63\xC3\x5F\xB3\xC3\xC0\xC8\xC0\x47\xB3\x3E\xC2\x90\xB0\x41\xC2\x22\xB2\xA5\x5B\xE5\xB6\xD9\xB4\x39\xC3\xA4\xB7\x4B\xB8\x6D\xC3\x54\xC3\xA8\xC1\xC8\xC3\x72\xC1\x42\xC3\xCE\xBF\x44\xC3\xE5\xBE\x46\xC3\xE7\xBE\xD4\xBE\x97\xC1\x8A\xB0\xA8\xB0\x61\xBF\x3F\x9F\xD7\xC3\x9C\xB3\x15\xC1\xE9\xA6\xC7\xC0\xA0\xC3\x32\xB5\x96\x59\xBF\xB3\xFB\xB5\x28\xC2\x6B\xC3\x6D\xC1\x53\xC3\x92\xBE\x6A\xC0\x18\x8E\x71\xC3\x9A\xC0\x96\xBE\x9C\xC0\x98\xBE\x9E\xC0\x93\xC3\xD9\xC0\x95\xC3\xDB\xC0\x1D\xC3\x54\xAF\xE0\xC2\xF0\x9B\xA2\xAD\x47\xAA\xE1\xBC\x34\xB9\x22\xB7\x0F\x94\x79\x90\xA9\xAD\x2D\xC1\xC8\x72\xBE\xB4\x00\x00\xA5\xA7\x54\x5A\xB4\xBA\x81\x35\xE8\xC2\x70\xC3\xF3\xC1\x1D\xB6\xF5\xC1\x81\xB0\xB1\xC3\xC3\xB0\xB3\xC3\xF0\xA2\x95\xC1\x1D\xA2\x49\xC3\xFF\x6D\x84\xBE\xE2\xBB\x86\xBE\x77\xAA\x6C\xBE\x27\xB4\x82\xA6\x2D\x8B\xF5\xBE\xEE\xA6\xB9\x67\x1F\xC4\x75\x9F\xEE\x3D\xFD\x3D\x23\xC4\x00\xB6\x8D\xC3\x06\xC1\xAC\xC2\x9B\xC2\x2F\xC3\xC6\xC2\x1A\xC2\xC8\xC2\x33\xC3\x9D\xBE\x6C\xAE\x20\xB4\xAA\x95\x5F\xC1\xCF\xA5\x61\xC1\x15\x9C\xEA\xAD\xE4\xA5\xA1\x72\x52\xBE\xA5\x5B\x8D\xBE\xF0\xAD\x3C\xC4\xBD\x74\x3E\xC4\xBD\x4E\xD5\xA0\xFC\xC2\x1F\xC0\xAB\xC3\x05\xC4\x90\xB5\xE8\xC3\x48\xC0\xEA\xC3\xD0\xBF\x4B\xC0\x7B\xBF\x4D\xC0\xB4\xB3\x0F\xC4\x41\x95\xA0\xBE\xF0\xA5\xE3",
"\x82\x8A\xB4\x42\xBE\xA5\x5B\xA5\xBE\x18\x85\x5A\xC4\x07\x5A\x21\xC4\xAE\x35\x40\xC4\x0B\xB7\x42\xC4\x72\xC3\xC0\xC1\x74\xC3\xC2\xC1\x5B\xC3\xA9\x93\xF0\xC2\x06\xBF\x4A\xC4\x08\xBF\x35\xC3\x57\xB1\x9A\xC1\xE7\xAA\x25\x87\xE2\x75\x4A\xBF\xEB\xAA\xD8\xA7\x0E\x99\x08\xAB\xA4\xA7\x7E\x5A\x78\xC4\xB7\x3D\x7A\xC4\xFD\xBE\x99\xC0\x63\xC4\xCA\xC3\x83\xC0\xCC\xC3\x03\xC3\xCE\xC3\x05\xC3\xBE\xC0\x89\xC0\x15\xB3\xA4\xA2\xA5\xB4\x38\xC3\x03\x01\x76\xC4\x06\x5A\x94\xC4\x5F\x37\x96\xC4\x54\xBF\x25\xC4\xAE\xC3\x27\xC4\x1F\xB6\xEE\xC2\x82\xC4\x5D\xC3\x2D\xC4\x81\xA2\x7A\xC3\x9C\xAD\x7C\xC3\x48\xC1\xA5\x5B\xCE\xA7\xC7\x00\xA5\x70\x4F\x83\xCC\xC1\x55\xBE\x27\x01\xA7\xC4\x05\x5A\xA9\xC4\xA8\x37\xAB\xC4\xBD\xC1\x98\xC4\xFF\xBE\x9A\xC4\xEC\xC0\x9C\xC4\x85\xC0\x04\xC3\x87\xC0\xD0\xB2\xA1\xC4\xC2\x5C\x31\xC4\xD6\xA2\x51\xC4\xD4\xB4\xE7\xC1\x28\xBA\x18\x9C\xDB\xA2\xB4\xAE\xC2\xC4\x04\x5A\xC4\xC4\xA1\x37\xC6\xC4\x3F\xC3\xC8\xC4\xCC\xBF\x64\xC4\x74\xC1\x66\xC4\x4A\xC0\xEC\xC3\x4C\xC0\xEE\xC3\xE9\xBE\xCD\xAC\x27\xBF\x3A\xC2\xBF\xB1\x2A\xBF\xA5\xB6\xA4\xA6\x52\xB5\x2D\xBF\xF9\xC3\x2F\xBF\x61\xAB\xEE\xBE\xCD\xC1\x1E\x62\xDC\xC4\x14\x7B\x5C\xC4\xFA\x55\x5E\xC4\xA9\xC3\xFD\xC2\x61\xC4\xAD\xC4\xF5\x93\xAF\xC3\x35\x99\x29\xC4\x8F\xB3\x2B\xC4\xB6\xB1\xB4\xC4\x55\xA3\xEF\xC3\xBB\xB1\x1F\xC2\x9D\xAA\xB5\xB8\xA0\x90\x49\xBF\x00\xB7\xBD\xB3\xA6\x5B\xDB\xC4\x93\xC4\xFD\xC4\xDE\x35\xE0\xC4\x40\xB2\xE2\xC4\x6D\xC0\xCA\xC4\x43\xC3\xCC\xC4\xEE\xC0\xCE\xC4\xFB\xC1\x5A\xB4\x2F\xC4\x99\xB5\x0F\xC5\xBD\xB1\xEE\xC4\x3D\xA6\x3C\xC2\xBA\xC3\x0E\xB9\x5B\xC2\xF6\xB4\xFB\xBB\xDC\x76\xF8\xC4\x28\x98\xC1\xC4\x18\xC5\x40\x3D\x85\x4C\x1B\xC5\x1A\xB6\xAC\xC3\x1C\xBF\x2D\xC3\xAD\xC2\xD8\xC2\xFC\xBF\xDA\xC2\x22\xBF\xDC\xC2\x22\xAF\x87\xC4\xDF\xA5\xEC\x99\xE8\xAE\xF1\xC4\x30\xB5\x8D\xC4\x7B\xA6\x04\x5C\x5F\xC2\x11\xC5\xDC\x67\xFB\xC4\x02\x5A\xDE\xC4\xCB\x05\x39\xC5\x1A\xBF\x3B\xC5\xF8\xBF\xD6\xC2\x39\xC1\x3F\xC5\x3B\xC1\x41\xC5\x14\xC0\x43\xC5\xAF\xAF\x6C\xC4\x5D\x96\x6F\xB5\xDD\xAB\x60\xC2\xA6\xC4\x36\xC5\x70\x42\xDB\x56\x10\x2E\x55\xC5\xD5\xC1\x57\xC5\xD3\xC0\x8F\xC3\xD5\xC0\x91\xC3\xDB\xC1\x0B\xC4\xDD\xC1\x0D\xC4\x5B\xC1\xF4\xC2\x2B\x9A\x8F\xC2\xA1\x9D\xB6\xC1\x51\xC5\x5C\x58\x53\xC5\xDC\x05\x6B\xC5\xFE\xC2\xB3\xC0\x00\xC3\x07\xB5\x02\xC3\xCD\xC4\x9E\xC4\xCF\xC4\xCA\xB5\x26\xC5\xA9\x9B\x28\xC5\x64\xB2\xC6\xBF\x59\xC4\x67\xC5\x36\x7B\x69\xC5\x76\x35\x80\xC5\x02\xC5\xEA\xC2\x26\xC4\xEC\xC2\x28\xC4\xB1\xC4\xC3\x95\x83\xC4\xC6\xC1\x85\xC4\xC8\xC1\x45\xC5\x63\x9F\x11\xC1\xD1\x89\xB5\xB5\x2B\x8D\x92\xC4\x20\xC4\x19\xC5\x8E\x32\x94\xC5\x04\xC4\x03\xC5\x22\x9E\x05\xC5\x72\x9A\x07\xC5\x0B\xB5\x9E\xC2\x5C\xBF\x75\xC5\xB2\xC1\x38\xAC\xCC\xC2\x6D\xAF\x0D\xC3\x02\x01\x7C\xC5\xD3\x0D\x7E\xC5\x62\x01\xAA\xC5\x86\x8E\x1D\xC5\xBF\xC1\x58\xC3\xC1\xC1\x5A\xC3\x76\xC3\x5C\xC3\xCF\xC3\x20\xAF\xB6\xC4\x96\xB3\xB8\xC4\xB5\xC2\xD7\xBF\xB7\xC2\xFC\xC0\xD5\x77\x07\xC0\x4F\xC5\x27\x09\xBB\xC5\xCF\x0D\xBD\xC5\xFF\xC4\x11\xC3\xC0\xC2\x95\xC5\x57\xC3\xEB\xC2\x59\xC3\xED\xC2\x81\xC4\x9B\xC5\xB3\xC4\xB5\xC3\xB9\xBE\xB7\xC3\xED\xA5\xF8\xB5\x27\xAE\xD5\xC5\xCB\x0D\xD7\xC5\xBF\xC5\xFE\x8E\x6D\xC5\xD7\xC1\xC3\xC2\xD9\xC1\xC5\xC2\x46\xB5\x5D\xC5\x3D\xC1\x6A\xC4\x7D\xBF\x61\xC5\x23\x97\x0B\xC3\x46\xA4\xB9\xC5\x01\x01\xE9\xC5\xC7\x0D\xEB\xC5\x89\xC1\xAC\xBE\x8B\xC1\xCE\xB6\x6A\xC2\xC1\xB5\x6C\xC2\xC3\xB5\x24\xB5\x9A\xC5\x96\x98\x9C\xC5\x5E\xC3\x5F\xC5\xFC\xAF\x62\xC3\xA8\xA6\xA2\xC5\xFF\xAC\x3F\xC0\xF9\xB5\xBA\xC5\x90\xC5\xBA\xC2\xF4\x3D\x3F\xC4\x01\xC6\x80\xC2\xAD\xBE\x4F\xB4\x05\xC6\xD0\xB6\x07\xC6\xD2\xB6\x6E\xC2\x0A\xC6\x54\x9A\xC8\xC5\x8E\xB2\x4E\xC0\x10\xC6\x19\xC0\x40\xB6\x72\x89\x8B\xBF\xFE\xC5\x05\x7A\x37\xC5\x1A\xC6\x5F\xC4\x2F\xC0\xAB\xC5\x96\xC5\xAE\xC4\x98\xC5\xB0\xC4\xE0\xC5\x0B\xC6\xE2\xC5\x43\xBF\x0E\xC1\x16\xB7\x52\x8C\x65\xC0\xD2\xAC\x4D\xC4\x50\xC5\x17\xC6\xE3\xBA\x38\xC5\x1B\xC6\xA4\xBF\xFF\xC2\xF0\xC5\x01\xC3\xDA\xC1\xD9\xC2\xB2\xC5\x60\xC0\xB4\xC5\xDF\xC1\x97\xC3\x25\x8D\x12\xC6\xE7\xA6\x68\xC3\x27\xC2\x35\xC5\xA7\xC5\x30\xC6\x5D\xC4\xEC\xC5\xEA\x8F\xEE\xC5\x8E\xC3\x07\xC4\x90\xC3\x09\xC4\x92\xC3\x48\xC4\x94\xC3\x9E\xC5\x37\xC2\x77\xC5\xD8\xA6\xA4\xB6\x59\xC2\x2E\xC1\x65\x0D\x02\xAD\x9E\xC1\x83",
"\xC3\x33\xC5\x69\x99\x06\x01\x2E\xC6\xBD\xBB\x98\x03\x92\xC5\x22\xC4\x47\xC6\xAA\xC2\xC2\xC2\x44\xC4\xC4\xC2\x9C\xC2\xF3\xC5\x4E\xC6\xB0\xC1\x50\xC6\x53\xC2\x52\xC6\xA4\xC0\x51\xB9\xF7\x89\x81\xC1\x9C\xC3\xC1\xA6\x5A\xB1\xED\xA4\xE3\xB6\xE0\x9E\xC0\xC3\xD0\x5C\x74\xC6\xB6\x96\xBE\xBB\x77\xC6\x79\xC4\x79\xC6\x2B\xC3\x7B\xC6\x3D\xC5\x45\xC4\x5B\xC5\x57\xC1\xF4\xC5\x35\xC2\x66\xC6\xA1\xC2\x68\xC6\x8C\xB0\x1B\xB7\xF3\xC3\xF5\xC4\x8F\xC0\xBB\xC3\x74\x19\x42\xAD\x82\xC3\x44\xAD\xD8\xB4\x16\xBF\x58\xC6\x3D\xC4\x5A\xC6\xFE\xC4\x5C\xC6\xDD\x90\x7C\xC4\x06\xC4\x16\xC2\x08\xC4\x18\xC2\x0A\xC4\x64\xC6\x0C\xC4\x9F\xC6\xB3\xC2\xA0\xC5\xEB\x8E\xF6\xC0\x2D\xC5\x05\xC2\x31\x86\x30\xA5\x8D\xC6\x93\xB0\xA3\xC3\xC4\x65\x91\xC6\x7D\xB2\x76\xC6\x46\xC6\x32\xC6\x43\xC0\x34\xC6\xDC\xC5\x97\xC5\xDE\xC5\x99\xC5\x39\xC6\x25\xC6\x9F\xC4\x79\xC3\xD1\xC4\x26\xBF\x3C\xAD\x9B\xAB\xA0\xBB\xC1\xC6\x7E\xAD\xF5\x4C\x80\xAD\x14\xC5\x05\xC0\xBE\xB3\xB1\xB0\x45\xB6\xD4\xC5\x44\xC6\x93\xC6\xCC\xC6\x00\xC5\x60\xC4\xCF\xC6\xC9\xC3\x7E\xC4\xCB\xC3\x80\xC4\xC6\xC5\xB2\xC4\x26\xC6\xD1\xB3\x8C\xC2\xF8\xC5\xA1\xB2\xCE\xC5\x20\xC3\xC1\x8A\x13\xC1\x25\xB7\x00\xA7\xF6\x9B\xE9\x08\x17\xC1\x19\xC4\xFC\xC6\x1A\xC1\x3D\xBC\xEE\xAD\x09\x01\x2E\xB9\x0E\xBF\x27\x09\x39\xBB\x87\xAD\xD4\x4C\x65\x26\x63\xB8\x0A\xA8\xC5\xB9\x89\xBA\x8B\xBE\x87\x06\xA0\xB7\x46\xB9\xDC\x67\x0A\xC7\x0B\xAB\x98\x28\x0D\xC7\x12\xBA\x9D\xBC\x72\xBC\x38\xBB\x5B\xAF\x65\x26\x7A\xBA\x78\xB8\x4E\xBA\x47\xBF\xA6\xBC\x5B\xBB\x03\x5C\x5A\xB9\x83\xB9\x17\xC7\xDD\xB0\xF4\x28\x20\xC7\xA1\xBC\x86\xB8\x27\xBA\x82\xBC\x84\xA0\x8E\xB8\x1D\xC7\x6C\x7A\x1F\xC7\x47\x2E\xCD\xB7\x3C\xA8\x97\xB8\x6C\xBC\x6D\xA8\x8B\xB8\xB4\xBC\x9C\xB8\x2E\xBA\x2A\xC7\xF9\xB0\x34\x6D\x37\xC7\x76\xBC\xA0\x62\x78\xBC\x11\xC7\x4F\xBA\xBF\xBC\xD2\xB9\x82\xB9\x9E\xBC\x06\x01\x41\xC7\xF1\xB3\x32\xA9\x2D\xC7\xEB\xB8\xB2\xB8\x47\xC7\x29\xBA\x24\xC7\x2B\xBA\x7C\xBC\x84\xBC\xB6\xBC\x53\xA1\x09\xC7\x36\xC7\x8C\x3E\x87\xBC\xF4\x90\x58\xBA\xB1\xBC\xE0\xB8\x58\xC7\x3E\xC7\x04\x7D\x5B\xC7\xB7\xBB\x16\xC7\x5E\xC7\x0C\x51\x79\x00\x5E\xBC\x4A\x02\x96\xBC\x55\xBC\x4F\xC5\x63\xBC\x9D\xB9\xC6\xB9\x12\x7D\x40\xC7\x6B\xC7\x1D\x51\x6D\xC7\x2E\xC7\xB1\xB9\xA3\xBC\x71\xC7\xB4\xB9\x3C\xC7\x65\xB9\x59\xBC\xD0\x0D\xAA\xBC\x29\xC7\x78\xC7\x14\x2E\x7A\xBA\xC1\xB9\x7E\xC7\xC3\xB9\x6D\xBC\x26\xC7\xF2\xB8\x77\xC7\x29\xAE\x52\xC7\x80\xBC\xBC\xBC\xD8\xC5\x8A\xC7\x1C\xBA\x8C\xC7\x8C\xBC\xD3\xB7\xF4\x7D\xB7\xA1\x15\xC7\x5D\xC7\x90\xC7\x47\x2E\x93\xBA\x95\xBA\xFF\xB3\xC4\x65\x4F\xC7\x8F\xB1\x67\x56\x9F\xC7\xDF\xB9\xB4\xA8\x5F\x7C\x34\xC7\x4E\xC7\x86\xC7\x6B\x0B\xF1\xB9\x0C\xA0\x8D\x0E\xA2\xBA\x19\xB9\x7C\x7C\x33\x6B\x27\x01\xC8\x00\xB4\xC7\x18\x0F\xEC\xBC\xE7\x07\x94\xB7\xAE\xA7\x9E\xC7\x8C\x3E\x27\x09\x38\xBE\x70\xB0\xE8\xBD\x85\x42\xF6\xBC\xC5\x6F\x5E\x3B\x6B\x72\x03\x01\xBD\xC7\x32\xB3\x07\x56\xBF\xC7\x2C\xBD\x49\xBE\xE9\xBD\x01\x01\x03\xBD\xCB\xBD\x80\xBD\xAE\xBD\xDF\xBD\xFB\xBD\x97\xBD\xA6\x0C\x99\xBD\x3A\xBD\x0F\x3E\x9D\xBD\x8E\x81\x10\xBD\x96\xB8\xE9\x26\x12\xBD\x14\xBD\x4E\xA0\xCA\xC7\xD5\xAC\x0C\xC7\x47\x2E\xC0\xC7\xE7\xBD\x1C\xBD\xAA\xBD\xBA\xBD\xD3\xC7\xBC\xBD\xD5\xC7\xFA\xBD\xCF\xBD\x8B\x70\x26\xBD\x9E\x94\xD0\x5C\xE5\xC7\x48\xAD\xE7\xC7\xCD\xC7\x48\xBE\x58\xBD\xC3\xC7\x22\xBE\x59\x83\xD2\xC7\x3E\xBE\xAD\xBD\x72\x51\xD6\xC7\xCF\xBD\xD8\xC7\x7A\x49\xDA\xC7\x51\x17\x21\x3A\x58\x2D\x3C\xBD\x76\x06\xAC\x72\x3F\xBD\x83\xB9\xF7\xC7\x0B\xC7\x75\x53\x65\x26\xE9\xC7\xCF\xC7\xEC\xC7\x23\x4B\xBB\xBD\x3D\x3F\xCD\xBD\xFD\x53\x4F\xBD\x7E\x9A\x69\xB9\x1E\x62\x11\xC8\x18\xC7\xA6\xC7\xFA\xC7\xE6\xBD\x16\xC8\xFE\xC7\xA9\x83\x0C\x00\xEB\xBD\x02\xC8\x4A\xBE\xFB\xBD\x12\xC7\x62\xBD\xE4\xC7\xAD\xC7\x6F\x16\x15\xC8\xFC\xC7\xEB\xC7\x27\xC8\xF7\xBD\x07\x5A\xF9\xBD\xCE\xBD\x4D\xBD\x24\xBD\x31\x72\x76\xBD\x30\xC8\xBE\xC7\x6C\xC7\x33\xC8\x6A\xBD\xB8\xBD\x17\xC8\xD1\xC7\x19\xC8\x08\x40\x1B\xC8\x83\xBD\x66\xC1\xFF\x00\x86\xBD\x00\x00\x88\xBD\xEF\xA6\x02\x01\x21\xC8\x2B\xC7\xF9\xC7\x41\xC8\xCE\xC7\x34\xC8\x80\x86\xD0\xC7\x00\x00\x00\xC8\x4D\xBE\x2B\xC8\x94\xBD\x3B\xC8\x68\x00\x06\xC8\xF5\x64\x08\xC8\x71\x27\x9B\xBD\xF8\x1C\xDD\xC7\x24\xBE\x17\x06\xA0\xBD\xE0\x01\xA2\xBD\xCC\x0D\xA4\xBD\x3F\xC8\xCB",
"\xC7\x43\xC7\x24\xC8\x92\x02\xEA\xC7\x58\xC8\x45\xC8\x5A\xC8\x47\xC8\x70\xBD\x04\xC8\x5F\xC8\xB2\xBD\x43\x6B\x6F\xC8\xE6\xC7\x13\xC8\xE8\xC7\x56\xC8\x43\xC8\x3A\xBE\x1B\x54\xC9\xBD\x4C\xBE\x38\xC8\x4E\xBE\x7A\xC8\x72\xBD\xD1\x09\xC1\xBD\x27\x01\xC3\xBD\x36\xA1\x52\xC8\x42\xC7\x0A\x56\x72\xC8\xEF\x03\x74\xC8\x00\xBD\x76\xC8\x5B\xC8\x88\xC8\x5D\xC8\x40\xBE\xD1\x09\xD1\xBD\x7E\x53\x7E\xC8\xF8\xC7\x80\xC8\x94\xC8\x44\xBD\x26\xC8\x08\xBE\x94\x0B\x37\xC8\x06\x5A\x39\xC8\xFD\x53\xE1\xBD\x27\x01\xE3\xBD\x90\xC8\x31\xC8\x7D\xA7\x82\xC8\x7B\xBD\xA9\xBD\x36\xC8\x5B\xBD\xEE\xC7\x1A\xC8\xD9\xBD\xA6\xC8\x7B\xC8\xFF\x59\xEF\xBD\xA0\xC8\x12\xC8\x51\xC7\x81\xC8\xFB\xC7\x83\xC8\xFD\xC7\xBA\xC8\x86\xC8\x91\xBD\x01\xC8\xCC\xBD\xF0\xC7\x3A\xC8\x8B\xC8\xB6\x09\xFF\x59\xFE\xBD\xF5\xC7\x20\xC8\xB0\xC8\x42\xC8\xB3\xC8\x44\xC8\x27\xC8\x0A\xBE\x79\x01\x0C\xBE\x49\x01\x63\x00\x2A\xBE\xF7\x59\xDC\x95\x11\xBE\x5E\x94\x4C\x9E\x70\xA9\xD5\x36\x03\x5C\x18\xBE\xD0\xC8\x47\x62\x91\xC8\x50\xC7\xCC\xC7\x55\xC8\xC2\xC8\xD4\xC8\x84\xC8\x9C\x0D\x3E\xBA\xCD\x65\x25\xBE\xB5\x24\x27\xBE\x72\x00\xE8\x36\xDC\xC8\x12\xBE\xDE\xC8\x2D\xBE\xAA\xA9\x71\xC8\x30\xBE\x03\x5C\x32\xBE\xBE\xC8\x22\xC8\x2C\xC7\xC1\xC8\x25\xC8\x57\xC8\x97\xC8\xB5\xC8\xC7\xC8\x5C\xC8\xC9\xC8\x03\xC8\xF1\xC7\x5F\xC8\xFE\xB9\x44\xBE\x00\xC9\x53\xC8\xA2\xC8\xEB\xC8\x04\xC9\xC3\xC8\x35\xC8\xC5\xC8\xDB\xBD\x87\xC8\xA9\xC8\x89\xC8\x0C\xC9\xCC\xC8\x79\xAE\xD9\xB0\xCD\xAD\x18\x85\xB3\xA7\x14\x68\x81\x3D\xB2\xC6\xDA\x9B\x62\xC4\xC9\xC4\xEE\xC6\x9B\xC4\xF0\xC6\xCD\xC3\x77\xC3\xD6\xC6\xD0\xC3\xCA\xC5\x6A\xAF\xD3\xC4\x46\xC5\x24\xB4\xE9\xAD\x26\xB4\x9C\xAA\x28\xB4\xCC\xAD\x6C\xC6\x21\xC9\xED\x67\x24\xC9\x96\xC6\xE6\xC3\xAA\xC1\x6F\xC5\xAC\xC1\x71\xC5\x4D\xC6\x73\xC5\x9F\xC2\xBC\xC6\xCA\xC2\x71\x8F\xE1\xC1\x22\xB4\xD4\xC4\x34\xC9\x05\x8C\xC4\x98\x37\xC9\xE5\xA5\x84\xBD\x3E\xBC\x19\xB1\xF0\xAD\x22\xC9\x10\x69\x3D\xC9\xCD\xC6\x03\xC4\xC0\xC5\xB4\xC6\x99\xC4\x29\xC9\xCB\xC4\x2B\xC9\x9D\xC4\x2D\xC9\x88\xC5\x74\xC0\x8A\xC5\x87\xB6\x77\xC2\x2F\xB1\x89\x04\x70\xC4\x9E\xC1\xFE\xB9\x74\xC4\x55\xC9\x3C\xC9\xD9\x2E\x25\xC9\xA6\xA3\xC1\xC5\x41\xC3\x1F\xC5\xE9\xC3\x21\xC5\x45\xC3\x23\xC5\x47\xC3\xF1\xC0\x0D\xC5\xA2\xB4\xD4\xC3\xA0\xA6\x89\xC4\x59\xB1\x9C\xC1\xC0\xBE\xE1\xC6\xAF\x63\xC3\xBE\x91\xC4\x06\x01\x56\xC9\x30\x6D\x58\xC9\xEA\xC6\x33\xC6\x5B\xC9\x5E\xC6\x43\xC4\x99\xC6\x7D\xC6\x46\xC4\x7F\xC6\x45\xC9\xB3\xC5\x47\xC9\x96\xC3\x4F\xC0\xDB\xAB\x9F\xB7\xF5\xA9\x8A\x8D\x89\xC9\x88\x6F\x8B\xC9\xD9\xC5\xAA\xC3\xEC\xC6\xE7\xC3\x75\xC9\x65\xC4\x77\xC9\xEB\xC3\x79\xC9\xED\xC3\x74\xC2\x7C\xC9\xD6\xBE\x99\xC1\xCB\xC1\x2A\xB4\x57\xAE\x1E\x62\x9E\xC9\x27\x9B\xA0\xC9\x8A\xC3\x37\xBF\xC7\xC4\x5C\xC9\x28\xC9\xC3\xC5\x7F\xC4\xC5\xC5\x2C\xC9\xC7\xC5\x2E\xC9\xC9\xC5\xD8\xC6\xF4\x94\x4A\xC9\xD1\xB4\xA0\x8C\xD3\xB4\xD8\xA2\xD7\xC4\x27\xA2\xDC\xA2\x30\xB3\x88\xC9\x6F\xC9\x75\x43\x71\xC9\x93\xB1\xA4\xC9\x5E\xC9\x20\xC5\x60\xC9\x86\xC5\x62\xC9\x24\xC5\xD8\xB6\x65\xC9\xDA\xB6\x7E\xC9\x82\x76\x7A\x66\x2B\x8C\x22\xA6\x03\xC2\xDD\xC6\xCC\xAE\x5C\xC2\x31\xC5\xF8\xB4\x71\xC6\xF6\xBE\x27\x09\xB3\xC9\x22\xAC\xB5\xC9\xC6\xC3\x65\xB1\x97\xC4\xB9\xC9\xE3\xC4\xA5\xC9\xE5\xC4\xA7\xC9\x67\xC4\xE8\xC4\x69\xC4\xEA\xC4\x28\xC6\xEA\xBE\xAE\xC9\x7F\xC7\xAE\x99\x13\xC5\xDB\xC3\x65\xB3\x16\xC5\xC7\xC6\xB9\x67\xEA\xC9\xDE\x87\xEC\xC9\x6E\xC3\x7F\xC2\x48\xC6\x82\xC5\x4A\xC6\x84\xC5\x4C\xC6\x40\xC5\x80\xC6\xDB\xC2\x1B\xC3\xAF\xB5\x29\xC6\x68\x5E\x2D\xB5\x3B\xC2\xDF\xC0\x2F\xC5\x86\xBF\xC5\xAB\x7F\x8C\x02\xCA\xDC\x67\x04\xCA\xF8\x92\x06\xCA\xE4\xC3\xD3\xC2\x3F\xC9\xD5\xC2\x41\xC9\xD7\xC2\x43\xC9\x0E\xCA\x95\xC9\x4F\xC6\x97\xC9\x0E\xC4\x84\xC6\x22\x88\x1A\xB2\x1F\x47\xEE\x99\x49\xC5\x2C\xBF\x93\xC0\x18\x0F\x55\xA6\x7A\xC2\x00\x00\x1E\xCA\x91\x95\x20\xCA\x02\xC4\x97\xC0\xA3\xC9\x40\xC9\x60\xC6\x70\xC5\x62\xC6\x72\xC5\xBA\xC6\x74\xC5\x2B\xCA\x76\xC5\xBE\xC6\xA3\x9C\x63\xC5\x20\x91\xB6\xC1\x39\xCA\xD9\x99\x3B\xCA\xA2\xBF\xDA\xC5\x3E\xCA\x24\xCA\x40\xCA\x42\xC9\x42\xCA\x44\xC9\x44\xCA\x46\xC9\x8B\xC2\xC3\xBF\x48\xCA\xE9\xBB\xF6\xAB\x26\xAF\x24\xC3\x02\x01\x4D\xCA\xE9\x9F\x4F\xCA\xCF\xC0\x12\xC2\x41\xC4\x8F\xC9\x7D\xC4\xBB\xC9\xEF\xC6\xBD\xC9\x61\xC9\xBF\xC9\x63\xC9\x06",
"\xC3\xC2\xC9\xD3\xC3\x08\x97\xA4\xC2\xFC\xC5\x38\xCA\xCE\xC9\xA5\x4C\xD0\xC9\x7D\x89\xD2\xC9\x6A\xCA\x2A\xC9\x6C\xCA\xD6\xC9\x6E\xCA\xD8\xC9\xED\xBF\xDA\xC9\x2C\xB1\x11\xC6\x65\xC3\xA0\xBF\x7B\xB2\xCC\x0D\x84\x91\xBB\xC2\xCD\xC9\x23\xC9\x70\xC9\x3E\xC9\x24\xC4\x35\xC6\x04\xC5\xAF\xC4\xB0\xC3\x24\xC6\x99\x9C\xF3\xC6\x96\xC1\xEB\xC4\xAD\x68\xF0\xBF\x75\xCA\x62\xCA\xBF\x9E\x64\xCA\xE7\xC0\x55\xC3\x90\xCA\xD0\xC6\x36\xC6\xD2\xC6\x38\xC6\xF1\xC6\xE1\xC5\x97\xCA\x2E\xC4\xAC\xC9\x02\xC0\x8C\xC5\xF8\x9D\x86\xCA\xDF\xBF\x83\xAF\x06\xC0\xE3\xC2\x4C\xCA\x77\xCA\x92\x0B\x79\xCA\xA7\x84\xED\xC6\x7C\xCA\x5F\xC9\x7E\xCA\x22\xC5\x87\xC5\x81\xCA\x88\xC0\x83\xCA\x76\xC0\x7B\xA4\x83\xA6\x6A\xAC\xB4\xCA\x8D\xCA\xCF\xC9\x8F\xCA\x67\xCA\x27\xC9\xF1\xC9\xD3\xC9\x76\xC9\xD5\xC9\xBD\xCA\xD7\xC9\x7A\xC9\xFC\xC1\xAB\xCA\xF3\xC0\x08\x97\x11\xB6\x35\x9E\x6E\xC9\xC7\xCA\x78\xCA\xC9\xCA\x7B\xC4\x68\xCA\xB5\xC6\x73\xC1\x17\xC2\x75\xC1\x19\xC2\x89\xC2\x1B\xC2\x5A\xCA\x29\xC0\x5C\xCA\xCD\xC5\x11\xC4\x90\xBE\x4B\xA0\xD0\x0D\xCF\x8D\x27\xAE\x9D\xCA\x07\xA0\x9F\xCA\xFB\xBE\x53\xBF\xB8\xC9\xDE\xCA\x5D\xC9\xBA\xCA\xD4\xC9\xBC\xCA\x78\xC9\xBE\xCA\xD2\xCA\x25\xC5\xD4\xCA\xFE\xC1\xDC\xC9\xB8\xAC\x2C\xC6\x65\xC5\x61\xCA\xB5\xCA\xBE\x2E\xB7\xCA\x95\x8D\x3F\xCA\xB6\xC6\x61\xC6\xB8\xC6\x63\xC6\xE4\xCA\x49\xC4\xE6\xCA\x3A\xC0\xA1\xC6\x2E\xB1\x1D\xB9\xD1\xAC\x7E\x9E\xD9\xCA\x57\xC9\x8E\xCA\x59\xC9\x3D\xCA\x8E\xC9\xCB\xCA\x1E\xC5\xCD\xCA\xA6\xC9\xCF\xCA\xFB\xCA\xD1\xCA\xAA\xC9\x48\xC3\xFF\xCA\x76\xC2\xAD\xCA\xBD\x91\xAF\xCA\x69\xA2\x9A\x9E\xAC\xC6\x41\xAB\xB2\xA7\x06\xCB\xB0\x0B\x08\xCB\xB2\x8E\x0A\xCB\xE0\xCA\xB7\xC6\xE2\xCA\xB9\xC6\x0F\xCB\x65\xC6\x11\xCB\x1D\xC2\xA2\xC2\x69\xC6\x8D\xC0\xA5\xC6\x7E\x98\x38\x93\x80\xC3\x46\x9B\x69\xBF\x88\xBF\xFB\x0D\x06\xAD\xDF\xC3\x03\x01\xF0\xCA\xE4\xA0\xF2\xCA\x8C\xB5\x8B\xC3\x52\xCA\x14\xC3\x59\xC5\x55\xC1\x9B\xC6\xAF\xC2\x9D\xC6\xB1\xC2\x46\xCA\xB5\xC5\xE8\xCA\x5B\xAD\x40\xCB\x20\xAD\x54\xB0\x22\xAD\x46\xCB\xCF\xAE\x66\xB3\x1C\xCA\xE9\xC9\x31\xCB\x5D\x05\x33\xCB\xC7\xA2\x35\xCB\xE4\xC4\xE1\xCA\xE6\xC4\x76\xC1\x68\xC4\xD2\xBF\xF6\xC5\xD4\xBF\x2D\xCA\xFD\xAC\xDE\xC0\x3F\xAD\xC6\xC0\xBD\xC3\x08\xC2\xAB\xC6\x15\xBF\x2F\xCB\x09\x01\x4C\xCB\x2B\x61\x4E\xCB\x96\xC2\x50\xCB\x1D\xCB\xAC\xC5\x85\x9E\xAE\xC5\x37\x9B\xB0\xC5\x68\xB5\x57\xCB\x1A\xC3\x82\xC6\x1C\xC3\x73\xCB\x8B\x93\xC0\xC6\x9D\x85\xE8\xB8\x14\x6F\xC4\xC6\xAA\xC6\xE0\xA6\x8F\xC6\xB2\xC9\x66\xCB\x81\x05\x68\xCB\x8B\x98\x52\xCB\x25\xCA\x5A\xC5\x27\xCA\x5C\xC5\x0F\xCA\x42\xC5\x11\xCA\xDD\xC2\x8E\xCB\xB3\x93\xD6\xC3\x41\xCB\xD8\xC3\xFE\xC6\xE0\xC6\xFF\xC9\x01\xB7\xE3\xC6\x03\xB7\x85\xAD\x30\xCB\xDA\xCA\xB6\xCA\xDC\xCA\xEF\xC9\xF6\xCA\xBA\xC9\xDD\xC5\xC4\xC5\xDF\xC5\xA7\xCA\x3A\xC6\xA9\xCA\xB5\xC4\x71\xCA\x55\xAB\xBB\xA6\x79\xB2\xFD\x8A\xA8\xCB\x14\xC1\xF8\xC0\xDD\xB3\x23\xB7\x01\xC7\x19\xC1\x4C\xC3\x96\x59\xF5\x5E\xC9\x00\xCC\x7C\xB1\x7A\xCD\x0A\xC2\x2E\x0E\x02\x76\xBB\x2A\x38\xFF\x54\x38\x6A\x53\x18\x9F\x38\x24\x15\xEE\x08\x1A\x38\xFF\x54\xE6\xAA\x59\xB1\xD2\x58\xC2\x59\x87\xC3\xB3\x3E\xDC\x37\x75\x73\x49\x5C\x6B\x82\xCB\x00\x25\x6A\x6B\x82\xCC\x00\xCC\x7C\xDF\xCB\x43\x95\x00\x00\xE1\xCB\xCB\x59\xE3\xCB\x06\x55\xA8\x2E\xD8\xCB\xD0\x1A\xDA\xCB\x05\x15\xDC\xCB\x67\x38\xD7\xCB\xDC\x95\x1F\x55\xD4\xCB\x60\xBB\x35\x55\xDE\xCB\xFE\xB9\xD5\x70\xCA\x00\xD0\xCB\xFD\xCB\xD3\xCB\xF6\x06\xD5\xCB\x19\x0A\xFC\xCB\x56\x88\xF8\xCB\xA1\x10\x8D\x0E\xB3\x38\x4A\x55\x39\xBD\x03\x1C\x08\x37\xEE\xCB\xFD\xA5\xF0\xCB\x34\x59\xAB\x59\x5F\xCA\x4B\xB8\x15\xCC\x40\x94\x2D\xB9\x94\xB7\x2A\xBB\xA8\xC4\x31\xBB\x43\x3D\x6D\x06\x0E\xC7\x36\xB9\x98\xC7\x2D\xB8\x8A\x9F\x0D\xBA\xE3\xA7\x21\xCC\xC3\xC4\x23\xCC\xD3\x3E\x0A\x04\x4D\xBC\x2E\xBA\x2D\xCC\xDD\xC4\x2F\xCC\x44\x51\x21\xC7\x54\xBC\x23\xC7\x72\xC7\x57\xBC\xA7\xBC\x75\xC7\x5A\xBC\x68\xC7\x0D\xBB\xC4\x65\x34\xCC\xFC\xC4\x67\x7A\x98\x56\xB1\x01\x6E\xC7\x3E\x0B\x30\xC7\xBE\xBC\x8B\xBA\x59\xC7\x33\xC7\xE2\xB9\x27\x09\x43\xCC\x52\xC5\x36\xCC\xCC\x1F\x38\xC7\x71\x27\x00\x7C\x4B\xCC\x7C\xB8\x8C\xBA\xFF\x00\x71\xBC\x4F\xCC\x2C\xBB\xAF\xC6\x68\xC5\x3D\x59\x5C\xBB\xBA\xBC\xC1\x9F\xDC\xB7\xD8\xC4\x29\xCC\x63\xBD\x7E\xBA\x3D\xCC\x65\xBC\x61\xA1\x40\xCC\x1E\xAA\x47\x62\x51",
"\xCC\x7D\xC5\x53\xCC\xCE\x26\x7A\xBA\xB3\xB8\x95\xC7\x21\xC2\x5B\xBA\x9A\xBC\xA8\xBC\x62\xA8\x6D\xCC\x54\xA8\x42\xCC\xE7\xC6\x76\xC6\x61\xCC\x60\xC7\x30\xCA\x62\xC7\x76\xCC\x98\xBC\x65\xC7\x82\xC7\x7C\x71\x33\xCC\x7F\xCC\x54\x51\x43\x51\x54\xCC\x7B\xC7\xFF\x05\xD2\xB8\x58\xCC\x3D\xC7\x88\xCC\x42\x7C\x7C\xCC\xC7\x72\x70\xCC\xBC\xC5\x72\xCC\xF3\x1C\x48\xCC\x4F\xA5\xE8\xBB\x3B\xC7\x73\xC7\x10\xC7\x8D\xBC\x0D\x74\x8A\xCC\x59\xC6\x60\xCC\x48\x51\x88\xC7\xB0\xBC\x85\xCC\xA5\xBC\x87\xCC\x9B\xBC\xB5\xBC\x1C\xC7\x5D\xCC\x09\x01\x98\xCC\xD6\xC5\x9A\xCC\xE9\x26\x87\xBA\xCF\xB9\x9F\xCC\x3C\xCC\x8D\xC7\xB6\xA1\xA7\xA8\x2C\xCC\x8B\xCC\x34\x6D\x48\x51\xA0\xC7\xC8\xBC\x9C\xC7\x5E\xCC\x5B\xC4\x45\xCC\x8D\xCC\xCE\x26\xCD\xBC\x70\x98\xA4\xCC\x5F\xCC\x91\xC5\x61\xCC\xAF\xC7\x97\xA5\xB1\xC7\xD4\xBC\x28\xCC\x66\xB8\x15\xCB\xFB\x0D\xAD\x05\xCD\x00\x23\xC1\x27\xB7\xA1\x34\xD9\xCC\x4B\xC8\x5B\xB8\x94\xB7\x1F\xBB\x43\x75\x0D\x05\x26\xCC\x7F\xC1\xD5\xBC\x12\xC7\x0F\xA8\x8F\xBA\x01\x01\xE0\xCC\x72\x75\xE2\xCC\x1B\xC7\xE1\xB9\x52\xBD\xC4\x65\xEA\xCC\x27\x78\x0D\x05\x38\xCC\x20\xA8\xB8\xCC\x78\xCC\x6A\xCC\xA2\xCC\x3F\xCC\xAF\xCC\xEF\xCC\xB9\x67\xF1\xCC\x3C\x79\xF3\xCC\x8F\xCC\x48\x0B\xC0\xB7\x63\xC7\x56\xB9\xB9\xCC\xD3\xCC\xC7\xB8\x42\xA1\x2E\xBA\xFE\xCC\x93\x79\x00\xCD\x49\xA1\xE0\xC7\xD2\x7C\x92\xCC\x81\xC7\xAD\xCC\x3F\xC7\x96\xCC\x7C\x5A\x0B\xCD\x24\x78\x0D\xCD\x17\xB8\x40\xBA\x56\xC7\x3B\xCC\xF7\xCC\xBA\xCC\xAA\xB8\x15\xCD\xD0\x5C\x17\xCD\x2C\x7F\x19\xCD\x99\xC3\xB2\x7C\xEC\xB7\x8B\xB9\xD3\xB7\x8A\xBA\x59\xCC\x59\xC7\xBA\xB8\x83\xB9\x23\xCD\xCA\x81\x25\xCD\xA5\xC0\x09\x70\xFB\xB7\x66\xCC\xD4\xCC\x49\xC7\x4C\xCC\x66\xC7\xC8\xB8\xFB\xCC\x1F\xC8\x47\x62\x30\xCD\x62\x84\x32\xCD\x86\xC6\xE9\x7B\xEC\x9F\x64\xC2\x48\xC7\x57\xC7\xB3\xBC\x94\xCC\xAB\xB9\x0A\xCD\xE9\x93\x14\x05\x9C\xCC\xB2\xB9\xAA\xCC\xB2\xBC\x4A\xC7\x5A\xCC\x84\xC7\x4D\xC7\x03\x01\x3F\xCD\x82\x85\x41\xCD\x9E\xBA\xAE\xBC\x00\x69\x89\xC7\x3A\xCC\xFC\xC9\x06\xCD\x74\xC7\x6B\xCC\x98\xA8\x21\xCD\x1E\x62\x57\xCD\x53\x87\x59\xCD\xF0\xC8\xE9\x7B\xD4\xA0\x31\xC7\x41\xA1\xD3\xB9\x3F\xB8\xC3\xCC\x09\x01\x66\xCD\xA9\x85\xEC\xCC\xC6\xBC\xA5\x5B\xA1\xC7\x35\x74\x22\xCD\x4C\xCD\x74\xCD\x11\xB9\xA9\xC7\xC4\xA5\xB0\xCC\x50\x7A\x7A\xCD\x0F\x93\x4E\xAA\x9C\x71\xD1\xCC\xEB\xB9\xE5\xCC\x67\xB8\x41\x6A\x39\xC4\xFE\xC0\xB9\x67\xD5\xA7\xE3\x7B\x37\x0A\xF4\x32\xB5\xCB\xAC\xC4\x91\xCA\xAD\xC5\x93\xCA\x06\xC5\x95\xCA\xF4\x9C\x3B\xC6\xF5\xB6\x15\xB7\xE1\x8B\x32\xC9\x0D\xBF\x4D\xC9\x0F\xBF\x16\x9C\x50\xC9\x98\xA6\x38\xC4\xBF\xC4\x71\xBE\x09\x01\x8D\xCD\x79\xA0\x8F\xCD\x1D\x40\x1B\xCB\x92\xB1\x7A\xCA\x6A\xCB\xF2\xC9\x6C\xCB\xF4\xC9\xE7\xC4\xA9\xC9\xE9\xC4\xAB\xC9\x99\xCA\xFC\x68\x9D\xCD\x46\xA2\x9F\xCD\x62\xC1\xAF\x86\x64\xC1\xCF\xAC\x52\xC9\x05\xC7\x01\x95\xF0\xAD\xA8\xCD\x35\x7C\xAA\xCD\x1A\x27\x91\xCD\xF5\xCA\x1E\xCB\xC2\xC5\xB9\xCB\xBC\xC9\xBB\xCB\xBE\xC9\xF2\xC6\xC0\xC9\x27\xC6\x6B\xC4\xA6\xCB\x79\xAB\xE6\x98\x7E\xC1\x61\xB4\x71\xC4\x82\xC1\x88\xB9\x18\x85\xC4\xCD\xBD\x7C\xC6\xCD\x9B\xCB\x8B\xA3\x2C\xC3\x53\xCB\x16\xC3\x55\xCB\x18\xC3\x8A\xCB\x32\xC3\x3C\xCB\xF3\xC2\x5B\xCB\xEA\x5F\x58\xB1\xEF\xCB\x82\xC9\x8C\xC4\x84\xC9\x8E\xC4\x2B\xB7\x8B\x9C\xB6\xC1\xDD\xCD\x96\xA0\xDF\xCD\xC8\xCD\xE1\xC4\xF0\xC9\x1F\xCB\xF8\xCA\xCE\xCA\xFA\xCA\xA8\xC9\xFC\xCA\x25\xCB\x7B\xC9\xB7\xCD\x0E\xC5\xDC\xC9\x74\xB1\x69\xC7\x8A\x8D\xF6\xCD\x44\xA8\xF8\xCD\xAC\xCD\x82\xB2\x1D\xC6\xBF\xB5\x1F\xC6\xB6\xC0\x21\xC6\xB8\xC0\x09\xC6\xD4\xC6\x96\xCA\xD1\xCD\xF4\xC6\x5B\xCA\xF6\xC6\xB2\x75\x75\xCD\x45\x99\x8A\xCD\xFA\xB4\xC4\x65\x0A\xCE\xE2\xB9\x0C\xCE\x8C\xC9\xCE\xC6\x83\xCB\x93\xCD\x85\xCB\x95\xCD\xAF\xC5\x97\xCD\xAE\x9D\x99\xCD\x86\x97\xF6\xB6\x47\xCA\xE0\xC1\x42\xC6\x96\xAA\x0C\xBF\xBA\xCD\xA2\xB1\xAD\x86\xA4\xB1\xCB\xAD\x14\xBF\x06\x88\xAD\xC6\xA7\xCD\xCC\x7C\x24\xCE\xA1\xC9\x01\xC5\x51\xCB\xE2\xCD\x9E\xCB\x54\xCB\xA0\xCB\x9C\xC6\xA2\xCB\x5E\xC5\xA4\xCB\x44\xC5\x1B\xCE\x32\xC4\xDE\xC9\x62\xBF\xE0\xC9\xC0\xB1\x83\xBF\xE3\xC9\x30\xC5\x51\xA5\xE6\xC9\x2E\xCB\x42\xC6\x27\x09\x22\xCE\xFC\xCC\x3B\x72\x90\xCD\x0D\xCE\x4D\xB4\x0F\xCE\x82\xC2\x8D\xC1\x6B\xC2\x8F\xC1\x6D\xC2\x15\xCE\xBC\xCB\xD5\xC6\x6F\xCA\xA0\xC4\xC1\xCA\x8A\xC0\x06\xCE\x7A\xB8\xDE",
"\xB1\xAD\xCB\x15\xC5\x26\xC2\xCC\xC0\x27\x01\x5B\xCE\x3D\xCD\xBF\xBA\xAB\xCD\x25\xCE\x5A\xC9\xED\xC5\xCA\xCD\x74\xC9\x20\xCB\xF3\xC9\x22\xCB\x00\xCE\x24\xCB\xB5\xCD\x26\xCB\x04\xCE\x7D\xC9\xED\xC4\xA3\xC6\x9C\xAB\x77\x8C\x3A\xA3\x53\xCE\xC2\xB1\xE4\xC9\x56\xCE\x1B\xCA\x97\xCB\x47\x62\x76\xCE\x92\xB9\x1E\xAA\x5E\xCE\x7A\xCE\x1C\xCB\x7C\xCE\x84\xCB\xF9\xA3\x86\xCB\x57\x9B\x88\xCB\x68\xB6\x29\xCA\x81\xC6\x59\xCB\x51\xC6\x99\xC9\xE7\x61\x4B\xA6\x48\xC5\x6B\xC6\xF2\xC4\x18\xCA\x40\xC2\x61\xCB\x92\xB0\x89\xBF\x1B\x84\xF5\xCD\x3F\xCE\xA4\x18\x79\xCE\x41\xCE\xEB\xC6\x27\xCE\xA3\xCA\x92\xCA\x37\xC6\x94\xCA\x16\xCE\x98\xCD\xBE\xCB\x0C\xC5\x86\xCE\xAD\xC9\x4C\x60\x39\xB2\xA6\xB4\x01\x01\x94\xCE\x14\xBA\x84\xA9\xB4\xCE\xB6\xC9\xF4\xCA\xFA\xCD\xB7\xCB\xCC\xCA\xFD\xCD\x21\xCB\xFF\xCD\xF5\xC9\xB4\xCD\xF7\xC9\xB6\xCD\xF9\xC9\xEC\xC4\x73\xA6\xB1\xBF\xC4\xCE\x00\x00\xC6\xCE\x21\xBA\xC8\xCE\xC7\xCD\x5F\xCE\x77\xB4\x03\xC6\xAE\xBE\x83\xC2\x64\xCE\x85\xC2\x66\xCE\xB3\xBE\x2C\xCE\x0F\x9E\x2E\xCE\x9C\x9C\x30\xCE\x5A\xCB\x4D\xCE\xA9\x72\x74\xCA\x59\xCE\x75\xCE\xB2\xCE\xE2\x12\xC9\xCE\xED\xC9\x6B\xB2\xB6\xCB\x7D\xCE\xA2\x9A\xE3\xCD\x2E\xC3\xE5\xCD\x30\xC3\xE7\xCD\xF9\xAC\xA3\xCE\x83\xC6\xA5\xCE\xD6\xBF\xEA\xCA\xA8\xBE\x10\x5F\xA4\xC5\x9D\x84\xF3\xCE\x8E\xCD\xB3\xCE\xDF\xCE\x98\xCE\xAD\xCD\xB8\xCA\x7B\xCA\xCC\xCD\x6B\xCA\xCE\xCD\x6D\xCA\xD0\xCD\x6A\xCE\xD7\xC6\x6C\xCE\x43\x62\xB7\xC5\xB3\x77\xC3\xCD\xF4\xCE\x52\x17\xF6\xCE\x07\xCA\xA9\xC2\x97\xC6\x49\xC6\x7C\xC6\xF1\xC5\x7E\xC6\xF1\xB5\xA1\xCE\x10\xCA\x8C\xCB\x12\xCA\xFA\xC9\xB1\xB5\x7A\xB2\xFA\xC3\xB2\xCA\x04\xA2\x09\xCE\x1F\xCF\x97\xCE\xB5\xCE\x8D\xC9\x9A\xCE\x28\xCE\x9C\xCE\x2A\xCE\x87\xCB\xE9\xCE\xAB\x9E\xEB\xCE\x5A\x9E\xED\xCE\xA4\xCE\x13\xCA\xB1\xAF\xC4\xCA\x9D\xAF\xB1\xCE\x0C\xCF\xF5\xCE\x0E\xCF\x37\xCF\x26\xCE\x39\xCF\xB8\xCE\x94\xCD\xBA\xCE\x96\xCD\xBC\xCE\x2D\xCE\xBE\xCE\x7C\xA3\xC0\xCB\x4D\xAC\xC3\xCA\xFA\xC5\xD5\xB2\x1E\xCF\x49\xCF\x20\xCF\x4B\xCF\xCA\xCE\xD0\xC0\xCA\xCA\x9B\xCE\x1B\xA4\x9D\xCE\x9F\x9B\x9F\xCE\x7E\xBE\x50\xC2\x8B\xCB\x02\xCF\x8D\xCB\x04\xCF\x53\xC6\x2B\xCB\x08\x86\x14\xC6\x27\xAE\xDC\xCE\x60\xBA\xDE\xCE\xE0\xCD\x8C\xAD\x69\xCA\x13\xCF\x7D\xCA\x15\xCF\x7F\xCA\x17\xCF\xBF\xCA\xD0\xC4\x1A\xCF\xBB\xBE\x50\xC0\xD4\x0D\x9A\xA6\xDA\xCE\x73\xCF\x6C\xBA\x75\xCF\xF9\xCD\x1C\xC5\xFB\xCD\xCB\xCD\xD1\xC6\xBA\xCB\xD3\xC6\x68\xCE\x17\xCE\x18\xCF\x2F\xC9\x57\xCF\xE6\xAC\x99\x8B\xD5\xCC\x59\xB6\x41\xC6\xCF\xB4\x8C\xCD\x35\xCF\x21\xCF\x21\xCA\x12\xC3\x23\xCA\x9D\xCB\x54\xCA\x26\xCA\x56\xCA\x28\xCA\x58\xCA\x96\xC9\xE9\xCD\x34\xC3\xEF\xCE\xF3\xA6\x54\xC6\x9B\xC3\x56\xC6\x74\xCE\x3E\xCE\x5D\xCF\x36\xCF\x60\xCF\x66\xCA\xDD\xCA\xFA\xCE\x81\xAE\xB0\xB4\x65\xCF\xE2\x9B\x67\xCF\xBB\xC0\xAB\xAF\x92\xCF\xC1\xC9\x80\xCF\xD9\xC6\x1E\xAD\x5D\xCB\x38\xB0\x44\xCB\x9F\xC3\x40\xA3\x4D\xB3\x64\xCB\x0B\xCF\xA9\xCD\x0D\xCF\x76\xCF\x12\xAE\xFB\xCE\x45\xCE\xE4\xCD\x47\xCE\x56\xCB\x49\xCE\xF5\xC5\xF8\xC9\xD3\xCD\x6D\xCF\x85\xC6\x5A\xCD\xC9\xA4\x88\xC6\x53\xB0\xA7\xB6\xD8\x97\xAB\xC0\x4B\xC5\xB1\xCA\x63\xCB\x92\xCE\x21\xCE\x9C\xCF\x5F\xCF\xF7\xCE\xA4\xB5\x7A\xC6\x25\xCF\x91\xC9\x27\xCF\x93\xC9\x29\xCF\xA6\xCF\x2A\xCA\xA8\xCF\x4B\xC4\xAA\xCF\xC2\xC0\x75\xCB\x3F\xA6\x77\xCB\x78\x9F\x79\xCB\xBF\xC3\xE7\xC9\x77\xAE\x5A\xCE\xE6\xCF\xCD\xCF\x34\xB6\xCF\xCF\xA2\xCF\x9F\xCB\xA4\xCF\xA1\xCB\x2A\xCF\xA3\xCB\x2C\xCF\xA5\xCB\xD8\xCF\xB6\xB3\x90\xCB\xB8\x75\xBE\xB8\x2F\xA5\x60\xAD\x34\xCA\xC6\xC6\xE4\xCF\x9B\xCF\xB1\xCF\x9D\xCF\x3C\xCA\x10\xCF\x09\xCB\x53\xCA\x0B\xCB\x41\xCA\x0D\xCB\x43\xCA\x3A\xCB\xBB\xC6\xF2\xCF\x86\xC4\xF4\xCF\xBF\xC6\xA8\xCB\x40\x98\x6D\x8A\x78\xCB\xF4\xC3\x4C\xB3\xFC\xC3\x06\xB9\x93\xCE\xFF\xCF\x89\xCF\x3A\xC5\xB6\xCF\xBC\xAF\x5B\xC0\xED\xCF\xFE\xCE\x47\xC4\x20\xD0\x45\xCA\x22\xD0\x9F\xC5\x24\xD0\x8D\x97\xAC\xCF\xC4\xC0\x13\xC4\xF9\xA6\x1F\xB7\x06\xA9\x00\xC7\x61\x99\xC6\xCB\xFC\xB3\x2D\xCB\x01\x01\xCF\x00\x4D\xAA\xF2\x75\x43\x35\xE6\xC2\x7A\x59\x81\x05\x24\xC1\xCC\x0E\x93\x4E\x78\xCD\x09\x5A\xA9\x59\x65\x09\x48\x59\xF3\xCB\x89\x17\x4E\x77\xFA\x0D\xD1\x00\x21\xA7\x29\xC8\x9C\xC9\x00\xAD\x90\x0B\xB6\x2D\xF2\xCB\xA6\xC3\xE9\xB8\xEA\x02\x94\x08\x5F\xD0\x3A\xC3\x33\xB8\x20\x01\xCA\xBB\x0A\xC9\xD4\xC7\xF4",
"\xBD\x85\xC8\xB0\xBD\x96\x0C\xD7\x74\x22\x7A\xBA\x70\xF6\xA8\x7E\x5A\x56\xD0\x0F\x2B\x7E\x59\x59\xD0\x2D\x09\x94\x08\xB2\xB5\xD0\xC1\x25\xB8\x24\x02\x00\xA2\x09\x56\x83\x1E\x8E\xB0\xD9\xB3\x89\x17\xF3\xBE\xDC\xCC\x72\xC4\xFB\x0D\xE2\xA7\xE8\xCC\xF2\x3E\x7E\x5A\xA7\x56\x73\x3A\xE0\xC8\x91\xB7\xFF\x59\xCC\x0E\xD3\x00\xE5\xBC\x15\xBB\x73\x28\xB1\x59\xEF\x66\xAE\x3F\x03\x5C\xFA\x0D\xD2\x00\x21\xA7\xA0\xD0\x60\xD0\x91\xA2\x9A\xD0\x4B\x39\x2B\x61\xAE\x3F\x94\x08\xA2\xD0\x10\x69\xAE\x3F\x22\x7A\x9E\x10\x5C\x39\x44\x94\x84\x7B\xC9\x1C\xAA\x27\x8A\xD0\x24\xC1\x8D\xD0\xC9\xBC\x09\x01\xCB\xA9\x06\xBE\x1E\xB7\xAF\x8C\xAC\x94\x5A\xB7\x00\x00\xD4\x00\x03\xA1\x83\x5E\x2C\xB7\xD5\xBB\x50\x90\xBE\x7A\x6C\x93\xDC\x84\xD6\xAC\x22\x7A\xEE\x08\xC6\x20\xB0\xD0\x0C\xAA\xF4\xB3\x95\xD0\x27\x01\xC0\xD0\x66\xB4\x6F\xA2\xCA\x0C\x74\x31\xF3\xB3\x22\xB0\x33\xB3\xF2\x01\xB6\x70\xC3\xD0\x9A\xBB\x00\x00\xD5\x70\xDB\xA8\xE5\x0C\xD6\xD0\xC7\xA9\x3E\xB1\xF2\xB3\x8C\x01\x94\x08\xC7\xD0\x61\x50\xCA\xD0\xD6\x08\xCC\xD0\x67\xA9\xD7\x92\x65\x94\x03\x5C\xB4\xBB\x03\x01\xD5\x00\xC1\xD0\xD4\x0D\xBA\x7A\x00\x00\x91\xA9\x40\xB8\x51\xA2\xD5\xD0\xD4\x3F\x68\xB2\x84\xAB\xF8\xB3\x66\x82\xD2\xD0\xCC\xCB\xC5\xC7\xFE\x92\x83\xA7\xD5\x70\x50\x7B\xE8\xD0\x48\x91\xEA\xD0\x08\x0A\xEC\xD0\xB6\xA9\x03\x5E\x09\xA7\xBE\xD0\x01\xD1\x15\xC7\xFA\xD0\x73\x28\x6A\x30\x36\xAA\xC8\xD0\x46\xB1\xDA\xD0\x3D\xB7\x04\xD1\xC6\xBB\xC4\x92\x75\xB1\xA9\xA2\xFB\xD0\x3D\xB1\x17\xD1\xE5\xD0\x16\x01\xE7\xD0\x3C\xB2\x0A\xD1\x72\x0A\x0C\xD1\xCE\xD0\xBD\xD0\xFF\x59\xF6\xD0\xF8\xD0\x12\xD1\xD4\xD0\x14\xD1\xE2\xD0\x0B\xAA\x06\xB0\x89\xAF\x28\xBC\xE2\xB3\x60\xBD\xD7\x00\x98\xD0\x27\xB2\x61\x0D\xB6\x39\x1D\xA9\xFC\x3F\x31\x4E\x4C\xB3\xFA\x0D\xEE\x24\x1C\xD1\x02\x01\x43\xD1\x08\xCE\x92\xC8\x3D\xD1\x62\x8C\xB6\x39\x94\x08\x46\xD1\xB7\xAF\xB6\x39\x22\x7A\x93\x0C\xEB\x39\x81\x4E\x3E\xC2\xFE\xB4\xCF\xD0\x8B\xBE\xD9\x00\x3A\xD1\xDE\xC6\x62\x4D\xA0\x31\xE0\x29\x01\xAA\x31\xB7\x8F\x92\x1A\xD1\x06\x01\xCE\xA8\x83\xA7\xD0\xA8\xD6\x99\xD2\x01\x80\x55\xA3\x30\x2E\xBE\x4C\x54\xA2\x50\x24\xD1\xEB\x93\x2D\xA2\x5F\xD1\x51\x44\x09\x6A\x61\x50\xB4\xD0\xFB\xA1\xBE\xD0\xCC\x2C\x02\xD1\xFB\x0D\xCD\xA8\xCF\xA8\x61\xB7\x6E\xD1\xA1\xB8\x94\xB6\xBA\x32\x72\xD1\x48\x91\x74\xD1\xA4\xBA\xCD\xCB\x64\xB4\x59\xD1\xA4\x83\x8E\x0C\xC3\x55\xD7\xD0\x5A\xC2\x15\xB6\x8D\x4E\xEF\xD0\xD0\xD0\x09\x01\xDB\x00\x87\xD1\xF9\x0C\x8A\xC6\x2C\x59\x64\xD0\x1E\x96\xBF\xA9\xDB\xD0\x09\x01\xBE\x19\x44\xD1\x46\xC8\xA3\xD0\x89\xC6\x0F\xA1\x37\x08\x51\x3E\x94\x0B\x3E\xD1\x01\x36\x00\xBB\x40\x82\x01\x36\x6D\xD0\x6F\xD0\x6F\xD0\x21\xBD\x8A\xC8\x72\xD0\x5F\xBD\xAF\xA7\xBE\xD0\xFE\x04\xD3\xD0\xB5\x9E\x76\x07\x6B\x3A\x21\xD1\x91\xD0\xB0\x2D\x9E\xD0\x27\x01\x1B\xAA\x9D\xD1\xE4\xA7\xE1\xA9\x02\x72\x01\x02\xBC\x56\x16\xD1\xB9\xD1\x3F\x1C\x94\x08\x83\xBB\xDC\x95\x72\x3A\xB0\x2D\xFF\xA9\x2A\xAA\x6E\xA9\xFA\xA7\xB1\xD1\x90\xD1\x06\x01\xF4\x26\xF9\xD0\x68\xC9\xCD\x07\x6D\x37\xDB\x59\x23\xC3\x4A\xA4\x37\xA7\x9A\xD1\x06\x01\x9C\xD1\x90\xBB\xAB\xBD\x1E\xD1\xD3\x0D\x55\x59\xC3\x3D\xD8\xD1\x3E\x97\xDA\xD1\xAD\x1F\xA7\xD1\x35\xA5\x70\xA9\xAD\x1F\xAA\xD1\xEF\xC7\x0A\xC9\xAD\xD1\x1C\xC9\xAF\xD1\x3C\xC8\xEE\xB9\xD1\xD1\x03\x01\xE0\x00\x93\xD1\x50\x95\xDC\x32\x6B\xB4\x41\xCC\x96\xCE\xFA\x02\x5B\xD0\x27\x01\x63\xD1\xBE\xD1\x65\xD1\xC5\x85\xFA\xD1\x36\xD1\x6E\xCC\x78\xCE\x6D\x2F\x7D\xD1\x5C\xCE\xC6\xCD\xED\xD1\xE4\xD0\xD9\xD0\x5D\xA9\x20\x1B\x21\xA7\x7E\xA9\xE1\xD1\x80\xA9\x05\xD2\x8B\xD1\x07\xD2\xFD\xD1\x09\xD2\x09\x01\x13\xD2\xC5\xCD\x0D\xCF\x59\x5A\xCD\x09\xD8\x3A\xB0\xD1\x53\xA1\xC6\xCD\xB9\x7B\x03\x5C\xC5\xBB\x03\x01\x1C\xD2\x88\x74\xBE\xD0\xF7\xD1\xB4\xD1\x0D\x97\x00\x03\xE3\x4E\x33\xD1\x69\xC7\xC6\xCD\xFF\xD1\x09\x01\x01\xD2\xDF\xD1\xD8\x8F\x4D\xA9\x65\x86\x16\xD2\xE3\xD0\x7D\xCC\x19\xD2\xD8\xA8\x16\xD0\x66\x00\x0D\xD2\x22\xD1\x0F\xD2\x8D\x01\x72\xA9\x12\xD2\xC0\xD1\x29\x95\x3B\xD2\x31\xD2\xFC\xD1\x5D\xCE\xFA\x02\x94\x08\x29\xD2\xF7\xCD\x1E\xD2\xDC\x95\x1C\x57\x9B\x92\x6C\x2F\x3C\xBC\x03\x5C\x9F\xA7\x2A\xB7\xD4\x0D\xA9\x07\x01\xBB\xE5\xB3\x1F\xC9\x3A\xC9\xF0\xAD\xA7\x00\x2F\xD0\xE0\xCE\x1D\xB5\x70\x9C\x8C\xC1\xC8\xB3\x84\xC2\x99\xB4\xE7\xCE\x91\xC1\xD4\xB6\x93\xC1\x2C\xC4\xE3",
"\xC5\x24\xBF\x71\xB1\xB9\xCD\x60\xBF\x6A\xBE\x52\xC4\x36\xC9\xEB\xAD\x37\xC4\x6F\xBE\xA5\xCD\xE8\xC9\x9A\x5F\x63\xD2\x0F\xCF\x0E\xCE\xE2\xCE\x1E\xC6\xE4\xCE\x06\xC6\x65\xCE\x08\xC6\xE8\xCE\x53\xCF\xEA\xCE\x55\xCF\x66\xA5\xC0\xCF\xC3\xC9\x33\xCE\x6E\xAE\xE3\xC1\x39\xC2\x37\xCE\x4E\xC9\x53\xC4\x8A\xBE\x24\xC1\x58\xC4\x75\xCA\x62\xD2\x40\xD2\x00\xD0\x31\xC0\x02\xD0\x1C\xD0\x55\xCA\x1E\xD0\x57\xCA\x38\xD0\x59\xCA\x71\xCB\x3F\xC1\xD4\xCD\x6D\xC4\xD6\xCD\x05\xAE\x6A\xC9\x24\xC2\x90\x97\x05\x87\xDB\xCD\x61\xD2\x7E\xD2\x4C\xCF\x7B\xCE\x5D\xC6\x32\xD0\x5A\xC0\x3D\xBF\xE1\x9B\x6F\x9E\xCF\xCD\xA8\xCA\x18\xCE\x98\xCA\xD6\xCE\x98\xC1\xBC\xBE\x87\xA2\x24\x87\x09\x99\x9D\xC1\xAB\xD2\x8B\xB4\x90\xC4\x8A\x8D\x99\xD2\xCB\xCF\x4A\xCF\x9B\xD2\x45\xC0\x9D\xD2\x36\xCB\x0C\xCB\x38\xCB\x0E\xCB\x6F\xCB\x78\xC1\xA4\xD2\x7A\xC1\xA6\xD2\x62\xC5\xE3\xB3\x47\xD1\x8B\xBF\xC8\xD2\x1D\xD2\xCA\xD2\x30\xD0\x56\xC5\xB4\xD2\x1F\xB5\x18\xAF\xB8\xAD\x1A\xAF\xF9\xB2\x40\xBF\xB5\xB4\x13\xB7\x9A\xCD\x44\xBF\xC0\xC0\x46\xBF\xAF\xC9\xDA\xB0\x98\xD2\xB0\xD2\xB3\xCF\xA1\xCA\x62\xCF\x3A\xCF\x64\xCF\x3C\xCF\x9E\xCE\x3E\xCF\x12\x9F\x40\xCF\x25\xA4\x42\xCF\x03\xCF\x4B\x8B\xC4\xC9\x4F\xC4\xEF\xB4\xD5\xC4\xC8\xC9\xA0\x62\x12\xBF\xD6\xB4\x84\xB7\xFC\xCF\xA4\xB3\x7D\xD2\x9A\xD2\xDE\xD2\x6C\xC5\xE0\xD2\x67\xD2\x20\xB5\x69\xD2\x22\xB5\x6B\xD2\x87\xC2\x21\xB6\xD4\xCF\x9E\xC6\x3A\xD0\x67\xC6\xEB\xCD\x01\xD3\x2A\xC5\x2C\x8C\xE1\xC9\x91\xCB\xF6\xB8\xA1\xAB\xAC\xCE\x87\xBF\x62\xCB\xFF\x00\x0A\xC2\xED\xA3\xDB\xD2\xDE\xCD\xCC\xCF\x0C\xD3\x81\xC5\x68\xC2\x83\xC5\x06\xB6\x85\xC5\xD0\xCA\x80\xCA\xFD\xCA\xD9\xC9\x27\xCB\x4A\xC3\x67\xC9\x12\xB5\xFE\xC9\xAD\xCE\x42\xC2\x7E\xAB\x08\xD3\xB3\xAF\x27\x5F\xF0\xD2\xE8\xCF\x3E\xC3\x8A\xCF\xCD\xCE\xFC\xCD\x79\xCF\xBB\xCA\x7B\xCF\x31\xD3\x7D\xCF\x33\xD3\x82\xCA\x35\xD3\xED\xB4\xDC\xC9\x15\xCA\xCB\x99\x17\xCA\xC3\xAB\x19\xCA\x5D\xC2\x33\xB5\x3D\xD3\x35\xB5\x3F\xD3\x0B\xD3\x64\xD2\xCC\xB6\x81\xD2\x10\xCE\x83\xD2\x20\xC6\x85\xD2\x22\xC6\x67\xCE\xB9\xD2\xBD\xCB\xBB\xD2\xAA\xCA\xC0\xCE\xAC\xCA\x4F\xD3\x2F\xCA\x73\x71\x1C\xB2\x3D\xC2\x54\xCE\x54\xD3\xE5\xC9\x3F\x96\x8A\xBF\x04\xCB\xD0\x60\x40\xD3\x22\xCF\xC7\xC3\xA2\xCA\xB9\xCA\x46\xD3\xF9\xCA\x48\xD3\x23\xCB\x32\xD3\x02\xCE\xD3\xCA\x68\xD3\xD5\xCA\xC2\xCE\x4A\xCA\x12\x9A\xC7\xD2\x76\xD3\x9E\xCF\x51\xCA\xB7\xCE\x7A\xD3\x8D\xCF\xCD\xCD\x8F\xCF\x64\xD3\x69\xCE\x7E\xCF\x89\xC5\x4D\xD3\x27\xC5\x01\xCB\xD9\xCE\xA5\xC4\x94\x60\x88\xD3\x18\xD0\x80\xD2\x66\xD2\x04\xC6\x5F\xD3\x12\xCE\x61\xD3\x14\xCE\x87\xD2\x90\xCF\xBD\xCE\x66\xD3\xBF\xCB\x8C\xD2\x72\xCA\x73\xA6\xF1\xCE\x9A\xCF\xDC\x67\x28\xD3\x51\xD2\xDD\xD2\x5B\xD3\x8A\xC1\x9D\xD3\xE3\xCE\x63\xCE\x84\xD2\xE6\xCE\x86\xD2\x6C\xD2\xBA\xC0\x6E\xD2\x0A\xC5\x70\xD2\x16\xC0\xE5\xC5\x27\xB6\x3D\xC0\x8A\x95\x09\xCF\xDC\xBF\xE4\xB3\x5A\xD3\x7F\xD2\x60\xCE\x5D\xD3\x62\xCE\x68\xD2\xE5\xCE\x6A\xD2\xB8\xD3\x14\xD3\xB5\xBE\x31\xC3\x01\xCF\x18\xD3\xA0\xC6\x44\x5F\x9B\xCA\xF2\xCE\xCE\x5F\x9A\xD3\x50\xCA\xA2\xC9\x8B\xD3\x12\xCF\x8D\xD3\x14\xCF\x8F\xD3\x16\xCF\xBA\xD2\xBE\xCF\xD2\xCD\xF7\xC5\xD6\xD2\x8D\xA6\x3E\xD0\x2A\xD0\xE2\xC2\x33\xCF\xB6\xC1\xAE\xD3\x0B\xCE\x2A\xD3\xB1\xD3\x02\xC6\xB3\xD3\x82\xD2\xB5\xD3\x60\xD3\xB7\xD3\x62\xD3\xA3\xD3\x90\xD3\x91\xCF\x92\xD3\x64\xC9\x94\xD3\x8B\xC5\x01\xCB\x1A\xC0\xE2\x91\xEC\xD3\xD9\xD3\x65\xCA\xF2\xD2\xB5\xCF\x63\xCF\x36\xA4\xB9\xCF\xB8\xD2\xE1\xD3\x65\xD3\xE3\xD3\x19\xCE\xE7\xCA\x3C\xD0\xB9\xC4\xFB\x0D\x8A\xA6\x5B\xB6\xD8\xD3\xC6\xD3\xB1\xD2\x99\xCE\xB3\xD2\x07\xD4\xF8\xAA\x09\xD4\xA7\x9E\xF8\xD2\x3E\xA2\x4B\xD3\xC0\xCA\xFD\xD3\x66\xC9\x29\xCB\x6F\xB6\x85\x98\x58\x89\xCC\xAF\x02\xD4\x16\xD4\xF1\xD2\xE5\xC3\x79\xD3\xDD\xD3\xA4\xCA\x8E\xCF\xA6\xCA\xF9\xD3\xA5\xD3\x0D\xD4\xBC\xD2\xD7\xCF\x44\xCF\x21\x81\x2B\xC6\x43\x92\x29\xD4\xC9\xD2\x5E\xCF\xCB\xD2\x40\xC3\xCD\xD2\x6B\xCB\x37\xCB\x6D\xCB\xE3\xCA\xD2\xD2\x8A\xC2\xD4\xD2\xF5\xC6\xE6\xD3\xFD\x9A\xCC\x0D\x69\x92\xE2\x00\x7E\xB7\x94\xA4\x39\xAA\x18\x85\xED\xD3\x23\xCE\xEF\xD3\xC7\xD3\xE1\xCE\xF2\xD3\x5E\xD3\xF4\xD3\xA0\xD3\xF6\xD3\xA2\xD3\xB9\xD3\xBB\xCF\xBB\xD3\x0C\xC6\x0B\xC5\x56\xCF\xA8\xD3\xC1\xCB\x78\xB2\x7F\xD0\x66\xC3\xD5\x97\xAE\xCF\xE6\xB6\x59\xD3\x3C\xD4\xB2\xCF\x41\xD3\x97\xC2\xDB",
"\xC5\x8C\xD3\x2F\xD4\x8E\xD3\x31\xD4\x0B\xD4\x91\xD3\x20\xD4\x7F\xCF\x22\xD4\xDB\xC9\xF1\xC3\xCC\xB9\x3F\x74\xBC\xBB\x44\x72\xE7\x01\x6E\xC6\xAB\xD2\x70\xC6\x58\xCE\xFD\xB6\xB9\x67\x52\xD4\x0B\xD2\x54\xD4\x17\xD4\x19\xD0\x34\xCB\x1B\xD0\xCE\xD2\x1D\xD0\xD0\xD2\x1F\xD0\x45\xD4\xE5\xCA\x47\xD4\x1A\xCE\x49\xD4\x2B\xA5\x6A\xC6\x8D\xCE\x40\x7B\x8A\xC6\xAA\xC0\xC6\xCF\xC5\xB1\xE3\xCF\x57\xD3\x0E\x69\x87\xD4\x77\xCE\x19\xD2\x3E\xD4\x73\xC9\x40\xD4\xB0\xCD\x42\xD4\xB2\xCD\x6E\xCB\xF6\xC9\x70\xCB\xD6\xCF\xE5\xD3\x0B\xD0\x74\xCB\xD8\xB3\x52\xB0\xA7\xC6\x7C\xB3\xC3\xB6\x71\xD3\x00\x9F\xC9\xCF\x15\xD4\x6C\xD4\x17\xD0\xDA\xD3\x42\xCE\xDC\xD3\xAF\xCD\x7F\xCE\xB1\xCD\x81\xCE\xD2\xCE\x01\xCE\x84\xCE\x03\xCE\xBD\xD2\xF0\xC3\xDA\xC6\x4F\xCE\xA4\xC6\x52\xD3\xE1\xB6\x22\x98\x3A\xD3\xDC\xC3\xE4\xC0\xB9\xD4\xC5\xD3\xBB\xD4\xE7\xCF\x77\xD3\xEE\xC9\x92\xCD\x4F\xCF\x29\xCE\x51\xCF\x2B\xCE\x88\xD2\x3F\xCF\x8A\xD2\x96\xAB\x82\xD3\x00\xCB\x7B\xD4\x5E\x65\xAA\xB0\xF1\xC4\xAC\xB0\x29\xD0\xA9\xCB\x04\xAD\x2C\xD0\x5D\xB6\xC4\x65\xA2\xD4\x95\xCE\x4D\xD2\xD6\xD4\x89\xD3\xDB\xD3\x4E\xCF\x71\xD4\xB9\xCE\xA5\xCA\xBB\xCE\xA4\xD3\x54\xCF\xA6\xD3\xBF\xCE\xC8\xD4\x05\xCE\x85\xCA\xF8\xC6\x67\xD4\xD8\x8A\xC5\xCB\x02\xC7\x43\xD0\xDE\xB3\xD6\xB0\xCB\xCB\xFE\xB9\x5A\xAA\x75\xCA\xE9\xB3\xA6\xB3\xA5\xD4\x8B\xCF\x7E\xCE\xCF\xCE\x80\xCE\xD1\xCE\xB3\xCD\xC5\xD4\xD4\xCE\x85\xCE\xFE\xD4\x66\x6A\x73\xD2\x43\xC1\x9B\x9E\xBC\xCD\x2A\x87\xD3\xA5\x36\xC4\xA3\xCD\x7A\xD2\xB0\xC9\x09\xB4\xC4\x65\x0D\xD5\x70\xC8\xAB\xB2\x17\xB6\x4F\xCB\xB7\xC9\xCC\xCE\x0E\xD3\x9E\xD3\x59\xD4\xB1\xB4\xE4\xD2\xB3\xB4\x94\xAF\x22\xA4\xF4\xB6\x2F\xCE\x9B\xCD\xC0\xC0\x1B\xD5\xE4\xC1\xF0\xB0\x34\xC4\x88\xBE\x15\xB1\xCA\xC1\x04\xC7\x57\xC4\x68\xC1\xD7\xD3\x06\x01\x27\xD5\x7F\xC8\x44\xD2\x0F\xD5\x44\xD3\x8C\xCF\x72\xD4\xDF\xD3\x74\xD4\x7C\xCF\xE2\xD3\xFB\xD3\x70\xCA\x63\xD4\x58\xCF\x64\xC0\x6E\xC4\x5F\xB4\xA2\xBE\x62\xB4\x8B\xD0\xFF\x00\x6D\xC9\x0C\xD5\xC2\xB3\xD7\xD4\xF8\xCE\xD9\xD4\xF6\xD4\x50\xCF\xF8\xD4\x52\xCF\xFA\xD4\x89\xD2\xFC\xD4\x62\xD4\x79\xD4\x84\xCA\xBF\xD2\xC7\x0D\xBE\xBE\x89\xB4\x6B\xC9\x86\xC9\x8A\x8D\x46\xD5\xA1\xC8\x48\xD5\x2B\xD3\x70\xD4\x2E\xD4\xF7\xD4\x30\xD4\xF9\xD4\x32\xD4\xFB\xD4\x34\xD4\x67\xD3\x19\xD5\xC1\xCE\xA3\xC4\xD8\xD2\x4C\xD2\x72\xD5\x5E\xD5\xF3\xD4\xBE\xD4\xF5\xD4\x78\xD5\x63\xD5\x7A\xD5\x65\xD5\x7C\xD5\x67\xD5\x7E\xD5\xA7\xD3\x6A\xD5\xC2\xCA\x55\xD5\x7A\xB7\xE5\x8B\x7B\xD2\x3A\xC4\xDC\x67\x73\xD5\xBF\xC8\xFA\xB0\xA2\xB5\xC9\xD1\x6F\xD4\x43\xCE\x98\xC6\xFC\xCE\x3E\xC5\xD2\xCF\xE6\xCD\x16\xD3\x58\xCB\xD3\xD3\xBD\xC6\x32\xCE\xAC\xD3\x34\xCE\x6F\xAE\x4C\xC9\x92\xD2\x0F\xBF\x39\xCE\x6E\xBE\xDA\xC4\xD3\xD4\x03\x01\x9A\xD5\x01\xC9\x18\xD1\x2A\xD5\x81\xCB\x2C\xD5\x43\xD3\x2E\xD5\xB4\xD3\xCB\xD3\xB6\xD3\xCD\xD3\xF7\xD3\x5D\xD4\x1E\xD4\x03\xA5\x90\xD5\xFD\xD4\x36\xD4\x2E\xCF\x14\xCA\x01\xC2\x2A\x0B\x52\xCE\x6E\xD3\x8E\xCE\x55\xCE\xBE\xC3\x7C\x90\x34\xB5\x34\x76\xB6\xD5\x11\xC9\x75\xD5\xF0\xD3\x1C\xC6\xC9\xD3\x2E\xD3\x7A\xBE\x30\xD3\x7E\xD3\x4A\xD3\x80\xD3\xFE\xCA\xE2\xD4\x28\xCB\x6E\xCE\x38\xD3\x23\xC2\xE1\xCF\xA1\xC3\xFB\x0D\x73\xCE\x6A\xD4\x27\x01\xD5\xD5\x92\xC8\x5C\xAF\xD8\xD5\x09\xCA\x2D\xD3\x0B\xCA\x2F\xD3\x0D\xCA\x06\xD0\xF0\xCF\xA2\xCE\xA8\xD5\x48\xC9\x37\xD4\xE5\x66\xCB\xD5\xFA\x0C\x8C\xCE\xCE\xD5\xF4\xB4\x3F\xC2\x07\xC2\xE9\xD3\x32\xC5\x84\xD4\x15\xC1\x27\x09\xED\xD5\xE9\xC8\x35\xD1\xDF\xB4\x04\xD4\x2C\xD4\xF3\xD2\xDA\xD4\x3B\xCF\xDC\xD4\x3D\xCF\xDE\xD4\xF9\xD2\xE0\xD4\x1B\xAD\xC8\xD5\xD7\xCE\xCA\xD5\x56\xC2\x65\x9D\x5D\xA3\x32\xCA\xD4\x95\x95\xCB\x72\xD3\xB0\xCE\x8B\xBF\x09\xD6\xA5\xC7\x79\xB0\x2B\xD4\x22\xCA\x2D\xD4\xC0\xD4\x12\xD5\xC2\xD4\x14\xD5\xAB\xD4\xD3\xCE\xAD\xD4\xD5\xCE\x18\xD6\xBE\xD2\x82\xD5\xD0\x0D\x86\x9D\x3A\xB2\xB6\xC1\x24\xD6\xAB\xB1\xDE\xB0\xF0\xD5\xEA\xCF\x0A\xCA\x26\xCF\x4B\xC6\xF2\xC5\xEF\xCF\xA2\xD2\xA7\xCF\x94\xD4\x0F\xD4\x96\xD4\x17\x9E\x97\xD3\x15\xC6\x01\x01\x39\xD6\xCA\xB1\x3B\xD6\x55\xD4\x65\xD2\x0F\x9D\x2F\xD5\xBF\xD5\xF5\xD3\xC1\xD5\x5C\xD4\xCF\xD3\xE9\xBF\x09\xC5\x60\xD4\xBD\xD3\xD1\xC3\xBF\xD3\x6E\xB6\x95\x96\x1A\xB3\x45\xD5\x86\xD5\x9B\xD3\xC8\xD3\x57\xD4\xCA\xD3\x10\xD3\xCC\xD3\x12\xD3\xCE\xD3\xB4\xB4\x35\xD5\xE8\xD2\x37\xD5\xEA\xD2\x08",
"\xC3\xA5\x78\xE8\xD3\xEA\xD4\xD8\x6A\xC3\xD3\x7E\xB2\xEC\xD5\x62\xD6\xBD\xD4\xB6\xCE\x89\xD5\x2A\xD6\x7B\xD3\xFE\xCD\x7D\xD3\x82\xCE\x7F\xD3\xC6\xD4\x81\xD3\x80\xD5\x2F\x6B\xD6\xD3\xAC\xD3\x08\xD6\x78\xD6\x0D\xD6\x28\xD6\x0F\xD6\x62\xD5\xDB\xD4\x64\xD5\xDD\xD4\x66\xD5\xDF\xD4\x68\xD5\x8B\xD2\x92\xD5\x6D\xCE\x00\xD5\x06\xCF\xC7\xBE\x04\xAD\x7D\xA6\x27\xAE\x4C\xD6\x04\xB2\x69\xB2\x6E\xD4\x82\xCB\x7B\xD6\x8D\xD4\x41\xD4\xCF\xD2\x43\xD4\x39\xCB\x92\xD4\x10\xCB\x45\xD6\x12\xCB\x1A\xD3\x74\xAE\xF6\xC2\x89\x8D\x38\xD6\x89\xD6\xA0\xCA\x0E\xD6\x06\xD4\xF4\xD2\x08\xD4\xF6\xD2\x66\xCF\xC4\xD5\x34\xAB\x51\xD5\x6B\xCE\x95\xD6\xA2\xC4\x45\xCF\x5A\xCF\x77\xAE\x18\x85\x9D\xD6\x3B\xD1\x26\xD6\xA0\xD6\xBB\xD5\x31\xD0\x1A\xD4\xAA\xAC\xB7\xD6\xBA\xCF\xB9\xD6\xB9\xB2\x82\xD6\xE1\xD5\x84\xD6\x83\xD3\xC2\xCB\x66\xD4\x87\xCA\x21\xC3\xE4\x9A\xEC\xB2\x87\xC9\xB5\xD5\xB1\xD6\xF3\xCA\x61\xCF\xB4\xD6\x10\xD6\xF5\xD2\x12\xD6\xF7\xD2\x14\xD6\x1F\xD4\xE0\xD5\x34\xD3\xE2\xD5\x36\xD3\x24\xD4\x02\xCB\x3A\xD4\x23\xD6\xDB\xD6\x2B\xD5\xCB\xCE\xBC\xD5\xC9\xD6\x90\xAF\x1C\xD4\x0E\x9F\xCD\xD6\x9E\xB4\xE5\xD6\x4C\xD3\xE7\xD6\x4E\xD3\xFB\xC9\xEB\xB3\x18\xB3\x99\xCF\x5D\xC1\xB9\x67\xC3\xD6\xFD\xD0\xC5\xD6\x5F\xD5\xE9\xCF\x24\xCF\x3E\xD6\xEC\xCF\x40\xD6\x28\xCF\x88\xC2\xA8\xD6\x3B\xCB\xAA\xD6\x3D\xCB\x13\xCB\x20\x5D\xC1\xD3\xA8\x78\x48\xD0\x3C\xCE\x7C\xCB\x61\xD6\x0E\xD5\x76\xD5\xA0\xD5\xEB\xCF\xA2\xD5\x9A\xC6\xA4\xD5\xFF\xCE\xA6\xD5\x6A\xCF\xF9\xD5\x98\xC9\xFB\xD5\x09\xA5\x17\xB8\x86\xD0\x37\x75\x80\xD4\x92\xC0\xC5\xC6\xA5\x5B\x49\xCB\x3D\xCE\x17\xD7\x28\xD5\xEF\xD5\x4F\xD6\x5C\xD3\x65\xD6\xDB\xD5\xB7\xC0\xDD\xD5\x80\xD6\xDF\xD5\xCF\xD6\xE6\xD6\xD1\xD6\xE3\xD4\xCA\xD4\x69\xCD\x64\x7C\x27\xD7\x8A\xC6\x9B\xD4\x9E\xC3\x12\xD0\xA2\xC3\x14\xD0\x99\xD5\xED\xD6\xBA\xD5\xEF\xD6\xC8\xD6\xB5\xD6\x1B\xD4\xCB\xD6\x0A\xD4\x4F\xD5\x0C\xD4\xBB\xD6\x19\xCF\xBD\xD6\x81\xCF\x27\x94\xF6\xCF\xF1\xC4\xF8\xCF\x45\xD7\x90\x9B\xB4\xAE\x01\xD7\x3F\xBB\x78\xB6\x63\xD6\x56\xD4\x51\xD6\xBE\xD5\x67\xD6\xC0\xD5\x69\xD6\xC2\xD5\x57\xD6\xF8\xC1\x59\xD6\xFA\xD2\xFF\xBF\xFC\xD2\x6C\xCF\x24\xD7\xD9\xCF\xA9\xB0\x1C\xB7\xCD\xD4\x10\xD0\xE2\xB6\x20\xD6\xE4\xB6\x5D\xD7\x49\xD7\x3D\xC3\x9F\xD5\xBF\xD4\xA3\xD6\xA8\xD4\xA5\xD6\xAA\xD4\x44\xD4\xAC\xD4\xD3\xD2\xAE\xD4\x72\xCB\xB0\xD4\x8F\xCB\x26\xD0\x3F\xAD\xE8\xD4\xF9\xCF\x04\xD6\x84\x79\xE4\xC6\x5C\xAB\x88\xD6\x18\xD7\x3C\xD6\x06\xD7\xF2\xD5\x3F\xD6\x0C\xCA\x41\xD6\x0B\xD7\x83\xD7\x46\xD4\x85\xD7\xA5\xD2\x87\xD7\x1E\xC3\x01\xD5\xD5\xD6\xFA\xC6\x04\xD5\x09\xD5\xF9\xB9\xFD\xA6\x08\xD5\xE0\xB3\x79\x5E\x5F\xD2\x1C\xC4\x2F\xC1\x01\x01\xF6\xB3\x91\xB8\xB0\xB6\x19\xD7\x7D\xD7\xA1\xCF\x9E\xD2\xA3\xCF\xA0\xD2\xA5\xCF\x43\xD6\xF1\xCF\x0E\xD7\xEA\xCD\xAA\xD5\xFF\xD6\xBF\x98\x00\xD3\xC6\xC9\xE0\xA5\xA1\xCD\x78\xD2\x22\xD5\xF5\xB0\x1F\xCE\xD4\x9B\xC4\x65\xAE\xD7\x2D\xD0\x1A\xB5\xCA\xB6\x93\xD7\xA0\xCF\x44\xCE\x03\xD0\x46\xCE\x05\xD0\x48\xCE\x07\xD0\x4A\xCE\x09\xD0\x4C\xCE\xC9\x5D\x3A\xD5\x91\xD2\x33\xC4\x25\xB4\x41\xB4\x89\xBE\x40\xD5\x88\xCD\xC1\xCD\x4E\xA2\xF0\xAD\xC9\xD7\xED\xD4\xE8\xB5\x16\xB6\x9D\xD5\x03\xBA\x42\xD3\x4C\xD7\xDF\xD6\xB6\xD6\xE1\xD6\xB8\xD6\xE3\xD6\xC5\xD5\x53\xD7\x93\xCF\x53\xD5\x95\xCF\x94\xD5\xE2\xD1\xD7\xCD\x8D\x6F\xF3\xBE\x6F\xB4\xED\xA3\xE4\xD7\x60\xB8\x8D\xD1\xDE\xB4\x1D\xB3\x87\xD5\x7A\xD6\x19\xD4\x4D\xD7\xCA\xD6\xEE\xD7\xCC\xD6\xF0\xD7\xBA\xD6\x77\xD4\x93\xD3\xF9\xD6\x95\xD3\xFB\xD6\x6D\xD5\xC1\xD2\x86\x9C\xC3\xD2\xE7\xD5\xA0\x8B\xA0\xC1\x1F\xD5\x27\xAE\xFD\xD7\x6E\xB8\xCB\xD7\xE7\xD7\x49\xD5\xBD\xD5\xF3\xD3\x53\xD6\x5A\xD4\x55\xD6\x37\xD7\xC4\xD4\x83\xCE\x17\xD5\xC7\xD4\x32\xD6\xC9\xD4\x34\xD6\x68\xB8\x18\xD2\xD9\xD6\x02\x01\x19\xD8\x82\xB8\x74\xB4\x47\xB6\x8A\xD4\x9C\xD3\x63\xD7\x1F\xD8\x65\xD7\x54\xD6\x67\xD7\x56\xD6\x6B\xD6\x45\xA5\x36\xD5\xEC\xCE\x38\xD5\x70\xD6\x9B\xBF\x20\xAB\xBD\xB4\xAC\xD7\x00\x00\x2F\xD8\x7E\xD1\xE9\xB6\x95\xB6\x79\xD6\x38\xCF\x04\xD8\xEC\xD7\x4E\xD7\x07\xD8\x50\xD7\x49\xD3\x50\xD5\x0B\xD8\xFC\xD3\x0D\xD8\x6B\x77\xD9\xD7\x50\xC4\xBB\xCD\x64\x99\xD5\xB4\x3E\xAB\x3B\xCE\x1A\xBD\x58\xD3\x27\x01\x46\xD8\xAE\xB8\x77\xB6\xD1\xB5\x7B\xD7\xA1\xD6\x4C\xD8\x8D\xD6\x11\xD6\x8F\xD6\x13\xD6\x91\xD6\x15\xD6\x93\xD6\xE1\xD4\x3C",
"\xD7\xE3\xD5\x88\xCE\xDB\xC6\x90\xAE\x2F\xB5\x33\xCA\x2B\xD7\xFB\x0D\x26\xD3\x1D\xC4\x61\xD8\x0F\xD0\x63\xD8\xEA\xB6\x8A\xD6\x9F\xCF\x29\xD6\x7E\xD7\xC1\xD4\xA9\xD4\xC3\xD4\x15\xD5\x25\xD8\x30\xD6\x18\xD5\x28\xD8\xFF\xD4\x6C\xD5\x77\xCC\xFA\x0C\x13\xB5\x23\xD3\xAE\xCE\xE9\xD5\xB4\xAE\x7B\xD8\xCD\xB8\x7F\xD1\x0C\xD6\xB2\xD6\x8B\xD6\xDE\xD6\x68\xD8\xE0\xD6\x6A\xD8\xE2\xD6\x6C\xD8\xE4\xD6\x3A\xD7\xF8\xD6\x70\xD8\xE8\xD6\x6A\xD3\xF0\xB4\x11\x96\xFF\xD5\xE2\xC9\xCF\xD5\x70\xD3\x90\xCE\x43\xC2\xB4\xD5\x2E\xD8\xAF\xB6\x08\xB7\x27\xD6\x80\xD8\x8C\xD6\x8A\xD5\x8E\xD6\x8C\xD5\x90\xD6\x8E\xD5\x92\xD6\xC6\xD5\x69\xD5\x55\xD8\x23\xD4\xA5\xD8\x47\xC5\x81\xBF\x74\xD7\x02\xD6\xF4\xC4\xC7\xCF\x36\xCA\x2D\xD8\xAD\xD7\xB0\xD8\xFD\xB5\x33\xD8\x64\xD6\x35\xD8\x58\xD4\x20\xD8\x31\xD5\x3E\xBF\xE5\xD2\xCD\xB3\x41\xBF\x0C\xC1\x3C\xC6\xB6\xC3\x3E\xC6\x59\xA6\x85\xD3\x9D\xBF\x60\xCA\xC8\xD8\xAF\xD7\xB1\xD8\xC6\xD6\x4B\xD7\xDF\xD2\xF1\xD6\xF6\xB2\xF3\xD6\x59\x9F\x09\xD8\xCE\xD6\x26\xD8\x83\xD6\x8A\xD8\x87\xCE\xD8\xCE\x5E\xCA\x4E\xB2\x37\xCA\x94\xD8\x92\xCB\xB0\xD7\xCD\xD7\x81\xD8\xB3\xD7\x8E\xD4\x9F\xD2\x90\xD4\xA1\xD2\x0C\xD7\x21\xD0\xBA\xD7\xA9\xCF\x47\xD6\xF0\xCE\x8E\xC5\x75\xCA\xF1\xD8\x20\xD3\x48\xD8\xD8\xB2\x4A\xD8\x4D\xCF\x67\xD8\xB5\xD8\x69\xD8\xB7\xD8\x6B\xD8\xB9\xD8\x6D\xD8\xBB\xD8\x94\xD6\xBD\xD8\x7A\xD4\x2F\xCF\x6C\x81\x75\xD6\xA7\x78\x27\x09\x03\xD9\x2E\xC5\xFF\xD7\x60\xD7\x07\xD9\xB2\xD2\xB3\xC6\x4A\xD5\x11\xD5\x7D\xD6\xD0\xCE\x7F\xD6\x24\xD8\x81\xD6\xE9\xD8\xD0\xD6\xEB\xD8\x00\x6B\x86\xD6\xBD\xD7\x18\xD9\xC9\xD8\x32\xD8\xB2\xD8\x8A\xD3\xA2\xD6\xF6\xD8\xA4\xD6\x8F\xD4\xA6\xD6\xD1\xD2\x9A\xD7\x93\xD4\x9C\xD7\xD5\xD2\x9E\xD7\x10\xC4\x8D\x77\x30\xCF\xF6\xC4\x32\xCF\x22\xB0\x8A\x8D\x19\xD9\xC2\xC6\xE6\xD7\x8D\x4E\x1D\xD8\xE3\xD8\x97\xB4\xE5\xD8\xBF\xA4\x9F\xD8\xF1\xD7\x53\xD8\x52\xD5\x55\xD7\xC1\xCF\xBF\xD6\xAE\xD6\x84\xA6\x8B\xBF\x44\xD9\x54\xD1\xDF\xD8\x04\xD7\xEA\xD7\xE2\xD8\x05\xD8\xF2\xD6\x4F\xD7\x1D\xD4\xE7\xD8\xF6\xD6\xA1\xD8\x21\xD4\x12\xD9\x6B\xD5\x82\xCF\xDE\x80\x0C\xC3\x44\xD5\x03\x01\x57\xD9\x6D\xA7\x59\xD9\x02\xD8\x4B\xD8\x1F\xD9\x1E\xD8\xCE\xD8\x37\xD8\x21\xD8\x39\xD8\x23\xD8\x86\xD8\x26\xD9\x88\xD8\x27\xD8\xAF\xD4\x70\xD7\x9B\xAC\x72\xD6\x23\x5D\x22\xC3\xE6\xD1\xC7\xD8\x45\xD8\x2E\xD9\xCC\xD7\x32\xD7\xB2\xD3\xCD\xD8\x66\xD6\xE2\xD2\x21\xB5\x32\xD5\x86\xC2\x3B\xD8\x36\xAE\xAC\xB5\xE8\xCD\xFD\xD8\xF3\xCF\xFF\xD8\x61\x78\x37\xC3\x4A\xD6\x84\xD9\xDE\xD8\xCA\xD8\x30\xD9\xF4\xD4\x09\xD9\x7C\xD6\xDE\xD3\x7A\xCF\xE0\xD3\x51\xD7\x76\xD4\xF7\xD6\x64\xD9\xA3\xD8\xFA\xD6\x8C\xD8\xDC\xA7\x78\x85\x17\xCB\x02\xD9\x85\xD9\x1C\xD8\xB1\xD7\x32\xD9\xCF\xD7\xB4\xD7\x04\xD0\xB6\xD7\xF6\xD5\xB8\xD7\xF8\xD5\x93\xD9\x23\xD0\x95\xD9\xA1\xC5\x6F\xCF\x88\xC6\x69\xD4\x4A\xCB\xAF\xD8\x9A\xD9\x2F\xD9\xE0\xD8\xDD\xD6\xF9\xCE\x49\xD9\xB8\xCF\x5F\xD9\xF4\xD6\x61\xD9\xD6\xB6\xF2\xD7\xBF\xCF\x51\xD9\x18\xC0\xC2\xCF\x26\xD7\x7E\xD4\x28\xD7\x0A\x7E\xB7\x9E\x77\xD8\xC8\xCF\x47\xD7\x2D\xD9\xC2\xD9\x86\xD9\xCB\xD8\x62\xD7\xE7\xAB\x0F\xD3\x8B\xD9\x11\xD3\x8D\xD9\x13\xD3\x8F\xD9\x57\xB4\x91\xD9\xD2\xD3\xB9\xD9\x3B\xD0\xBB\xD9\x25\xD0\xD2\xD9\xDC\xCF\xBA\x81\x5F\xCB\x63\xB3\x71\xCE\xE2\xC6\xAE\xC0\xAE\xD8\xDD\xD8\xCA\xD7\x46\xD9\x00\xD8\xB9\xD5\x65\xD8\xC7\xD6\x5C\xD9\x4D\xD8\x06\xD8\x9D\xD8\xEF\xD7\x4D\xD9\x0A\xD8\xA5\xD9\x78\xD4\x65\xD9\x93\xD5\x71\xD7\xF2\xC3\xF7\xA6\xC4\xC0\x39\xBE\x8F\x8A\xA9\xC6\x6F\xC6\x7A\xCB\x15\xD7\x46\xAD\x60\xD8\xAE\xD9\x47\xD9\xB0\xD9\x9E\xD9\x82\xD8\x2B\xD6\x84\xD8\x2D\xD6\x82\xD7\x2F\xD6\x84\xD7\x31\xD6\x7C\xD9\xC9\xD5\x57\xD7\xB2\xD4\x9B\xC3\x92\xCB\xDA\xC3\xD0\xD4\x00\xCA\xDE\xC3\x2E\xD7\x6B\xD9\x14\xDA\xF9\xD9\xE8\xD7\x2E\xD2\x5B\xD9\x0D\xD3\xC7\xD9\x05\xB5\xD0\xD8\xB7\xD2\x60\xD9\x02\xDA\xE8\xD8\x7A\xD9\xEA\xD8\x20\xDA\x19\xD6\x22\xDA\x89\xCE\xDC\xC6\x1F\xD3\xC7\xCB\xF0\x8E\xFF\xB6\xF2\xD9\x4B\xBF\x02\xB7\xF6\xBE\x04\xB7\xDA\xD9\xF7\xD9\xC9\xB6\xAF\xD9\xF4\xD8\xB4\xD8\x9F\xD9\x4C\xD5\xA1\xD9\x4E\xD5\x51\xD8\x52\xD7\x4F\xD9\xBC\xD6\x06\xDA\x96\xD6\x14\xD9\xCC\x8A\xFB\xC6\xA4\xD7\x43\xBC\xA6\xD7\x18\xC1\xA8\xD7\x77\x6F\x12\xA7\x14\xD7\xE3\x00\x4B\xD0\xED\xD9\x01\xD6\x55\xD1\x01\xA7\x31\x75\x58\x59\xD9\xCC\xAA\xD7\x3A\x94\x90\xBC\x06",
"\x01\x36\xB7\x49\xC9\x8E\xD2\x0B\xBF\xAD\xD5\x33\xC9\xAF\xD5\x1E\xD5\x18\x05\x26\xA2\x11\xD4\x28\xA2\xC6\xD7\xC7\x72\x71\xDA\xFE\xD2\x73\xDA\xE2\xC1\x10\xB1\x3B\xD5\x12\xB1\x76\xD2\xDD\xD7\x3F\xD5\xBF\xCD\xDD\xCC\x43\xD5\xC7\xCE\x47\x62\x7F\xDA\x21\xDA\x92\x89\xA8\xD2\xA1\xBE\xAA\xD2\x14\xD8\x67\xC3\xAD\xD2\x22\x95\x7F\xCD\x03\x01\x8E\xDA\x3C\xDA\x90\xDA\xC9\x8F\x11\xD8\x5B\xB1\xF0\xCD\x44\xDA\xF2\xCD\xD4\x0D\x8C\xB4\x22\xBC\xDC\x67\x9A\xDA\x33\xD6\x9A\xC9\x2B\xD8\x3D\xD2\xE7\xA1\x1E\x62\xA7\xDA\x29\xD8\x06\x72\x1D\xCE\x21\xAB\x7D\xDA\x7C\x5A\xAE\xDA\x8F\x6B\x41\xC1\xA0\x98\x1C\xD5\x1E\xB0\xD8\x86\xB1\xD5\xD9\xC4\xEA\xC1\xE1\xA6\xC4\x65\xB5\xDA\xEC\xD8\x1A\xD6\x28\xBF\x1D\xD3\xCD\xD5\xA9\xD8\x01\xD6\xC3\xB1\x90\xD8\x3B\xD3\xF7\xC4\x06\xD6\x74\xCF\x8D\xDA\x9F\x73\xCC\xC5\xFB\xA5\xE5\xD5\x5B\xD7\x01\xCA\x34\xB5\x37\xA6\xC1\xDA\x81\xD5\xF9\xB1\x3E\xDA\x2E\xB5\x2B\xBF\x1F\xD6\x0F\xDA\xA5\x7F\xC7\xA6\xB4\xDA\xD0\xDA\x81\x76\xA7\xCE\xC1\xD8\x75\xD8\xDE\xDA\x82\xD4\x55\xB5\x22\xD6\x08\xC7\x25\x94\xE3\xDA\x9B\xBF\xC3\xCE\x40\xBC\x70\xDA\xEE\xDA\xF4\x89\x40\x91\x62\xA6\x2F\xB9\xED\xDA\x10\xD7\x62\x75\xAB\xD3\xDD\xCE\xCF\xDA\xF9\xDA\x83\x5D\x12\xD7\x60\x7D\x16\xD9\x21\xA7\x27\x09\xD8\xDA\x85\xD6\x1C\xCF\x74\x80\x5C\xCE\x04\xDB\xF3\xDA\x62\x98\x00\xDB\x00\xCA\x9B\xD6\x56\xA6\xB9\x67\x05\xDB\xD2\xD6\x53\xD9\x18\x0F\xF7\xC2\x94\xB7\x12\xDB\x3D\xD7\x67\xD9\xFE\x91\x69\xD9\x8C\xDA\xC0\xDA\x0B\xDB\x78\xA6\x7F\xD9\xE6\x72\x81\xD9\xE1\xC8\x0A\xA6\xA6\xDA\x1F\xDB\xB7\xAC\x97\xD9\xA5\xDA\x0A\xDB\xFE\xDA\x10\xC5\xFF\xD0\xFD\xD6\xAC\xD9\xF0\xD4\x2B\xDB\xAC\xD6\x2C\x8E\x0D\xDB\x9F\x8E\x1D\xB0\x7B\xCB\x63\x7C\x32\xDB\x10\xD4\xF6\x97\xC3\xCF\x3F\xA6\x8D\xB6\x77\xD7\x53\x8E\xE1\xDA\xD0\x5C\x18\xDB\x71\xD8\x3E\xD7\xA3\xB9\x8F\x81\xEE\xD9\xDE\xBB\xDE\xCF\x8C\xC6\x40\xDB\x96\x59\xAC\xB6\x04\x5A\xD7\xDA\x27\xDB\x6E\xB6\xB9\xC3\x40\xDA\xCE\xA6\xA8\xC6\x72\xB0\x4D\xDB\xCA\xC0\x42\xDB\xAD\xDA\x52\xDB\x24\xD4\x54\xDB\x0E\xD0\x95\xD8\x75\xD7\xCF\xD4\xCA\xDA\xD1\xD4\xFF\x00\x29\xDA\x6F\x7B\x3A\xDB\xEB\xD9\x7D\xC3\x0D\xD0\x36\xDB\x85\xD4\x42\xDA\xFA\xC0\x94\xDA\xAD\xC0\xEC\xD4\x50\xC8\x01\x01\x44\xDB\xA4\xD8\x97\xD6\x3E\xD9\xC4\xCB\xFA\xB6\x46\xD0\x5A\xD1\x0E\x94\xDE\xBC\xD9\xB3\x8E\x8D\x47\x9B\x77\xA5\x27\x01\x96\x94\x10\xDB\xE6\xB6\xD0\x01\x7B\x94\xEF\x6B\xA3\x94\xDA\x0F\x75\x2A\x04\x2A\x03\x5C\x6E\x08\x85\xDB\x25\xDB\x4E\xA5\x89\xDB\xFC\x6C\x8B\xDB\x45\x11\x57\x2A\x8E\xDB\xFF\x59\xCD\x05\x91\xDB\xAC\xDA\xD9\x89\x88\xDB\x8E\x94\x61\x6B\x96\xDB\x83\x63\x7F\x03\x04\x2A\x83\xD1\xB2\x94\xF5\xD1\xCA\x5F\x3C\xB7\xC2\xD0\x09\x01\xE6\x00\x21\xA7\x34\x5D\x50\x7B\x5D\xC3\x33\x00\x42\xD2\x98\x4F\xD7\x74\xE7\x00\x21\xA7\x36\x00\x7C\xD1\xA7\x24\x15\x5D\x6D\xB7\x11\x0B\x50\xB7\xA7\x68\x52\xB7\x06\x01\xE8\x00\x32\xBC\x6D\xD7\x76\xB7\x3E\xAA\x71\x6E\x59\xB7\xA8\xDB\x2B\x60\xAA\xDB\x9D\x8A\x27\x01\xAD\xDB\x83\xA7\xAF\xDB\xC0\x79\xB1\xDB\xB3\xDB\xAB\x40\xB5\xDB\xB7\xDB\xB9\xDB\x06\x01\xB8\xDB\xE9\x5B\xBC\xDB\x53\x07\xBE\xDB\xC7\x6A\xC0\xDB\x03\x01\xC2\xDB\x9A\x7B\x45\x0A\xD7\xB1\xC5\xDB\xED\x6B\xA6\xDB\x33\xB7\xE0\xB9\x02\x01\xEA\x00\x65\xDA\x26\xCD\x3F\xDA\x60\xDB\x24\xC1\x0B\xD5\x6A\xD9\x02\x01\x7D\xB7\xB0\xC0\xAB\xBE\xD9\xD5\x34\xD7\xF3\xD5\xDC\xD5\xF5\xD5\xD3\xD7\xF7\xD5\x2B\xCF\x6B\xCF\x2D\xCF\x66\xBE\xFF\xD2\x35\xCE\x74\xD2\x44\xC1\x86\xDA\x46\xC1\xF3\xB0\xE9\xC1\xA5\x5B\x4A\xC1\x75\xCA\xF4\xDB\xE6\xC0\xDC\xD6\xB4\xCF\xC6\xD9\x5D\xD9\xE4\xD8\xC9\xD9\xE6\xD8\x37\xDA\x62\xD9\x27\xD9\x3B\xD7\x29\xD9\x0E\xB1\x02\xDC\x75\xDA\x9E\xCD\x77\xDA\x06\xDC\x63\xC1\xDE\xD7\x89\xDA\xF3\xB9\xE1\xD7\x54\xC9\x0C\xDC\x96\xC0\x8B\xD4\x69\xCB\x18\xDA\x22\xD9\x13\xD5\x24\xD9\x78\xD9\x39\xD7\x18\xDC\xA2\xD8\x1A\xDC\x13\xDB\x9C\xDA\x7D\xC1\xA9\xD2\x67\xA2\xFA\xD7\x96\xDA\xC4\xA9\xF0\xAD\x0D\xDC\x01\xC1\x9C\xD9\x88\xD5\x17\xDA\x33\xD9\x7F\xD7\x35\xD9\x81\xD7\xA7\xD6\x38\xD9\xA9\xD6\x3A\xD9\x48\xD4\x3C\xD9\xA7\xD2\x9D\xDA\x9B\xC1\x8B\xC4\x33\xB1\x71\xD5\xB6\xC1\x3D\xDC\x58\xBE\xDD\xD9\x50\xD6\xDF\xD9\x52\xD6\x74\xD9\x34\xDA\x3F\xBF\xD3\xD8\xE7\xD2\x42\xBF\xE9\xD2\x3D\xC6\x9A\xBF\x08\xA6\xA4\xC4\x98\xD9\x53\xDC\xEB\xCA\x71\xBF\x5A\xD9\x7C\xD7\xB1\xD9\xA1\xD5\xD0\xCF\xFD\xCE\x1E\xD7\x37\xD0\xFB",
"\xD8\x39\xD0\xE9\xD9\x19\xD3\x3B\xDB\xD2\xDA\x95\xD5\x26\x90\xC6\xD7\x34\x76\x65\xDC\x07\xCF\x51\xBF\x61\xD7\x56\xDC\x16\xAF\xE1\xD2\x3C\xBF\xE3\xD2\xD1\xD8\x33\xD5\xFA\xB2\x5D\xDC\xD5\xD8\x5F\xDC\xD7\xD8\x9C\xCD\xB7\xDA\x61\x99\x04\xDC\x1D\xD5\x5A\xD8\xC9\xC9\x7B\xDA\xCB\xC9\x69\xC3\x7A\xDC\x99\xD6\x3C\xC3\x9E\xD5\x66\xD8\x71\xD9\x32\xDA\x04\xB6\x5A\xDC\xD2\xD8\x92\xC1\xD4\xD8\xB4\xC3\xD6\xD8\xE4\xC5\xD8\xD8\x2C\xB5\xFD\xD5\x5A\xAB\x55\xDB\x3E\xC2\xC9\xDA\x1A\xCA\xD4\x0D\x79\xD8\x44\xD8\x94\xDC\xDC\xBE\x95\x97\x7F\xD8\x31\xD9\x41\xDC\xB2\xD9\xF7\xD8\xB5\xD7\xF9\xD8\xB7\xD7\x70\xDC\xA3\xD2\x49\xDC\x95\xD4\x4B\xDC\x03\xAE\x24\xC7\x70\xCE\x27\xDA\xAE\xCB\xD5\xDA\xA0\xD4\x7C\x5A\xAE\xDC\xD8\xBF\x96\xDC\xE9\xD7\x69\xDC\xB3\xDC\x6B\xDC\xD0\xD7\xD1\xCF\xD2\xD7\xD3\xCF\xD4\xD7\xD5\xCF\x1F\xDA\x86\xD7\x7D\xD9\x55\xC2\xC4\xDA\x8B\xCE\xCA\xAE\x99\xD4\x66\xBF\xA9\xDC\x55\xD3\x01\xB2\xF5\xD9\x00\x00\xC6\xDC\xCF\xC5\xB0\xDC\x98\xD8\xB3\xD8\x9A\xD8\x0A\xD9\x9C\xD8\x0C\xD9\x9E\xD8\x0E\xD9\xA0\xD8\x31\xDC\xA6\xD9\x33\xDC\x19\xDB\xDA\xDA\xDB\xC6\xA8\xCE\xDA\xDC\x8C\xD1\x21\xD3\x03\xD6\x73\xD6\x5F\x6C\x4E\xC5\x7F\xC7\x27\x09\xE1\xDC\xF9\xC6\x35\xBF\x7D\xDC\x33\xD7\x89\xD9\x35\xD7\x13\xCE\x77\xD9\x2E\xD6\x16\xD5\x39\xDA\x28\xD9\x3B\xDA\xA8\xDA\xC7\x65\xF0\xDA\x64\xDC\x28\xDC\x34\xD8\x57\xDC\x64\xD7\xE1\xD9\x68\xD6\xE3\xD9\x6A\xD6\x34\xD5\x3C\xD8\x6D\xD6\x3E\xD8\x6F\xD6\x7B\xC3\x4C\xB2\xEE\xD8\x86\xB5\x83\xD9\xFD\xDC\x02\xD5\xFA\xBE\xEE\xD6\xC5\xD9\x61\xD5\xE7\xDC\xED\xD7\x00\xDA\x08\xD8\x16\xDC\xCC\xD9\x55\xDA\x54\xD7\x57\xDA\xBE\xD6\xAE\x6C\xFB\xDA\xB1\xC9\x47\x62\x21\xDD\xA1\xD7\xFF\xDC\x1D\xD9\x18\xD4\x99\xDC\x12\xDC\x4A\xD9\x14\xDC\x4C\xD9\xEB\xDC\x4E\xD9\x04\xDA\x0C\xD8\xA7\xD9\x0E\xD8\x59\xDA\x26\xD4\x51\x80\x8A\xCA\xB6\xB5\x09\x01\x35\xDD\xB0\xCA\x7C\xDC\x38\xDD\x29\xDC\x9C\xCB\xB4\xDC\x34\xD9\xF8\xD8\x36\xD9\x91\xD4\x47\xDC\x0D\xD7\xBB\xDC\x46\xD6\x90\xB2\x07\xDB\xBC\x84\x3C\xDC\x0F\xDD\xCC\xD8\x11\xDD\x36\xD8\x13\xDD\x66\xD7\x15\xDD\x68\xD7\xE5\xD9\x71\xC2\xE7\xD9\xE2\xAD\x22\xD7\x2C\xCA\xBD\xDC\xE7\xD3\xBD\xD9\xAC\xD8\xD1\xC5\xB3\xCA\x8B\xBF\x4B\xDD\xF3\xBF\x3F\xDC\x03\xD8\x3A\xDD\xFE\xD9\x5E\xD9\x4F\xD8\x36\xDA\x3F\xDD\x03\xDA\x63\xD9\x05\xDA\x43\xDD\xFE\xD3\xD6\xCA\x46\xCF\x1B\xC0\x72\xDD\x5E\xDD\xDE\xD9\x7F\xDC\xE0\xD9\x81\xDC\x8C\xD9\x83\xDC\x8E\xD9\x17\xDD\x90\xD9\x3D\xD8\x41\xCF\x3F\xD8\x1C\xDD\x00\xB3\xC0\xD6\x82\xAC\x18\x85\x73\xDD\x7C\xC0\x87\xD9\xF1\xD3\x02\xDD\xF9\xDB\x36\xD7\xFB\xDB\xD0\xDC\xFD\xDB\x08\xD0\xFF\xDB\x0A\xD0\xD5\xDC\xDF\xC2\x79\xDB\x70\xB6\x71\xCF\xDC\xD8\xE0\xDC\x86\xDD\x7E\xDC\xD5\xAF\x89\xDD\x34\xD0\x09\xD7\xEE\xCF\x99\xD7\x1D\xDA\x9B\xD7\xD3\xDC\x9D\xD7\xA5\xDD\x87\x8D\x39\xD4\x58\x97\x52\xDC\xAC\xDD\x01\xDD\x60\xDD\x73\xD9\x62\xDD\x38\xD8\x64\xDD\x3A\xD8\x8E\xDD\xE6\xD9\x90\xDD\xFB\xD2\x92\xDD\xB7\xC4\xEC\xD2\x2E\xDB\x16\xCB\x73\x97\x97\xDD\xBD\xDD\x88\xD9\xBF\xDD\x8A\xD9\x8A\xDD\xE2\xD9\x8C\xDD\xE4\xD9\xC5\xDD\x67\xDD\xC7\xDD\x6D\xD7\xC9\xDD\xCB\xC5\x71\xD6\x6E\xDD\xAD\xCF\x14\xD7\x5E\xD8\x0E\x69\x98\xDD\x91\x93\x48\xD9\x3B\xDD\xC8\xD9\x7A\xDD\xCA\xD9\x2B\xDD\xBC\xC0\x6E\xD8\x17\xD6\x0A\xDD\xAF\xDA\x43\xB3\xED\xDB\x41\xD7\xCD\xAD\x29\xD7\xEB\xB9\xD4\xDA\x2D\xD7\x16\xD7\x7C\xB7\xD0\xDD\x9B\xDD\xD2\xDD\x03\xDD\xA1\xD3\x05\xDD\x1C\xDA\x07\xDD\x1E\xDA\x89\xD8\xEF\xDD\x8B\xD8\xD1\xD9\xF2\xDD\xD3\xD9\x42\xD7\xA1\xD1\x9C\xD4\xD4\xDA\x4F\xDB\x2A\xDA\xF3\xDB\xFB\xDD\xF7\xDB\x9C\xDD\x96\xD7\xF4\xD5\x98\xD7\x15\xD3\xD1\xDC\x17\xD3\x72\xDC\xD4\xD3\x74\xDC\x7B\xAD\x89\xD7\xF7\xCF\xBC\xC3\x8C\xD7\xF8\xDC\x10\xDA\xE2\xDD\xC5\xDC\x11\xDE\xF1\xD5\x81\xC2\xFE\xDD\x5B\xD4\x00\xDE\x46\xDC\xB4\xDD\x39\xD9\xB6\xDD\x3B\xD9\xB8\xDD\x31\x6B\x5F\xDB\x6D\xDB\x04\xD9\x93\xCB\x11\xD0\xD7\xD9\x67\xDB\x12\xDA\x4A\xDD\x26\xDE\x3D\xD6\x95\xD7\x08\xD7\x97\xD7\x0A\xD7\x17\xDE\xA1\xDD\xD5\xD7\xA3\xDD\xD7\xD7\x6C\xDD\xDD\xC0\x23\xDA\x0B\xDA\x25\xA7\x9E\x0E\x43\xDA\xC1\xDC\x15\xC5\x73\xDB\x1A\xD8\xB9\x67\xE4\xDD\x8F\x97\xE6\xDD\x78\xDD\x13\xDC\xE9\xDD\x15\xDC\x7C\xDD\x38\xDA\x03\xDE\x7B\xD9\xD4\xDC\x8F\xDA\x05\xCF\xA7\xDD\x85\x98\x40\xD0\xBB\xD0\xF7\xDC\x7D\xDB\x17\xC4\x7F\xDB\xF9\x97\xE0\xBC\x61\xDA\xA2\xA5\xA9\x78\xEB\x00\xEC\xDB\x33",
"\xCD\x45\xB3\x0E\xD2\xA4\x18\x06\xA2\xCC\xDD\x67\xC1\x06\xC7\x94\xB7\x3B\xBC\x02\xBB\xE3\xCC\x61\x9C\x87\xCD\x84\xD1\xA5\x5B\xE7\xCC\xB7\xD0\x06\x01\x79\xDE\x78\xB9\x32\xCC\x64\xCD\x47\x62\x83\xDE\x79\xBA\x52\xBC\x19\xBA\xF5\xCC\x8A\xBC\x2B\xB8\x07\xCD\x25\xA8\x28\xC7\x55\xCD\x3F\x7A\xB9\xBC\x19\x7D\x61\xB9\x2E\xA8\xF6\xCC\x25\xC7\x8F\xDE\x13\xA8\x4E\xCC\x09\xDB\x42\x39\x94\xDE\xE1\x0A\x6B\xBC\x8D\xDE\xC5\xB8\x9A\xDE\xD4\xB7\x2E\xBA\x88\xDE\x86\xBA\x45\xC7\x28\x64\x55\xC7\x2A\xCD\x7A\xBC\x52\xCD\x59\xC7\x4C\xC7\xAB\xC7\x03\x01\xA7\xDE\xAF\xB9\x8A\xDE\x4C\xBA\x29\xCD\x67\xCC\x2B\xCD\x93\xCC\x13\xCD\xF2\x7C\xA6\xDE\x9F\xDE\x9A\xA0\x35\xCD\x6C\xCD\x8C\xA1\xFF\x00\x80\xA1\xD8\xB8\xB3\xDE\xBC\xB9\x9C\xCC\x91\xCC\x98\xDE\xAC\xCC\x7A\xCC\xD4\x0D\xAC\xB9\x92\xDE\x01\x01\xC6\xDE\xD7\xB9\x4E\xCD\x7D\xC7\x5E\xCD\x8B\xC7\x80\xC7\x5C\xBA\xBB\xDE\xB8\xB9\x86\xDE\xC4\x65\xD1\xDE\xE5\xB9\xA8\xCC\xED\xB8\xA2\xDE\xEF\xB8\x61\xCD\xF9\xCC\x81\xBA\x3C\xCD\x31\xDB\x9E\xDE\x92\xBC\x70\xDE\x58\xAB\x35\x05\x88\xBA\x1C\xCD\x5F\xCD\x1E\xCD\xA4\xDE\x9A\xC7\xBC\xCC\x8E\xD0\xDD\xDE\x59\xB8\xE0\xD7\x76\xCD\xC2\xCC\x49\xBC\xDC\xDE\x42\xBC\x0F\xA7\xE9\xDB\xAA\xC7\x98\xDA\x93\xDE\x34\xBC\x24\xBA\x48\xDB\xCB\xA1\xEA\xB9\x07\x69\x7D\xDE\xF0\xDB\x78\xDC\x7C\x5A\xD9\xBC\x49\xBE\x81\x8E\x75\xDD\x70\xD9\x26\xC9\x9A\xDC\x78\xBE\x9C\xDC\x84\xDC\xE6\xD2\x6C\xD6\x5E\xDC\x6E\xD6\x60\xDC\x39\xD5\x8B\xDC\x12\x9C\x8D\xDC\xBA\xDA\x20\xDC\xAF\x86\x7A\xDA\x09\xDC\xA7\x98\x0A\xDF\xD0\x5C\x0C\xDF\x05\xC9\xD2\xA9\x11\x8D\x4E\xDD\x10\xDD\x88\xDD\x58\xDC\xC1\xDD\x75\xD9\xC3\xDD\x2B\xDE\x37\xD9\x2D\xDE\x48\xDC\x2F\xDE\x4A\xDC\x80\xDA\xAB\xD5\x8F\xD2\x83\xDA\xDA\xD7\xE5\xC1\x3D\xD5\x21\xDC\x88\xDA\x75\xDC\x24\xDC\x42\xD5\x46\xB4\xF2\xDB\x01\x01\x27\xDF\x15\xC9\x69\x9F\x1F\xB7\x55\xDE\x9B\xD8\x28\xDD\xE9\xDC\x01\xDA\x5A\xDE\x17\xDC\x08\xDD\x19\xDC\x05\xDE\xC2\xDA\xB0\xDA\x91\xDA\x6F\xC4\x38\xDC\x59\xD5\xDA\xCD\x97\xDA\xF0\xAD\x47\xDF\xED\xC8\x64\xDE\xD4\x8D\x16\xDA\x77\xDD\x4C\xDF\x4E\xD8\x29\xDD\x50\xD8\xDE\xD5\x52\xD8\x41\xDD\x54\xD8\x80\xDD\xBE\xD8\x0F\xD8\xF8\x59\x9E\xDA\x22\xAE\xE9\xAA\x71\xDB\x48\x95\x16\xD8\xA2\x8B\xC1\x82\x27\x09\x5E\xDF\xBA\xD0\xD1\xB0\x4A\xDF\x62\xDF\x11\xDF\xE7\xDD\x33\xDA\x4B\xD9\x78\xAC\xCB\xD9\xEC\xDD\x10\xD9\x6F\xD8\xEF\xDC\x45\xDB\x2A\xD8\xC9\x65\x48\xD2\x77\xDF\x27\x01\x79\xDF\xF0\xBE\x60\xDA\x30\x8D\x00\xDD\xD1\xDD\x2D\xDF\x12\xDD\xD4\xDD\x14\xDD\xD6\xDD\x16\xDD\x85\xDC\x17\xDF\x87\xDC\x19\xDF\x89\xDC\xEB\xD2\x41\xD8\xB1\xDA\x43\xD8\x83\xAC\x8E\xDF\x0C\xDA\x7B\xDF\x36\x8E\x7D\xDF\x72\xC9\x10\xD5\xA7\xD4\x83\xD8\x80\xD7\x85\xD8\x06\xDD\x87\xD8\x5C\xDE\x3A\xDA\x5E\xDE\x01\xDC\x81\xDA\x4B\xC9\x76\xDA\xDB\xD7\x38\xCE\x5B\xD8\xAD\xD6\xB3\xD5\xD9\xD9\x8D\xDF\x57\x8E\x81\xDB\x60\x8C\x92\xDF\xFC\xDD\x94\xDF\x61\xDD\x96\xDF\x63\xDD\x98\xDF\x65\xDD\xD8\xDD\x6B\xD7\x16\xD6\x57\xAD\xCF\xD9\xA9\xD3\xC3\xDA\x1C\xD3\x51\xCE\xF0\xC4\xA9\xCE\x4A\xC5\xF1\xCD\x4C\xC5\xAC\xDC\xA3\xDF\xBF\xDF\x0E\xDF\xC4\xD9\x10\xDC\x26\xDD\x4F\xDA\x79\xD5\x73\xD4\x7B\xD5\x75\xD4\xFA\xD3\x2D\xDD\xF3\xD7\xCE\xDF\x64\xD4\x35\xDC\xD6\xDE\xFD\xC9\xE6\xD5\xD6\xDF\xE2\xCF\xC3\xDC\xCD\xDA\x3F\xA0\x1E\x62\xA4\xDF\xC2\xC7\xA6\xDF\xD6\x8E\x4D\xDA\xE6\xDC\xDF\xDF\x8B\xD5\xE1\xDF\x8D\xD5\xE3\xDF\x33\xD4\xCD\xD9\xE4\xD3\xB3\xDF\x0B\xDD\xFC\xD5\xA6\xD8\x35\x05\x12\x96\x00\xD6\xDB\xDC\x8F\xCE\xD1\xD5\xAD\xD8\xBD\xDF\x09\x01\xF3\xDF\x12\xAA\x60\xDF\xF1\x8D\x2B\xDF\x5F\xDD\xC4\xDF\xC0\xDD\xC6\xDF\xC2\xDD\xC8\xDF\xC4\xDD\x9A\xDF\x18\xDD\x18\xDF\x1A\xDD\x1A\xDF\x40\xD8\x3A\xA6\x6B\xD3\x55\x5A\x31\xCA\xD4\xDF\x76\xD8\x59\xDB\x54\xA6\xFA\xDC\xD6\xDE\x78\xDF\xDA\xDF\xFA\x8E\x9A\xDD\x12\xDE\xFD\xDD\x9D\xDD\x04\xDD\x9F\xDD\xA5\xD5\x18\xDE\xA7\xD5\x1A\xDE\xA9\xD5\x6A\xDB\x0B\xAF\xDA\xD8\x79\xC2\x83\xD9\x0E\xE0\x0F\x8D\x90\xDF\xAC\x8E\xC2\xDF\x2E\xE0\x14\xE0\xD3\xDD\xB0\xDD\x40\xDE\xB2\xDD\x42\xDE\xB7\xD9\xFE\xDB\x6A\xDD\x31\xCE\x38\xE0\xBA\x61\x49\xD6\x27\xAE\x3D\xE0\x2E\x8D\x3F\xE0\x70\x8D\x41\xE0\x27\xDE\x61\xCE\x29\xDE\x22\xD8\x32\xE0\x1F\xD7\x34\xE0\x21\xD7\x36\xE0\xFA\xD5\x5F\xDE\xBE\xB2\x32\xDD\x25\xD5\xB9\x67\x51\xE0\xB4\xD4\x14\xC4\x2A\xDF\xB1\xDC\x9D\xD9\x63\xDF\x27\xDD\x65\xDF\x4E\xDF\x2A\xDD\x50",
"\xDF\x2C\xDD\x6A\xDF\x50\xD9\x2F\xDD\x56\xD7\x77\xC0\x46\xDD\xBE\x72\xBD\xBB\x17\xD9\xBE\xDF\x0D\xDF\x2C\xE0\x55\xDC\xBE\xDD\x43\xE0\x58\xE0\x76\xD9\x5A\xE0\x6F\xDC\x56\xDD\xFC\xD8\x58\xDD\xAB\xD6\xB3\x5F\x2B\xD9\x33\xDD\xC4\x65\x65\xE0\xC1\xB6\x02\xC7\x4B\xDF\x6C\xE0\xFF\xD9\x6E\xE0\x67\xDF\x38\xD7\x69\xDF\x7E\xDD\x42\xDD\x87\xDF\x77\xDB\x45\xDD\xF0\x9B\xEA\xD3\x42\xD9\xB6\xC1\x8D\xE0\x56\xDB\x53\xE0\x8F\x8D\x55\xE0\x3D\xDE\x28\xDE\x30\xE0\xFF\xDD\x83\xE0\x94\xC9\x43\xDE\xD2\xDC\x04\xDE\x01\xE0\xF0\xDD\x59\xCF\x54\xD9\xC5\xCA\x8B\xBF\xA0\xE0\x7B\xB3\x67\xE0\x91\xDF\x12\xE0\x87\xDD\xAE\xDD\x2E\xDF\x16\xE0\x30\xDF\x18\xE0\x32\xDF\x55\xDD\x34\xDF\x57\xDD\x36\xDF\xBC\xDC\x31\xDE\xEA\x8D\xD7\xCA\x60\xD6\x03\x01\xB4\xE0\xDF\xBC\x29\xDF\xB7\xE0\x69\xE0\x40\xDC\x6B\xE0\xF9\xDF\xB6\xD8\xFB\xDF\xB8\xD8\xFD\xDF\x7D\xD5\xFF\xDF\x0E\xD4\x88\xE0\x4D\xE0\x58\x82\x21\xDB\x9D\xAC\x23\xDB\x6F\xA9\x37\xCA\xCA\xE0\x80\xDB\xDB\xDF\x68\xDC\x98\xDC\x7E\xDF\x56\xDE\x3C\xDD\x58\xDE\x3E\xDD\xD5\xE0\x8F\xD5\xD7\xE0\x35\xD4\x54\xDF\xD9\xDA\x38\xD4\x51\xC0\x02\xB3\x74\xD3\x00\x00\xE1\xE0\x69\xDE\xCC\xE0\x40\xE0\xB8\xE0\xAD\xDD\x3A\xBF\x80\xDC\x45\xE0\x15\xDE\x41\xDE\xD0\xD3\x00\xCF\x69\xDD\x5E\xE0\x23\xD7\x60\xE0\x16\xA3\xE6\xB3\x4D\xC3\xFE\xD6\x8B\xE0\x64\xE0\x2B\xE0\xEC\x8B\xA8\xDF\xD1\xC9\xD1\xE0\x0B\xD9\xD3\xE0\x0D\xD9\xEB\xE0\xBA\xD8\xED\xE0\x7F\xD5\x99\xE0\xA8\xD9\xD3\xD6\x3F\xD9\x68\xD4\xE1\xDD\xD6\x99\x2A\xE0\x7C\xE0\x0E\xE1\xF7\xDF\x11\xDC\xE7\xE0\xE8\xDD\x66\xDF\x7B\xDD\x15\xE1\x0F\xD9\x17\xE1\x91\xD5\x74\xE0\x52\xD9\xF1\xDD\xEA\xDE\xF3\xDD\x6C\xC6\xF5\xDD\xD6\xD9\x26\xE0\xD8\xD9\xC4\xDC\x26\xDF\x0D\xE1\x7C\xDF\x23\xE1\xDE\xDF\x2B\xDC\xA0\xD9\x47\xD3\xA2\xD9\x53\xDA\xA4\xD9\x97\xE0\x6B\xDF\x19\xE1\x44\xDD\x07\xDE\x30\xE1\x09\xDE\xA1\xD1\x43\xD7\xDC\x9E\xF1\xD9\x4E\xDE\xF3\xD9\x0E\xDE\xF9\xDD\x02\x01\xF6\xE0\xD0\xB0\x49\xDF\xA7\xDF\x3B\xE1\xC9\xCD\x12\xDF\xB5\xC0\x14\xDF\x8D\xDD\x1A\xE0\x8F\xDD\x19\xDD\x91\xDD\x1B\xDD\xCA\xDD\xCB\xA6\x6C\xDB\x25\xA0\x52\xE0\x0D\xA5\x58\xDB\xDF\xDA\xC5\xB6\xDF\xDC\x53\xE1\x8B\x9B\x6A\xDE\xCD\xE0\xE4\xDC\xB2\xDC\xD0\xE0\x3D\xE1\x50\xDA\x3F\xE1\x52\xDA\x68\xDF\x54\xDA\x72\xE0\x56\xDA\x6C\xDF\x13\xD9\x47\xE1\xDB\xC6\x31\xE1\xAA\xCE\x9E\xB3\x94\xCB\x69\xE1\x78\xD7\x6B\xE1\x39\xE1\x56\xE1\x2D\xE0\x56\xE0\xDA\xD5\xA7\xE0\x2A\xDE\xA9\xE0\x42\xD6\xB9\xDC\x44\xD6\x87\xE0\x0F\xD7\x33\xDB\x8C\xC0\x58\xD7\xA9\xCE\x8B\xD7\xD4\xDA\x50\xDE\x30\xD8\x47\x62\x6C\xE1\xF3\xBC\x10\xE0\xF0\x8C\xA4\xE0\x94\xD7\xA6\xE0\x14\xDE\xFA\xDB\x16\xDE\x01\xE1\x20\xD7\x92\xD9\x91\xE1\xBB\xD7\xDA\xE0\x54\x6D\x35\xDB\x63\x4D\x63\xDE\xF5\xDF\xF4\xC4\x66\xDE\xD4\xB0\x18\xC4\x45\xD0\x05\xD5\x9C\xA7\xA9\x78\x5C\x18\x40\xB8\x18\xB9\x3B\x52\xE1\x11\xD1\xA7\xA9\x78\xED\x00\x6F\xDE\x42\xCD\x40\xD7\x73\xCD\x3C\xD2\x0F\xD1\x14\xD7\xEE\x00\xC1\xE1\xDA\xCF\x7D\xD4\xF3\xCB\x92\x0B\x28\xC1\x7F\xDE\x27\x01\x2D\xA7\x5E\xD2\xFF\x59\x45\x0A\x27\xBD\x15\xC7\x61\xC8\x2C\x65\x38\xBD\x96\x0A\x74\x3C\x0C\xC8\xB4\xD0\x29\x87\xC7\xD0\x2E\x74\x3D\x5C\x90\xD0\x28\x59\xD7\x07\xE7\xDB\xB2\xA5\xFE\xDE\x00\x00\xF0\x00\xC9\xE1\x3F\xD7\xDB\xCF\x10\x8B\xFC\x06\xBE\xE1\x14\xD7\xF1\x00\xEA\xE1\x47\xDB\xA6\xC0\x94\x8D\xEE\xE1\x56\xD1\x7D\xCD\xF2\x00\xF2\xE1\x7C\xD4\xE8\xB9\x1D\x65\x86\x02\xEF\xE1\xE7\xE1\xF3\x00\xFA\xE1\x03\xDF\xF4\xE1\xA1\x6D\xFE\xE1\xF7\xE1\x4E\xB8\x09\x01\xF4\x00\x02\xE2\x55\xBA\xFC\xE1\x3B\x84\xB2\xD0\xC9\x05\xFF\xE1\x7D\xCD\xFD\x59\xF0\xB9\x4E\xAA\x8F\x56\x32\xBB\xE9\x26\x51\xD0\x27\x01\xF7\x00\xCB\xDB\x18\x0F\xFA\x0D\x23\x48\xBE\xD1\x1F\xBE\x50\x7B\xC1\xC7\xA4\xD0\x6B\xD1\xD5\x36\x1F\xD2\xCD\x0A\xFA\xC8\x80\xDB\x71\x3D\xD7\x74\x1F\xE2\x37\xD2\x02\x01\x1F\x00\xD7\xDB\x03\x01\x30\xE2\xEA\xD1\xDA\xD1\x26\xE2\xFD\xCB\x29\xE2\xF7\xE0\x70\xD0\x58\xD0\xE5\xE1\xB5\x7B\xA9\x78\xF8\x00\x0B\xE2\x69\xBC\xCB\xE1\x50\x79\x81\x3D\x97\xCF\xA9\x07\xF9\x00\x1F\xC1\x8F\xC4\x1B\xD1\x70\xCD\xD2\x4D\xD3\xA4\x64\xA7\x4F\x2D\x49\xAA\xD8\xA1\x27\x01\x64\x68\x18\xA1\xAE\x8F\x4D\xE2\xAB\xA9\x45\x2D\xDF\xA1\xAF\xD7\x10\xB9\xD5\x74\xE5\xA1\x94\xB7\x1E\xC1\x14\xA5\x6B\xD1\xAD\x1F\x18\xB9\x1F\x75\x56\xA7\x17\xD2\xA7\xA7\xCC\x0D\xBA\xC7\xF7\x07\x94\xB7\x27\xC1\xE1\xC3\x52\xB8\x65\x09\x59",
"\xE2\x4A\xDA\xF7\xB8\x93\xB8\xC6\xDB\xB2\x74\x5D\xE2\xF1\xDA\x03\x01\x6C\xE2\xAC\xB7\x44\xB8\xEA\x02\x63\xE2\x2F\xA7\x27\xA7\x4B\xD2\xBE\xD0\x2F\x3B\xFA\xDE\x06\x5A\x0C\x59\xFD\x3D\x2F\xC6\x68\xC5\x85\x4C\xBB\xD1\x09\x01\x6A\xA9\xBE\xD1\x47\xE2\x9F\xD1\x90\xC0\x6C\x0A\x0D\x59\x75\xC6\xF9\x27\xFD\x3D\x94\x08\x8E\xE2\xCC\xCC\x18\xC6\x94\xC6\xB7\x3D\x22\x7A\x30\x0C\xE0\x3D\x82\x3C\x6A\xD1\x7E\x54\x4F\xE2\xC8\xDB\x8B\xBE\xFD\x00\xF8\xD1\x16\xC4\x08\x07\x2D\x2E\xE5\xD1\x72\xDE\xFC\xC8\x79\xC7\x8A\xE2\x06\x01\xFC\x00\x21\xA7\xE9\xE1\x8F\xE2\xF6\xC3\x1A\x07\xFD\x06\xE2\xCB\x34\xD1\x93\xC8\x6C\xC7\x94\x08\xB2\xE2\x30\xD7\x65\x26\x42\xD2\xEF\x50\x07\xE2\x66\x82\xB9\x4A\xB0\x68\x5E\xB7\xD4\x0D\x21\xA7\x87\x00\x31\xE2\x02\x01\xC8\xE2\xFF\xC3\x1C\xCC\xDC\x37\x42\xD2\x39\x51\xBE\x2E\x4E\x77\x21\xA7\xBA\xA7\x50\x7B\xCE\xBA\x4D\xC1\xE2\x12\xAE\x4C\x09\x6A\xD0\xE2\xB0\x0B\x3C\xE2\xFD\xDE\xD0\x0D\x2B\xC1\x01\x01\xEC\xCB\x47\xD0\xB9\xA5\x27\x7B\xDD\xE2\x03\x5C\xCE\xCB\xFF\xA7\xBE\xD0\x01\x00\xC3\x5A\x01\x5B\x3C\x59\x48\x51\x3B\xE2\xDB\xBF\x93\xC6\x61\xCC\xAE\xE2\x03\x01\xDE\xD1\xC4\xD0\x9E\xD1\x14\xD2\xCB\x0D\xEE\xE2\x46\xCC\x3E\x59\x1D\x59\x93\xE2\xBF\xCC\xFC\xE2\x18\xB8\xED\xC7\x98\xE2\xE3\xBA\x61\xCC\x42\xD2\xAA\xC8\x4A\xC8\xD0\xD1\x8B\xBE\x82\x4C\x2F\xD1\xF9\xB9\x5E\x59\xFE\xE2\x22\x89\xB9\x0B\xDC\xD1\xF5\xE2\xFD\xBA\x39\xD2\x74\xB6\x9E\x02\xE4\x42\x1A\xCC\xE1\x95\x0D\x05\xE9\xD1\xF3\x67\x0D\x05\x07\xE3\x1B\xC9\xCB\xC8\xF2\xD1\x77\xB0\xA3\xE2\xD0\x0D\xA9\x07\x04\x00\x01\x5B\xF7\xDE\xFB\x0D\x07\x40\x05\x00\x29\xE3\x42\xDF\x23\xB9\x7E\x07\x2E\xE3\xDD\xE2\x4E\xD4\x60\xBD\x06\x00\x32\xE3\x89\xCD\xAB\xDB\x19\x05\x4B\x5A\xCC\x0E\x12\x00\xEA\x0D\x50\x7B\x3D\xE3\xB7\xC8\x48\xC8\xB9\xC8\x3B\xBE\xCF\xBD\x42\xD2\xD8\x59\x76\x02\xD7\x74\x07\x00\x3B\xE3\xB2\xC8\x6A\x7B\x94\x08\x23\xE2\x5C\x58\x5D\xBD\x27\xC8\xA3\x0C\x42\xD2\x2E\xBD\xE7\x06\xD7\x74\x08\x00\x4B\xE3\x7E\x12\xC9\xE2\x01\x01\x21\x00\x78\xC8\x06\xC9\x17\xC9\x50\xBE\x96\x0C\x46\xE3\x25\x24\x67\x04\x96\x5E\x59\xE3\x9A\x8A\x5B\xE3\x00\x00\x33\xE2\xC8\xC8\xAC\xD1\x17\x54\x54\xE3\x21\xBE\x60\xE3\x5A\x7B\x32\x03\x67\xE3\x03\x01\x2D\xE2\x2B\xBB\x09\x01\x76\xE3\x1A\xC9\x2B\xC8\x6E\xE3\x09\x6A\x55\xE3\x97\xD1\x74\xD1\xE7\xE2\x3B\x05\x37\xE3\x7E\xDE\xFB\x0D\x69\xE2\x53\xE2\x5D\xB8\x02\x01\xAA\xD0\x8D\x5C\xFE\x20\xAA\x27\x27\x09\xFD\x00\xBC\x72\x9B\xD0\xE4\xA1\x14\xD7\x4C\x2E\x86\xDB\x27\x09\x8A\xE3\x07\x5A\x36\x50\x7E\xC3\x00\x44\x5F\x52\x2B\xBE\x33\xE3\xEA\xB3\x3A\x72\x0B\x00\x83\xE3\x11\xE2\xA3\xDA\xDC\xD0\x54\xD0\x47\x62\x2E\xD1\x74\xD5\x9C\xD5\x9E\xE3\x8F\xD1\xCC\x0D\xF5\x5E\x65\xB4\xD4\xD1\xE1\xC1\x8A\x4E\x66\xE2\x74\xB5\x74\xE2\xC8\xA7\xD4\x0D\x8F\xBB\x7D\x08\xEC\xE2\x7C\x5A\x4D\xD1\x51\xDE\x4B\xDA\x8D\x4E\x03\x5C\x64\xBB\x84\x0A\xA2\xE3\xAB\xE3\xC4\xE3\x1E\xCC\xC9\xDB\x21\x06\xC3\xE3\x4B\x74\x61\xD1\x26\x05\x74\xE3\xA4\x03\x3E\xE3\xED\xBB\x2A\xC8\xEF\xD1\x5E\xC8\x1D\xC9\x63\xE3\xBC\x34\x65\xE3\x73\xE3\x83\xA7\x21\xE2\xC0\x79\x4F\xE3\xD3\x0D\x08\xE3\xBF\xBD\x6F\xE3\x8F\xBD\x27\xC8\x57\xE3\xCD\xE3\x01\x01\x20\x00\x69\xE3\xE6\xE3\x41\xE3\x79\xC8\xF1\xD1\x61\xE3\xBF\x09\xD5\xE3\x4C\x54\xD7\xE3\xC8\x1C\xE4\xE3\x89\x06\x69\xE3\x1E\x00\x5E\xE3\xCA\xC8\xFD\x53\xE0\xE3\xB4\xC8\x71\xE3\x03\xC7\xC5\xE3\xFD\xE3\x7D\x74\xDE\xE1\xE3\xA7\x50\xD2\xEE\xD3\x4A\xCF\x9E\xA5\xD4\x0D\xA9\x92\x01\xE4\xE6\xCF\xFE\xE3\xAA\xD9\x18\xB1\x16\xA1\x94\xB7\x5D\xD2\x6C\xC1\xE2\xC3\x43\x16\x7B\xDE\xFB\xB9\xE3\xDE\xAC\xDE\x24\xC1\x80\xDE\x4B\xE2\xAE\x41\x0F\xC3\x25\x03\x85\xDE\xE6\xDE\x1D\xDB\xB9\x67\x0F\xE4\xA4\xC1\x27\xC3\xC7\x17\xF4\xCC\xA8\x6F\x11\xCD\xD8\xDE\xCC\xDE\x5B\xA0\xDB\xDE\x20\xE4\x1B\xE4\x53\x02\x9C\xCC\x60\xBC\x50\xCD\x64\xC7\x48\xCD\xD9\xDE\x09\xCD\x2B\xE4\xDC\x67\x21\xE4\x80\xD0\x00\xC4\x24\xE4\x95\xB8\x39\xC7\xB5\x73\x27\xE4\x79\xCC\x3E\xCC\x05\x7C\x36\xE4\x02\xBD\x2D\xE4\x62\xCC\x8F\x08\x1B\xCD\x16\xE4\x47\xCD\xAE\xDE\x3A\xCD\x7D\xBC\x43\xE4\x2C\x7A\xCC\xE2\x2D\xAA\x76\x0D\x74\xCC\xAB\xDE\xB8\xDE\xAD\xDE\x39\xCD\x49\xCD\x52\xBA\x4E\xE4\x2E\x7A\x45\xE4\x82\xCC\x73\x71\x84\xCC\xD5\xDE\x96\xC7\xD7\xDE\x40\xE4\x62\xCD\xA0\xA0\x2E\xBA\x38\xE4\xED\xC1\x94\xC2\xC8\xDE\x70\xC7\x60\xE4\x8D\xD8\xCB\xDE\x41\xE4\xCD",
"\xDE\x66\xE4\x5C\xE4\x01\xCD\x4C\xDE\x07\x74\xC1\xDE\xF1\xB7\x54\xCD\xB1\xDE\x23\x4B\x72\xE4\x53\xC7\x0F\x69\x5D\xCD\x79\xBC\x38\xCD\x2C\xCD\x4C\xE4\xFF\x00\xC8\xB9\xD8\xB8\x67\xE4\x0E\xC2\xD0\xC2\xBE\x17\xB6\xCC\xBD\xBC\xCA\xDE\x33\xE4\x29\xE4\x96\x59\xC2\xBC\x19\xE4\x7A\xE4\x50\xE4\xC4\xC3\x52\xAA\x46\xB8\xF9\xDE\xA2\xC7\x2C\xE4\x93\xE4\xA7\xC3\x19\x0A\xC9\xCC\xFB\x0D\xE8\xA0\xC9\xB9\x86\xE4\x93\xC2\x88\xE4\x19\x0A\xCF\xCC\x66\xBA\x85\xCD\x07\xDF\xA4\xDE\xA3\xE3\x9B\xBA\x40\x56\x14\xE2\x40\xCB\x56\xD2\x7F\x9F\x49\x5C\x03\x95\x10\x00\xBA\xE3\xAE\xD2\xE3\xCB\x6A\x4C\x96\x0A\x50\x56\x6C\x00\xB4\xE3\xFF\x00\x03\x95\x11\x00\xC3\xE3\x0A\xE4\x4B\xC8\x07\x93\x40\xE2\xE7\x92\x12\x93\x58\xD9\x05\xB4\x4B\xC8\xF1\xDB\xA2\xA1\x27\x09\x9C\xDB\xAE\xE0\xB6\xDA\x1C\xDC\x90\xD2\x58\xD8\x1F\xDC\x6F\x94\xC2\xD7\x54\xC4\x0E\x68\x29\xB4\xEE\xD2\x39\xDB\x84\xDB\x9F\x73\xD2\xC3\x5F\x99\x1C\xDF\x21\xA2\xB9\xDA\x6A\x7B\x78\xDA\xDB\x86\x3C\x9C\x41\xDF\x41\xD5\x76\xDE\xC2\xCD\x68\xDB\xDA\xE4\xF4\xD7\x66\xAC\x24\xD4\x5E\xB4\xBB\xAA\x9A\xB7\x45\xBC\x39\xDC\xBA\x75\xB5\xE4\xD9\xE4\x09\x01\xCC\xE4\xB7\xDD\x06\xE1\x7C\xC1\xC0\xD2\x4E\xDC\xC2\xD2\x83\xC9\xA1\xDA\x25\xAE\x75\xDF\x4E\xA0\xF7\xE4\x30\xDE\xF9\xE4\xF4\x71\xB5\xC1\xA3\xD4\xDC\x67\x03\xE5\x37\xDF\x05\xE5\xDC\x75\x42\xD8\xC6\xD7\x37\xA6\x0A\xE5\xC4\xE0\xEC\xB0\xCF\xE4\x3B\xDF\xD1\xE4\xB8\xDF\x72\xAE\xBA\xDF\xA5\xB1\x07\xD3\xF0\xDF\x4B\x66\x03\x01\x11\xE5\x59\xDD\xC5\xE0\x86\x6C\x50\xD3\x29\xBF\xC2\xD8\xDC\xDC\xB7\xD4\x30\xBF\xD6\xDA\x7C\x5A\x1F\xE5\xD9\xE0\x47\xDE\x1C\xCE\xBF\xDC\x8F\xD8\xAA\xDC\x3C\xD3\x1C\xE5\x77\x63\x1E\xE5\xDB\xE4\x5D\xD6\x24\xD4\x23\xE5\x63\xBF\x25\xE5\x09\xE0\xFA\xCF\x91\xCE\x57\xD3\xB7\x0A\x35\xE5\xEB\xE4\x87\xB1\x56\xAB\x3E\xDA\xF3\xDC\x07\xE0\xF5\xDC\x85\xBF\x22\xD3\x31\xE5\x23\xB2\xEB\xDA\x1F\xE4\x09\xE5\x36\xE5\xA3\xDC\x4B\xC3\x0D\xDD\xD8\xB8\x2B\xE5\x92\xE1\x1C\xDE\x73\x6A\x4F\xE0\x83\xB9\x55\xE5\xAA\xE1\x2D\xE5\x17\x9E\x62\xE0\x3F\xD7\xCB\xE4\x50\xE5\x61\xDC\x0C\xDB\xDC\xE0\x33\x82\x02\xDB\xF7\xDA\xF6\xE4\x62\xE5\xC0\xC0\x8A\xE0\x5A\xCD\x61\xE5\x42\xE5\x17\xB2\x78\xDB\xC3\xCB\xE2\xB5\xCF\x72\x71\xDD\xE7\xDE\x69\xE5\x6F\xE5\x97\xB3\x82\xDD\xD0\x0D\x16\xDB\x36\xA1\x5B\xE5\xFE\xD8\x5D\xE5\x61\x9E\xD4\xB2\xC1\xD6\x1D\x73\x6E\xE5\xE7\xDF\x54\xD5\x64\x8D\xDF\xDD\x4A\xDE\xA9\xDD\xCF\xDE\x00\x00\x7E\xE5\x94\xD9\x80\xE5\x96\xD9\xBA\xDD\xFF\x9A\x9D\xDE\x77\xE5\x86\xE5\xF5\xD7\x07\xE1\x17\xB3\xCD\xDD\x12\x9B\x50\xDB\x2A\xE5\x6A\xE5\x1F\xE0\x64\xE5\x89\xE5\x2A\xD0\xFE\xB9\x73\xB6\x3A\x5D\x41\xE5\x96\xE5\xEC\xE4\xDC\xC9\x9A\xE3\x3E\xDB\xC5\xCF\xF7\xDD\x79\x83\x40\xE5\x53\x94\x9E\xE5\x93\xDD\xB0\xA6\x66\xDA\x24\xDA\xEF\xD9\x4B\xDB\x55\xB0\xD7\xD9\x50\xE1\xEC\x62\xA6\xE5\x2D\xE1\xD0\xD9\x3D\xDA\x7E\xE1\x49\xE1\x9D\xE1\x57\x7B\x0E\xDA\xE9\xDA\xFB\xCF\x33\xE5\x49\x64\xBC\xE5\x7B\xE1\x66\xD9\xBF\xE5\xCB\xD4\x0A\xDA\xA2\xE5\x62\xD8\x26\xDA\x64\xDB\x28\xDA\xAE\xE5\x9D\xE5\x78\xE5\xD1\xDA\x1D\xDE\x95\xE1\xF4\xDC\xB3\xAF\xF7\xC3\xE9\xD4\xC7\xCF\x99\xE1\x74\x69\x85\xE5\xBD\xE5\xCF\xDF\x65\xD4\x1C\xE1\x03\xD5\x7B\xDB\xB6\xE1\xA5\xD7\x44\xD0\x12\x9C\xB3\x79\xC7\xE3\x13\x00\xC9\xE3\xC5\xE2\x3F\x04\xF2\xE3\x88\x5B\x50\x7B\xE8\xB4\x34\x00\xD3\xDB\xAA\x4F\xD7\x74\x15\x00\xF2\xE3\x40\x00\x69\xE3\xFC\xE5\x77\x5D\xDB\xDB\x9A\x94\xB6\x6B\xDF\xDB\xDB\x4A\xE2\xDB\x1E\xAF\xE5\xDB\x88\x67\x25\xE3\x84\xE3\xEE\xE5\x5D\xB7\xCB\xE3\xBD\x04\xF2\xE5\x69\xE3\xF5\xE5\xF7\xE5\x8C\x44\xF9\xE5\xFB\xE5\xFD\xE5\x11\x5E\x00\xE6\xDD\xDB\x45\x6E\x03\xE6\xFB\x4C\x05\xE6\x8C\xB2\x07\xE6\xA7\x68\xDB\xA7\xAA\xD7\x69\xB7\xA5\xDA\x93\xDB\xA0\xDB\x3A\x67\xA2\xDB\xA0\x62\xDE\x3B\xE0\x3B\x4F\x8F\xBB\x03\xC3\x5A\x24\xDE\xC1\x08\x94\xDB\x62\x6A\x28\xE6\x28\x64\x75\x34\x62\x00\xE0\x3B\x5A\xD5\xD3\x06\x23\xE6\x86\xDB\x25\xE6\xC5\xC9\x3B\x5C\xA3\x94\x1C\x0E\xB9\x3B\xA9\x83\xC3\x5D\x03\x5C\x71\x06\x3A\xE6\x92\xDB\x4B\xDE\x00\x00\x31\xE6\x71\x6E\xA3\x94\xD1\x7C\x9E\x08\x37\xE6\xC0\xE4\x98\xA5\x3A\x72\x17\x00\xBF\xE4\xA7\xDB\x8B\xBE\x1B\x00\xB4\xE4\x6A\xD0\x51\x17\x74\xDE\xB8\xE2\xDC\x4C\x31\x01\x9C\x0E\xFA\x0D\x5D\xE3\x83\xA7\x40\xE3\xF9\xE2\xA2\xE4\x71\x27\x5B\xE6\xD8\xD0\x73\xDE\xC4\x0A\x94\x08\x63\xE6\x47\xD5\x69\xE6\x6F\x0C\x27",
"\xD1\x61\x0D\x95\x42\xA0\xE2\xF0\xA3\xF0\xE3\xD9\x37\xF2\xE3\x6C\xE6\x84\xD5\xD7\xE2\xF0\xCB\xC4\x0A\x02\xD7\xD4\x4C\x1D\x2B\x6B\xE6\x1A\xBD\x52\x57\x49\xBB\x0A\xD6\xA4\x3E\x85\x0B\x73\xE6\x4A\xA4\x75\xE6\x54\x06\xF2\xE3\x1F\xBE\xDB\xA8\x92\x59\x7C\xE6\x3F\xBB\x7F\xE6\x4C\xE3\xB7\xD5\x05\xA2\xC4\x0A\x70\xE6\x26\x28\x72\xE6\xCB\xE0\x3A\xE2\x56\xE3\xFA\x0D\x6B\xE3\x2E\xE2\xA4\xC8\x64\xE6\x4E\xD0\x66\xE6\x8F\xE6\xEB\xAF\xD8\xE2\x6A\xE6\x92\xE6\xD6\xD5\x6E\xE6\xBB\x27\x96\xE6\x14\x33\x98\xE6\x2A\xE2\x85\x42\xD7\x74\x1D\x00\xF2\xE3\x8F\xE3\xB3\xE2\x87\xE4\xA2\xE6\x6F\x0C\x7D\xE6\x94\xE6\x6F\x0C\x94\x08\xB3\xE6\x30\xD7\x1D\x2B\xAB\xE6\xE1\x47\xAD\xE6\x50\x79\x9D\xD0\xFA\x0D\x1C\x00\xF2\xE3\xF7\x00\x16\xE3\xBB\xB7\x5A\xE6\xA3\xE6\x5C\xE6\x91\xE6\x09\x01\xC7\xE6\x29\xAE\xBE\xE6\x92\xC8\xC1\xE6\x68\xE6\x06\x3D\x32\x43\xD7\x74\x1A\x00\xF2\xE3\xF3\x00\xC8\xE6\xCB\xB7\x98\xA7\xCB\xE6\xD4\xE6\xB3\x3E\xA6\xE6\x09\x01\xDA\xE6\xD0\xE6\x95\xE6\xD2\xE6\x86\xE6\x3F\xBB\xF2\x41\xD7\x74\x19\x00\xF2\xE3\x1D\x75\xB4\xE6\x65\xE6\xB2\x3E\x67\xE6\x40\xB0\x7E\xE6\xE1\xE6\x06\x01\xED\xE6\xBD\xE6\xE5\xE6\x84\xE6\xD3\xE6\x48\xE5\x92\xB8\x7F\xE2\x45\xD2\x27\x01\x61\xE6\xBE\xD1\x00\xE7\xD9\xD2\x22\xE4\xF0\xE6\xDE\xE6\xF2\xE6\xB9\xE6\xBB\x27\x94\x08\x02\xE7\xA9\xE3\xA5\xE6\x6F\xE6\xE6\xE6\xFB\x25\x87\xE6\xD4\xA4\x89\xE6\x02\x01\xE8\xE3\xBE\xD1\x15\xE7\x03\xE7\x39\xE4\x36\x7A\xF1\xE6\xAB\xE2\xE0\xE6\xBA\xE6\x41\x3F\x45\x93\xF3\xE6\x0E\xE7\xF9\xE6\xE7\xE6\xD8\xD6\x64\xA7\x13\xE7\x01\x01\x9D\xE6\xF7\xE2\x6A\xE3\xDB\xE6\xF7\xB7\x1A\xE7\x06\xE7\x1C\xE7\x5D\xE6\x94\x08\x29\xE7\x9B\xD5\x0D\xE7\xAA\xE6\x0F\xE7\x80\x3F\xB5\xE0\xEE\xC8\x9B\xE6\xA3\x01\xF2\xE3\xF5\xE3\xEE\xE6\xA1\xE6\x05\xE7\xB7\xE6\x90\xE6\xF4\xE6\x8A\xE6\xE4\xE6\x22\xE7\x25\xD6\xAC\xE6\x24\xE7\x39\xE2\x2C\xC8\x94\x0B\xB0\xE6\xF2\xE3\xB1\xE6\x3F\xE7\x51\xC3\x11\x05\x2F\xE7\x43\xD2\xA9\xE6\x75\x08\x94\x08\x50\xE7\xF7\xE6\x47\xE7\x3A\xD6\x97\xE6\x4A\xE7\x0C\x82\xC3\xE6\x14\x54\xF2\xE3\xC5\xE6\x51\xE7\xE3\xCB\x1B\xE7\x55\xE7\x35\xE7\x57\xE7\x61\xE7\x46\xE7\x36\xE7\x23\xE7\x10\xE7\xE8\xE6\x1F\x42\xD7\xE6\xF2\xE3\xD8\xE6\x64\xE7\x65\xD0\x7B\xE6\x42\xE7\xA4\xE6\x1D\xE7\x09\xE7\xB4\x04\x20\xE7\x08\xE7\x75\x08\xBF\xE6\xA5\x07\x38\xE7\x6F\xE7\x0C\x45\xEA\xE6\xF2\xE3\xEB\xE6\x74\xE7\xC3\xC3\x53\xE7\x77\xE7\xCC\xE6\x44\xE7\x07\x3A\x7C\xE7\x32\xA9\xD1\xE6\x6D\xE7\x81\xE7\x89\xA7\x5B\xE2\x69\xDA\x9B\xC9\x6F\xBD\x54\xE6\xF4\xD1\x49\xE2\x06\x01\x22\x00\x98\xE7\xC1\xE2\x0E\xA8\x27\x01\xF3\xBA\x8A\xD0\xF7\xA1\xFE\x73\x9D\xE7\x57\xAA\x03\x5C\xCE\xA7\x22\xC1\x58\xB6\x86\xE3\x94\xB7\xD1\xE1\x30\xB7\x5F\x3C\x58\xE2\x27\x01\xF6\xE6\xE5\xD7\x61\xB8\x88\xA7\x05\x75\xE7\xE1\xE6\xA1\x54\xE2\x03\x01\xAD\xE7\x07\x5A\x0C\xC8\x7D\xE2\x83\xB8\xE2\xA1\x45\xE2\x1E\xC7\x8E\xD0\xBC\xE2\x19\x6B\xF6\xE1\x5A\xD5\x1D\x54\xE8\xC8\xBE\xD1\x27\x09\xC4\xE7\x68\x6D\xC6\xE7\x76\x98\x83\xDB\x86\x59\xDD\x8A\xD7\xC8\x64\x00\x11\xBD\x11\x59\x1D\x01\xD7\xE1\x1A\x66\xD9\xE1\x39\x0B\x74\x3C\xC0\xE2\xA2\xE7\x16\xD8\x77\x27\xA6\xDB\x29\x87\x26\x00\xA5\xE7\xA1\xA7\x29\x87\x97\xE3\xDE\xE7\xCC\x0D\xA9\x07\xDB\xBA\x50\xE6\x67\xE2\xD0\x0D\x50\xBD\x94\xB7\x79\xE3\x8F\xDF\xD5\xC8\xFB\xE3\x27\x09\x69\xD0\x09\xC9\x6D\xE3\x5E\xBD\xF3\xD1\x75\xDE\xAC\xC8\x09\x01\xAE\xC8\x7E\xA6\xC4\x65\xF1\xE7\xA5\xDF\x75\xC8\x07\xC9\xF8\x02\xD1\xE3\xF8\xE7\x52\xE3\x51\xBE\xEC\xE7\x31\x72\xA9\x07\xD0\xBA\xE7\xDB\x1F\xCC\x36\xA1\x97\xE2\xAE\xE7\x61\xE2\xB0\xE7\x09\x01\xB0\xBA\x77\xC4\xA8\xC5\xE1\x3D\x13\xE4\x45\xBC\x08\xDF\x5A\xD5\x18\xE4\x95\xE3\x27\x01\x11\xE8\xBC\xE7\x53\x59\xDA\x05\x27\x09\x16\xE8\x22\xCC\xB0\xC6\xDE\x35\x1D\xE4\xEE\xCC\xE9\xE4\x09\x01\x21\xE8\x0D\xA2\x23\xE8\x79\x07\x25\xE8\xC3\x5A\xD7\xC5\x25\xE4\x76\xE4\x80\xB9\x26\xA8\x53\xA8\x37\xA6\x2E\xE8\x6F\xD1\xAF\xE7\xD7\x07\x32\xE8\xA5\xCC\x91\xC5\x85\x4C\x2F\xE4\x4A\xCC\x8C\xE4\x4B\xE4\x58\xE4\x35\xE4\x1E\xE4\x6F\xA0\x27\x09\x3B\xE8\x13\xD1\x13\xE8\x3E\xE8\xBD\x79\x33\xE8\x18\xE8\x10\x2E\x55\xCC\xB2\x3E\x57\xCC\x45\xE8\x57\xE4\x34\xE4\x5B\xCC\x39\xE8\x7C\x5A\x4C\xE8\x30\xD1\x4E\xE8\xC3\x07\x3F\xE8\x04\xE3\xE8\xC6\xFD\x3D\xA4\xB8\x65\xCC\x36\xE8\xC0\xBC\xE4\xB7\x5B\xE8\xD0\x5C\x5D\xE8\x24\xE2\xA1\xE2\xAD\x1F\x61",
"\xE8\xC5\xCC\x88\xE2\x64\xE8\xB5\xDE\xF6\x64\x54\xE4\x37\xCD\x4A\xE4\x58\xE8\x8E\xE4\x59\xE4\x49\xE8\xC2\xE1\x4B\xE8\x56\xE2\x34\x6D\x6F\xE8\x50\xE8\x40\xE8\x99\xE2\x42\xE8\x77\xA1\x88\xBC\x9A\xB9\xE1\xDE\x68\xBA\x84\xA0\xC4\xDE\x07\x5A\x3A\xE8\x7F\xE8\x62\x3C\x14\xE8\xAF\xBA\x51\xE8\x28\xE8\x8E\x32\x6A\xE4\xA6\xB9\x57\xE8\x81\xE4\x47\xE8\xFF\x00\xCE\xDE\x3D\x73\x5C\xE8\x8F\xE8\x65\xA7\x24\xE8\x82\xE8\x62\xE8\xCB\xC6\x73\xE8\x63\xBA\xA2\xBC\x75\xE4\x3F\xE4\xF8\xCC\x99\xC7\xA3\xCC\x7C\xCC\x8E\xE8\x34\xE2\x36\xA7\x81\xE8\x15\xE8\x93\xE8\x72\xE8\x5D\xC4\xDF\xDE\xA5\xA1\x98\xE8\xBA\xDE\x7A\xE8\xCA\xA0\x6A\xE8\x1E\x62\x6C\xE8\x1F\xD1\x3D\xE8\x60\xE8\xA2\xE8\x71\xE8\x41\xE8\xA5\xE8\x92\xC7\xED\x7D\xB7\xCC\x89\xE8\x97\xC7\x15\xE4\x67\xCC\xF2\xDE\xCB\x71\x77\xE2\x02\x01\xBE\xE8\xC1\xA2\x30\xE8\x11\x02\x70\xE8\x17\xE8\x94\xE8\x19\xE8\x96\xE4\x28\xA0\xCF\xE8\x01\x01\xD1\xE8\x20\xA3\xD3\xE8\x5E\x01\xD5\xE8\x27\xE8\xB4\xE8\xFE\xC4\x9D\xE4\xFF\x00\x9F\xE4\x1A\xBE\x9E\xE8\xAF\xE8\x4E\xE2\xB1\xE8\x92\xE8\x83\xE8\x45\xC6\xFD\x3D\xA5\xE4\x04\xCD\xE6\x85\xB2\xC7\xF2\xB9\x82\xB7\x1C\xC1\x20\xE8\x5A\xD2\xEC\xB3\x4A\xE2\x83\xE2\xDC\x67\x8C\xE2\x12\xE8\x6E\xE8\x45\x2D\x2B\xD1\x8B\xBE\x29\x00\xC9\xE3\x13\xE3\x02\x01\xF6\xE2\xDD\xD0\x99\xC8\x4D\xE3\x19\xC9\xBA\x6D\xFC\x06\x20\xE3\x9B\xC8\x4F\xBE\x6F\x51\x09\xE8\x0A\xE8\x14\xE9\x97\xCF\xCC\x0E\x2A\x00\x05\xE9\x0D\xE6\x01\x01\x5D\xD0\x83\xA7\xF6\xE7\x77\xE3\x05\xE8\xB3\xCB\xBE\x2E\x0F\xE9\xEF\xD1\x17\x54\x15\xE9\x84\xE3\xB2\xDA\x09\x01\x05\xCC\xE3\x7B\xD1\xCB\x8B\x0B\xFE\xCB\x09\xCC\x00\xCC\xC8\x3E\xCA\x1D\x0C\xCC\xFB\x95\x0E\xCC\x4A\x0B\x10\xCC\x39\x55\xCF\x3E\x25\x03\x02\xCC\xED\xCD\x17\xCC\xF1\xCB\xAA\xE2\x1F\xDD\x4D\xA7\x1D\xCC\x26\xE9\x6C\xDA\xC7\xE3\xED\x0D\x2D\xD2\x90\xE2\x90\x0B\x1D\x55\xD1\x99\xF0\xBA\x06\xE9\x01\x01\x08\xE9\xEF\xBE\x0A\xE9\xAB\xDA\x67\xB4\x6C\x0A\x4A\xE9\xB2\x58\x15\x7A\x1D\xE3\x6D\xE2\x4D\xA7\x92\x0B\x23\xE9\xAC\xD1\xD3\xE3\x23\xE3\x43\xE9\x82\x74\xA9\x78\x2C\x00\x58\xE6\x5B\x81\xB3\x0B\x00\x3F\xB1\x43\x7B\xCD\x88\xE7\xE2\x12\xCD\xE1\x9E\xE7\xCA\xCC\x69\x24\x64\xE9\xD2\x81\xA4\x0B\x15\x3F\x40\xE7\x50\xAA\x6C\xE9\xA6\xE7\xC7\xE3\x2E\x00\xEF\xE5\x1A\xE9\x00\x00\xC9\xE7\xD3\x67\x21\xC8\x50\x7B\x7D\xE9\x66\xE0\x3A\xE7\x97\x07\x50\xD1\x78\x0C\x00\x53\x2B\x02\xB8\xE6\xC0\xC8\x8C\x3E\xD7\x74\x35\xBE\xC0\x6A\x54\xBD\x50\x7B\x8D\xE9\xA1\xE0\xF3\xE7\x44\xE3\x72\x05\x85\xE9\x73\x28\x87\xE9\xCD\xD0\xB3\xD4\x0E\xA7\xBE\xD0\xF5\x89\x99\x70\x06\x0E\xFA\x0D\x2F\x00\xF2\xE3\x02\x00\xCF\xE3\xD0\x7F\xA3\xE9\xEA\xE8\xA4\x18\xFF\x03\x96\xE9\xC7\x29\x98\xE9\xC6\x0D\xE0\x52\xD7\x74\xA1\xE9\x83\xA7\xB0\xE9\xF4\xBA\xB2\xE9\xFF\xE8\x74\xE6\xE7\x06\xAA\xE9\x3A\x30\xAC\xE9\xB1\xD0\x00\xBD\x8A\x0A\xD7\x74\x9C\xE7\x83\xA7\xBF\xE9\xF4\xBA\xC1\xE9\xB5\xE9\x88\xE6\xB7\xE9\x5E\xE8\xB9\xE9\x86\x0A\x89\xE9\xA4\x18\x04\x35\x6D\xE9\xFD\x70\x31\x00\x70\xE9\xBD\xE3\x64\x04\xA2\x3F\x7F\xE3\x3B\xE0\x0F\xE2\x2D\x02\xF4\xE2\x07\xE9\x15\xE3\x87\xE7\xFB\xE6\x3E\x3D\xD4\xE9\x0D\xAF\xD5\x8A\x39\x50\x74\x00\x58\xE9\x98\xE3\x8C\xE3\xC9\x05\x5C\xE9\xEE\xD1\xF0\xD1\x22\xE3\xEC\xE3\xFA\xE7\x38\xBC\xA3\xE7\x55\x24\xE4\xE7\x60\xE9\xF4\xD0\xAB\xE4\x06\x01\x33\x00\xD0\xE9\x8B\x85\x7C\x98\x07\xE7\x44\xD2\xC1\xE7\x53\xA9\xF6\xE8\x1B\xC4\x6E\xDA\xA6\xCD\x2E\x04\x40\x82\xB6\x39\x90\xE0\x11\xE1\xE8\xDC\x13\xE1\xEA\xDC\x29\xE1\xEC\xDC\x52\xDF\x32\xDC\xEF\xE0\x1B\xDC\xB5\xDF\x3D\xE6\x19\xB2\xC1\xD7\x8E\x82\x08\xDC\xF5\xC2\xC5\xD7\x97\xD5\x8B\xCD\xDC\x67\x0D\x00\x02\xEA\x20\x32\x04\xEA\x73\xE1\xE0\xDF\x4D\xD5\xE2\xDF\xA3\xD9\xE4\xDF\x79\xE1\x2E\xDD\xCA\xE5\x99\x5A\x57\xD8\x1B\xD3\xD2\xE4\x4E\x5F\x4F\xC9\xC3\xD7\x7F\xC9\x2F\xE3\x3F\x9C\x8B\xDA\x2C\xD9\x15\x03\x1B\xEA\x34\x4E\x1D\xEA\x42\xDC\xAC\xDF\x44\xDC\xAE\xDF\x01\xDE\xB0\xDF\xB5\xDD\xAD\xE0\xF8\xE4\x9B\xDA\x96\xCF\x57\xDF\x57\xD5\x93\xDA\xED\xDF\x8B\xB6\xFB\xD7\x1D\xC4\x1A\xEA\x96\x97\x03\xEA\x0F\xE1\xAE\xCD\x1E\xEA\xFA\xDF\x20\xEA\xFC\xDF\x22\xEA\xFE\xDF\xE5\xDF\xCE\xD9\xE2\xE5\xE8\xDF\x41\xEA\x4D\xDC\x8A\xC4\xFD\xE4\xA0\xDA\x4E\xE1\x85\xC9\x01\xE5\x98\xD3\x04\x0A\x34\xEA\x40\xD1\x36\xEA\x51\xDD\x43\xDC\x53\xDD\x45\xDC\x33\xDF\x02\xDE\x3D\xEA\x5D\xDE\x3F\xEA\x02\xE0\xD6\x7E\x07",
"\xE5\xF4\xE0\x49\xEA\x6C\x9C\x4B\xEA\x57\xE1\x2D\xD5\x59\xE1\x11\xCE\x5B\xE1\xD7\xDD\x5D\xE1\xC6\xDD\x5F\xE1\xC8\xDD\x61\xE1\xDD\xDD\xA0\xDF\x76\xDC\x55\xAE\x24\xD5\xF9\xC4\x47\x62\x72\xEA\x09\x87\x74\xEA\x88\xE1\xA5\xE0\x57\xE0\x8B\xE1\x59\xE0\xA5\xE1\x58\xD6\x69\xCF\xA8\xE1\xC3\xE0\x20\xE5\x13\xE5\x0F\xEA\xBF\xD7\xCD\x95\xC7\xC9\x91\x94\x11\xBF\xE8\xC1\x15\xEA\xBE\xDA\x0C\xE0\x01\xEA\x4A\xEA\x1C\xEA\x4C\xEA\x11\xCF\x05\xEA\x4D\xDF\x07\xEA\x4F\xDF\x09\xEA\x40\xDD\x43\xE1\x73\xE0\x26\xEA\x58\xDA\xD0\xDF\xDB\xDA\x87\x99\x3B\xE5\xD0\xD5\x3D\xE5\xAB\xDC\xC7\xB1\x86\xEA\x62\xEA\x7F\x50\x64\xEA\xCC\xDC\xB3\xD9\xD1\xD7\xB5\xD9\xFC\xDB\x49\xE0\xA2\xDD\x4B\xE0\xEE\xCE\xAB\xE1\xFF\xAF\xD3\xDA\xD7\xD9\xEA\xD5\xC0\xD9\x61\xEA\xA1\xEA\x35\xEA\xA3\xEA\x1A\xD0\x37\xEA\x19\xDA\xAD\xDF\x1B\xDA\x2C\xDE\x6A\xEA\x2E\xDE\x3E\xEA\x04\xE5\x40\xEA\xF7\xA2\xD7\xDC\x8E\x68\x06\xE0\xC7\xDA\x08\xE0\xB3\xEA\x8D\xD7\x3E\xE5\xC7\xE5\x80\xAB\xA0\xEA\x73\xEA\xA2\xEA\x75\xEA\xF0\xD6\x7F\xDF\x9B\xDC\x81\xDF\x86\xAE\x83\xDF\xBD\xCF\x2B\xE1\xC7\xD5\x0D\xEA\x34\xDC\x03\xE0\xC0\xD8\x57\xC2\x2C\xC5\xA7\xDC\x6F\xD3\x4A\xE5\xDD\xDC\xAF\xCE\xAA\x8C\xB6\xC1\x87\xEA\x4E\xD1\xE6\xEA\x8A\xEA\xA1\xE1\x8C\xEA\xA3\xE1\x9E\xDD\x8F\xEA\x6A\xD7\x91\xEA\xE8\xD9\xA9\xE1\x7F\xE5\x21\xE5\x7B\x74\x53\xE5\xAA\xDD\xFE\xEA\xA8\xB3\x89\xEA\x7E\xE0\x93\xDF\xBA\xE0\x95\xDF\xFE\xE0\xA4\xE1\x00\xE1\x90\xEA\xD1\xD3\x03\xE1\x0A\xEB\x8F\xE5\x0C\xEB\x35\x94\x1E\xDD\xB2\xBF\x30\x83\x27\x09\x10\xEB\xD2\xB5\x12\xEB\x0F\xDF\x08\xD9\x72\xE1\xCF\xEA\x2C\xDC\x2C\xD6\x2E\xDC\xAF\xDF\x79\xD9\xB1\xDF\x09\xDD\xCD\xE4\x55\xDF\x31\xDD\x01\xD9\x45\xDF\x0D\x0A\xB8\xEA\xE7\x58\xC8\xDC\x2F\xDA\xCA\xDC\x2A\xEB\x65\xEA\x38\xEA\x67\xEA\x3A\xEA\xD3\xEA\x3C\xEA\xD5\xEA\x6C\xEA\xD7\xEA\x6E\xEA\x88\xE5\xA0\xD7\x4C\xDD\xB4\xB5\xB9\xC2\xCD\x9D\xA5\xC5\xE4\xEA\x88\xEA\x00\xEB\x13\xEB\xC3\xDF\x15\xEB\xC5\xDF\x17\xEB\x05\xEB\x19\xEB\x07\xEB\x1B\xEB\x67\xAF\x4B\xCE\x60\xC5\xCB\xC2\x6C\xAF\x1D\xCF\x75\xCA\x25\xEB\x3D\xC3\x27\xEB\xDC\xDF\x05\xD4\x24\xE1\x64\xDF\x92\xE0\xA7\xEA\x6F\xE0\xA9\xEA\x7D\xDD\xED\xDC\x7F\xDD\x45\xE1\x81\xDD\x9B\xE0\x66\xDC\x40\xD9\xA5\xB2\x75\xE5\xD3\xC5\x33\xEA\xCB\xEA\x63\xEA\xCD\xEA\x8C\xD4\x2B\xEB\x3E\xE1\x7C\xD3\x40\xE1\x77\xE1\x42\xE1\x6F\xEB\x98\xE0\xF1\xEA\xF0\xDC\xF1\xE0\xB1\xE0\x47\xCF\x8B\xBF\x63\xEB\xC9\xD1\x65\xEB\xE4\xE0\xFC\xD9\x31\xDA\xE9\xEA\x13\xDF\xEB\xEA\xC1\xB0\x5E\xD4\x9F\xDC\x6F\xD2\xA1\xDC\x71\xD2\x51\xE5\x5E\xD6\xC7\xE0\x14\xD4\x50\xEB\xFF\xEA\xCC\xEA\xE7\xEA\xEB\xD7\x69\xEB\x79\xDD\x27\xE1\xEA\xDD\x70\xE0\x84\xDF\xEF\xEA\xBC\xD8\xAD\xEA\x30\xDD\x60\xDE\x72\xE5\x46\xDD\x8B\xE5\x83\xD9\x8C\xEB\xE9\xD7\x8E\xEB\x6F\xD9\x29\xEB\xE6\xE0\xA4\xEB\x57\xDE\xA6\xEB\x59\xDE\x6D\xEB\x5B\xDE\x6B\xEA\xB2\xDF\x6D\xEA\xAF\xE0\xBE\xB2\x29\xDB\x0F\xEB\x39\xEB\x75\x04\xBA\xEA\x1B\xD7\x6C\xDC\xA3\xD5\xCF\xDC\x33\xE0\xAB\xE0\x19\xDE\x1D\xEB\xBA\xD9\x90\xE5\x9F\xBE\x08\xE1\x2F\xDB\xCE\xDD\xF0\xAD\xB3\xEB\x2F\xDA\xB5\xEB\xA0\xE1\xCE\xD7\xBB\xEA\xB5\xDC\xB4\xD9\xB7\xDC\xB6\xD9\x8F\xE1\xB9\xD7\xD0\xEB\xEA\xD9\xD2\xEB\xED\x72\x04\xC0\xA6\x8F\x1E\xE1\xEA\xAC\x86\x05\xC6\xEB\xD7\x05\xC8\xEB\x07\xD7\x1C\xD7\x92\xC9\x36\xD0\xAA\xE0\xC0\xEA\x44\xDE\xC2\xEA\x43\xCF\x0C\xE5\xA7\xCB\xB4\xE5\x4A\xDE\xB5\xD1\x91\xC0\xF6\xDD\xD7\xD9\xF8\xDD\x3A\xDE\x9F\xEB\x11\xEB\x52\xEB\x28\xEB\x1E\xD9\xB8\xEB\x91\xE0\xA5\xEB\x93\xE0\x28\xE1\x52\xEA\xD6\xE0\x54\xEA\x00\xE0\xC1\xEB\x06\xDE\xCC\xE5\xEB\xE1\x42\xE2\xB5\xE5\x4A\xDB\x9D\xC3\x4C\xE1\xE0\xCF\x45\xEA\x31\xCF\x9F\xD4\xE2\xEA\xFD\xCF\x79\xEB\xE5\xEA\xA1\xEB\x01\xEB\xDC\xEB\xC9\xEB\xCD\xDC\x6D\xDC\xCC\xEB\x5B\xE0\xCE\xEB\x35\xE0\xE4\xEB\x73\xDC\xC4\xEA\xA2\xC6\xC0\xE5\x49\xDB\x92\xE9\x71\xB0\xFB\x97\xD4\xDA\xCB\xC0\xEB\xD5\x3C\x10\xED\xEB\x54\x01\xEF\xEB\x3E\xDE\xF1\xEB\x35\xD0\x6E\xDC\xF4\xEB\xE2\xEB\xB8\xD9\x2C\xEC\x1B\xDE\x2E\xEC\xDC\xB6\x49\xDE\xCF\xE5\x7C\xD8\xD1\xE5\x4B\xE5\xDD\xC3\xB4\xAE\xD8\xEB\x2B\x98\x3F\xD1\xB9\xEA\x7C\xEB\x2A\xDC\x7E\xEB\x74\xE1\x80\xEB\x76\xE1\x95\xE0\x78\xE1\xAB\xEA\x7A\xE1\x71\xEB\x6D\xDF\x46\xDB\x49\x64\xE6\xD4\x96\xE1\x28\xD0\x21\xDE\xDE\xE5\x8F\xD7\xC8\xB6\x24\xEB\x39\xEC\x3B\xEB\x4F\xEC\x3D\xEB\x08\xEC\xA5\xEA\x6D\xE0\x6B\xEB\x94",
"\xE0\x25\xD9\x30\xDC\x0B\xEA\xEE\xDC\x86\xEB\x88\xDF\xE4\xE5\x7A\xDB\x47\xEC\x1B\xBD\x55\xE1\x65\xDE\xFE\xC6\x5E\xDA\xCA\xCB\xA2\xE0\x26\xB7\xFD\xE9\xE9\xE7\x27\x01\xBB\xBA\x38\xB7\x6D\xDA\xC8\xE0\xC0\x02\xE0\xA1\x07\xB7\x9B\xD9\x66\xEB\xB3\xD6\x68\xEB\x09\xEC\xBA\xEB\x0B\xEC\xA7\xEB\xBD\xEB\x51\xDF\x31\xEB\x53\xDF\x33\xEB\x00\x6B\x28\xEA\xC0\xD7\x02\xD3\xD1\xA5\x21\xDF\x47\xC1\x23\xDF\x7C\xDA\x17\xEA\x20\xCE\xB9\x67\xB3\xE4\xDB\xD9\x4C\xDA\x23\xEC\xF5\xD8\x3F\xEB\xD0\xEA\x39\xEA\xD2\xEA\x69\xEA\x44\xEB\x35\xDF\xD6\xEA\x0B\xE5\xB4\xDF\x39\xDF\x74\xDA\xD0\xE4\x29\xEA\x17\xE5\xA0\xCD\x94\xD2\xDF\xD7\x12\xC7\x97\xD2\x37\xEB\xA5\xEC\x71\xE2\x96\xD8\x01\xD8\xDB\xEB\xA9\xEC\xDD\xEB\x52\xDD\xB6\xDC\x54\xDD\xFA\xD8\x85\xE0\x71\xDC\x43\xEC\x37\xE0\xE6\xEB\x95\xD2\xA8\x8A\xEF\xE4\x44\xBC\xB6\x75\xD9\xCD\x7D\x8B\xF4\xE4\x87\xD6\x67\x01\x8A\xEC\x31\xD8\xDC\xD9\x06\xEC\x39\xDD\x6C\xEC\x4E\xEA\xD2\xE0\x50\xEA\xD4\xE0\x0D\xEC\xEC\xE0\x0F\xEC\xD8\xE0\x56\xE5\x45\xEC\x5E\x9C\x10\xD8\xFC\xE4\x12\xD8\xFE\xE4\x5D\xEA\xA2\xDA\xFA\xE8\xFC\x71\x27\xAE\xBF\xEC\xB3\xE7\x1B\xD9\x64\xD8\x97\xDC\x90\xEB\x2C\xD3\xA2\xE1\x3F\xDE\xFF\xE0\x47\xE0\xA6\xE1\x5C\xE0\x92\xEA\xB1\xEC\x12\xE5\xD8\xEA\x7B\x73\x70\xEA\x78\xEB\x3A\x03\xD9\xEC\x5E\xB6\x8C\xEC\x8F\xEB\xE1\xD8\x91\xEB\x25\xE1\x80\xDF\x3D\xDD\x82\xDF\xEB\xDD\xEE\xEA\xE5\xEC\xEE\xE0\x98\xEC\x69\xD3\x6E\xDF\xE6\xE4\x28\xE9\x84\xEA\xC0\xC4\x07\xED\xA6\xEC\x15\xDA\xA2\xEB\xFD\xD9\xB9\xEB\xE8\xE0\xBB\xEB\xEA\xE0\xE3\xEC\x16\xE1\x14\xED\x18\xE1\x75\xEC\xFF\x8B\x14\xE5\x3D\xB4\x3C\xDF\x3C\xD5\xA3\xB1\x19\xE5\x3A\xCE\x1B\xE5\x38\xDB\x6E\xDB\x27\x09\xF3\xEC\xFE\xD7\xC1\xEC\xFA\xD9\xF7\xEC\x0C\xED\xF9\xEC\x03\xEB\xFB\xEC\x18\xEB\xFD\xEC\x1A\xEB\x02\xE1\x5C\xEB\xD6\xD7\x5E\xEB\xCE\xEC\xE0\xE4\xBE\x69\xDF\xC9\xF1\xB4\xC6\xDA\xF7\xEA\xAA\xD8\xF9\xEA\x27\xE5\xCC\xDA\x34\xED\x32\xEA\x1D\xED\xC0\xEC\x05\xD9\x97\xD8\x0F\xDC\x67\xEB\x3C\xE1\x54\xEC\x1F\xEA\x51\xDA\x21\xEA\x41\xE1\x23\xEA\x5A\xEC\x25\xEA\x5C\xEC\x7C\xE1\x56\xDF\x1D\xCD\x8E\xD8\x39\xD3\xD2\xE5\xC2\xDC\xC8\xEA\x0F\xDE\xCA\x02\x08\xED\x1B\xD8\x1F\xED\xA8\xEC\x4E\xDA\xDF\xEC\x12\xE1\xE1\xEC\x14\xE1\x26\xED\x2A\xE1\x28\xED\x2C\xE1\xAC\xEB\x75\xE0\xF3\xEA\xD1\xDF\xDB\xEA\xA8\xD8\x4D\xED\xC8\xDA\x3C\xE5\xE0\xEA\x0B\xE0\x37\xE1\x1E\x62\x37\xED\xD1\xE9\x39\xED\x2E\xDA\x6A\xEC\xE5\xE0\xA9\xDF\x20\xD9\xAB\xDF\xAB\xEC\x41\xEB\xAD\xEC\xC0\xE0\xD4\xEA\xB0\xEC\x46\xEB\xB2\xEC\x48\xEB\x2E\xCA\x1B\xD6\x1B\xB2\x1D\xD6\x24\xE0\xE8\xDA\x73\xDF\xD0\xC5\x4C\xE5\xFC\xEA\x8B\xBF\x88\xED\x9A\xE1\x6F\xED\x2D\xDA\x3B\xEC\xFA\xEC\x3D\xEC\xB1\xDD\xF3\xEB\x8E\xE1\xCA\xEC\xBA\xDC\x93\xEA\x2C\xE5\x1F\xEB\x26\x6E\x0E\xEB\x37\xCA\xA5\xED\x47\xD8\x7D\xD8\x49\xD8\xCE\xE0\x76\xDD\xDE\xEC\x5B\xED\x4F\xEA\x5D\xED\x51\xEA\x5F\xED\x53\xEA\x24\xEA\xE6\xDF\x56\xEA\x87\xE5\x2A\xA4\x59\xE5\xB6\xED\x6E\xED\xF8\xD9\x1C\xD9\xBB\xED\x10\xDF\x8E\xED\x72\xD9\x44\xE0\xB6\xD2\x5B\xDC\x9E\xDC\x86\xDC\xA0\xDC\x88\xDC\xA2\xDC\x63\xE5\xE6\xC5\x5F\xE5\x1C\xED\xD1\x01\xCB\xED\xBE\xE3\xA8\xED\x52\xEC\x50\xDD\xC5\xEC\x66\xEA\xC7\xEC\x68\xEA\x94\xED\xAF\xEC\xC2\xE0\x01\xED\x94\xEA\x03\xED\x7E\xD9\xA1\xE5\x73\xD6\x5A\xD5\x48\xDD\x4F\xEB\x9D\x02\xDF\xED\xF5\xEC\x7E\xD8\x70\xE1\x6A\xE0\xBD\xED\xAA\xEC\x2C\xEB\x1A\xDA\x2E\xEB\x3B\xEA\x30\xEB\xBF\xEB\x32\xEB\x11\xEC\xCE\x96\x5B\xDD\x51\xBD\x75\xCA\xB7\xED\x62\xD8\xF3\xD8\x71\xED\xF8\xDF\x73\xED\x06\xEA\x75\xED\x08\xEA\x77\xED\x0A\xEA\x96\xEC\x0C\xEA\x16\xED\xF2\xEA\x6E\xCF\x4A\xEB\x4B\xEC\x76\xEB\xEB\xD3\xA4\xED\xF5\xED\x8A\xED\xA9\xED\x3E\xED\xAB\xED\x46\xE0\xAD\xED\xB3\xDD\x95\xED\xEA\xED\x97\xED\x02\xED\x99\xED\x44\xA4\x7B\xE5\xAF\xD6\x1C\xEE\x1E\xED\xE1\xED\x20\xED\x0D\xED\x22\xED\x26\xE1\x92\xEC\xBC\xEB\x11\xEE\xAA\xEA\x84\xEB\x44\xE1\x2A\xED\x1A\xE1\x14\xDB\x1B\xDB\xFB\xC5\xBE\xEC\x1D\xEE\x56\xED\xC2\xEC\xFA\xE0\x7F\xE0\x55\xEB\x15\xE0\x57\xEB\x31\xE0\x06\xEB\x70\xC2\xCB\xDF\xED\xDD\xCD\xDF\xC6\xED\x97\xE5\xEE\xED\x18\xEE\x70\xCF\xDE\xE0\x93\xA6\x2D\xEE\x55\xED\xB9\xED\x06\xD9\xCE\xED\xB7\xEB\xD0\xED\x77\xEA\x9F\xD3\x79\xEA\x99\xDF\x16\xDF\x1B\xE0\x9C\xDF\x1D\xE0\x9E\xDF\x9F\xE5\xE6\xC5\xC4\xEB\xCA\xED\x2E\xEE\xCD\xED\xF8\xED\xCF\xE0\xFA\xED\xE4\xED\x40\xEB\xE6",
"\xED\x42\xEB\xAE\xEC\x00\xEE\x45\xEB\xC0\xEB\x47\xEB\xC2\xEB\x98\xE5\xFB\xE7\x4E\xC3\x1D\xC4\x08\xEE\x7C\xD8\x0A\xEE\x53\xEB\x42\xE0\x45\xEE\xD2\xED\x82\xDC\x35\xDA\x93\xEC\x36\xEE\x6E\xEB\x73\xEC\x70\xEB\x3A\xEE\x46\xE1\x77\xEC\x78\xC0\x37\xDB\x11\xDA\x35\xED\xD8\xEC\x69\xEE\xF6\xEC\xC9\xDC\x8D\xED\x10\xE1\x0D\xEE\xA6\xEA\x0F\xEE\xA8\xEA\x86\xEE\xBE\xEB\x74\xEE\x02\xEE\x76\xEE\x12\xEC\x2F\xE1\xC2\xE1\xEC\xE1\x16\xEC\x48\xB3\xAF\x97\xFF\xEB\x35\xE1\x01\xEC\x90\xEE\x54\xED\xF4\xEC\x1E\xEE\xE2\xED\xE1\xCD\x6E\xEE\x91\xED\x70\xEE\x93\xED\xC9\xEC\xC1\xE0\x86\xE0\xB1\xED\xE7\xEC\x47\xED\x3C\xDB\xFB\xEB\x48\xEC\xA0\xD1\xA6\xB6\x8B\xC6\xB8\xE5\x35\xE1\xBA\xE5\xAA\xEE\xDE\xED\x92\xEE\xF7\xED\x58\xED\x8E\xEC\x5A\xED\xFB\xED\x7F\xEB\x7E\xD6\x81\xEB\x58\xEC\x83\xEB\x88\xEE\x85\xEB\x15\xEE\x87\xEB\x98\xC3\x3E\xDA\x7F\xE1\x5A\xD7\xD7\xD9\x36\xEC\xC9\xEA\x5A\x04\x40\xEE\x57\xEE\x57\xED\x24\xDD\xDD\xDF\x58\xE1\x92\xEB\x5A\xE1\x94\xEB\x17\xB4\xF5\xD6\x71\xE0\x61\xED\xC5\xED\x7B\xED\x2E\xE1\xD4\xEE\x30\xEC\x9A\xE9\x45\xD9\x15\x96\x4A\xEC\xFA\xEA\xD2\xD4\x9F\xEA\xF4\xED\xC5\xEE\xBA\xED\x6B\xEE\xBC\xED\x5B\xEE\xE2\xEE\x78\xEA\xE4\xEE\x44\xB5\xE6\xEE\xA9\xEB\x79\xED\xF0\xEA\xD2\xEE\x76\xEC\xA1\xEE\xCD\xE5\xEE\xDB\x34\xDE\x41\xDA\xDC\xE5\x63\xEC\x9E\xD4\xFF\x00\xDF\xE5\xB1\xCB\xAB\xEE\x38\xED\x41\xEE\x3A\xED\x94\xEE\xF8\xEC\x77\xD5\x6D\xEC\x6A\xEB\x99\xEE\x6C\xEB\x9B\xEE\x95\xEC\x01\xEE\x97\xEC\x03\xEE\xF0\xE0\xAE\xEB\xD4\xD6\x4B\xEB\xA2\xD7\xE7\xE5\x5C\xDA\x6E\xDB\x7E\xDB\x46\xAA\x41\xD0\xBC\xD0\x02\xE9\xD0\x0D\x67\x7B\xC4\xEE\x40\xB8\x95\xA7\x51\x17\x6A\x4C\x07\xBA\xFC\x3A\xB4\xE3\x00\x75\x03\x5C\xB6\x87\xD9\xDB\xFF\xE7\x66\xAD\x9F\xDB\x10\xEA\x36\x5D\x33\xE6\x9D\xA1\x96\x3B\xB4\xDB\xFF\x59\xB4\x70\x02\x01\x3A\xEF\x24\xE6\x48\xE6\x4A\xE6\x72\x79\x40\xEF\x1E\xAA\xA5\x3B\x98\x4F\xF1\xE9\x0B\xE4\x60\xBD\x38\x00\x7A\xE9\x39\xE3\x03\x01\x39\x00\xF2\xE3\x4A\x7E\x50\x7B\x67\xCF\x3F\x30\x08\x6A\xF6\x44\xD7\x74\x3A\x00\xF2\xE3\x0F\x4C\xF4\xBA\x62\xEF\x72\x5F\x18\xE6\x6F\xB7\xC6\x6D\x1B\xE6\x00\x00\x37\x00\x2E\xE6\x84\x7B\xAB\xB5\x1F\xE6\xB6\x6B\x09\xE6\x66\x82\x53\xEF\x0C\xE6\x55\xEF\x02\x01\x57\xEF\x83\xA7\x59\xEF\xC0\x79\x5B\xEF\x12\xE6\xBA\x4F\x5F\xEF\x61\xEF\x69\xE3\x64\xEF\xF2\x5C\x66\xEF\x03\x06\xF3\x6C\x69\xEF\x6B\xEF\x1D\xE6\x22\xA4\x6F\xEF\x45\x6E\x21\xE6\xFE\xE9\xC8\xC7\x88\x04\x0E\xC6\xC9\xB0\xBC\xD7\x0B\xE1\xBE\xD7\x03\xDC\x48\xED\x24\xA2\xD2\xA5\x22\xDF\x9D\xEA\x0A\xDC\xC6\xD7\xAF\xE5\x92\x07\x90\xEF\xAE\xBF\xD8\xD7\xDE\xE4\x15\xA6\x84\xDA\x75\xD2\xD3\xE4\xBA\xEC\x23\xDC\x19\xED\xBD\xEC\x9E\x63\x2D\xE6\x5D\xEB\x0F\xC6\xF9\xEB\xD5\xCD\xF7\xD7\x37\xDC\x7F\xC1\xF2\xE4\xAF\xA5\x5C\xDF\x6B\x62\xAC\xEF\x45\xED\xAE\xEF\xED\xED\xBB\xB4\xBD\xBE\x70\xDF\xBF\xBE\x5C\xEA\x69\xED\x0A\x83\x5F\xEA\x00\xBE\x1E\x62\x46\xE6\xCC\xEC\x5F\xE0\xBB\xEF\x3D\xAE\x83\xD5\x2C\xD8\x9C\xE5\xD0\x5C\xC6\xEF\xB7\xEE\x5C\xE5\xB3\xED\xF0\x95\x82\xEA\x1E\xCE\xA2\xEC\xBE\x69\xB8\xEF\x45\xDE\x46\xED\x38\xDF\xBD\xD7\xAC\xD5\xB6\xEC\x9B\xEC\x59\xD8\xD6\xC4\x04\xD3\x9C\xEA\x06\xD3\xBC\xDF\x57\xD3\x94\x08\x27\x09\xCF\xEF\xEB\xED\xB2\xED\xAF\xEF\x7B\x72\xA5\xDC\x1E\xD3\xEF\xDB\x35\xDE\x26\xE5\x6F\xDD\x51\xED\x8F\xEE\xD4\x63\xD8\xEF\xF7\xEB\xFD\xD2\xEC\xEF\xBE\xDC\x66\xED\xC0\xDC\xC1\xEF\xF3\xD9\x6B\xED\xE7\x6C\xE8\xEF\x9F\xEF\x61\xC3\xFA\xEF\x7F\xBF\xB0\xEA\x51\xD3\xE7\xDA\x46\x9D\x4F\xED\xF3\xEF\xD0\xAE\x11\xA5\xE7\xEF\x1B\x02\x03\xF0\xDC\xE4\xC7\xED\xD6\xDC\x80\xBF\xF5\xEA\xB2\xEA\xAB\xD8\x0A\xE0\x35\xCA\x28\xE0\x6D\xE5\x10\xF0\xAD\xEF\x91\xEF\xE8\xEC\x39\x72\x3A\xE0\xDF\xE9\xCD\xEF\xC5\xEF\x11\xF0\x37\xE5\x96\xD3\x21\xEB\xE6\xC8\xC4\x65\xE9\xEF\x27\xEE\xEC\xED\x29\xEE\x79\x84\xDC\xED\xC8\xE5\x8F\xEF\x1E\xF0\xA0\xEF\xB9\xEE\xDB\xE0\xEF\xED\x82\x91\xD4\x0D\xF2\xED\x83\xB9\x2C\xF0\x75\xEE\x98\xED\x1F\x94\x05\xEE\x8E\xEF\x9E\xEF\x34\xF0\x04\xF0\xC9\xEF\x9F\xD7\x98\xD6\xAF\xDC\x4C\xB3\x0F\xDB\x88\x72\x7C\x5A\x3D\xF0\x9E\xEE\x3F\xF0\xA0\xEE\xB0\xE0\x15\xDB\x2C\xEE\xF5\xE4\xAF\x03\x26\xF0\x9B\xEB\xE9\xD6\x9D\xEB\xFA\xBC\x33\xF0\xB9\xEF\x1F\xF0\x36\xF0\xAC\xE1\x65\xE5\x3C\x97\x53\xEE\x2A\xF0\xB9\x67\x4E\xF0\x1E\xEF\x9F\xEE\x34\xEB\x52\xF0\x96\x59\x84\xCF\x06\x73\x4D\xF0\x57\xF0\xDA",
"\xED\x4B\xC3\x40\xC6\x30\xDB\xAB\xEF\x5C\xF0\xD9\xEF\xBA\xEF\x2F\xF0\x47\xF0\x61\xDE\xF0\x9B\xA3\xE5\x79\x83\x0F\xF0\x6B\xB7\x44\xF0\x12\xF0\x4F\xEE\xB1\xD4\x48\xE1\x31\xEC\xE5\x59\xAC\xE5\x00\xEC\x7D\xF0\x6E\xF0\x80\xF0\x27\xF0\xE4\xD4\x0C\xE2\x04\xDF\xA4\xEE\xEB\xA4\xB7\xE5\x60\xCB\xFE\xEF\x45\xDA\x1D\xEC\x52\xED\xD9\x7F\x02\xF0\x8B\xF0\x58\xF0\xA9\xE5\x64\xE1\xE5\xA0\x32\xEC\x0D\xDA\x68\xE1\xC5\xE5\x6A\xE1\x34\xB5\x7E\xF0\x56\xF0\x9A\xF0\x70\xF0\x53\xDB\x9D\xF0\xCA\x8E\x35\xDE\xF1\xEE\x50\xED\x4C\xEC\x0E\xF0\x8A\xF0\x5D\xF0\x35\xF0\xD2\xEF\xBE\xB6\x1E\xDE\xE7\xD4\x62\xEC\x98\xE1\x65\xEC\x1C\xBC\xB1\xF0\x76\xF0\x5E\xF0\xB4\xF0\xAB\xCF\x38\xF0\xF5\xA6\xD5\xEE\x99\xE6\xC0\xDF\xFC\xE3\xDB\xE5\x67\xDE\x29\xEF\x9E\xE1\xE9\x63\x87\xEC\x9E\xEB\xD5\x03\xE5\xE5\x23\xDD\x4A\xD7\x25\xDD\xE1\xEE\x0E\xED\xEA\xEA\x10\xED\xEC\xEA\x12\xED\x85\xB0\x6C\xD7\x5F\xC3\x30\xC9\x5C\xC1\x93\xEF\xDD\xEF\x15\xE5\xB7\xEC\x3D\xDF\xDC\xD7\x07\xDC\x6D\xBE\xBD\xDA\x9B\xEF\xD6\xEF\x34\x76\x53\xE6\xF5\xDB\x66\xC2\x89\xE1\xF8\xDB\x04\xEB\x48\xEE\x59\xEB\x4A\xEE\x08\xEB\x1C\xEB\xD0\xEF\x0B\xEB\x95\xEA\xB4\xEC\x82\xDA\x2D\xED\x16\xE5\xE2\xF0\x35\xC9\x87\xDA\xE4\xE4\xEC\xCD\x8A\xDA\x44\xDF\xD7\xEC\x58\x05\xCF\xF0\xE3\xDC\xC7\xEE\x99\xD8\x8F\xEC\x17\xEF\x0A\xEC\x6F\xEC\x0C\xEC\xC2\xED\x0E\xEC\xC4\xED\x55\xEA\xEA\xEE\xBE\xE5\xE9\xDF\xC7\x0D\x60\x9C\xF9\xD7\x5A\xDF\xD5\xEC\xB6\xEF\x37\xEB\xEA\xF0\x0E\xDC\xDF\xEE\x59\xED\xD3\xF0\x32\xEE\x0F\xED\xE9\xE0\x11\xED\xA8\xEB\x13\xED\x10\xF1\x10\xEC\x68\xF0\x20\xEF\xF6\xD7\xBD\xEF\xEB\xEC\x9F\xDA\x50\xDC\xC3\xEF\x27\xAE\x1C\xF1\x3E\xDC\x8D\xEC\x08\xF1\xC9\xEE\xB0\xEE\xFC\xED\xD1\xEA\xFE\xED\x43\xEB\x73\xEE\x96\xED\x3E\xF0\x28\xEE\x77\xEE\x1E\x91\x63\xDC\x31\xF1\x05\xF1\x69\xEC\x80\xA9\x30\xDA\x3D\xED\x8A\xE1\xEF\xF0\xA8\xE0\x49\xEE\xB2\xC3\xF3\xF0\x44\xED\xBD\xF0\xB3\xF0\x05\xF0\xED\x7F\x0E\xE5\xE8\xF0\x7C\x5A\x32\xF1\x54\xDC\xDC\xEC\x4F\xDD\xAF\xEE\x25\xEC\xBC\xEA\xCE\xDC\xBE\xEA\xA0\xDD\xF5\xEB\xAC\xE0\x2D\xF0\xEB\xEF\xB3\xEC\xDC\xEF\x3A\xDF\xFA\xF0\xE1\xF0\x2F\xED\xB9\xDF\x90\xDC\xA0\xEC\x92\xDC\x57\xC6\x04\xF1\xEB\xF0\x2A\xC3\x24\xEC\xF0\xEB\xCA\xEB\x1D\xD7\x28\xEC\x84\xE0\xB5\xEE\xCB\xEC\xF5\xF0\x1E\xEB\x52\xF1\x85\xBE\x06\xEF\x74\xD8\xDD\xDA\x0A\xF0\xF7\xDC\xC7\xCF\xD8\xDF\x18\x85\x57\xF1\x74\xEB\x37\xDD\x59\xEE\x07\xEC\xFA\xEE\xD4\xF0\x93\xEB\xD6\xF0\x95\xEB\xFF\xEE\x26\xF1\xE8\xEE\x11\xF1\x63\xED\xCB\xE5\x14\xF1\x8D\xD8\xFD\xEF\x19\xEE\xEF\xDF\x97\xF0\xF1\xDF\x47\x62\x87\xF1\x7B\xDC\x67\xDC\xB6\xEB\x8B\xF1\x96\xEE\xBE\xED\xE0\xEC\xC0\xED\xE2\xEC\x0E\xF1\xE4\xEC\x27\xF1\xE6\xEC\xD1\xEF\x7D\xF1\x4E\xCE\x72\xD7\xCF\x95\x2B\xC5\x17\xF0\x0B\xF0\x19\xF0\xDE\xDC\xF4\xEE\x03\x04\x44\xF1\x1F\xEE\x49\xF1\x3F\xED\x58\xEB\x41\xED\x5A\xEB\x43\xED\x87\xB0\x04\xE1\x6B\xDD\xBF\xF0\x1E\xDC\xF2\xDC\xE6\xDA\x81\xF1\x06\xC2\xC4\xD8\x0C\xEF\xC6\xD8\x8A\x8D\x9F\xF1\x95\xDC\xBA\xF1\xEE\xF0\xBC\xF1\xF0\xF0\xBE\xF1\xF2\xF0\x5B\xEB\xC1\xF1\xC7\xEF\x05\xE1\x46\xF0\x19\x72\xB5\xED\x83\xD9\xCE\xF1\x49\xF0\xD0\xF1\x13\xDE\xD2\xF1\x4B\xF1\xF1\xF0\x4D\xF1\xD6\xF1\x13\xB2\xA7\xF0\x9F\xDF\xF4\xDA\xC9\xED\xDD\xF1\xB9\xF1\xAE\xEE\x77\xCF\xDF\xCA\xC6\xEC\xDF\xEB\xC8\xEC\xB8\xDC\xAF\xED\x90\xE1\x7B\xF1\xD1\xEB\xC4\xF1\xC5\xBF\x0D\xAC\xF0\xAD\xDE\xF1\xC7\xDC\xE0\xF1\x2F\xE0\x4A\xF1\x8C\xE1\x4C\xF1\x2A\xC4\x4E\xF1\xD7\xF1\xF7\xF1\xE5\xEB\xF9\xF1\x3D\xD0\xC1\xF0\xB4\x96\x89\xCA\x79\xE0\x3C\x7E\x27\x09\xFD\xF1\xE2\xDC\x45\xF1\x68\x9A\x05\xD7\x73\xF1\x3C\xEC\x75\xF1\xF2\xEB\x3F\xEC\xAE\xED\x79\xF1\xB0\xED\xEA\xEF\xB8\xEE\x55\x74\x41\xF0\xCD\xF0\xB8\xF1\x71\xF1\x6F\xC3\x72\xED\xA5\xF1\x74\xED\xA7\xF1\x76\xED\xA9\xF1\x27\xED\xAB\xF1\x15\xED\x1F\xEF\x17\xED\x73\xEB\xA0\xF1\x75\xEB\xFF\x00\x4B\xF0\xEC\xF1\x24\xF2\x08\xCA\x8B\xEA\xBB\xF1\x21\xEE\xFC\xEC\x23\xEE\x48\xE0\x41\xEC\x4A\xE0\xC2\xF1\x4C\xE0\x5F\xF0\x5C\xD8\x89\xEB\x84\xDD\xF4\xE0\x11\xF2\xFE\xDC\xBA\x97\xC3\xEC\x26\xF2\xCA\xEE\x55\xEC\xCC\xEE\x57\xEC\x71\xEC\x96\xE0\x38\xEE\xAC\xEA\x95\xF1\x07\xDA\x2A\xA4\x5A\xF0\xED\xA3\x48\xF2\x22\xDD\x06\xF1\x1E\xF1\xC8\xEE\x20\xF1\x90\xEC\x23\xED\x34\xEE\x25\xED\x2B\xF2\x78\xED\x2D\xF2\x29\xED\x03\xEF\x9A\xE0\x1B\xE1\x4A\x9E\x63\xF0\x60\xEA\xAE\x05\xED\xF1\x30",
"\xEE\x48\xF1\xD1\xF1\x3B\xF2\x40\xED\x3D\xF2\xFE\xEC\x2A\xEC\x5D\xE0\xD8\xF1\xC3\xF1\xAE\xF1\x81\xE5\xF2\xE0\x41\xB6\x06\xED\x6E\x03\x6F\xF2\x0B\xEE\x09\xF1\x97\xEE\x6E\xEC\x19\xEF\x70\xEC\x2F\xDC\x52\xF2\xD0\xEE\x39\xEE\x68\xF2\x3B\xEE\x97\xF1\x51\xEF\xA2\xA6\x0A\xE1\x63\xE0\xDC\x67\x5A\xF2\x36\xDD\x4A\xF2\x43\xEE\x14\xEB\xFC\xE0\xAF\xDD\xD3\xED\x9D\xDC\x6D\xD2\x97\xEB\xBC\xD3\x99\xEB\xBE\xD3\x9B\xF0\x71\xE5\x22\xEF\x2C\xCB\xE7\xE1\x2F\xE6\x1E\x62\x94\xF2\x23\xEF\x89\xF1\xF8\xEE\xCF\xED\xA4\xF1\x4D\xF2\x5C\xED\x75\xE1\x5E\xED\x82\xEB\x60\xED\x53\xF2\x5B\xEC\x8A\xEE\x72\xEB\x7D\xE1\xCA\xE1\x0D\xE2\x90\xF0\xC1\xD1\xD5\xD9\xCD\xA4\xA8\xEE\xB4\xAE\xA9\xF2\x74\xDD\x34\xF1\xE5\xDC\x83\xF2\x27\xF2\x0E\xEE\x29\xF2\x10\xEE\x64\xF2\x12\xEE\x1D\xEF\x14\xEE\x2F\xF2\x16\xEE\x08\xDA\xFB\xE1\x8F\xF0\xFC\xEB\xBD\xEE\x08\x08\x2C\x72\x19\xEC\x9D\xD4\x24\xAD\xC2\xEE\x07\xD6\x35\x01\x81\xF2\x7F\xEE\xED\xF0\xE1\xF1\x73\xF2\xBD\xF1\x75\xF2\x42\xED\xA7\xE1\x09\xEB\x07\xF2\x2D\xEC\x43\xF2\x2F\xEC\x06\xEF\xD6\xEE\x20\xDE\x35\xEC\xC1\xF2\xDE\xF2\x59\xF1\x2C\xDF\x81\xEE\x81\xE0\x31\xDF\x8D\xE1\x24\xEE\xE9\xED\xB6\xEE\x1E\xF2\xAD\xF1\xDA\xF1\x36\xB0\xB6\xF0\x9E\xED\x20\x98\x76\xD7\x83\xE1\x22\x9F\xB7\xF1\x6B\x05\xF1\xF2\xC4\xF2\x71\xE1\x6D\xEE\x5C\xF1\xDE\xEB\xBD\xEA\xE0\xEB\xBF\xEA\x3F\xF2\xC1\xEA\x41\xF2\xC3\xEA\xEA\xF2\x46\xEC\xC3\xF0\x85\xF0\xAB\xCB\x4D\xDE\x94\xF0\xD3\x99\xAF\xCB\x47\xDA\x0F\xEF\x80\xF2\x37\xF2\x23\xCF\x16\xF2\xAA\xED\x18\xF2\x3E\xEC\x77\xF1\x40\xEC\xF5\xF1\xE3\xEB\xE8\xF2\x44\xEC\x14\xF3\x11\xD7\x61\xF0\x64\x98\x5B\xDA\x80\xEC\xFD\xC6\x21\xB7\xB3\xE1\x68\xDE\x54\xE1\x6E\xE1\xFB\x9B\x8D\xEF\x22\xF2\x3D\x3F\x8E\xE7\x56\xE7\x55\x05\xFF\xF1\x80\xE0\x8D\xEA\x82\xE0\x03\xF2\x08\xC5\x05\xF2\xE7\xF1\xB2\xF0\x45\xF0\xAD\x68\x9A\xEC\x98\xEA\x12\xEA\x77\xD2\xD5\xE4\xFD\x91\xE7\xF0\x1B\xED\x00\xEA\xD7\x24\x3C\xF3\x68\xE7\x3E\xF3\xEE\xF1\xCE\xCF\xB7\xCF\x22\xF1\x24\xED\x24\xF1\x94\xEC\xE7\xEE\xB5\xF2\x62\xED\xB7\xF2\x35\x9C\x2C\xED\x68\xBE\xA4\xEF\x05\xDC\xA6\xEF\x14\xB1\xFF\xF0\xC5\xEA\x01\xF1\xE8\xE4\x37\xEB\x18\x00\x54\xF3\x79\xE7\x75\x08\x3F\xF3\xF4\xF2\x41\xF3\xF6\xF2\x43\xF3\xB1\xC5\xFF\xEC\xE7\xF2\xFB\xF2\xF6\xF0\xFD\xF2\xFB\xEF\x36\xDC\x92\xDA\x59\xDF\xD4\xEC\x47\xEA\x44\xD8\x6E\xF3\x6B\xE7\x71\xF3\x57\xF3\x01\xD0\x59\xF3\xD5\xF0\x23\xF1\xD7\xF0\x25\xF1\xD9\xF0\xCC\xDF\x15\xB0\x4E\xEE\xA8\xE5\x18\xED\x07\x99\x81\xC9\x4F\xDC\x62\xB4\x51\xDC\x8B\xBF\x84\xF3\x5A\xE7\xBB\x27\x72\xF3\x99\xF2\xBB\xE0\x47\xEE\xE3\xF1\xD4\xF1\xE5\xF1\xC0\xF1\x46\xF3\x50\xF1\x48\xF3\x40\xF1\x06\xE5\x42\xF1\xAA\xDD\x9A\xF3\x6D\xE6\x55\xF3\x33\x05\x9D\xF3\x59\xC0\xFD\xE0\x9B\xF2\x15\xDF\x5C\xDC\x9B\xDF\xD7\xED\x9D\xDF\xD9\xED\xE9\xF1\x11\xB5\xD4\xEF\x1A\xED\xD8\xE4\x03\xF1\x97\xE7\x85\xF3\x56\xF3\x70\xF2\x16\xEF\x84\xF2\x18\xEF\xC9\xF2\x9A\xEE\xCB\xF2\x37\xEE\x8A\xF2\x54\xF2\x61\xF3\x43\x90\x96\xEA\x95\xEF\x65\xF3\x8E\xDC\xE1\xEF\x9B\xEA\x36\xCD\x79\xD2\xE5\xEF\x1E\xEC\x09\xD3\x3D\x1E\x6F\xF3\x5D\xE6\xB0\xF3\x15\xC2\x0C\xF3\x5E\xF1\x0E\xF3\x60\xF1\x10\xF3\xF6\xEB\x12\xF3\xF8\xEB\x7C\xF3\x06\xF0\x73\xD8\xB1\xEA\x09\xF0\xC9\xF1\xD4\xDA\x85\xF1\xF0\xAD\xAC\xF3\x0C\xE7\x70\xF3\xC2\xF3\x82\xF2\x36\xF1\x0B\xF3\xF1\xF1\x0D\xF3\xF3\xF1\xE1\xEB\x28\xF3\x42\xEC\x2A\xF3\xCD\xEC\x09\xF2\xBB\xEC\x98\xF1\x30\xE5\xF2\xEE\x9B\xF1\xF5\xEF\x41\xDA\x27\x09\xF0\xF3\x34\xE7\xF2\xF3\xAF\xF3\x87\xF3\x9C\xD2\x89\xF3\x8E\xF1\x8B\xF3\x90\xF1\xED\xEA\x8E\xF3\x4C\xEE\x90\xF3\x12\xF1\xE3\xE5\xA6\xCE\xFD\xD5\xDC\xEA\x81\xED\xDE\xEA\x18\xF0\xB4\xEA\x56\xD3\xD8\xF3\x3E\xD3\x1F\x3A\xDB\xF3\x3E\x2B\x0C\xF4\xCC\xD2\x0E\xF4\xE3\xEE\x8F\xF1\xE5\xEE\x12\xF4\xC5\xB0\x14\xF4\xB9\xB1\xA7\xE5\x43\xE5\xAF\xEA\xC6\xF1\x16\xF0\xEB\xF3\xFD\xB1\x83\xF1\xCB\xF1\x1B\xF0\xB3\xBF\x22\xF4\xC1\xF3\x0B\xF4\xC3\xF3\x1A\xD7\x74\xF1\x26\xEC\xCB\xEB\x5F\xF1\xCD\xEB\x61\xF1\xCF\xEB\xFD\xF3\xC8\xEF\x78\xF0\xDB\xF1\x22\xF0\x37\xD6\x99\xF3\x23\xF4\xC4\x0A\xDD\xF3\xAD\xC3\xB0\xF2\x56\xEC\xB2\xF2\xCE\xEE\xB4\xF2\xCB\xF3\xB6\xF2\x8C\xF2\x8B\xEE\xB0\xBF\x29\xF0\x6D\xF2\x08\xF4\x93\xE6\x8F\xE7\x4E\xF4\x25\xF4\x3F\xD4\x27\xF4\xFC\xEE\x29\xF4\xFE\xEE\x2B\xF4\x91\xB3\x8F\xF3\x2E\xF4\x91\xF3\x30\xF4\x4D\x77\x31\xF0\x7C\xD2\xDA",
"\xF3\x3B\xF4\x3F\x05\x61\xF4\xA6\xD4\x63\xF4\x5D\xEE\xFD\xEE\x08\xB6\x91\xF1\x13\xF4\x85\xDF\xEE\xDD\x58\xF4\xB8\xF2\x8C\xEE\x77\xE0\x67\xE5\x33\x83\x07\xF4\x4D\xF4\xD2\x34\x73\xF4\xAA\xDF\x75\xF4\x30\xD5\x77\xF4\x7C\xBE\x96\xEB\xD6\xED\x98\xEB\xD8\xED\x9A\xEB\xE1\x8B\x6C\xE5\x85\xEA\xC4\x65\x5D\xF4\xA8\xE6\xAE\xF3\x72\xF4\x3D\xF4\xB2\xD7\xAF\xF2\xBF\xED\xB1\xF2\xC1\xED\xB3\xF2\xC3\xED\x93\xF1\x28\xF1\x50\xF0\x69\xF0\x17\xEE\x48\xF0\xC7\xDC\x9D\xE0\x07\xE7\x8A\x8D\x95\xF4\xEE\xD5\x24\xF4\x99\xF4\x6A\xDC\xF6\xF3\xE5\xED\xF2\xF1\xE7\xED\xB4\xEE\x25\xEE\xFA\xF2\x63\xF1\x1F\xF2\x7B\xF2\x91\xE5\x2B\xEE\x55\xD9\xF4\xE0\xAB\xF4\x84\xE6\xDC\xF3\x86\xF4\x8F\xED\x88\xF4\xCF\xD8\x8A\xF4\x23\xC6\x67\xF4\x1B\xB4\xAA\xEB\x11\xD9\x16\xF4\x57\xEA\xC3\xEB\x82\xE5\x96\xDD\xEF\xF3\x84\xF4\x9C\xF3\xC1\xF4\xD1\xED\xF5\xF2\xBE\xE0\xF7\xF2\x3E\xF2\xFB\xF3\x40\xF2\x79\xF2\x42\xF2\xFF\xF3\xE9\xCA\x7A\xF0\x88\xF1\x0F\x73\xB1\xEB\xAA\xF4\xD1\xF4\x86\xF3\xAE\xF4\xCB\xDC\xB0\xF4\x6F\xEE\xB2\xF4\x71\xEE\xE8\xED\x3C\xF1\x26\xEE\x3E\xF1\x2E\xF0\xA8\xF3\x79\x84\x67\xEE\x83\xD9\xBE\xF4\x48\xE7\x7D\xE7\xF3\xF3\xDF\xF2\x39\xF2\x72\xF2\x24\xF3\xAC\xED\x1A\xF2\xF8\xF2\xED\xF4\xB6\xF4\xEF\xF4\x64\xF1\x48\xF4\x4C\xDC\x79\xEE\x91\xF2\x93\xF4\xB9\x67\xF5\xF4\x5C\xE7\x21\xE7\xD2\xF4\xE6\xF4\x3E\xEB\x37\xF1\xCB\xEE\x23\xD9\xCD\xEE\x51\xF2\x59\xEC\x5F\xF3\xE9\xEE\x55\xF2\xAE\xEA\x7F\xF4\x7B\xF0\x5A\xD5\xA4\xE5\x37\xEC\xC0\xF3\x9B\xF3\xE5\xF4\xF4\xF3\x5F\xF2\x0A\xF1\x91\xEC\x0C\xF1\x85\xEE\xC9\xF3\x87\xEE\x13\xEE\x74\xEC\x7D\xF4\x5D\xEC\xB9\xF2\x14\xEC\xBB\xF2\xD4\xF2\x48\xE9\x53\x0D\x81\xD4\xA0\xED\x04\xAD\xA9\xEE\xDC\xF2\x70\xF4\x20\xF5\xF8\xF4\xF2\xF2\x13\xE0\x73\xF3\x01\xF2\x8E\xEA\xE4\xF1\x04\xF2\xE6\xF1\x63\xBE\xDB\xF4\x13\xF3\xDD\xF4\x5C\xCB\xBB\xEE\xF0\xED\x32\x69\x92\xF0\x4D\xE1\x1A\xF3\x4C\xC5\xDB\xF2\x06\xF4\x3A\xF4\x3A\xF5\x3C\xF4\x22\xF5\x76\xEA\xFB\xEE\x76\xF4\x65\xF4\x78\xF4\xC7\xF4\xC8\xB5\x7B\xF4\x4D\xEE\xCB\xF4\x13\xF0\x88\xD7\xD9\xE5\x47\xE5\xC2\xE5\x8C\x9B\xB6\xD4\x0C\xF0\x5C\xD7\xDF\xDC\x0A\xF5\x4D\xD6\xF4\x28\xAD\xF4\x55\xF5\xE8\xEA\x8D\xF1\x28\xF4\x10\xF4\x2A\xF4\xD8\xF0\x2C\xF4\x5D\xF5\x15\xF4\x18\xF5\xAD\xEB\x25\xD7\x79\xEC\xC2\xD8\xAD\xF0\x67\xF5\x66\xDB\xB4\xAE\x6A\xF5\x9E\xD6\x85\x28\x6D\xF5\xF9\xF4\x02\xEB\x3A\xF2\xFC\xF4\x22\xEE\xFE\xF4\xD8\xF4\x1C\xF2\xF6\xF1\x7A\xF3\x7C\xF1\xE7\xF3\x48\xDE\x16\xF3\xEE\xEE\xB2\xE1\x9D\xCC\x0B\xEF\x24\xAD\x0E\xEF\xB2\xB0\x83\xF4\x71\xF4\x13\xF2\x47\x9C\x15\xF2\xC4\xEC\xE8\xF4\xB1\xEE\xEA\xF4\xB3\xEE\xF4\xF1\x8C\xF5\x29\xF3\x8E\xF5\xF8\xF1\xB9\xF4\xBC\xD9\x51\xEE\x91\x93\xAF\xE1\x7B\xEC\xB1\xE1\x7D\xEC\xEA\xE5\xD1\x99\x7C\xDB\xFC\xD6\xA5\x5B\xAB\xE7\x8E\xD0\x86\xE7\x56\xEE\xF0\xA1\x37\xEF\x14\xD7\xB8\xE7\x21\xA7\xBE\xE7\x07\xB9\xB5\xE7\xB8\xC7\x96\x59\xB6\xF5\x81\xDE\x03\x01\x73\xE7\x30\xD7\xF2\x41\x22\x75\x14\xD7\x3B\x00\xF6\xE9\xBB\xE1\x26\x45\x1A\x3D\x50\xE6\x51\xE2\x38\x32\x8E\xD0\x63\xE7\xC8\xF5\x1F\x42\xCA\xF5\xE7\xE1\x3C\x00\xCD\xF5\x4E\xAA\x29\x52\xDE\xE2\xD4\x0D\xC4\xF5\x91\xE4\x06\x54\x90\xE3\xA6\xD0\xBB\xF5\xE7\xE1\x94\xE3\x98\xE4\xF7\xE9\x74\x98\x5F\xE7\xE4\xF5\xCE\xE1\x85\xE3\x52\xE2\xE3\xA7\x3E\xE7\x28\xDF\x9A\xE6\xCB\x59\x4E\x77\xF8\xBC\x64\xF0\xDC\x67\xF1\xF5\x48\xDF\x5F\xE3\x94\xE9\xC6\xC8\xE0\xD1\xF7\xE7\xE8\xE9\x5E\xE9\xEB\xE9\x60\xC8\xF5\x94\x63\xC8\xB2\x3E\x0A\xC8\x59\x01\x67\xC8\xED\xBA\xDF\xC7\x3D\xE4\x08\x2F\xE2\xC7\x8F\x5A\x94\xB7\xF9\xF5\x5F\xDF\x16\xC9\xFC\xF5\x18\xC9\x08\xC9\x9A\xC8\xD2\xE3\x9C\xC8\xEC\xE9\x4E\x83\xF4\xC7\x36\xA1\x11\xF6\x7A\xDF\x03\xE8\xF4\xE7\x0C\xE9\x04\x5A\xDE\xE3\xD7\xC7\x04\xF6\xC7\x35\x0C\xBD\x0F\x3E\x0C\xC8\x3E\xBD\x10\xF6\xC3\x5A\x7E\xE3\x3C\xBE\x16\xF6\x7A\xE3\x18\xF6\x11\xE9\x79\x51\x1A\xF6\x27\xE9\x2F\xC8\xDB\xE8\xF3\xE3\xA5\xC8\x14\xF6\x50\x81\x51\xE9\x23\xF6\x21\xE3\x1C\xC8\x51\x80\x3E\xC8\x38\xF6\x1E\xF6\xF2\xE7\x83\xE9\x2F\xF6\xFE\xF5\x17\xF6\x5D\xE9\x19\xF6\x41\xAE\x03\x5C\x4D\xC8\x4F\xC8\x4C\xF0\xD0\x5C\x44\xF6\x02\xE8\xFB\xF5\x71\xD0\x3C\xF6\xF6\xE3\x0B\xC9\xEA\xE9\x12\xE9\x96\x0C\xD8\xE7\xF4\x06\x27\xF6\xF9\x08\x65\xC8\xDA\x03\x09\xF6\x04\xBB\x9F\xBD\xB2\x0E\x6B\xC8\xD6\xE7\xA0\x05\xA3\xBD\x27\x01\xA5\xBD\x43\xF6\x2D\xF6\x70\xE3\x3B\xF6\xFF",
"\xC7\x57\xF6\xE9\xE9\xAB\xC8\xFF\x59\xB3\xBD\x2C\xF6\x3A\xF6\x55\xF6\x70\xF6\xE9\xE3\x49\xC8\xE0\xBD\x8D\xC8\x09\x01\x8F\xC8\x3B\xEF\xF8\xF5\x6D\xF6\xE1\xE3\x21\xF6\x30\xF6\x05\x5A\x24\xF6\xCF\xBD\x03\x5C\xD2\xBD\x76\xF6\xF2\xF5\x4C\xE7\x72\x05\xA8\xC8\x86\xF6\x3F\xF6\x02\x54\xEE\xBD\x1E\x4A\x8B\xF6\xFA\xF5\x43\xE3\x78\xF6\xA9\x83\x3D\xF6\x03\x5A\x87\xF6\x0D\xC9\x51\x80\xFF\xC8\x6C\xF6\x77\xF6\x2F\xBD\x85\xF6\x3E\xF6\x10\xE9\xAE\xD1\x02\xF6\x0E\xC9\x27\x01\x45\xBE\xA0\xF6\x8C\xF6\x59\xC8\x9A\xF6\x02\x5A\x9C\xF6\x1D\xC9\xA8\xC7\xDF\xF5\xEF\xF5\x8E\xD0\x33\xE7\x45\xF6\xC4\xC8\x6F\xF6\xC6\xF0\xDF\xA0\x1E\xC8\xEC\xDA\x09\x01\xB6\xF6\x53\xF6\x97\xF6\xA2\xF6\x20\xE9\x6C\xE3\xE8\xE9\x25\xE9\x97\xCF\xE2\xBD\x94\xB7\xBF\xF6\xF4\xDF\x20\xF6\xB9\xF6\xF5\xE7\x06\xE8\xC5\xF6\xF9\xE7\x9B\x12\x03\x5C\xCF\xC8\x36\xA1\xCA\xF6\x0F\xE0\x13\xF6\x98\xF6\xD3\xE7\xD9\xC8\xD9\x36\xF7\xC8\x93\xD0\x1D\xA9\xDF\xC8\x11\xE7\x4E\xE2\xE3\xC8\x17\xBE\x18\x25\x4E\xA0\xD6\xF6\x3E\xE0\x93\xE9\xD9\xF6\x9E\xBD\x17\x06\x26\xBE\x54\x58\xDD\xF6\x2C\xBE\x82\x42\xE1\xF6\xEA\xC8\x46\x58\x05\xE4\xB9\xC7\xB4\xF6\xC5\xF5\x14\xE7\xC3\x5A\x47\xE3\xFE\xE2\xF5\xF5\xC7\xC7\x6D\xF0\xD0\x5C\x17\xE7\x22\xE8\xD6\xE3\xE7\x06\x8F\xF6\xA4\xF6\x32\xF6\xA6\xF6\x5A\xF6\x35\xBD\x26\xF6\x3A\x3E\x28\xF6\x91\x35\x62\xF6\xA2\xEE\x64\x08\x79\x01\xD5\xE7\xBE\x49\xFC\x06\x13\xBD\x0F\xF6\x38\xF6\x01\xF7\x2F\xE8\x03\xF7\x4B\xBE\xA3\xF6\x9B\xF6\x91\xF6\xBF\xBD\xF3\xC7\x1E\xDD\xD5\xE1\x83\xB9\x19\xF7\x3C\xE8\xEF\xE3\x04\xF7\x22\xF6\x1E\xF7\xA5\xF6\xEB\xE3\x09\xF7\x96\xBD\x0B\xF7\xCA\x3D\x0D\xF7\x2D\x36\x2A\xF6\x0E\xC8\x94\xB7\x25\xF7\x4D\xE8\x7E\x54\xC2\xF6\x03\xE3\xFF\xF5\xB8\xC8\x58\xF6\x40\xF6\x2F\xEA\x37\xF6\x80\xF6\x27\x09\x36\xF7\xC7\xE9\xB6\xE9\x1C\xF7\x48\xF6\x31\xF6\x4A\xF6\x33\xF6\xA3\x0C\x5A\xD5\x42\xF6\x41\xF7\x1F\xE7\xA7\xE9\xE2\x12\x39\xF7\x18\xC8\x7A\xF6\xF7\xE3\x09\xE3\x19\xED\x4E\xF6\xF7\xF5\x42\xF7\xFA\xF6\x64\xE3\x28\xF7\x1D\xF7\xAF\xF6\x1F\xF7\x25\xF6\xE1\xC1\x05\xF6\x44\x67\x60\xF6\x64\x00\x0F\xF7\xBA\xF2\x1F\x07\x69\xC8\x65\xF6\xAA\x03\x6C\xC8\xD0\x0D\x6E\xC8\x18\xF7\x5B\xF7\x1B\xF7\x47\xF6\x3A\xF7\x49\xF6\x00\xF6\x4B\xF6\x7C\xC8\xAF\x6A\x35\xF7\x71\xF7\x27\xF7\x46\xF7\x74\xF7\x48\xF7\x76\xF7\x4A\xF7\xB1\xBD\x7D\xF6\x06\x01\x7F\xF6\x2A\xDB\x4F\xF7\x60\xE2\x38\xF7\x5D\xF7\x47\xF7\x90\xF6\x2B\xF7\x59\xF6\x34\xF6\xFC\xBD\xD0\x0D\x8A\xF6\x70\xF7\x50\xF7\x52\x17\x52\xF7\xF8\xE2\x3B\xF7\x42\xE3\x3D\xF7\x92\xF6\xBC\xC8\x94\xF6\x93\xF7\x88\xF7\x45\xF7\x73\xF7\x53\xF7\xC4\xF6\x3C\xF7\x72\xF6\x09\xE3\xFE\xC8\xCA\x43\x7A\xF7\x94\xF7\x4D\x54\x8E\xF6\x29\xF7\x5F\xF7\x8D\xF7\x3E\xF7\x31\x72\x0F\xC9\x9E\xF7\xC4\xE9\x12\xE7\x8A\xF7\x7E\xF7\x8C\xF7\x07\xF7\x2C\xF7\x8F\xF7\xB2\xF6\xF6\xF6\xD3\xF5\xF8\xF6\x5C\xE3\x7B\xF7\x89\xF7\xDE\xE9\x20\x8F\xDA\xB9\xE6\x9D\x68\xE5\x06\x01\x0B\xE7\x1A\xF7\x7C\xF7\xA1\xF7\x00\x07\xCF\xF6\xA4\xF7\xC6\xF6\xD4\xEB\xA5\x5B\xC8\xF6\x38\xF6\xC9\xF7\x26\xF7\xC2\xF7\xCC\xF7\x84\x0A\xCE\xF7\x99\xF7\x8D\xF6\xB1\xF6\x9F\x70\x81\xE3\x09\x01\x3D\x00\x54\xE6\xD2\xF5\x15\x75\x38\xF6\xC3\xE9\xF1\xF3\x09\x35\x8C\x57\x27\x09\x78\xE6\xCA\xF7\xD7\xF7\xA4\xD1\x79\xD1\xC6\xC7\x09\x01\x4F\xF6\x7B\x5D\x03\x01\xE6\xF7\x09\xF4\xE8\xF7\x3C\x52\xB7\x9F\x3F\x02\x1A\xBD\xFB\xF6\x56\xF6\x54\xF7\x9A\xF7\xBF\xBD\x5C\xF6\xC7\x07\x5E\xF6\x09\xC8\x0D\xBD\x67\xF6\xD3\xE7\x13\xF7\x66\x5F\x15\xF7\xE3\xC7\x36\xA1\xF5\xF7\x5E\xF4\xCB\xE9\x1E\x3C\xEA\xF7\xFB\xF7\x5C\xF7\x7D\xF7\xA2\xF7\x98\xF7\xEA\xE3\x8E\xF7\x4B\xF7\x25\xBD\x22\xF7\x59\xF7\xFF\x53\xDB\xF3\x04\x35\x11\xF8\xAA\xF7\x96\xF7\x77\xC8\xFE\xF7\xA5\xF7\x00\xF8\x2F\xF7\x65\x3E\x31\xF7\x18\x37\x72\x00\x33\xF7\x27\x53\x4E\xA0\x0D\xF8\x96\xF4\x52\x17\x1F\xF8\xFA\xF7\x21\xF8\xB6\xF7\x15\xF8\x75\xF7\xA4\xF7\x01\xF6\x2D\xF7\xB4\x20\x92\xF4\x6F\xDA\xF4\xF7\x1E\xF8\x10\xF8\x33\xF8\x9F\xF7\xC5\xE9\x14\xF8\xCD\xF7\x24\xF8\xD0\xF7\xFE\xB9\x40\xF7\xD8\xB8\x2F\xF8\xEE\xD5\x32\xF8\x88\x09\x12\xF8\x72\xF7\xA7\xC8\xAD\xF7\x50\xE3\x60\xF7\xF2\xC7\x41\xF6\xB8\xA9\x0C\xF8\x3F\xF8\xE9\xF7\x41\xF8\xB4\xF7\x26\xE7\x35\xF8\x97\xF7\x37\xF8\xDB\xF7\x39\xF8\xBB\xF7\x4B\xC8\x58\xF7\x2C\x5B\x3E\xF8\x29\xAE\x4D\xF8\xB5\x02\x4F\xF8\xCB\xF7\x51\xF8\x5E\xF7\x53\xF8\xAF",
"\xF7\x02\x54\x01\xF8\xEA\x06\x03\xF8\x64\xC8\x9D\x05\x07\x1D\x67\xF7\x2F\xF5\x69\xF7\x79\x01\x6A\xC8\x6C\xF7\x67\xF6\x03\x5C\x6F\xF7\xC9\xB9\x4B\xF8\xBF\xF4\x69\xF8\xE7\x02\x6B\xF8\xED\xF7\xAC\xF7\x6E\xF8\xDD\xE3\x54\xF8\xBB\xC8\xCC\x0D\x75\xF6\x58\xF8\x68\xF8\x40\xF8\x4E\xF8\x34\xF8\x44\xF8\x23\xF8\xA3\xF7\x61\xF8\x77\xF7\x83\xF7\x03\x01\x85\xF7\x83\xB9\x82\xF8\xF6\xF4\x32\xA9\x84\xF8\xCE\xE3\x93\xF8\xD8\xF7\xAE\xF6\x6F\xF8\xB9\xF7\x18\xF8\xB1\xBD\x9E\xC8\x09\x01\xD3\xBD\x4A\xF8\x59\xF8\xF8\xF7\x72\xA0\x5B\xF8\x02\xF7\x6C\xF8\x88\xF8\x8B\xF7\x06\xF7\x49\xF7\x08\xF7\x8F\xF7\xFC\xE7\x06\x01\xFE\xE7\xAC\xF8\x90\xF8\x5A\xF8\x92\xF8\x42\xF8\xB5\xF7\x94\xF8\x1E\xE9\x7F\xF7\xCF\xF7\xD1\xF6\x93\xF6\xDD\x5E\x2E\xF8\xAD\xF8\xE1\x11\x20\xF8\xC0\xF8\x5D\xF8\x94\xF8\xA4\xF8\x8A\xF8\x70\xF8\x20\xF7\x9E\xF6\xA8\xF7\x8F\xF8\x30\xD7\xA0\xF8\x0C\x06\x86\xF8\xA0\xF7\x6D\xF8\xB4\xF8\x2A\xF7\xA6\xF8\xB0\xF7\x03\x5C\xB2\xF7\x81\xF8\xCA\xF8\x0B\x35\xCC\xF8\x5C\xF8\xA8\xE9\x5E\xF8\x95\xF8\x16\xF8\x7B\xF6\x2D\xC8\x58\xB6\xDE\xCC\x38\xF6\xA1\xE7\x94\x6D\x69\xE9\xB4\xE2\xF0\xE4\x7F\x73\xA9\xE4\xE6\xCC\x14\xC7\xFC\xE8\x96\x77\x30\x63\x12\xE3\xC0\xA8\x09\x01\xD0\xA7\xF2\xE9\x96\x59\x4E\xBC\x83\xB9\xF1\xF8\xE1\xCC\x39\x09\x74\xE8\x22\xC7\x7F\xE4\x78\xE8\x99\xE8\x59\xE8\x91\xDE\x79\xE4\x1A\x7A\xFC\xF8\x07\xF9\xA6\xE8\x2F\xC7\x03\xCD\x31\xE4\x05\xCD\xF0\xDE\xCB\xE8\x4E\x1B\x66\xBC\x5A\xE4\xB5\x77\x11\xF9\x94\xB8\x0E\xCD\x0C\xF6\x94\x7D\xA9\xE8\x1F\xCD\x42\xA8\x7C\xE8\x87\xCF\x94\x75\x1E\xF9\x74\x00\x65\xE8\x77\xBC\xB7\xDE\x77\xE8\x66\xED\x6E\xE4\x64\xE4\x53\x71\x2E\xBA\x05\xF9\xEB\xCC\x12\xF9\xC6\xE8\x28\xCD\x36\xCD\x6B\xA1\x67\xBA\xCA\xE8\xA1\xCC\xAB\xE8\x94\xA0\x26\xF9\x64\xBD\xD8\x78\x29\xF9\x5D\xE4\x22\xE0\x5F\xE4\x0A\xF9\x2F\xF9\x8D\xE4\x6F\xE4\x18\x0F\x8C\xE8\x8C\xE5\x34\xF9\xF2\xCC\x36\xF9\xED\xDB\x44\xCD\x0B\xB8\xDF\xB7\x17\xF9\x99\xDE\x19\xF9\x08\xCD\x9B\xE8\x33\xF9\x43\xF9\x73\xE4\x95\xF5\x67\xE8\xD2\xB9\x78\xE4\x00\xDF\x10\xF9\xFC\x66\x68\xCD\xF3\xE1\xD3\x73\xC4\xA0\x5E\xF9\x5A\xCC\x84\xE4\x04\xF9\x5B\xF9\x7C\xE4\xEC\xDE\xC8\xE8\xF2\xE8\x3B\xF9\x62\xE4\xAA\xE8\xCC\xE8\xA6\xA8\xCE\xE8\xBF\xF7\xF5\xBA\x63\xF9\xC5\xE1\x19\xED\x77\xCD\xD4\x92\x0E\x76\x29\xF9\xE5\xE8\xE7\xE8\x6B\xF9\x79\xF9\x16\x01\xF1\xE8\x16\xF9\xF3\xE8\xD2\xCC\x57\xF9\x0C\xB8\x56\xC4\xE7\xE4\x3F\xBC\x4E\xF7\x3E\x70\xC3\x5A\x15\x7A\x1A\xE8\xF6\xF8\x89\xF9\x2A\xCC\xCB\xEF\x00\x00\x0E\xBA\xA9\xA8\xA4\xE7\x9A\xE4\x6B\xE9\xBE\x2E\x2A\xE8\xB5\xA8\x4E\xE5\x27\x09\xE9\xBA\x59\xE9\xA4\x18\x92\x0B\x35\xE8\x23\xF9\xF1\xDE\xE1\x7B\x1C\xF9\x0F\x7A\x9B\xF9\x52\x17\xA5\xF9\x5C\xF9\x30\xE4\x6C\xE4\x86\xCC\x49\xF9\x31\xF9\xCA\x7C\x2E\xBA\xA2\xF9\x7A\xE2\x78\x43\xBE\x2E\x54\xE8\x44\x67\x56\xE8\xC9\xE8\x72\xF9\x24\xF9\x14\xCD\x40\xF9\x3D\xF8\x0C\x7A\xAC\xF9\x27\x57\x81\x05\x2B\xF9\x46\xC7\x2D\xF9\x3A\xF9\x69\xCC\xC0\xF9\x69\xE8\xAA\xF9\xC4\xF9\x59\xE6\xB9\xF9\xB0\x0B\x53\xE4\xCA\xF9\x8A\xF9\x5A\xBA\x56\xF9\x3D\xF9\x74\xF9\x3F\xF9\x2B\xE8\x76\xE5\xDA\x6F\x90\xF9\x41\x3C\xD3\xF9\x86\xE8\x61\xC7\x89\xBC\x70\xF9\xCC\xF9\xA8\xF9\xE4\x9F\xB6\xF9\xDF\xF9\x4F\xD0\x6F\x05\x96\xE8\x77\xA8\x46\xCD\x48\xF9\x46\xE8\x59\xE8\x9C\xE8\x61\xF9\x4A\x3F\xEA\xF9\xD2\xF9\x5D\x05\xD3\xDE\xA8\xE8\xB8\xE8\x12\xCD\xBA\xE8\x75\xBA\xE9\xF9\xC5\xF9\xAE\xF9\x6D\xF9\xBD\x06\xE0\xDE\xE5\xF9\x8B\xBC\x94\xF9\x4C\xB3\x6A\xF9\x8C\xE5\xB7\xF9\xC9\xE6\xF7\xF9\xC7\xF9\x74\xE8\xED\xDE\x49\xE4\xF0\xF9\x79\xE8\x4A\xF9\x8F\xE4\x6F\xCD\xFA\xF8\x9A\xF9\xD1\xF9\x81\x43\x76\xE9\xBC\xF3\x7C\xF9\x03\xDB\x18\xFA\xA3\xF9\x9C\xF9\xDC\xE2\xBC\xF7\xCE\xBC\xCF\xF9\xEB\xBA\x00\xFA\xBE\x2E\x85\xF9\xB1\xF9\x81\x6E\xF4\xE8\x0C\xA0\xC4\xF7\xBD\xF7\xE4\xF7\x8E\xF9\xC3\x1B\x6F\x5C\x86\x02\x27\x09\xE3\xE6\xD6\xF5\x0C\x45\xD8\xF5\x7D\xCD\xCC\xF5\x38\xF6\xE0\xE7\x72\x60\x86\x02\xCE\xF5\x89\x59\x38\xFA\x48\xE2\xD0\x0D\xE0\xF5\x1F\xE8\x2D\x17\x33\xFA\x16\x02\x35\xFA\xDB\xF3\xC9\xF5\xE5\xF5\x3A\xFA\x6C\xEF\xCD\x7B\x48\xFA\x6D\x00\x40\xFA\x56\x47\xD0\xF5\x99\xE5\x8C\xF9\x81\x9F\x38\xF6\xEB\xE7\xD6\xE8\xA6\xCC\x01\xE3\x92\xF9\xC6\x7B\x07\xFA\x2A\xE3\x13\xC7\x1D\x7B\x8E\xD0\x5A\xFA\xE2\xE8\xCD\xCC\xC0\xCC\xED\xCC\x9F\xF9\xFC\xDA\xC4\x65\x65\xFA\x2E\xCC\xC6\xCC\x3A",
"\x59\x08\x2F\xA6\xF9\xFB\xF9\x28\xE4\x14\xFA\x7E\x7D\x2E\xBA\x6D\xFA\x35\xCC\x6F\xFA\xE5\xBA\x47\xCC\xAF\xF9\x44\xE8\xBE\xF9\xA0\xCC\x74\xBA\x9C\xDE\x08\xE5\x27\x09\x78\xFA\x44\xCC\x5C\xFA\xC7\xCC\x9B\xCC\x3C\xE4\x56\xCC\xCF\xB7\x7F\xFA\x60\xCD\xD9\xF9\x1A\xF9\xD8\x6F\x77\xFA\xB3\xE8\x67\xFA\x01\xE3\xC8\xF9\xAA\xDE\xD5\xF9\x54\xF9\xD7\xF9\x30\xF9\xE4\xDE\x32\xF9\x25\xFA\x80\x12\x93\xFA\x99\xE2\x81\xCC\x74\xE8\x75\xCC\x2A\xFA\x51\xCD\x13\xFA\xB4\xF9\xBC\xDE\x9E\xFA\x85\xFA\x52\xCC\x7A\xFA\x17\xE2\x71\xFA\xE2\xF9\x83\xCC\xE4\xF9\x86\xF9\x71\xF9\x80\xFA\x83\xBC\x4C\xF9\x0F\xF9\x9F\xFA\xEE\xE8\xF2\xE2\xA7\xCC\x5C\xF9\xC9\xDE\x8D\xFA\x18\xF9\x8F\xFA\x58\xF9\xF3\xF9\x94\xE5\xBC\x7B\xA0\xFA\x05\xE3\xBC\xFA\x13\xF9\x7C\xC7\xFA\xF9\xBF\xFA\xD8\xF9\x74\xBA\x60\xF9\xC4\xFA\xFA\x79\xC6\xFA\xBB\xFA\x95\xFA\x74\xE8\x7E\xE4\xEF\xF9\xEF\xDE\xCD\xFA\x83\xBC\x09\xFA\xB8\xFA\xAB\xFA\x71\xCC\xAD\xFA\x24\xCC\x7C\xFA\x02\xFA\x51\x01\x6F\xF9\xB3\xFA\xE6\xF9\x07\xFA\xCD\xE8\x2B\x74\xE3\xA7\xDD\xFA\x99\xCC\xDF\xFA\x30\xCC\x63\xBD\x51\x80\x1D\xFA\x83\xA7\x84\xFA\xD2\xFA\x80\xCC\x68\xFA\xC1\xA5\x14\xD7\x91\xA5\xC7\x72\xEB\xFA\xB3\xCC\xED\xFA\x44\x51\x29\xFA\x47\xF9\xA1\xBA\x88\xF9\xC1\xFA\xD6\xF9\x6B\xF3\x8D\xF9\x86\xF7\xEB\x79\xBC\x72\x44\xE2\x48\xE6\x64\xB8\xF7\xF8\x17\xE4\xF9\xF8\xE8\xF5\xA6\x7C\x09\xFB\xBD\xA7\x69\xFA\xFF\xDE\xD0\xFA\x69\xB8\x12\xFB\x75\x43\x72\xFA\xCC\xFA\x9B\xFA\x3E\xF9\xB7\xB7\x9E\xFA\x0D\xE8\xEB\xC9\xD9\x2E\x43\xE8\x15\xF9\xA5\xFA\x32\xE4\xF1\xF9\xFD\xF9\x82\xFA\xDD\xF9\x68\x7D\x18\xFB\xA5\x4C\xBB\xF9\x36\x7A\xBD\xF9\x05\xFA\x8E\xDE\xE7\xFA\x91\xFA\x1F\xFB\x2C\xFB\x01\xFA\x1A\xCD\x66\xE8\xA7\xF9\x33\xFB\x47\xBA\x35\xFB\x21\xE9\xE1\xF9\xE2\xFA\x75\xE8\x98\xFA\x68\xCC\x06\xFA\x03\xFB\x13\xA8\x2E\xCD\x8C\xE5\x20\xFB\x05\xCA\x22\xFB\xB0\xFA\x5E\xE4\xB2\xFA\x25\xFB\x55\xF9\x1C\xFB\xDA\xF9\x65\xE4\x3D\xFB\x19\xCB\x19\xFB\xBD\xFA\x6B\xE4\x00\xFB\xEA\xDF\x8E\xFA\x74\xBA\xC3\xFA\x83\xFA\x93\x6F\x36\xFB\xBA\xF9\x5C\xF9\x4F\xCD\x4F\xFB\x9A\xFA\xB3\xF9\x9C\xFA\xE4\xB8\xDC\xF9\xA0\xF9\x5F\xFB\x3E\xFB\xF8\xF9\xD5\xFA\xA9\xCC\x64\xFB\xB4\xFA\x5B\xFB\xDA\xFA\x2E\xBA\x49\xFB\x1F\xCA\x4B\xFB\x40\xFB\x10\xFA\x55\xE4\x80\xE4\xB9\xE8\x75\xFA\x8D\xBA\x16\xFA\x10\xFB\x6B\xFB\x55\xFB\xA5\x4C\xC1\xCC\xDA\xE8\x77\xF9\x75\xFB\x3A\xCA\x13\xFB\xF7\xFA\xE7\xE1\xF9\xFA\x7C\x5A\x87\xFB\x4E\xCA\xD9\x2E\xFF\xFA\xD7\xFA\x27\x9F\x2C\xFA\x97\xA5\x50\xEF\x96\xFB\xED\xF5\xFF\x00\xF5\x5E\x03\x00\xF0\xE9\xBE\xA7\xF2\xA1\xA7\x04\xE4\xE7\xDF\xF7\x38\x0A\x9C\xFB\x97\xFB\x56\xFA\xD6\x5B\xB8\x2A\x0D\xE3\x41\x76\xB8\x59\xBB\xE9\x43\x3F\x8A\x0A\xED\xE7\xB3\xF6\xBE\xF7\x07\xFB\x5A\x8B\xC3\x5A\xE0\x52\xE6\xF8\xB1\xF8\x87\xF8\x25\x59\xFD\xF6\xF1\xF7\x42\xF0\x77\x0E\xB3\xFB\xB5\x59\x54\x03\xB5\xFB\xEC\xF7\xDB\xF8\xB3\xF8\xB7\xF7\xB5\xF8\x80\xF7\xB7\xF8\xA3\x0C\x72\xF8\xEF\x08\x0C\xF7\xDB\xC7\x0E\xF7\x06\xF8\xEB\xF6\x12\xF7\x0F\xCD\x6D\x06\x0E\xF6\xBE\x5A\x4E\xA0\xB4\xE9\xE4\xE9\x8E\x44\xC7\x43\xC0\xFB\xD6\xF7\xC2\xFB\xFD\xF5\xC4\xFB\xDE\xF8\xB6\xF8\xBA\xF7\x19\xF8\x59\x7D\x1C\xF6\xC4\xEF\x81\x8C\xBD\xFB\xD8\xFB\x98\x0A\xB0\xF8\xC1\xFB\x43\xF8\xA3\xF8\x71\xF6\x62\xF8\xC8\xFB\x27\xF8\x0D\x3E\x29\xF8\x0B\xC8\xDF\xE8\x0D\xC8\x2D\xF8\x36\xA1\xD6\xFB\x06\x5A\xB4\xFB\xEA\xFB\xDB\xFB\xEC\xFB\xDC\xF8\xDE\xFB\xAE\xF7\xDF\xF8\x56\xF7\x3C\xF8\xB7\xBC\x2C\x8D\xE7\xFB\xB7\x46\xD9\xFB\xFC\xFB\x37\xF7\xDC\xFB\x15\xF6\xC3\xF6\xEB\xF8\xC1\xF6\x56\xF7\x5A\xD5\x49\xF8\x83\xB9\xF9\xFB\x05\x5A\xFB\xFB\xBF\xF8\xE7\xF8\x51\xF7\xE9\xF8\xD0\xF8\xCF\x0D\xB0\xF6\x5F\xE9\x56\xF8\x93\x5A\xD5\xFB\x07\xFC\x06\x5F\xD9\x57\x80\x03\xDA\xFB\x0B\xFC\xFE\xFB\xC3\xFB\x36\xF8\xC4\xF8\x97\xF8\x81\xF7\x41\xBE\x2F\xEA\x65\xF8\x5B\xF0\x34\x0E\x23\xFC\x83\xA3\x25\xFC\xBF\xFB\x0A\xFC\x44\xF7\x29\xFC\xDD\xFB\x2B\xFC\xB8\xF7\xE0\xFB\xA7\xF8\x5B\xF6\xF1\xFB\x14\x3E\x13\xCC\x75\xF8\x1B\x36\x78\xF8\x47\xDB\x64\xF6\xE0\x12\xA1\xBD\x7E\xF8\x69\xF6\x09\x01\x6B\xF6\xC9\xB9\x15\xFC\x04\x5A\x17\xFC\x6A\xF8\xA2\xF8\xFF\xFB\x3C\xFC\xC5\xFB\x38\xF8\x98\xF8\x8D\xF8\x7D\xC8\xF8\xFB\x34\xFC\xCA\x8A\x36\xFC\x64\xC2\xEB\xF7\xFD\xFB\xC1\xF8\xED\xFB\x24\xF8\xEF\xFB\x82\xF7\xCC\x0D\xC2\xBD\x22\xFC\x54\x5A\x52\xFC\x85\xF8\x54\xFC\x2A\xFC\x5F",
"\xF8\x2C\xFC\x17\xF8\xAB\xC8\xA9\xF8\x06\x01\xAB\xF8\x14\xFC\x5D\xFC\xE0\xE9\x09\xFC\x18\xFC\xB6\xFB\x0C\xFC\xFD\xF7\x96\xF8\x72\xFC\x92\xF6\xD3\xF7\x4F\xFC\x78\xFC\xC9\x1C\x7A\xFC\x53\xFC\xCD\xF8\xE8\xF8\xC2\xF8\xDA\xF7\x3E\x3F\xC6\xF8\x9C\xF7\xC8\xF8\x5C\xFC\x6B\xFC\xBE\xFB\x60\xFC\xDA\xF8\x3A\xFC\x0D\xFC\x00\xFC\xA5\xF8\x3E\xFC\x3E\xF7\xA7\xF7\x09\x01\x33\xBE\x8C\xE5\x50\xFC\x0C\xBC\x5E\xFC\x86\xFC\x6D\xFC\x88\xFC\x1A\xFC\xCF\xF8\xEE\xFB\x4B\xF6\xA8\xF6\x09\x01\xAA\xF6\x83\xFC\x91\xFC\xE8\xFB\x26\xFC\x38\xFC\x6D\xE8\x7D\xFC\x79\xF6\x7F\xFC\xEC\xF8\x55\xF8\xA4\xFB\x75\xD1\xA4\xA5\x0D\xE4\x38\xF6\xC7\xBA\x88\x6F\x91\xE3\x43\xBC\x0C\xFB\x60\xFA\xF8\xF8\x63\xFA\x77\xF9\xBC\xFC\x27\x9B\x9B\xD0\x26\xA1\x6A\xFA\xCE\xDA\xC4\x65\xC5\xFC\x22\xAC\xAE\x3F\x1A\xFB\x31\xFB\xA3\xDE\x3B\xFB\x1E\xFB\xC2\xF9\x05\xFC\xEF\xE9\x14\x68\xCE\xFC\x7D\xFA\x24\xFB\x59\xFB\x61\xE4\xB5\xFA\x32\xC7\x2E\xBA\xCC\xFC\xDE\x87\xD8\xFC\x20\xF9\x8B\xFA\x3A\xC7\x1B\xFB\x66\xFB\x1D\xFB\x25\xF9\x69\xFB\x6B\xFA\xB9\x67\xE0\xFC\xF8\x92\xE2\xFC\x38\xFB\x2C\xF9\x39\xF9\x04\xFB\xE6\xFA\x45\xFB\x4C\xB3\xB0\xDE\xF4\xF9\xED\xFC\x91\x95\xEF\xFC\xED\xDB\x81\xBC\x3A\xFB\xF5\xFC\xB9\xB8\xDF\xFC\xE3\xF5\xA8\x3F\x44\xF9\x40\x05\x74\x71\xFE\xFC\x74\xBA\xB7\xFA\xF8\xFC\x02\xFD\xC5\x57\x1D\x07\x57\xFB\x97\xE8\xE6\xFC\x27\xFB\x7D\xFB\x59\xF9\x9E\xFA\xF9\xFC\xD9\x99\xFB\xFC\xEA\xDE\x72\xBA\x07\xFD\x83\xBC\xCF\xFA\x5E\xFB\xD6\xFC\xAB\xD0\x4B\x39\xB6\xE8\x68\xF9\x59\xC7\xDB\xFA\x0A\xFD\xD7\xFC\x20\xFD\x0F\xFA\xE4\xFA\x70\xFB\xF4\xFC\x74\xBA\x90\xE4\x17\xFA\x1E\xFD\x30\x6D\xBE\xFC\xBB\xF6\x85\xFB\xE1\xF5\x00\x00\x15\xFD\xE9\x9F\x31\xFD\x43\xFA\x08\xE2\xD4\xFC\x5C\xC7\x48\x74\x0B\xFD\xCE\x57\x72\x00\x91\xFB\xEE\xDE\x93\xFB\x02\xFB\xF6\xDE\xA5\xFB\xCE\xA7\x40\xA9\xE5\xE1\x00\xE4\x8E\xD0\x4C\xA9\xF6\xEE\x06\xD2\x9D\xFB\x0C\xE4\x93\xB7\x38\xF6\x85\xEC\x29\xD3\x04\xE4\x0B\xFB\x0F\xC7\x58\x7D\x48\xBC\x80\xFB\x09\x01\x53\xFD\xAF\xD3\x5E\xCF\x9E\xF9\x15\xFB\x1D\xFD\x06\x01\x5C\xFD\x03\xE4\x5E\xCF\xCF\xFC\xE5\xFA\x44\xFB\x74\xBA\x0E\xF9\xF4\xF9\x63\xFD\x53\xD4\x4A\xCF\x23\xFB\x62\xB9\x73\xFA\x63\xE4\x67\xFB\x2D\xBA\x9E\xFA\x6C\xFD\x88\xD4\x6E\xFD\x8A\xFA\x55\xE8\x8C\xFA\xD0\xFC\xE2\xDE\xFF\xFC\x34\xFB\x3B\xFD\x69\xC7\x27\x09\x76\xFD\x08\xE5\xC6\xCD\x96\xFA\x9D\xA1\x76\xE8\xCB\xF9\x68\xFD\x83\xBC\xF7\xFC\x16\xFB\x01\x01\x83\xFD\xF0\xD4\x85\xFD\xA3\xFA\x88\xFD\xF3\xFC\x8A\xFD\x84\xA0\x47\xFB\xB8\xFA\x8F\xFD\x4E\xE5\x91\xFD\xD7\x9E\x9B\xA0\x71\xFD\x73\xF9\x90\xFA\xE8\xF9\x75\xFD\xC3\x5A\x6C\x2F\xED\xF9\x45\xCD\x42\xFD\xDC\xFC\x72\xFB\x84\xA0\x5D\xFB\x2A\xFB\xD1\x79\x40\xD2\xF9\xF9\x49\x7C\x1A\xFD\x84\xA0\x1C\xFD\xAC\xFD\x8E\xFD\xA3\xFD\x1C\x40\x66\x00\x21\xFD\xB1\xFD\x6D\xCD\x24\xFD\x8D\xFD\x00\x00\x99\xFD\xEB\xFC\xF1\xD4\x8A\xE4\x94\xC7\x2A\xFD\x95\xFD\x6D\xCD\x2D\xFD\x5A\xFD\x62\xFD\xB6\xFD\xF0\xA8\xFA\x02\x84\xFB\xBD\xA1\x77\xF9\xBF\xFD\xCA\xFC\x19\xD2\x80\xF9\x2E\xBA\xD0\xFD\x27\xF9\x08\xD2\x41\xFD\x11\xFA\x01\xFB\x86\xCD\x0D\xFB\x12\xC7\xC9\xE4\xB4\x78\x27\x09\x47\xEF\x01\xEF\xAB\xEB\x78\xF5\xD2\xC4\xA2\xEF\xE8\xF3\xFC\xF0\x93\xD2\x4D\xF3\x7A\xAA\xC6\xD7\xA5\xF0\x6E\x2B\x69\xF4\x53\xB6\x5F\xF5\x84\x87\xE6\xFD\xE6\xAE\x2A\xEA\x9D\xEC\x1F\xD5\xBE\xCD\xE5\xE4\x61\xFA\xAA\xEF\xDF\xFD\x27\x01\xE1\xFD\x66\xF2\x7A\xED\xE4\xFD\xEB\xEE\x2B\xF1\x5F\x9C\xF8\xD7\xF1\xE4\x18\xF1\x82\xF3\xBC\x68\xE0\xFD\xEF\xFD\x85\xB6\xD6\xE5\xCB\xDD\xFB\xE4\x5A\xEA\xEC\xEC\xC0\xEF\xFB\x78\x98\xF3\xBB\xE5\x46\xEF\x0B\xFE\x00\xC0\x2F\xF4\x70\xE5\x84\xD3\x96\xF9\xDB\xA8\x9D\xEF\x00\x00\xFE\xFD\xA1\xF4\xAC\xF1\x7B\xF3\x04\xF5\x7D\xF3\xC0\xCD\x83\xEA\xBE\xF3\xFC\xFD\xBA\xDB\x2D\xF4\xF0\xFD\x01\xFE\x8D\xD2\xF8\xF0\xB6\xDF\xC5\xF1\xE8\xFD\xB0\xD5\x31\xED\xB2\xD5\x9E\xEA\x57\xD3\x8E\x5C\xFD\xFD\x17\xFE\x6E\xD7\x00\xDC\x24\xFE\xE7\xFD\xB0\xF1\x8A\xCE\x4B\xED\xD3\xDF\xDA\xE5\x80\xE1\xF6\xDC\xCA\xF1\x24\xAD\xEE\xF3\x01\xF0\x39\xFE\x2B\xFE\x0C\xFE\x19\xFE\x79\xE5\xA9\xD9\xA5\xBC\x99\xF1\x03\xF4\x00\xF0\x7D\x7B\xD0\x5C\x20\xFE\x16\xF5\x94\xF1\xCD\xF3\x96\xF1\x7D\xED\x07\xF0\xB2\xF1\x34\xF4\xF3\xC4\xD4\xDA\x6C\xBF\xD7\xFB\x1E\x62\x56\xFE\x56\xF4\x60\xF3\x2C\xF5\x64\xED\x18\xF4\x9B\xED\x30\xCA\x6D\xD3\xDD\xEA\xFB\xE6\xF2\xEF\xB5",
"\xF1\xFB\xEA\xC7\xAB\x37\x5E\xEE\xFD\x4B\xFE\x18\xFE\x6B\xF4\x1A\xFE\x89\xDF\x96\x59\x36\xD6\xBB\xFB\x64\xFE\x2A\xF5\x89\xEE\x67\xFE\x5A\xFE\xBE\xB2\xEB\xF1\x9C\x5D\x74\xFE\x76\xF5\x6A\xF4\xF1\xFD\x92\xF3\xAA\xD3\x36\xEB\xE6\x76\x0A\xFE\x75\xFE\x3B\xFE\xA4\xDD\xA9\xF5\xE7\xEB\xAD\xE1\x23\xAC\x4D\xEB\xBE\xBB\xE8\xE8\x55\xFE\x3A\xFE\xDC\xDD\x6A\xAF\x04\xFC\x9E\x82\x8D\xFE\x86\xFE\x2C\xFE\x59\xFE\x56\xF2\x82\x64\xE8\xEB\x1B\xF3\x34\xF2\xD2\xC5\xF6\xEF\x16\xFE\x8E\xFE\x9A\xFE\x3E\xCB\xBB\xDF\x96\x59\x7C\xE5\x32\xFC\x1F\xFE\x99\xFE\x7F\xEA\x1E\xC2\xFF\xD3\xCE\xF4\xB3\xAF\xE0\xE5\x4A\xFE\x9F\xFE\x4C\xFE\x77\xFE\x4E\xFE\x6A\xF2\xA8\xDD\x6C\xF2\xB0\xFE\x7D\xFE\xCD\xF2\x2B\xF5\xCF\xF2\xD3\xEE\xCD\xF4\x7D\xF2\x03\xCB\x74\xF0\x01\x01\xC2\xFE\x9D\xEE\x67\xF0\xA3\xF4\x2A\xF1\x78\xEE\xB4\xF5\x01\xB0\x07\xF5\xC0\x79\x9E\xFE\xC9\xF4\x86\xDF\xA1\xFE\x19\xF5\x76\xE0\x1B\xF5\x79\xC0\x11\xA5\x38\xFE\x2A\xFE\xBA\xFE\x76\xFE\x88\xFE\x6C\xF4\x05\xEF\x79\xF8\x04\xE2\x4A\xF5\xFD\xEB\x01\xAD\x2A\xD7\xC0\xF2\xDE\xFE\x7C\x5A\xCC\xFE\x3D\xF1\x4F\xF0\x3F\xF1\x51\xF0\x7A\xF5\x84\xF0\x93\xF5\xDD\x07\x4B\xE1\xA8\xB6\xD9\xF2\x6A\xBF\x50\xF5\x26\xBC\x98\xFE\xAA\xFE\xB3\xFE\xAC\xFE\x15\xF3\xED\xEE\xBC\xF2\x87\xD0\xA1\xF0\x35\xF5\x4C\xB3\xD9\xEE\xA0\xFC\xDC\x67\xEF\xFE\xEE\xF4\xF1\xFE\xF0\xF4\xF3\xFE\xD1\xF2\xE5\xD4\x73\xD7\x5E\xFE\xF0\xEE\xE1\xC0\x07\xFF\x1A\x6F\x37\xFE\xEE\xFE\xB2\xFE\x1E\xE0\xB2\xE5\xB8\xC3\xAA\xF0\x1C\xB0\x27\xEF\x54\x0C\xF8\xC3\x64\xEC\xB0\xCB\x02\x5A\x4B\x5D\x85\xFE\xD7\xFE\x7C\xF4\xC5\xFE\x04\xEF\x21\xEF\x44\xF1\xAD\xF5\x37\xF3\x79\x90\x94\xF5\x7E\xEC\xB5\xE1\x26\xEF\x12\xC7\x83\x0A\xFE\xE5\x80\xF6\x3C\xE6\x97\xEA\x3A\x7F\xA3\x94\x39\x0E\x7F\x0E\x91\x58\x03\x5C\x0C\x0A\x38\xFF\x48\xEF\xF9\xB9\x4A\xEF\xEC\x77\x3D\xFF\x76\x0E\x41\x10\xD8\x40\xBF\xA7\x45\xA1\x4F\xFA\x27\x8A\x3D\xEF\x3B\xFF\xE3\x5B\x48\xFF\x4D\x5F\x4F\x0E\x40\xFF\xFF\x59\xAF\x06\x43\xFF\x3B\xE6\x49\xEF\x26\xE6\xB6\x6B\x53\xFF\x45\x5B\xEF\x40\x56\xFF\xCC\x0D\x59\x04\x59\xFF\x47\xE6\x45\xFF\x5C\xFF\x45\x6E\x5E\xFF\xA8\x5B\x5F\x0E\x61\xFF\xD0\x0D\x5D\x07\x64\xFF\x9D\xDB\x17\xE3\x6B\x94\xD0\xF3\x8C\x44\x69\xFF\x86\x60\x40\x12\x91\x58\xB7\xFC\x98\x70\xBE\xD0\x03\x21\x84\x70\xF0\xE5\x90\x01\xF2\xE3\x4F\x00\x69\xE3\x81\xFF\x85\x5B\x83\xEF\x79\x01\xB0\x69\xD7\x74\x41\x00\xF2\xE3\xCC\x0E\x50\x7B\x64\x88\x36\x00\x7C\xEF\x0B\x5C\x69\xEF\x43\x00\x4E\xFF\x12\x9A\xBB\xCF\x8A\xEF\xC0\x78\x71\xEF\x8B\xD0\x7C\xFF\x5A\xFF\x66\xFF\x3E\xEF\xB5\x46\x4C\xEF\x3B\x72\x07\x45\x5E\xEF\x7E\xFF\x51\x01\x80\xFF\x77\xD0\x9D\x91\x50\xFF\x73\xFF\xBA\x4F\x9F\xFF\x37\x0A\xA1\xFF\x51\x5D\x94\x08\x83\xFF\xB1\x5C\x85\xFF\x03\x90\x63\x83\x88\xFF\x8A\xFF\x83\xC1\x43\xBC\x46\xFF\xF6\x44\xAB\xFF\xC6\x49\xE0\xE8\xAE\xFF\x30\xAB\x8E\xFF\x09\x6A\xDF\x45\x91\xFF\xC3\x5A\x86\xA7\xE8\x08\xB9\xFF\x51\x5D\xBB\xFF\x01\x01\xAD\xFF\xDD\x44\x45\x0A\x95\xFF\xD9\x8A\xAA\x94\xC6\x6D\xED\xE9\xD3\xA7\x2B\xA2\xA3\xFB\xD6\xBC\xD3\xFF\x8E\x42\xD5\xFF\x2C\xEF\x84\xE3\x47\x00\xF6\xE9\x79\xFA\x70\x42\xA2\x59\xEE\xF7\x78\xE7\xF7\xF7\xE1\x11\xD8\xE9\x4E\xE9\xDA\xE9\xA0\xE6\xFF\xE2\xDC\x0A\x5C\x45\xB7\xE2\xDF\xE6\xE3\xFF\x0B\x35\xE3\xE9\xF6\xF7\x04\x35\xE7\xE9\x58\xFC\x2E\xFC\x22\xD2\x79\xFF\xC6\xE3\x9A\xE7\x1D\xD1\x34\xFD\x48\xFD\xAD\xF3\x29\xD5\xB5\xE3\x1F\x8F\xCC\xF0\x09\xB4\x1F\xFB\x6F\xA7\x35\x34\x7C\xA8\x7A\x11\x7B\xEC\x78\x49\xF3\x73\xFB\x7E\xC5\x6A\x8B\x79\xDE\x7D\x86\x62\x68\x66\x6B\x72\x39\xC9\x2B\xAF\x56\xF0\x7C\xD3\x2F\xF6\x7B\x7C\x7A\x58\x78\x81\x7A\xB8\xF4\x65\xE2\x5E\xC3\x67\x8B\x74\x36\x7E\xA5\x75\xA1\x6D\xB3\x79\xFE\xF0\x21\xAA\x6E\xA8\x69\x7D\x71\xA3\x73\x17\x7A\x48\x51\x02\x80\xC1\xBF\x78\xDF\x6F\x5D\x71\xF4\x7F\xCC\x74\x3A\x55\x34\x76\xAC\x6A\x81\xF3\x3A\xB8\x70\xE9\x51\xE2\x74\x01\x80\x05\x81\xBC\x60\x15\x80\x3C\xFE\x71\xE9\x5F\xAC\x5C\x49\x77\x48\x5F\xD7\x77\x5B\x6A\x62\x69\x14\xFE\x0C\xFD\x4D\xFD\x63\xAA\x79\x02\x85\x7C\x79\xFE\x76\xC8\x7A\xB4\xED\x2A\xE7\x4C\x9F\x27\x49\x05\x01\x81\x9B\x79\xC4\x79\xA2\x7A\xE6\xF3\x3D\xFC\x53\xC5\x61\xFD\x66\x7C\x6B\x00\x80\x67\x2A\x1B\x80\x84\xC4\x38\x00\x90\xFA\x7A\x00\x82\x29\x7F\x1B\x78\x5A\x79\xEF\x77\xF5\xFD\x10\x7E\x5D\x86\x45\x98\x64\x24\x7F\x7A\x78\x67\x78\xE3\x06\x27\xFF",
"\x2B\x1E\x18\x01\x9D\x2C\x6A\x05\x86\xC8\x6F\x51\x7B\x7D\x78\x3F\xFE\x6B\xBD\x42\x08\x6C\x6A\x70\xFF\x72\x23\x6D\x91\x7F\xF6\x79\x79\x83\x56\x00\xAA\x01\x84\x02\x87\x03\x86\x08\x83\x0A\x80\x24\x80\xD3\xEF\x7C\xDF\x42\xD0\x6E\x85\x72\x89\x69\xA2\x51\x1A\x81\xE3\x27\x6B\x00\x8D\x8C\x68\xC7\x65\x73\x7B\xC0\x51\xA7\x70\x36\x6E\x7B\x75\x75\x00\xEF\xDD\x53\x4D\x74\x8D\x7E\x41\x7E\x36\x7B\xD5\x69\x43\x80\x2F\x52\x09\x01\xA1\x51\x6A\xA6\x7D\xE2\x7F\x82\x7B\x96\x7E\x19\x7A\x1C\xD6\x58\x84\x43\xF9\x75\xFE\x6F\x4F\x76\xFD\x6C\x73\x79\xED\x35\x4C\x00\x9A\x01\x9B\x59\x7C\x86\x7C\xB2\x6E\x4D\x38\x77\x78\x5C\x7F\xFF\x27\x2A\x01\xA0\xCA\x7C\xB2\x62\x2A\x7D\x1D\x6D\x5E\x63\xFB\x55\xA8\x00\xC3\x00\xA4\xCE\x66\x00\x87\x5A\x78\x41\x78\x0B\x80\x12\x33\x6E\xF4\x12\x34\x69\x02\x9C\x03\x89\x05\x86\x0F\x81\x0E\x80\x88\x7F\x50\xEE\x26\xE9\x52\xC8\x71\x6F\x7E\x20\x7F\xF6\x77\x1E\x81\x5D\x80\x45\x00\xD0\x00\x87\x01\x9A\x54\x61\x22\x7A\x00\x81\x0D\x80\x62\x80\x6C\x00\xC6\x01\x9B\x01\x92\x02\x84\x3D\x5B\xB5\x7A\x5F\x7B\x1A\x79\xB0\x00\x84\x00\x98\x03\x8A\x04\x87\x34\x79\x10\x79\xA2\x7E\x8D\x6D\xA5\x5B\x2F\xFD\x74\x98\x23\x06\x80\x0D\x85\x0F\x82\x34\x81\x3F\x80\xDC\x00\xB6\x86\x76\xFA\x72\xB0\x5A\xF0\x7C\x1D\x82\xB9\x78\x7A\x78\xBD\x00\xE9\xE5\x6F\x01\x9C\xC1\x3E\x32\x7E\xAD\x3C\xB0\x7F\x75\x80\xBA\x00\xF7\x01\x8F\xC5\x6D\x03\x8A\xFD\x77\x17\x80\x28\x76\x36\x78\x0E\x65\x76\x01\xB8\xCD\x78\x07\x87\x4B\x7C\x5F\x79\x3C\x80\x44\x62\xA5\xFB\x7A\xDC\x7A\xEF\x77\x06\x8D\x0E\x85\x18\x83\x3B\x81\x63\x80\xA4\xF4\x49\xD6\x4A\x03\x89\x92\x76\x35\x3F\x37\x6E\xD1\x3C\xCF\x50\xB2\x00\x8F\xE9\x61\xCA\x68\x85\x7E\xB5\x68\x93\x6B\x58\x7A\x09\x80\x33\xE1\x3F\xE5\x43\xCC\x78\x35\x54\x53\x58\x13\x81\x13\x81\xD2\x7A\xFC\xF3\x79\x01\xAB\xCC\x7B\x07\x8B\x2E\x7E\xDC\x7E\xE6\x61\x98\x7A\xB6\xE5\x18\xD8\x79\xFB\x6D\xF0\x69\x37\x46\x25\x81\x48\x80\xDC\x79\x90\xF4\x3A\xE7\x6D\x97\x53\xF1\x65\x16\x72\x30\x74\x28\x78\x1A\x76\xD8\xEE\x3D\x02\x94\x04\x82\x08\x86\x20\x7A\x26\x82\xFF\x78\x83\x80\x48\xF5\x7B\xEA\x54\xFC\x61\x0C\x77\xE3\x6D\x26\x71\x8E\x6F\xE9\x06\x3E\x01\xE3\x01\x9B\x02\x98\xF6\x70\xE8\x7A\xD4\x7D\x58\x7A\xA9\x80\xAB\xB0\x38\xE1\x57\x67\x78\xAC\x74\x70\x71\x25\x53\x4F\x81\x31\x77\xB9\xF3\x0C\x01\x83\x00\x73\xF4\x7E\x0C\x59\x8F\x77\x6C\x7B\x99\x79\xFF\xC6\x07\xAA\x5F\x69\x76\x05\x75\x88\x2E\x17\x69\x12\x00\xAA\x77\xCC\xDB\x50\x53\x32\x8F\x6C\x08\x30\xB5\x38\x1A\x6F\x0D\x01\xC7\x7F\x33\x99\x57\xE9\x0B\x01\x12\x1F\x77\x05\x01\x6D\x71\x61\x80\x16\x2E\xB2\xFF\x3D\xEE\x29\xBD\x68\x02\x03\xF9\x7B\x1B\x6C\xDA\x6A\xCB\x7F\x36\x7F\x18\xFF\x4B\xFA\x37\x0B\x8A\xB9\x3A\xE7\x7D\xEA\x7F\x05\x2E\xC9\xFF\x70\x97\x7B\xE1\x7E\xD6\x24\x23\x6E\x20\x02\x12\x01\xBD\x80\xA6\xFF\x4F\xFE\x72\xFD\x7D\xE0\x63\x36\x41\x33\x81\x77\x23\xEF\x22\x94\x08\x7E\x02\x80\x06\x90\xD3\x42\x18\x84\x30\x81\x68\x80\xCF\x6D\xA3\x01\xDE\xDF\x65\xD6\x26\x0D\x8B\x19\x82\x70\x2C\x25\x05\xC3\x80\x6C\x5C\x09\x03\x8C\xFC\x2B\x0C\x84\xFC\x7E\x2C\x69\x6C\x80\x70\x78\xAD\x5B\x34\x03\xA6\x90\x62\xDC\x25\xA4\x01\x38\x44\x64\x81\xB1\x41\x26\xE9\x03\xB8\x38\xC2\x27\x51\x09\xFD\x7F\xFE\x7E\x64\x80\xB4\x7A\x06\x01\x4D\x00\x1B\xD7\x72\xAF\x37\x89\x00\x1F\x66\xF8\x7E\x26\x7D\xE5\xE7\x14\xAE\x61\x38\x18\xB1\x76\x9C\x1F\x46\x7C\xDF\x22\x8C\x5C\xFA\x56\x7F\xFF\x43\xA5\x63\xE0\x21\xB8\x40\xF6\x7E\x73\x80\xBE\x66\x84\xE3\x51\x00\x38\x05\x9D\x10\x78\x6A\x22\x7E\x71\x44\x3C\xA8\x3D\xD3\xDD\x38\x00\x2B\x06\x8B\x8D\x46\xB6\x3A\x7E\x70\x18\x01\xB4\x71\xF7\x01\xA2\xBF\x3A\x06\x84\xF6\x39\xF6\x75\xC1\x29\xA9\x6D\x22\x05\x34\xDA\x47\x03\xB3\x1E\x2F\x0E\x86\xBD\x2A\x3D\x81\x65\x81\xAD\x7F\x9D\xFF\x60\x37\x75\xFD\x61\x06\x37\x3D\x03\xF6\x21\x67\x81\x4F\x14\xEE\x01\xAF\x03\xB1\xFD\x71\x2F\x07\x19\x83\x26\x4F\x82\x80\xF7\x31\x0D\x02\x84\x8E\x14\x22\x11\x0F\x83\x1F\x83\xE2\x49\x7D\x80\x0E\x55\x12\x02\xBC\xDE\x7F\x06\x9F\x02\x80\xA7\x4F\x42\x80\x4F\x07\x0C\x81\xF7\x93\x47\xA3\x71\x7C\x3B\x0F\x8C\x03\x45\x3F\x81\x6F\x81\xD3\x7F\x23\x02\x9D\x00\xAA\x59\x46\x11\x8C\x22\x3B\xF6\x20\x80\x81\x15\x81\xCF\xFF\x57\x6E\x4C\xFC\x2C\x7C\x7C\xDC\x06\xBB\x7F\x72\x06\x4C\x80\x81\xEF\x1B\xDE\x5E\xCD\x65\xF3\x77\x51\x79\xDB\x7E\x27\x4C\x05\x80\xAF\xF1\x1F\x00\xAB\xA8",
"\x73\x50\x75\x0E\x7C\xDD\x5D\x04\x81\xFF\x74\xF1\xEC\x44\xCB\x01\x09\x88\xA9\x7C\xE9\x70\xDE\x7E\xB3\x7E\x79\x7F\x1A\xD5\x48\x04\xAE\x56\x78\x65\x72\x4E\x73\x57\x41\xDA\x79\x2B\x5B\x26\xFE\x57\xF4\x57\x86\x5F\xD7\x20\xCD\x2B\x4A\x83\x27\x7B\x87\x78\x21\xFE\x2E\xE4\x69\xC4\x70\x91\x76\x28\x55\x22\x79\x81\x7F\x69\x76\x6B\xC9\x5A\xAA\x5C\x55\x7F\xD6\x55\x26\x81\x8F\x79\x5D\x7B\x94\x7F\x5E\xF5\x1D\x01\x8C\xD3\x71\xF6\x7A\xCE\x70\xC2\x7E\x4B\x79\xCB\x79\x30\xF1\x62\xFC\x47\x89\x26\x13\x84\x45\x78\x94\x7B\x95\x7E\x51\x7A\x58\x02\xD0\xFD\x41\xC5\x7C\xF0\x7E\xA7\x2A\x0F\x83\xC5\x00\x3B\x81\x68\xF4\x7F\xFD\x5C\xFC\x62\x0B\x7F\x63\x64\x0A\x82\xF5\x76\x20\x81\x90\x02\xC8\xE9\x62\xF7\x7C\x04\x86\x24\x85\xBC\x7F\xD8\x78\xA1\x60\xD1\xF3\x1F\xBE\x53\xCF\x63\x03\x83\xFE\x75\x0C\x82\x8D\x7E\x10\x7A\x1F\xDD\x27\x12\x04\x0A\x94\xA8\x7F\xEC\x76\xCF\x7D\xB4\x77\x95\x7F\x69\xF2\x71\xB9\x7F\xC5\x6A\x9F\x78\x1C\x7D\x86\x7A\x91\x7E\xB5\x5F\x48\xFE\x74\x04\x9E\x88\x2B\x15\x88\x28\x7D\xA2\x78\x91\x80\x2C\x7F\x5D\x01\xDA\xFD\x58\xA9\x78\xD6\x71\xE5\x7C\x10\x80\x01\x7A\x2F\x6C\xAC\x5C\x0F\x05\x9B\xD5\x6B\xFF\x58\x27\x87\xAE\x79\xA7\x80\x01\x7F\x21\x63\x0E\x01\xBF\xB5\x79\xE6\x67\x12\x84\x14\x82\x3B\x76\xA6\x62\x61\xFE\x0C\xF4\x43\x0A\x99\x14\x8C\x55\x7D\x59\x83\xA1\x7E\x3D\x81\x60\xF5\x7D\x39\x6A\xF9\x6C\x9B\x6D\xD9\x73\x14\x81\x09\x71\x95\x80\x71\xFE\x48\x11\x74\x00\x95\x13\x8B\x2C\x82\x3F\x63\xA6\x80\xAE\x80\xB0\x02\x8D\xE5\x41\x0F\x4F\x05\x85\x0F\x87\x24\x00\xAF\x81\x97\x75\x72\xEC\x2E\x05\x8B\xCA\x71\x17\x89\x45\x7B\xB5\x37\xA0\x7F\x7A\x81\x10\x4C\x6D\x05\xB2\x09\x7F\xEF\x72\xF0\x74\x5F\x82\x1F\x7B\x9A\x75\xFB\xF1\x26\xFE\x7C\x69\x37\x17\x8F\xDF\x71\x5F\x83\xB0\x7F\x3F\x7F\x06\x03\xAD\xEA\x5A\xD4\x60\xA7\x78\x06\x39\x90\x7A\x10\x81\x80\x81\x74\xF5\x11\x05\xA1\xFB\x6F\xF4\x7E\x06\x81\x31\x30\xA7\x7F\xF3\x3A\xDB\x02\x82\x06\xA8\x75\x63\x08\x8A\x0D\x85\x63\x80\x20\x81\x4B\x42\x6C\x01\xA5\xFD\x60\x03\x80\x18\x86\x10\x04\x61\x83\x4E\x78\x87\x81\xCD\xFE\x4E\xE5\x6B\x09\x90\x96\x77\x25\x7B\xB0\x6D\x00\x6A\x01\x2D\x8E\x02\xAA\x06\x1C\x0B\x8C\x16\x8F\x2E\x82\xE5\x7F\xCC\x80\x63\x7F\xD5\x72\x15\xBB\x77\xFA\x7F\x08\x81\x32\x81\x63\x82\xA6\x80\x82\x81\xE3\xFD\x4F\x05\x93\xC4\x6D\xF9\x7B\x26\x7F\xDA\x6B\x8A\x5B\x89\x80\xEC\x02\xC6\x06\x9D\x0B\x9D\x19\x89\x27\x82\x69\x82\x27\x81\x63\x7F\x83\xCF\x52\x80\x48\xEE\x31\x1A\x8D\x38\x7F\x4E\x80\xD5\x80\x67\x81\xC1\x02\xF9\xEA\x7C\x09\x8E\xD1\x75\xBD\x73\xB3\x70\xD1\x80\x29\x81\x3B\x03\xEE\x05\x88\x0D\x9C\x14\x81\x36\x84\xAF\x75\x29\x7B\x6F\x7A\x32\xF2\x1D\xC2\x66\xCA\x71\xC2\x5A\x2A\x81\x6D\x83\xC0\x81\x34\x81\x67\xF2\x11\x06\xA8\xF9\x6C\x77\x78\x76\x7F\xDC\x7F\xDF\x60\x53\x77\x34\xE1\x68\x05\x88\x2D\x79\x1B\x49\x2C\x82\x67\x82\xC8\x80\xED\x6E\xDB\xF0\x14\x9F\x67\x03\x93\x60\x75\x96\x79\xCE\x6C\xBA\x7F\x6A\x79\x27\x02\x0C\xBC\x79\x96\x64\x1C\x8B\x30\x86\x6E\x83\xC8\x81\xA6\x80\x0D\x01\xA3\xFC\x7A\x00\x92\xF1\x6F\xF1\x7E\x48\x46\x59\x71\x19\x76\x7D\xB3\x22\xE1\x78\x52\x74\xA9\x55\x38\x86\x65\x82\x9C\x76\x98\x81\x56\x02\xB2\x06\x8F\xFB\x6C\x13\x8C\x38\x87\x8B\x77\xC4\x7F\x5A\x81\xE0\xC0\x02\xC3\x62\x0E\x84\x98\x77\x35\x6D\x74\x82\xE5\x80\xC4\x81\x6F\xF0\x42\x02\x88\xDA\x5D\x1C\x8C\x6F\x5C\x1E\x7D\x65\x7B\x5C\x78\x25\xFF\x76\xE9\x75\x0D\x87\x1C\x8D\xA7\x73\xBB\x6C\xC0\x7F\x56\x80\x64\xC3\x5E\x01\xA5\x7D\x4F\xF9\x78\x0F\x71\xE6\x7C\x6C\x7A\xB9\x80\x7F\xEC\x74\x02\x8E\x0F\x9E\xE1\x47\x00\x21\xE5\x06\x74\x71\x45\x5F\x55\x00\x5D\xFF\x46\xEA\x76\xD9\x3E\x96\x2D\xEE\x2A\x2C\x2D\xF0\x80\xE5\xFF\x70\x09\x32\x8F\x7D\x0E\x88\x71\x74\x5F\x7C\x9C\x21\xEE\x81\x44\x42\x72\xED\x55\x9B\x6B\xCB\x22\x9E\x76\x80\x5D\xF0\x7A\xF8\x51\xC2\x51\x22\xF4\x0D\x3A\x0A\x3D\x22\x88\x02\x39\x77\xFA\x80\x0E\x21\xE9\xE2\x39\xE6\x59\xE8\x64\x2E\x36\x1E\x84\x5C\x7B\x6F\x78\xA6\x80\xA5\xF3\x04\x02\xB7\xC1\x78\x6D\x6A\x25\x87\xF6\x6E\x8C\x7F\x2E\x81\x20\xD5\x0F\x00\x8F\xCD\x64\xF9\x66\xFD\x75\x70\x81\xFF\x80\xC5\x7A\x76\xF2\x44\xE8\x6B\xB0\x67\x00\x8A\x27\x7C\x0B\x80\x42\x7A\xCA\x77\xA4\x01\x9E\xBE\x61\x93\x60\xF9\x67\xDF\x7A\x84\x6D\x7E\x7E\x5E\x76\x25\x00\xEF\xCD\x7C\x0F\x97\xE6\x29\x76\x6D\x3A\x79\x45\x81\x6C\x80\x17\x01\xDB\x01\x9B\x0E\x85\xA8\x74\xE0",
"\x7A\xF6\x74\x76\x67\x38\x81\x5B\xDF\x3B\xB8\x50\x90\x7C\x3E\x3F\x40\x86\x64\x7B\x86\x79\x5A\x7A\x7A\xF1\x4E\x02\x87\xD1\x6B\x21\x85\xE2\x7D\x4F\x81\xE5\x79\x2D\x75\x2F\xF1\x79\xFF\x6D\xAB\x47\xD0\x28\x09\x85\x86\x82\x10\x7B\x14\x76\x12\x04\xF8\xE4\x54\x10\x9C\xA6\x70\x15\x84\x94\x58\xA3\x80\x2A\x2D\x45\x04\xA4\x08\xA6\x75\x6B\x72\x7B\x31\x83\xD5\x7C\xF2\x81\x2A\x62\x96\x02\xD1\xE6\x6D\x68\x47\x49\x06\x44\x81\x7C\x7B\x10\x7A\x0B\x80\x45\xF4\x3A\x08\x88\x00\x84\x20\x8F\x29\x80\x57\x6D\xA8\x81\x0D\x82\xA3\x02\x9E\x54\x64\x01\x8D\xF5\x75\xBA\x2E\x2D\x7A\x04\x64\x2E\x82\x52\x04\xCA\xBF\x67\x05\x80\x0B\x73\x29\x80\x50\x74\x08\x70\x02\x70\x73\x00\xC2\xFC\x55\x0B\x87\x17\x83\x3B\x84\xFE\x74\xB2\x80\x3E\x2D\x5D\x04\xF9\xE7\x4F\xCC\x6E\x02\x84\x3E\x79\x85\x82\xC9\x81\x87\x80\x85\xB4\x46\xD5\x75\x84\x73\xF2\x7B\x50\x7C\x86\x81\x1C\x83\x3D\x75\xD9\xDD\x45\x07\x89\x0E\x8D\xF0\x70\x62\x52\x5B\x77\x29\x6C\x6A\x81\x6D\xFE\x42\x57\x77\x01\x97\xCE\x69\x2D\x83\xD2\x70\x1C\x82\xBB\x79\x89\xCB\x00\x08\xBC\x02\x99\x1C\x8F\x58\x78\x91\x81\x8C\x7F\x38\x80\x46\xE5\x19\x09\x84\xF9\x69\x2A\x76\x43\x7C\xA4\x57\x29\x80\x85\x81\xD0\x5C\x01\x09\xB3\xD2\x64\xAD\x78\x43\x85\x43\x78\x29\x82\xD4\x7A\x27\x03\xF3\x62\x74\x0B\x90\x25\x8E\x21\x32\x96\x83\x3A\x7A\x5A\x7A\xF9\xF2\x39\x08\xB7\x12\x9E\x05\x89\x4B\x87\xBE\x5B\xBF\x80\x5E\x82\x47\x62\x3E\x09\xA3\xD6\x7A\x9F\x70\x13\x82\x9B\x7B\x12\x82\xA3\x7A\x4D\x04\xF3\xD4\x01\x03\x9B\x60\x6E\x48\x80\x94\x80\xA8\x67\x3B\x79\x00\xED\x43\x09\xBA\x03\x91\x26\x81\xAE\x49\x65\x82\x26\x43\x4A\x7F\xD9\xBB\x04\xF7\x1F\x12\x81\xAA\x74\x34\x7A\x2B\x83\x2A\x80\xC5\x81\x60\x21\x1F\x06\x94\x13\x83\x27\x82\x3A\x7A\xA8\x7B\x09\x82\x72\x80\xA6\xF3\x66\x01\xA4\xFB\x6C\x1A\x83\x57\x73\x13\x43\x86\x76\x5D\x81\xC9\x04\x8F\x09\xA0\xB9\x7E\x0A\x7C\x01\x74\x8E\x80\x99\x77\x8E\x7F\x66\xEE\x36\x06\x8A\x5C\x47\x1B\x89\x7B\x32\x99\x82\x4E\x79\xD3\x81\x89\xF2\x7A\x05\x8C\xCF\x6D\x1B\x80\x2D\x85\x66\x82\xD0\x80\x7A\x80\x33\x04\xEC\x09\xBE\x0F\x86\x21\x82\x4A\x81\x1A\x83\x33\x83\x28\x80\x3C\x04\xED\xBA\x4A\x0F\x8A\x2C\x7F\x0F\x84\x88\x80\x20\x82\x7D\x82\xB5\xF3\x61\xDC\x77\xCE\x68\x0B\x81\x14\x82\x2D\x81\x16\x78\xC9\x72\x9B\xA6\x48\x09\xA3\x10\x96\x26\x88\xF6\x66\x9C\x83\x2C\x80\x56\x80\x93\xE1\x46\x31\x51\x04\x94\xF6\x7B\xCE\x42\xA2\x80\x04\x83\x72\x79\x0B\x01\xA4\x06\x86\x12\x85\x08\x85\x4C\x82\xD2\x7D\x3F\x81\x89\x6B\x73\x03\xF0\x55\x76\x14\x96\x21\x8F\x4F\x78\x75\x81\xC3\x7F\x2B\x81\x0F\xFF\x19\x02\x8C\x40\x7D\xD9\x61\x4F\x67\x67\x6E\xE0\x80\x9B\x70\xA8\x02\xAE\xBC\x3E\x2C\x00\x29\x85\xDD\x76\x76\x7A\x23\x7A\xA0\x80\x23\x01\xBA\x07\xA9\xC2\x6C\x2A\x89\xEA\x62\x6C\x5A\x06\x77\x52\x80\xE8\xD5\x74\xB3\x74\xD4\x52\x2A\x84\xB3\x04\xAA\x81\xA7\x79\x46\x7A\x9F\xF2\x22\x02\xB4\x02\x84\x09\x8C\x09\x7F\x5F\x7B\x90\x7F\x6B\x77\x35\xE1\x09\xFE\x71\xCF\x43\x2A\x87\x44\x80\x2F\x79\x2D\x83\xC6\x7A\xDA\x04\xB3\x02\x9C\x13\x82\xF8\x7C\x2E\x79\xB8\x73\x2A\x82\x1B\x6F\x02\xF3\x7D\x08\xAF\xC2\x63\x2B\x8F\x51\x84\xA5\x80\xEF\x66\x3D\x7A\xDE\x02\xA0\xFD\x4C\x14\x8B\x1A\x84\xEF\x7B\xE0\x7C\x4E\x81\x84\x77\x22\xFF\x5D\xCB\x4C\xBC\x64\x0B\x80\x75\x44\xAE\x82\x17\x82\x24\x82\x60\x04\x93\x08\xA2\x11\x95\x20\x86\x4A\x86\xA7\x83\x82\x79\xD0\x56\x30\xF3\x52\x07\xB0\x7D\x4F\x1E\x89\xBC\x64\xE6\x7D\xCC\x78\x5D\x7B\xE2\xBC\x54\x1B\x05\x9A\x38\x0D\x87\x1E\x81\xA7\x7E\x99\x41\x2C\x00\xEB\x01\x96\xB3\x0D\xEB\x52\x1F\x71\x0D\x30\x6A\x3E\xD1\x4B\xA0\x27\xBF\xE2\x1A\x92\x37\xE7\x34\x2D\x89\x36\x77\xB6\x83\x95\x44\xE6\x68\xB2\x3E\x23\x92\x32\x62\x33\x7A\x29\xF6\x71\xF0\x23\x7F\x80\x2D\x60\x02\x02\xD7\x14\x44\x08\x8C\x76\x00\x5B\x87\x40\x80\xE7\x7F\xA8\x7F\x9C\x97\x23\x29\x6E\x23\x10\x45\x23\x75\x22\xC8\x72\x87\x81\xD1\x7F\x00\x00\x5A\x00\x3C\x16\x96\x66\x7E\x3B\x87\xF8\x7F\x05\x46\xE9\x82\xD6\x08\x54\x0B\x99\x1F\x36\x2E\x8C\x79\x4C\x12\x06\x6F\x83\x0B\x46\xB9\x05\xE1\xC6\x3B\x16\x83\x3C\x51\x0D\x35\xF8\x7C\x28\x4A\xE8\x82\x20\x47\x60\x0B\x88\x28\x02\x2F\x8B\x73\x21\xE8\x26\x79\x83\x96\x2F\xC0\x05\xC4\xCE\x02\x17\x8C\x7C\x45\x5C\x87\x45\x82\x68\x80\x0A\x81\x19\x04\xD7\x14\x72\x17\x92\x53\x04\x5F\x85\x22\x01\xD0\x27\x22\x05\x44\xE0\x49\x0B\x97\x30\x4B\x2E\x8C\x00\x1D\x31\x82\x52",
"\x2F\x5A\x12\x8C\x59\x02\xCF\x53\x14\x33\x3E\x7F\xCF\x03\xA4\x22\x45\x01\x9D\x2B\xCA\xE3\x75\xDE\x43\x23\x32\x1F\x7D\x05\x01\x44\x81\x81\x2C\xCD\x2C\x40\x42\x76\x07\x9E\x0C\x2C\x28\x24\x61\x85\x96\x12\x85\x83\xCE\x27\x98\x59\x13\x8A\x14\x22\x1D\x30\x89\xE2\x52\x3E\x22\x88\x3D\x5B\x05\x5F\x36\x13\xCE\x06\x0A\x17\xA6\x3C\x05\x02\x7E\x71\x8D\x82\xEE\x82\x3F\x02\x90\x0C\x9B\x66\x32\x30\x8D\x93\x25\xC4\x81\x82\x2B\x13\x83\x3B\x57\x14\x11\x37\x18\x9E\x0E\x8D\x93\x27\xC5\x83\x11\x07\x18\x83\x78\x64\x33\x0C\x97\xE8\x32\x1F\x73\x7E\x70\xC7\x83\x71\x06\x10\x83\xFB\x41\x22\x0C\x94\x18\x3E\x31\x8C\x1F\x38\xC8\x83\x73\x7A\x86\x22\x94\x08\x4D\x0C\x84\x19\x9C\xB2\x16\x64\x80\x5C\x08\x92\x83\xFE\x70\x16\x02\x34\x0C\xB2\x8F\x77\x3B\x1D\x93\x30\xCA\x82\xDA\x00\x29\x83\xF2\x41\x54\x0C\xA7\xD7\x36\x32\x81\xA4\x7A\xC5\x83\x0C\x3B\x25\x7D\x1A\x3D\x5D\x0C\xB4\x66\x1F\x32\x8F\x5E\x36\x40\x71\x6B\x83\x44\x3A\x44\xE6\x6E\x07\xB6\x8E\x78\x78\x07\x00\x27\x0B\x01\x73\x80\x00\x80\xFA\x03\xFF\x90\x67\x24\x0C\x2D\x82\x26\x7C\x6B\x7A\x90\x80\x80\x77\x6B\x03\xF0\x05\xBF\x0C\x9F\xA0\x5F\xE2\x79\x41\x81\x4A\x63\x30\x80\xD4\xE4\x6B\xFB\x56\xBF\x64\x2B\x84\x68\x86\xA4\x79\x8D\x76\x2A\x81\x1C\xEF\x31\x06\x84\xFB\x6B\x34\x8B\xD2\x77\x79\x79\x80\x83\x33\x82\xAA\x78\x08\x08\xB8\xF7\x60\x88\x7F\xA2\x73\xBF\x7E\x60\x7A\xE2\x32\x95\x06\x86\xE5\x4D\xC4\x67\x13\x8A\x1A\x78\x6F\x80\x80\x7E\xAB\x81\x7B\x02\xFA\xC9\x6E\x09\x8E\x21\x87\x11\x79\x06\x83\x3C\x72\x8D\x78\x8D\x04\x83\x0D\x85\xD3\x63\x9B\x6D\x35\x78\xD1\x82\xAB\x83\x82\x81\x9C\x06\xF2\x05\x83\xF8\x7E\x21\x8E\xDE\x66\x72\x7A\x22\x5B\x20\x80\x68\xE4\x50\xB9\x29\x1A\x87\x9E\x7A\xF1\x70\xD3\x83\x90\x80\x85\x82\x57\xF4\x7A\x06\x81\xFA\x64\x68\x7A\x04\x84\xDB\x72\xB2\x83\x5D\x83\xF8\xD3\x3D\x0D\x92\xC6\x67\x14\x82\xE2\x7D\x94\x81\x46\x83\x29\x80\xBC\xF3\x22\xBF\x51\x24\x7A\x35\x89\x55\x7B\x91\x7B\xED\x80\x49\x82\xB9\x03\x88\x86\x4A\xCD\x71\x50\x7C\xC9\x72\x0C\x82\x1A\x83\x52\x81\x6C\x04\xFB\x1B\x2E\x11\x8D\x1E\x44\x6E\x82\xAE\x7A\x19\x7A\xA9\x81\x3C\x03\x89\x0D\xBE\x0C\x8B\x1D\x84\x33\x84\x02\x78\x97\x7F\x62\x6D\x7A\x04\xAA\x09\x96\x0B\x8E\xAA\x7E\xFE\x69\x57\x81\xAE\x83\x93\x00\xCB\x06\x9D\xE9\x68\xC6\x6C\x35\x8C\x22\x7F\xD7\x81\xD2\x81\xC5\x82\x57\x03\xE3\x06\x98\xF2\x45\x16\x8E\x57\x7C\x91\x83\x30\x45\x7A\x83\x5B\xF3\x0C\xE7\x5A\x1B\x88\x2C\x8F\x35\x87\x5B\x80\xAC\x83\x70\x81\x63\x9D\x78\x08\x81\x12\x00\x6C\x71\x09\x80\x95\x6F\x60\x76\x11\x6F\xE0\xDA\x11\x4A\x54\x79\x28\x38\x88\x6D\x83\xB8\x68\xF1\x81\x7E\x82\x7E\xEA\x75\x08\xB4\xFA\x72\xC3\x66\xF0\x71\x95\x83\x06\x7A\x37\x7F\x27\x07\xC5\xB1\x78\xD0\x7A\x22\x48\x71\x85\xD0\x82\xC6\x83\x43\x83\xDB\x06\xBF\x05\x88\x0A\x89\x2A\x8A\x28\x81\x75\x78\xF7\x55\x25\x65\x11\x05\xAC\x0E\xA5\x1B\x86\xA6\x78\x6F\x82\x6D\x82\xC3\x82\xB6\x81\xD2\x06\xDE\x02\xA4\xBC\x5B\xA2\x7B\x3F\x81\xF7\x31\xC2\x82\x29\x7A\x9E\xF4\x05\x05\xA8\x09\x9C\x36\x8A\x26\x84\xDF\x80\xD0\x80\x15\x52\xD3\x04\xE4\xA1\x7D\x1C\x96\x34\x83\x26\x7C\xE1\x81\x99\x79\xA7\x83\x8A\x06\xDE\x0E\xAC\xFC\x6F\x1B\x8F\xBA\x74\xDB\x7E\xC5\x81\xF1\x5D\x7C\x5A\x57\x0E\x8F\xC9\x73\xA2\x7C\x2A\x85\x8A\x78\xB4\x82\x33\x7F\x51\x07\xC9\x1A\x55\x03\x82\x34\x8A\x74\x86\xDE\x82\x56\x7B\xA6\x83\x77\x03\xDC\x0E\xB9\x0D\x81\x36\x8D\x2F\x84\xED\x80\xA9\x79\x01\x7A\x2B\x03\xC9\x0E\xAB\x62\x0D\x39\x85\x42\x83\x74\x79\x45\x82\x77\x80\x17\x05\xD3\x01\x9F\x1B\x8D\xBB\x30\x40\x6B\xA0\x82\xE2\x82\x83\x00\x72\x07\x92\xEA\x50\xC9\x7D\x15\x8D\x2A\x87\x61\x83\xAB\x80\xC2\x83\x07\x03\xEA\xE0\x65\x6E\x33\xA0\x62\x2C\x5B\xEC\x82\xAA\x83\x93\x7A\x66\x07\xCC\xE5\x5A\x1A\x90\x18\x80\x7A\x82\x62\x83\xB6\x7E\x8A\x81\xB0\x74\x62\xE9\x45\xE0\x46\x3D\x8C\x6C\x87\x50\x78\xBE\x81\x84\x82\x9E\x07\xFB\x05\xAD\x1E\x9B\x1B\x88\x35\x87\x5D\x3A\xD6\x81\x64\x83\x1E\x62\x19\x0F\xAD\x70\x73\xA8\x7C\x79\x86\xEE\x81\xEE\x83\x85\x82\x79\x07\xE2\x06\xB2\x1A\x84\x1B\x8A\x59\x72\x4B\x63\xB8\x83\xBE\x83\x19\x07\x91\xE8\x40\x1E\x97\x1C\x81\x40\x85\x64\x80\x4F\x83\xCE\x82\x0A\xF2\x1B\x0A\xBC\xBA\x7E\x08\x81\x73\x44\xF6\x82\xC2\x82\x15\x79\xA9\x07\xCA\xE7\x77\x1D\x85\x12\x80\x71\x81\xD6\x83\x20\x78\x88\x7B\x30\xF5\x3C\xDD\x72\xD4\x6D\x33\x6B\xEE\x7F\xA9\x83\x4D\x7A\xAE\x47\xDE",
"\x07\xD8\x0E\x8B\x1C\x9A\x3A\x8D\x6A\x82\xF0\x83\xAB\x83\xF2\x83\x20\x07\xFE\xE5\x49\xD5\x7E\x5A\x6C\x54\x7F\xAB\x83\xB5\x80\xF7\x6F\xFC\xFE\x70\x27\x71\x1F\x93\x3B\x89\x75\x85\xEE\x82\xA1\x80\xA1\x83\xDD\x06\xB8\x09\x98\x1F\x92\xBE\x4E\x56\x87\x24\x80\x5C\x83\xA7\x82\x72\x05\xBA\x0F\x43\x20\x9A\x3C\x84\x77\x85\xF8\x83\x01\x85\xF1\x83\xC0\x02\xC9\x0F\xAE\x0D\x91\xF8\x75\x67\x30\x8C\x76\xB9\x81\x07\x41\x16\xFF\x1B\xD8\x73\xC8\x77\x0A\x87\x71\x80\xFA\x82\xCF\x82\xE9\x83\x5D\x03\x9A\x06\x89\x16\x9B\xF5\x73\xEE\x78\xCF\x7D\xEB\x80\x89\x7F\xCC\xD4\x0A\xAF\x62\x05\x95\x09\x74\x59\x86\x1B\x77\xB5\x83\xA5\x83\xBC\x06\xC0\x0E\x9C\x1C\x9A\x37\x85\x35\x80\xFF\x82\x20\x78\xD3\x6E\x6D\x07\xB0\x0F\x91\xEC\x5D\x2B\x82\x0E\x74\x81\x49\x97\x6D\xD8\x7A\x64\x82\x68\xCB\x71\x6A\x62\x1A\x09\x1F\x87\xCE\x82\xED\x3D\xE3\x71\x61\x00\x49\xC7\x57\x50\x49\x08\x03\x84\x80\xFB\x2D\x33\x30\xA8\x3D\x5A\xF1\x1D\xD3\x7A\x96\x23\xA3\x43\x55\x4F\x9A\x38\x19\x00\xF9\x71\x57\x08\xC0\xF3\x19\x21\x89\x2F\x83\x3C\x37\x9A\x3B\x18\x00\xF9\x71\x6A\x00\x69\xC6\x69\x21\x8A\x4A\x37\x22\x73\x71\x04\x95\x68\xFE\x82\xFA\x0D\x62\x00\x32\x8F\x74\xC8\x04\xAF\x5C\x0E\x87\xC5\x3B\xC4\x5D\x26\x28\x6E\x51\x76\x36\x44\x4A\x7C\xDC\x01\xD2\x02\x1D\x84\x05\x72\xA1\xFB\x20\x59\x4E\x18\x83\x63\x68\x76\x79\x11\x04\x2E\x73\x8C\x04\xC3\xFD\x34\xB6\x36\x19\x81\xD4\x6C\x91\x2D\xE3\x6F\xC6\x20\x0B\x01\x51\x80\x45\xF4\x65\x6C\x67\x49\x03\x64\x80\x8B\x2C\x8D\x7D\x93\x00\x36\xFA\x7D\xFF\x54\x18\x39\xD1\x7A\xD3\x7A\x97\x3B\x20\x84\x4A\x84\x51\xFA\x53\xF4\x69\x18\x9D\x49\x29\x8F\x75\x30\x69\xE0\x55\x41\x84\xD3\xE7\x1E\x0E\x3B\x0C\x21\x18\x27\x55\x3D\x11\x87\x37\x73\x97\x24\x03\xD1\x2F\xF7\x70\xE8\x71\xDD\x7C\x24\x19\x4A\x7E\x92\x7D\x16\x83\x1A\x3D\x7F\x01\x12\x22\x90\xFB\x79\x7B\x34\xC5\x80\xFC\x2D\x4B\x84\xCE\xE6\x70\x0C\xB2\x0C\x22\xA9\x39\xC4\x29\xB1\x2F\x8E\x7D\x18\x7D\xB5\x08\xD1\xB6\x3F\xE8\x7C\xAE\x77\x65\x83\xA2\x22\x39\x75\x93\x00\xDA\xF5\x38\xEC\x7E\x22\x96\x44\x86\x21\x02\x14\x85\xD9\x2B\x61\x84\xD7\x03\xE0\x7A\x69\x01\x03\x44\x84\x26\x84\x3F\x39\x84\x83\xEB\x80\x1F\x42\x53\xCF\x72\x31\x11\x3D\x29\x22\x2F\x41\x80\xF9\x12\xF9\x71\xEF\x33\x38\x0D\xB0\x1D\x89\xB0\x2F\x8D\x84\xCB\x73\x49\x22\x71\x84\x78\x0C\x64\x11\x8D\x23\x9C\x10\x24\x89\x01\x1D\x86\x26\x85\x93\x22\x72\x06\xAB\x67\x34\x19\x98\x38\x3A\x64\x83\xC1\x54\x87\x82\x0F\x83\xDD\x08\xE7\xEB\x2D\x23\x8D\xFF\x7F\x8E\x87\x79\x7C\x19\x01\x71\x84\x80\x57\x23\xB1\x2D\x19\x94\x47\x87\x12\x03\x1A\x87\xF9\x7A\x7C\x84\x37\x5E\x7B\x11\xB7\xB3\x2B\x44\x8D\x9C\x75\xE3\x52\xF1\x6B\x95\x83\x09\x01\x4D\x10\xA2\xC7\x62\x90\x74\x4E\x87\x6E\x78\x36\x83\xBC\x79\x79\x05\xCF\x02\x96\x10\x88\x8C\x6C\x01\x80\x54\x82\x07\x81\xD2\x77\x4B\x02\xEA\xFB\x7B\x69\x6B\xE0\x62\x81\x87\x24\x02\x46\x84\x71\x79\xD3\xF1\x13\x0A\x8E\x1E\x99\x29\x88\x39\x80\x03\x82\x43\x80\x32\x82\x9E\x06\xB2\x03\xAC\x1B\x80\x7F\x79\x92\x81\x04\x82\x02\x82\x1F\x4E\xA6\x06\xC5\x27\x67\x24\x0F\x49\x88\x58\x7C\x47\x7B\x4D\x83\xFF\x81\x34\x09\xD5\x0F\xBB\x14\x83\x20\x88\x0C\x84\xF7\x75\x0B\x83\xBF\x79\xB3\xEF\x07\xFC\x72\x00\x8D\xE5\x5F\x43\x43\x28\x85\x35\x7A\x42\x77\x97\x06\xE1\x0F\xA9\xD4\x67\x3E\x81\x6D\x83\xF7\x83\xB4\x83\xE5\x83\xEC\x5F\x3F\x08\x91\xF8\x61\x22\x83\xDF\x61\x4A\x83\x1B\x82\x97\x84\x57\x09\xD4\xDB\x67\x15\x96\x2A\x89\x56\x80\xAB\x83\x5A\x82\xAD\x82\xED\xE4\x05\xDA\x6B\xD5\x79\x3D\x34\x94\x80\x88\x7A\x5D\x79\xBA\x82\x27\xF3\x4D\x09\x8F\x01\x91\x3C\x80\x0F\x83\xF2\x81\x20\x81\xC5\x7C\xBD\xF3\x20\x92\x63\x12\x56\x4A\x84\x37\x7E\x9A\x7A\x61\x83\x2F\x6A\xDA\xF0\x69\x0D\xBB\x0D\x6B\x37\x80\x20\x64\x67\x54\x8D\x7E\x73\x78\xF2\x06\xF9\x06\x43\x2A\x04\x4C\x8F\x53\x7A\x68\x79\x47\x85\x50\x82\x49\x09\xA3\x09\xB6\x24\x9A\x1C\x8D\x94\x84\xA9\x5A\x25\x83\x7F\x4E\xEF\xEF\x08\xDE\x52\x02\x9B\x24\x85\x13\x76\xE0\x81\x09\x85\x8C\x84\x69\x09\x9C\xE5\x7A\x4E\x7E\x94\x7A\x65\x6F\xA5\x80\x3A\x82\x17\x84\x8E\xF2\x50\xFC\x43\x02\x95\x38\x82\x99\x84\x4F\x2D\x5D\x85\xAE\x78\x27\xEC\x78\x12\xB7\x10\x81\x26\x86\x4B\x83\x33\x86\xB7\x83\xCE\x84\xE2\x02\x9F\x13\x95\x33\x18\x24\x87\x73\x82\x93\x80\x2B\x83\x5B\x81\x47\xCB\x6B\x7E\x75\x26\x90\xE6\x27\x9B\x87\x7B\x79\x6E\x85\xCB\x82\x76\x05\xBC\x13\xB8",
"\x15\x9E\x4D\x8A\x80\x86\x2F\x87\x96\x81\x9A\x83\xC7\xF1\x1E\xAC\x42\xC6\x68\x4E\x84\x32\x6F\x95\x82\xF0\x80\xB4\x84\x85\x09\xD8\x12\xA5\x1D\x94\x3F\x8D\x70\x86\xFE\x80\xB0\x82\xB5\x83\xB1\x02\x8C\xBA\x4A\xD1\x75\x62\x54\x99\x83\x23\x84\x50\x7B\x76\x82\xE5\x04\xEF\x09\x9B\x05\x9B\x37\x89\x28\x84\x75\x82\x16\x7B\x5B\x80\xD4\x04\xCF\x0F\xA8\x26\x81\x4F\x8A\x96\x83\x35\x84\x5A\x83\xD6\x84\x6A\x05\xB0\x0A\x97\x95\x60\x90\x31\x76\x85\xC2\x45\x7B\x84\x98\x84\xA1\xF3\x32\x12\xAE\x13\x8F\x3C\x86\x11\x84\x2F\x84\x46\x81\xA2\x83\x40\x08\x87\x0F\x81\x06\x6F\x3B\x85\x6B\x77\x48\x31\x73\x85\xFB\x79\xE0\xF3\x02\x09\xA2\xCF\x64\x24\x87\x01\x86\xE1\x7F\x40\x7A\x20\x78\x60\xEB\x08\xB6\x5D\x1F\x80\x4F\x85\x99\x85\x6E\x7B\x65\x85\x6B\x82\x49\x04\xD9\x09\x94\x27\x84\x26\x8B\x80\x86\x9B\x79\x10\x85\xB8\x81\xE3\xC0\x26\xFD\x77\xAD\x73\x4B\x8C\x7D\x37\x42\x85\x2C\x7A\xFC\x79\xB3\x04\xCC\x09\xB7\x15\x86\xAD\x71\x92\x83\x87\x80\x70\x84\xD5\x46\x02\x05\xF8\x85\x73\x15\x84\x51\x8E\x9E\x86\x32\x84\x7C\x84\x8F\x84\x29\x0A\xA0\x12\xAB\x28\x9B\x26\x8D\x53\x83\x05\x62\x8F\x77\xCA\x82\x44\x0A\x88\x14\x9C\x24\x87\x52\x88\x99\x87\x23\x84\x43\x81\x25\x85\x7A\x05\xCD\x14\xBC\x00\x7F\x29\x8E\x97\x3A\xF6\x83\x90\x85\xFD\x84\x25\x0A\x86\x13\xA7\x28\x8D\x29\x82\x9F\x87\x9C\x80\x25\x82\x7A\x6D\xF3\xF4\x7A\x13\xA5\xA8\x49\x4D\x84\x3B\x7D\xAA\x82\x48\x83\xAB\x82\x24\x05\xD9\x0A\xA6\x14\x84\xAF\x61\x7D\x7B\xDA\x7F\x1C\x79\xD3\x84\x6B\x0A\xFC\x13\xAA\x26\x8C\xA4\x7C\x96\x80\x40\x86\x5B\x84\x01\x85\x20\xF0\x7F\xB5\x5C\x29\x80\xDB\x6C\x7D\x87\x17\x76\x87\x30\x1B\x85\xE9\xF4\x38\x14\xBF\x12\x94\x25\x82\x9D\x84\x47\x84\x96\x84\x91\x84\x2D\x0A\xD1\x02\xB5\xFB\x64\xF8\x74\x9D\x6B\x7A\x05\xFB\x82\xC1\x82\x83\x03\x91\x4A\x53\x26\x91\x52\x85\x94\x84\x4E\x7B\x51\x84\x8A\x82\x99\x09\x96\x0A\x9B\x16\x8C\x22\x8A\xA5\x82\xD7\x74\x82\x6F\x8B\x79\x94\xD1\x0B\xBC\x44\x5D\x73\x1C\x8A\xA9\x86\x36\x84\x9B\x84\xAE\x70\xFB\x04\xFC\xD4\x70\x1C\x86\x1E\x82\x73\x81\xE0\x7C\x65\x70\xB0\x80\x59\xD7\x6E\xE5\x49\x05\x8D\x55\x8C\x9C\x87\x55\x86\x9E\x75\x58\x85\x91\x04\xB3\x15\x93\x12\x8D\xF2\x77\x5D\x77\x67\x66\x58\x7A\x81\x83\x53\x79\x55\x02\x8F\x15\x84\x41\x89\x09\x6F\x50\x86\xAF\x85\x2F\x77\x21\x05\xFC\x09\xA2\xB9\x7E\x27\x89\x16\x80\xA0\x83\xEE\x81\x06\x84\xAA\x04\x97\xC3\x63\x05\x9A\x85\x76\x97\x47\x40\x85\xA7\x85\x71\x79\x9F\x0A\xB3\x12\x96\x29\x9A\x29\x8E\xA0\x82\x85\x83\x8F\x84\xF0\x5A\x70\x03\x95\xB9\x4C\x0F\x9A\x9E\x51\x3E\x5F\x54\x71\x5C\x81\xD2\x82\xEB\xE5\x4A\x10\x9C\x33\x6E\x4F\x76\x10\x03\x0D\x87\xFD\x58\x5F\x68\x51\x08\xC7\xD2\x76\x20\x87\x4E\x1E\x9A\x04\x91\x30\x71\x83\x29\x84\x06\x01\x55\x10\x84\x90\x2D\x06\x30\x0E\x69\x1E\x87\x16\x11\x3C\x48\x53\x4F\x14\x11\x19\x21\x87\x0E\x86\x90\x26\x0B\x84\x18\x84\x96\x73\x39\xFC\x65\xD0\x3D\x2B\x89\x34\x39\xB0\x81\xBF\x77\x3A\x34\x32\x84\x32\x66\x66\x10\xA8\x21\x90\x58\x81\xCB\x79\x5F\x33\xC4\x84\xC0\x37\x15\x0B\xC1\x31\x1B\x9A\x2D\x43\x87\xEE\x07\x0D\x86\x6D\x47\x6B\x3A\x72\x08\x83\x4F\x7F\x21\x8C\x7E\x71\xB1\x81\x5F\x03\xC1\x85\xB0\x4C\x21\x0B\x82\x25\x63\x2C\x92\x44\x6A\x87\x87\x75\x45\x45\x84\x66\x07\xFE\xA9\x74\xDE\x79\x05\x96\x95\x42\x3F\x75\x07\x34\xD4\x3D\x56\x47\x06\x49\x42\xA4\x64\x88\x37\xA6\x3C\x06\x02\x7E\x71\xB9\x29\xA2\x5D\xE6\x52\x51\xD4\x2C\x08\x9F\xAE\x47\x25\x6F\xFA\x7D\xD2\x85\x91\x60\x01\x00\xF3\xDB\x61\xF0\x02\x2B\x44\x4D\x7A\x4F\x85\x9B\x85\xB5\x84\x6F\x0A\xED\x12\xB1\x29\x8F\x4B\x8A\x6E\x85\x80\x83\x29\x82\x25\x81\xF6\xFD\x79\xB4\x5F\xB2\x7A\x7C\x7C\x40\x82\x8B\x83\x70\x35\x93\x04\x2B\x0B\xC5\x3D\x55\x2D\x81\x53\x82\x9E\x86\xD0\x82\xB3\x82\x5F\x83\xE6\x09\x8F\x0E\x9A\x20\x83\x12\x55\x46\x84\x91\x6E\xE5\x76\x20\x5A\x3E\xD5\x5F\x04\x94\x2C\x65\xD8\x76\xC2\x6A\x90\x7B\x41\x1A\xAA\x85\x5C\xEE\x09\xE9\x78\x20\x99\x36\x8A\x83\x86\x6B\x80\x0F\x84\xB0\x81\x73\x0B\x8C\x0B\x92\x1C\x8E\x01\x80\x13\x5D\x1E\x7E\x47\x4A\x62\x69\x72\x02\xB7\xFF\x74\x14\x48\x5B\x80\xB8\x87\xAA\x7A\xE0\x84\xBF\x83\xE6\x06\xAF\x0E\x93\x2B\x91\x39\x8F\x4F\x84\x52\x83\xEE\x79\x2C\x75\x62\x09\xFF\x04\x87\x1B\x81\x14\x8B\xBE\x7C\xFB\x31\xDA\x84\x54\x56\x6B\x0B\xC5\x14\xA6\x28\x94\x52\x88\xA2\x81\xB3\x82\x12\x83\x51\x85\xD0\x04\xA5\x15\xB8\xC8\x55\x36\x88",
"\xC2\x7E\x74\x85\xE5\x84\xB8\x7A\x64\xF4\x18\x17\x8C\x1D\x89\x41\x87\x34\x80\xED\x80\x7D\x84\xA2\x83\xF6\x09\xC3\x05\xA1\x09\x81\x4C\x80\x26\x6C\xAE\x3C\xE5\x85\x51\x44\xA9\x0B\xD2\x14\xAF\x27\x8A\x50\x81\x9F\x84\x41\x84\x0A\x83\x72\x85\x87\x04\xB8\x12\x8D\x1A\x90\x2F\x8F\x68\x84\x4B\x83\x23\x6E\xF1\x77\xD5\xF3\x44\xAF\x67\x0A\x87\x03\x83\xB2\x77\x6F\x84\xF2\x85\xC0\x85\xC4\xF4\x03\x17\xAE\x1C\x93\x3E\x88\x3B\x83\x11\x82\xB5\x84\x37\x5B\xD2\x02\xD9\x56\x61\x26\x85\x0A\x86\x07\x87\x38\x84\x1E\x81\x88\x52\x0C\x0A\x47\x17\xB9\x2C\x49\x5E\x8F\xAD\x81\x26\x85\xB8\x85\x05\x85\xA1\x0A\x90\x0F\xB0\x2E\x98\x28\x87\xAE\x85\x87\x81\x00\x7A\xB4\x76\x9A\xF1\x16\x0E\xA9\x80\x7E\x5E\x83\xBF\x80\x7C\x85\x16\x6E\xC6\x83\x53\x04\xF3\x08\x9C\x2E\x95\x56\x8E\xB9\x84\x94\x6E\xC8\x82\xFF\x6A\xC4\x09\xA5\x0E\xB8\xAB\x6D\x25\x8A\xF6\x5D\x93\x82\x62\x47\xD3\x85\x8E\xAF\x74\x17\xB6\x25\x99\x90\x74\x54\x83\xB1\x7B\x8E\x85\x98\x80\x3D\x0A\xE3\x08\xBD\x2F\x9E\xF1\x79\xA0\x6C\xC9\x51\xB9\x81\x3D\x82\x9F\xED\x22\x10\xAD\x02\x7E\x4E\x82\x8D\x70\x9A\x2C\x06\x87\xC3\x59\x1A\x0C\xB8\x13\x81\xD1\x70\x4E\x89\x97\x87\x83\x86\x33\x83\xFD\x85\x92\x07\xA3\x18\x90\x21\x4B\x4F\x8F\x8A\x72\x7E\x87\xDD\x49\x18\x86\xCE\x09\xB3\x18\x9A\x28\x9F\x22\x8C\xA1\x81\x8C\x81\x08\x86\xCE\x82\xD6\x09\xFA\x2C\x54\x1D\x94\xBD\x7E\xC3\x83\x7E\x48\x10\x86\x0C\x85\xCF\x09\xC3\x18\x98\x16\x85\x62\x8A\x59\x87\x88\x84\xA9\x85\x48\x85\xA3\xC2\x0B\xFD\x74\x0F\x4D\x62\x83\xE8\x4F\x89\x87\x8D\x85\x0C\x85\x39\x0A\x83\x09\xBA\x25\x85\x24\x80\xBD\x87\xFA\x81\x12\x86\xD5\x7A\x1B\x01\xDB\xE4\x74\x59\x60\x27\x82\x1E\x76\x85\x87\xED\x85\x90\x78\x8A\xF3\x51\x0F\xB3\xD5\x7C\x5D\x83\x35\x87\x70\x86\xC7\x82\x1F\x84\x01\x2A\x6A\x09\xB9\xA0\x3C\x62\x8A\xB6\x86\x80\x87\xCB\x6E\x2F\x77\xC9\xDF\x10\x09\x94\x11\x8B\x41\x82\xEE\x78\x5C\x83\x0F\x85\x3C\x78\x2F\x0A\x95\xB9\x68\xD2\x64\x87\x65\xBB\x84\x8F\x84\xEA\x84\x3F\x86\xBC\xE0\x00\x19\x99\x80\x60\x56\x83\xC8\x85\xE3\x82\x62\x83\xC4\x85\x11\x07\x8E\x0A\x85\xC9\x77\x19\x86\xA8\x87\x48\x33\x0B\x87\x08\x5A\x5E\x0C\x89\x15\xA0\x31\x8B\x54\x8A\xA3\x85\x51\x84\x08\x87\x47\x85\x3E\x0A\xCA\x0A\xAA\xB8\x74\x6E\x04\x7A\x82\x6A\x85\x63\x05\x37\x86\x60\xF2\x33\xDC\x64\x1D\x8E\x5B\x8A\x95\x85\x4A\x83\x51\x82\xD5\x81\xF5\x09\xFD\x0D\x91\x28\x84\x8A\x77\x42\x68\xDB\x69\x23\x86\x02\x86\x3F\x0C\x90\x19\xA0\xCE\x73\x52\x8C\xBC\x80\x49\x86\xEB\x84\x15\x85\x1E\x0A\x99\x00\x98\x31\x86\x15\x85\xBA\x28\x21\x80\x13\x86\x60\x86\x4E\x0C\xC2\x19\xB3\xCE\x70\x55\x81\xAD\x82\x56\x87\xE6\x84\x5A\x85\x9D\x0B\xF6\x08\x9F\x2E\x86\xA8\x77\xA7\x81\x17\x46\x23\x87\x0C\x86\xD2\x0C\x83\xDD\x7D\x27\x9C\x53\x89\xB5\x86\x4F\x87\xD6\x84\x40\x85\x2C\xF3\x1F\x5B\x43\x2A\x96\xD9\x65\xA8\x87\x4F\x7A\x51\x12\x58\x86\x24\xF5\x61\xE4\x73\x32\x9F\x39\x8F\xB6\x81\xE8\x80\x06\x85\xA1\x83\x1F\x0A\xBA\x18\x97\x52\x7C\x2A\x83\xE4\x7E\xA9\x80\xA6\x84\xA8\x82\xDC\x0B\xA3\x17\x50\x33\x9D\x62\x81\xCE\x83\xB1\x6D\xDB\x84\x7A\x86\xB5\x0C\x99\x0D\xA9\x0E\x9B\x34\x88\x9E\x82\xD8\x80\x07\x85\x20\x71\xE9\x07\x8F\x07\x9D\x3F\x7A\x09\x8F\xFD\x62\xDF\x7D\x72\x85\x00\x84\xDD\x0B\xFD\x33\x30\x33\x85\x9E\x7B\x10\x7F\xF4\x81\x56\x84\xF2\x84\x67\x07\xF1\x16\x90\x1D\x9E\x4A\x82\x75\x84\x73\x80\xB6\x85\xE2\x84\x7A\xEC\x10\x12\x06\xFC\x6A\x61\x81\xA3\x81\x02\x86\x3B\x87\xA9\x85\xDF\x0B\x96\x17\xA1\x2F\x9A\x5D\x89\x83\x85\x9E\x87\x0E\x84\xDF\x85\x3D\x08\x98\x19\xA6\x1F\x9F\x0A\x82\x59\x7C\x52\x86\xD9\x5F\xBE\x7A\x70\xFE\x73\xDD\x57\x4D\x6C\xB8\x3F\xC9\x86\xA7\x59\x28\x87\xD0\x7A\x8A\x0A\xCB\x09\xA2\x31\x96\x61\x8B\x97\x80\x87\x85\x5F\x84\x7D\x86\xA3\xB6\x27\x1A\x92\x30\x90\x0B\x8C\xBA\x67\xFF\x81\x58\x83\x1A\x84\x93\xEF\x5F\x19\xB0\x30\x85\x68\x85\xDD\x6F\xA0\x84\x0A\x85\x8D\x83\x86\x0B\xB8\x1A\x88\x2E\x84\x69\x82\x2C\x86\xF0\x82\xCB\x7F\xD0\x82\x2A\xEF\x7C\xD8\x70\x05\x93\xF9\x71\xAF\x83\x79\x66\x2F\x69\x37\x00\x19\xE9\x1A\x0C\x80\x00\x0F\x4A\x77\xB2\x39\x2A\x74\xD4\x3C\x0E\x7E\x06\x67\x06\x05\x33\xFF\x6D\xE1\x77\xBC\x7B\x22\x75\xF8\x73\xFF\x2C\xF5\x5E\x67\x00\x28\x22\x86\x48\x8A\x8A\x85\xD2\x18\x2B\x85\x7A\x4A\xAE\x08\xA3\xDF\x59\x64\x30\x44\x8B\xCE\x5F\xDE\x78\x2D\x85\x73\x84\xCA\x08\xC9\xF4\x5A\x88\x62\x46\x8C\x77\x24\x13\x87",
"\x7C\x75\x81\x00\xD1\x08\xC8\x11\x90\x36\x9F\x45\x85\x8D\x84\x19\x87\x42\x84\x19\x23\x86\xEC\x01\x0D\x8A\x3C\x62\x59\x81\xD3\x80\x77\x84\x56\x7A\x9A\x86\x84\x0B\xB6\x1A\xA1\x35\x82\x69\x89\x76\x81\x97\x86\xAB\x32\xC6\x84\xFA\x87\x4C\xE6\x4E\x00\x8D\x51\x7B\x40\x81\x94\x76\xD9\x84\x6B\x35\x27\x09\x76\x15\x81\x33\x92\x69\x87\xC0\x82\x7C\x85\xE3\x82\xFC\x85\xE3\x0A\xB5\x12\x89\x33\x97\x49\x8E\x4C\x71\x27\x84\x70\x81\xA5\x79\xED\x06\xAC\xD4\x4E\xCD\x60\x4A\x81\x42\x86\xD3\x2D\x6E\x87\x8D\x86\xC7\xF2\x18\xDD\x75\x1E\x8B\x35\x80\xD2\x82\xF5\x83\x42\x86\xD6\x83\x0D\x0D\x85\x0F\x8B\x2E\x97\x5B\x48\xF5\x69\x2A\x86\xAD\x83\xDA\x77\x32\x04\xFE\x16\xA4\x36\x85\x60\x8C\xDB\x87\x8F\x84\x02\x86\x39\x82\x2E\x05\x81\x14\xAF\x26\x9D\xF5\x75\xD6\x74\x25\x7A\x9F\x81\xB8\x6F\x13\xD8\x2C\x1A\x82\x98\x44\x5D\x82\xC6\x7F\xB9\x85\x69\x86\x38\x86\x0F\xF4\x72\x18\xB7\x1B\x94\x63\x89\x6F\x82\xAC\x87\x1D\x86\x9D\x86\xF9\x07\xD7\xA5\x56\x9E\x65\x1F\x8D\xAC\x87\x48\x32\x6E\x87\x68\x86\xE5\x0D\x91\x19\xA7\x37\x82\x64\x8A\xC0\x80\x9B\x84\x03\x86\x6D\x86\x5D\xB4\x54\xE2\x77\x36\x9B\x63\x86\xD6\x20\xBA\x87\x26\x7A\xD3\x78\xDF\x07\xCA\xE5\x49\x34\x8F\x36\x8C\x95\x80\xEF\x80\x59\x87\x23\x81\x75\x0B\x8E\x11\xA0\x1A\x8F\x92\x3C\x16\x7C\x6C\x87\x3F\x01\x79\x83\x8A\x8D\x07\x1C\x84\x34\x89\x70\x83\xCC\x83\x79\x87\xFD\x85\xE6\x85\xF9\x0B\x8D\x14\x8E\x35\x8F\x50\x81\xBC\x81\x5B\x76\x5F\x76\xF5\x85\x74\x00\xA2\x13\xA6\x1C\x9F\x56\x78\x72\x82\xBA\x6B\xD5\x69\xF8\x85\x15\x0E\xF7\x1B\xB1\x32\x9A\x9A\x77\x82\x83\x8E\x84\x58\x86\x15\x84\x96\x0C\xAC\x10\x86\x32\x8B\x1C\x81\x9B\x81\x11\x5C\xC5\x83\xA0\x86\xC7\x02\xDA\x9D\x6A\x38\x9D\x63\x8C\xE2\x83\x9A\x87\xAF\x85\x6A\x86\xC1\x0A\xD7\x19\x83\x2B\x9C\xF5\x75\xAC\x80\x0C\x81\xFA\x78\x04\x78\xB0\x03\xAB\x9D\x54\x30\x89\x4E\x86\xC1\x86\x36\x63\x94\x87\x47\x86\x55\x0E\xE2\x19\xBB\x29\x87\x37\x82\xAC\x82\x31\x85\x03\x87\x46\x80\x21\xE0\x05\xFA\x6C\xF9\x68\x69\x83\x70\x82\x33\x78\x0B\x87\x7D\x85\x06\x0E\x96\x1C\x90\xD4\x6E\x92\x74\x81\x85\x00\x86\x05\x85\xAD\x83\x08\x08\xDD\x0E\xAE\x36\x8B\x3B\x84\x6D\x87\xE8\x82\xE1\x69\x88\x85\xF6\x0D\xE4\x1B\xA6\x36\x97\x5C\x8A\xDF\x87\xEF\x80\x7F\x86\xA7\x83\xAC\x0D\xBF\x17\xB9\x33\x8A\x65\x89\x47\x47\x98\x81\x27\x86\xE2\x32\x67\x0E\xE0\x19\xA9\x39\x86\x68\x83\xCE\x84\xCD\x86\x96\x86\x37\x87\x10\x0E\xB7\x59\x45\x28\x80\x72\x83\xDE\x83\xB7\x87\xA2\x87\x99\x86\x8D\x0E\x99\x17\xA4\x2F\x88\x37\x86\xBE\x87\xCD\x87\x5A\x81\x75\x86\xEE\x8E\x14\x14\x82\x25\x81\x72\x8A\xE8\x80\xBF\x85\x5C\x7B\x54\x87\xBB\x0B\xC7\x1C\xBD\x2E\x91\x74\x89\xD3\x87\xC3\x86\x30\x2E\x3D\x86\x3E\x69\x09\x1D\xA6\x3A\x96\x75\x89\xBB\x80\xD7\x85\x4D\x87\x0D\x87\x70\x0B\x81\x1D\x83\x1E\x99\x6E\x81\x7A\x86\xAC\x86\x22\x3D\x45\x86\x22\xD1\x3F\x19\xA5\x3A\x88\x70\x87\xEA\x85\xB7\x84\x6A\x87\xF1\x85\x8F\x0E\x81\x0F\x8A\x3B\x97\x3F\x80\xE0\x87\x90\x84\x90\x85\x5D\x7A\xB2\xE0\x17\x1D\xB9\x9E\x39\x74\x8B\xD5\x83\xD3\x85\x57\x87\x4E\x87\x9A\x0B\xA3\x0A\x94\x2B\x85\x29\x87\xBE\x87\xA4\x83\x43\x82\x6C\x65\xC6\x0B\xB4\x1D\x83\x3B\x83\x72\x81\xC7\x85\xC8\x87\x7E\x86\x5D\x87\x75\x0C\xFE\x1B\x97\x32\x9E\x75\x8D\x50\x83\xD4\x7E\x37\x82\xFD\x2E\x5E\x0A\xE2\x1D\x9C\x9F\x24\x77\x80\xCA\x84\xAB\x87\xE5\x6E\xAF\x86\x46\x0E\x85\x17\x88\x39\x96\x63\x8B\xEF\x84\xD9\x86\xEB\x82\xD1\x83\xFB\x0D\x4E\x19\xBC\xF1\x63\x77\x8A\xE7\x80\xB4\x78\x4E\x78\x56\x76\x07\x05\xEC\xE9\x46\x15\x81\xA8\x73\xDC\x84\x33\x84\xA5\x87\x1D\x80\x75\x0A\x98\x9F\x5D\x33\x9D\x56\x82\xEF\x84\xDA\x84\xB1\x87\xD3\x86\xC6\x0E\xA9\x1B\x88\x3B\x96\x67\x8D\xE1\x84\xFC\x81\xB7\x86\x26\x87\xF4\x04\xF7\xC0\x4E\xBA\x7E\xC2\x6C\x70\x3C\xE0\x86\x51\x86\x83\x87\xC7\xDF\x08\x1E\xB7\x3B\x8A\x78\x8B\xEB\x83\xDB\x87\x79\x85\x41\x87\xE9\x09\xFC\x06\xB6\x04\x8E\x1C\x8F\x37\x86\x7F\x75\xE0\x81\x7F\x86\xEF\x07\xE1\xC8\x42\x3B\x86\x79\x84\xEF\x81\xBF\x86\xBD\x86\x47\x87\xF8\x0E\xFD\x1B\xBC\x3A\x83\x6B\x8E\xF0\x84\xF7\x83\x43\x87\x56\x5E\xA3\xEE\x0F\x0B\x8C\xDE\x50\xCF\x6E\x7F\x84\xE0\x81\x58\x82\x8C\x86\x02\x0D\xD3\x1D\xAB\x38\x95\x76\x86\xDE\x86\xB7\x85\x02\x87\xF4\x86\x7F\x0A\xEB\x1B\x9D\x39\x9C\x2B\x81\x07\x85\x5D\x7B\xD5\x6C\xA4\x80\x71\x05\xF9\x06\x75\x3C\x95\x78\x8F\x43\x7A\x86\x87\x5D\x84\x1A\x86",
"\xBB\x09\x80\xEA\x42\x13\x88\x65\x82\xC2\x87\xE3\x86\x49\x87\x63\x85\x74\x0E\xC9\x15\x81\x16\x97\xF8\x72\x53\x51\xA2\x53\xDC\x86\x21\x87\xF1\x0C\xB2\x19\x9E\x34\x83\x4F\x86\x80\x80\xD0\x87\x3D\x87\x04\x84\x2C\x0A\xE7\x18\xAC\x67\x78\x55\x81\xC6\x73\xE8\x4D\xC6\x78\xCD\x78\x58\x0D\x92\xE5\x4B\x3D\x83\x7B\x87\xF2\x84\xD1\x87\xD3\x86\x55\x87\xD9\x0E\xD4\x0F\x9A\x26\x9D\x78\x8F\x9B\x86\xEF\x84\xBA\x85\x44\x86\x49\xF0\x6B\x15\x85\xC3\x66\xA8\x60\xAF\x82\xB6\x7A\xBC\x84\x85\x71\x60\xBD\x39\x16\xB9\xFC\x68\x10\x85\x24\x56\x20\x27\x28\x4B\x37\x07\xB1\x49\x0D\x16\x98\x17\x92\xD2\x73\x78\x55\x07\x36\x7B\x82\xC5\x12\x46\xFF\x36\x1F\x99\xAA\x70\x03\x08\xFB\x87\x22\x25\xE5\x05\xD0\x24\x94\x08\x40\x16\xA1\x26\x22\x5A\x8E\x62\x34\x68\x86\xD1\x84\x80\x84\xB4\x0F\xB5\x9C\x42\x3F\x80\x2F\x55\xFC\x82\xB1\x03\xF1\x87\xFB\x30\x94\x08\x47\x16\x96\xFA\x2B\x5A\x82\x68\x4F\x66\x85\x30\x63\xE4\x71\x30\x7D\x57\xE9\x03\x4A\x58\xFE\x23\x20\x6E\x53\x43\x20\x48\x8A\x77\xD9\x08\x78\x10\xB3\x50\x4C\x24\x33\x17\x69\x0C\x6B\x54\x06\x20\x14\x6E\xA9\x5D\x51\x50\x96\x12\x1F\x70\xB7\x30\x6A\x3F\x42\x37\x9D\x76\x19\x06\x6B\x76\x60\x8A\x2D\xDB\x50\x95\x3F\x4F\x37\x35\x3B\x78\x68\x2A\xE7\x21\x01\x29\x8D\x62\x80\x82\xFA\x5A\xFD\x85\xF8\x22\x1A\x4A\xFB\xBB\x1F\x4E\x72\x8F\x7C\x04\x09\x36\x74\x01\x8A\xE8\x5F\xCA\x5D\xB4\x08\x55\xF4\x29\xFF\x7A\x14\x7F\x75\x1C\x31\x76\xFC\x71\x4C\x00\x69\xE3\x18\x20\x8F\x40\x9A\x33\x74\xB2\x5E\x38\x85\xB7\x76\xF9\x00\xFA\x0D\x7F\x00\x32\x8F\x74\x04\x09\x36\x74\x04\x89\x01\x89\x4E\x78\xFE\x0F\xFA\x1B\x3D\x01\x12\x1F\x73\x09\x01\x6D\x71\x0B\x89\x0D\x88\xF2\x75\x01\x35\x29\xEE\x40\x2D\x52\x3F\x72\x12\x01\xDA\x70\x1B\x88\x30\x10\xC1\xEC\x32\x40\x8F\x1F\x4A\xDF\x00\x0F\x02\xFC\x71\x48\x00\x69\xE3\x40\x20\xB9\x40\x99\x38\x73\xB2\x5C\x69\x5D\xB4\x53\xD9\x5D\x21\xA7\x10\x01\x29\x8D\x6A\x82\x87\x02\x88\x67\x83\x0F\x06\x41\x10\x33\x10\x89\x02\x00\x40\x9D\x86\x6F\x08\x01\x6D\x71\x15\x89\x26\x88\xF8\x04\xD2\x4B\x45\x42\x7C\x81\x87\x12\x05\x0E\x02\xFC\x70\x17\x14\xF4\xBA\x60\x20\xA4\x73\x70\x80\x84\xEA\x1E\x08\x88\x82\x60\xFD\x06\x79\x00\x72\xC7\x4D\x02\x09\x1B\x7B\x06\x88\x0B\x8A\x66\x7E\x19\x04\x86\xFF\x5C\x20\xAC\xE9\x32\x1F\x7D\x45\x78\x6A\x3D\x60\x7B\xCE\x7A\x6B\x16\x6C\x1D\x42\x9A\x77\xA6\x3B\x07\x02\x7E\x73\x67\x78\xA8\x3D\xC2\xF2\x4E\x48\x79\x3F\x92\x44\x68\x00\x8D\xFF\x4A\x7E\x07\x42\x00\xF2\xE3\x25\xDB\x50\xED\x3C\x73\x7C\xB3\x75\x90\x02\x01\x88\xA8\x02\xAB\x4E\x32\xB1\x3B\x92\x7A\x6F\x01\x08\x02\x7E\x71\xC9\x74\xA8\x3D\x4E\xEC\x46\xE2\x4F\x0B\x0F\x84\x87\xA6\x01\xD1\x32\x39\x2D\x3A\x02\xD7\x74\x71\x00\x32\x8F\x6E\xFC\x60\xB5\x3C\x33\x73\x02\x61\x02\x04\x9C\x10\x95\x1A\x27\x5E\x62\x2D\x8E\x17\x02\xBF\x06\x1E\x00\xF9\x71\x7A\xDC\x50\xF6\x13\x79\x71\x7E\x59\xFE\x84\x10\x8A\x33\x52\xFD\x06\x84\x00\x72\xC7\x6F\x60\x70\xDA\x3C\x96\x6D\x94\x55\x2D\x88\x42\x73\x85\x10\xE6\x7E\x7E\xD3\x57\xA6\x30\x08\x02\x7E\x72\x6D\x6A\xA8\x3D\x5E\xD7\x3E\x21\x83\x42\x93\x21\x86\x1C\x03\xBF\x83\xD7\x6B\x0C\x55\xA7\x26\x34\x0B\xBE\xEA\x2F\xA7\x6C\xD8\x70\x15\x8A\x2D\x89\x44\x33\xD7\x79\x7A\x1B\x08\x02\x15\x81\x8E\xAB\x3E\xF0\x66\x4F\x69\x4D\x88\xD7\x10\x80\xDF\x19\x43\x87\x09\x0B\x2C\x76\x37\x6A\x7A\x64\xA8\x3D\x7E\xCB\x02\x21\x91\x0C\x09\x85\x82\xD6\x00\xC5\x53\xB5\x5D\x93\x00\x86\x00\x72\xC7\x42\x13\x70\xDA\x39\x6C\x64\x16\x89\x86\x02\x32\x88\x1D\x10\x96\xFD\x44\xA2\x7D\xEF\x17\x4D\x3A\x10\x02\xFC\x70\x69\x1B\x50\x7B\x42\x87\x58\xC2\x5F\x85\x8E\x89\x7D\x13\x88\xE0\x37\x9D\x61\xD7\x74\x3E\x20\x83\x9E\x47\xF5\x50\xB5\x3B\x0F\x62\x32\x89\x88\x01\xF8\x10\xE6\x20\xA9\x4F\x7A\x6F\x03\x08\x02\x7E\x73\x36\x5A\xA8\x3D\xC7\xB6\x14\xE4\x6B\x59\x11\x88\x87\xB9\x59\xF1\x53\x42\x54\xFD\x06\xE3\x0F\x84\xC8\x35\xB2\x1D\x6F\x04\x89\x01\x55\x5B\x43\x89\xE1\x00\xEC\x10\xC1\x21\xB9\xA7\x6A\x1D\x76\x48\x5C\x80\x01\x40\x08\x56\x14\xC1\x0B\x3C\x62\x71\x3F\x88\x8A\x42\xFE\x81\xE4\x51\x62\x2E\x92\x88\x5A\xAF\x6E\x20\xB4\x28\x84\x40\x00\xF8\x35\xFD\x85\x78\x60\x79\x18\x21\xD1\x72\x1F\x8B\x17\x23\x3C\x5A\xB0\x50\x27\x8A\x09\x56\x9D\x88\xA7\x06\xEB\x1F\x89\x9A\x3E\x89\x81\xA8\x6F\x58\x56\x0E\x03\xA0\x88\x34\x11\xFA\x1B\x30\x01\x12\x1F\x7C\x22\x50\x6A\x3E\x55\x53\x93\x88\x4A\x01\x6C\x1D",
"\x69\x8D\x54\x83\x61\x72\x51\x8D\x4C\xD4\x3C\xA6\x4F\xDF\x10\x8E\x21\x92\x22\x71\x84\x81\x05\x8E\x20\x03\x1C\x00\xF9\x71\xF0\x98\x50\xF6\x14\x6E\x4A\x87\x88\x12\x8B\xAD\x35\x80\x73\x23\x88\x5D\x10\xF2\xC7\x43\x54\x50\xDA\x3A\x84\x4C\x2D\x8A\x52\x00\x8E\x88\x12\x10\x89\x20\xA7\x04\x02\x85\x81\x9B\x76\x57\x3D\x53\x46\x8D\x88\xE0\x10\xC0\x21\xAE\x7D\x47\x2D\x87\x4D\x3F\x0E\x02\xFC\x70\xDB\x43\x50\x7B\x75\x12\x61\x45\x96\x86\x8B\x26\x33\x19\x0D\x59\x88\x09\x23\xF2\xE3\x6B\x04\x50\xED\x39\x31\x46\xFB\x5C\x31\x88\xBB\x30\xC7\x88\x72\x10\x86\x02\x13\x41\x8F\xF7\x50\xD3\x38\x6A\x3E\x52\x40\x7B\x88\xEB\x10\xE1\x21\x82\x52\x67\xA2\x42\x3F\x72\xA7\x38\xD4\x3D\x6C\x3C\x58\x11\xA0\x02\x24\xE4\x22\xAD\x0F\x18\x8A\xF8\x06\xFC\x71\x55\x03\x50\x7B\x3D\xD2\x24\x88\x39\xC7\x38\x00\x15\x35\x89\x40\x00\xA0\x7E\x83\xA7\x7D\x1B\x10\xED\x3B\x46\x54\x22\x37\x59\x73\x4F\x56\xDB\x52\x51\x0B\xAA\xBB\x5A\x3F\x8D\xC9\x4A\x15\x7F\x3D\x7B\xBD\x65\x8B\x87\x92\xED\x19\x1E\x80\x13\x9A\x7B\x8D\x9B\x84\xF4\x85\x75\x85\xE2\x86\xD3\x0B\x95\x04\x88\x37\x9C\x49\x81\xB6\x83\x89\x3F\xD8\x84\xF2\x77\x49\xC1\x46\xAF\x4C\xDC\x23\x8E\x8E\xC6\x4D\x38\x88\xD6\x79\x19\x68\x56\x0E\xD0\x15\xAE\x29\x92\x56\x8A\xEE\x83\x81\x84\xBB\x87\x5B\x62\xB0\x0D\xC9\x33\x49\x37\x87\x7D\x7F\x41\x86\x52\x69\x73\x87\x8C\x86\x4F\x0B\xDF\x13\x5E\x47\x88\x9C\x70\x1E\x8A\xCD\x87\xD5\x84\xFF\x84\x7D\x0A\x89\x13\xAD\x3A\x81\x75\x87\x33\x6A\x48\x77\x0B\x80\x22\x75\x60\x05\xE5\x03\x48\xF8\x6A\x6C\x4C\x1D\x8D\xA1\x4F\x7C\x89\x06\x7A\xF5\x11\x9C\x1D\xAB\x39\x89\x77\x80\xA7\x83\xDD\x86\x9C\x85\x76\x87\x74\x0A\xA0\x17\x85\x1B\x80\x22\x80\x28\x82\x88\x81\x68\x61\xD1\x86\xF1\x11\x89\x22\x47\x48\x86\xA1\x79\x20\x8F\xDC\x87\x82\x89\x55\x87\x6D\x0E\xFB\x23\xB3\x1C\x9B\xF0\x73\xE0\x81\xCF\x71\xBC\x86\x81\x0D\x42\x84\x1B\x24\xA2\xD1\x7D\x90\x87\xF0\x80\xDD\x84\x88\x89\x4F\x87\x22\x12\xB6\x15\xB2\x14\x80\x4C\x82\x6E\x86\x36\x61\x81\x89\xF2\x55\x2A\x12\xF4\xE8\x6C\x48\x99\x79\x8E\x22\x89\xF4\x85\xF9\x85\x72\x80\x72\xD2\x5E\x16\xB6\x38\x76\x5E\x89\x46\x83\x47\x3B\x1A\x82\x8D\x72\x66\x00\x85\xE8\x5A\x3E\x80\xA9\x19\x22\x8B\x5E\x7A\xE7\x78\x8B\x75\xE1\x11\x81\x19\x94\x32\x8D\x70\x8B\xE5\x85\x05\x84\x7B\x87\x34\x7F\xC2\x09\xCC\xAB\x41\x1C\x81\x7C\x89\xC2\x81\x40\x8B\x8C\x78\xD3\x84\x03\x0C\xA8\x24\x80\x19\x59\x91\x87\x48\x7B\x47\x8B\x05\x70\x9D\x87\x50\x0F\xBC\x1E\xB9\x3B\x93\x7A\x8F\xDF\x84\xDF\x86\xE2\x84\xB0\x84\xB2\x09\x80\x18\x92\xF9\x76\x55\x74\x5C\x37\x46\x88\xC5\x56\x32\x89\xC2\xF4\x66\x24\xBD\x82\x68\x93\x80\xFA\x81\xEA\x84\xA4\x86\x9F\x87\x72\x0B\xEE\x24\x99\x32\x9E\x37\x8F\xE5\x85\xCB\x7D\x98\x87\x49\x80\x63\x0E\xA4\xA6\x65\x39\x95\x53\x66\x27\x8B\xFA\x54\x9E\x89\xA3\x86\xC8\x11\xB2\xDD\x4A\x47\x8C\x54\x8C\x1C\x8B\x3A\x86\x73\x89\xC8\x87\x50\x0D\xD7\x13\xA8\x12\x99\x4E\x80\x30\x7C\x7D\x7B\x75\x6D\x3B\x87\xDE\x0C\xCC\x24\xA3\x49\x8E\x92\x81\x3B\x7A\x53\x7A\x7D\x88\x6A\x86\xE3\x11\xD6\x19\xA5\x47\x8E\x70\x87\x1E\x8C\x3F\x89\x5C\x84\x1E\x86\x49\xDD\x19\x24\x8F\x5C\x4F\x94\x88\xF3\x87\x4C\x89\x8F\x88\x3F\x89\xDA\x0E\x8F\x1F\x82\x3A\x80\x5E\x8A\xCB\x83\xEA\x80\x7E\x85\x77\x6C\x76\xD6\x62\x24\xB2\x47\x84\x95\x8E\x3D\x78\x8A\x86\x10\x87\x30\x86\x1B\x0A\xE3\x18\x9D\x28\x88\x2A\x83\xE9\x80\x42\x86\xFD\x3B\x02\x85\xDB\x11\xCD\x24\xBD\xD4\x6F\x92\x86\xB5\x71\x4A\x8B\x24\x86\x2C\x87\x95\x0C\x8C\x1E\x8A\x39\x9F\x38\x8E\xED\x87\xF4\x86\x84\x85\x85\x52\xB2\x0E\x91\xCE\x67\x24\x0D\x94\x87\x05\x64\x56\x8A\xB9\x87\x16\x89\x1F\x12\xBE\x24\xAC\x3A\x80\x92\x81\x6D\x40\xD8\x85\xB4\x89\x51\x89\xD3\x12\xA5\x25\x9F\xCE\x76\x96\x8F\x0B\x73\x39\x8B\xC6\x87\xBD\x87\x97\x12\xCC\x14\x8B\x33\x9D\x26\x80\xEB\x83\x3E\x6D\xE2\x82\xF1\x86\xB2\x12\xC4\x23\x84\x4B\x90\xA2\x7C\x49\x7A\xFE\x80\xF8\x83\xEA\x86\xE2\x07\xAD\x1E\x99\x20\x82\x94\x8B\xD3\x81\xB7\x6C\xB8\x86\xC5\x75\x00\x13\x83\x44\x12\x4B\x99\x05\x74\x2D\x8E\xC8\x74\xBD\x89\x6B\x7A\x11\x04\xC7\x19\x8A\x29\x99\x97\x89\xA5\x83\x5F\x88\x92\x89\x1E\x77\x5B\xCF\x0B\x7F\x64\x4B\x93\x10\x66\x2E\x8C\xEC\x86\x82\x86\xB3\x87\xE8\x0D\xE5\x14\xAE\x26\x87\x53\x80\x5A\x72\xFB\x82\x52\x7B\x80\x87\x93\x0B\xA2\x25\x83\x4B\x91\x97\x85\x2C\x8F\x8B\x85\x14\x86\x64\x89\x44\x0C\xCA\x25\x86\x31\x9C\x7B",
"\x88\xC4\x81\x53\x8A\x2E\x7B\xAC\x81\xF3\xE0\x31\x26\x82\x4B\x9A\x90\x83\x30\x8C\xA7\x62\xF2\x84\x23\x85\xC5\x0C\xD5\x14\x89\x29\x97\x52\x8C\x31\x88\x52\x86\xE4\x87\x16\x80\x93\xBA\x12\x02\x83\x66\x63\x99\x87\xA6\x65\x64\x89\xE7\x86\x54\x87\x9F\x0F\xB9\x1D\xAA\x49\x92\x7A\x80\x28\x8B\xA4\x85\xD5\x87\xAF\x84\xFE\x0E\xFD\x25\xA9\xAF\x61\x2A\x8B\x20\x62\x66\x88\xD1\x88\x9A\x89\x04\x13\x98\x1C\x86\x4C\x9A\x70\x88\x30\x8B\x2B\x87\xEA\x83\xCF\x83\x5F\x13\xA5\x1A\xBA\x1F\x87\x55\x86\xEF\x7F\x8F\x6A\xAF\x78\xA5\x59\xEE\x07\xF4\x24\xB9\x9E\x34\x9A\x8D\xAD\x66\x6A\x89\xD3\x87\x5B\x87\x59\x13\xC7\x1D\xAD\x4D\x96\x65\x8C\xF1\x84\x59\x8A\x32\x87\xA7\x89\x0C\x08\xFB\x0F\xBF\xB4\x5E\x2A\x86\xD1\x84\x64\x68\xD8\x87\x37\x7A\x01\x13\xDD\x23\x85\x4D\x98\x2A\x65\xBF\x81\x41\x87\x8B\x86\x63\x86\x54\x0C\xAF\x17\x96\x31\x91\x5D\x8E\x31\x8F\x56\x85\x4F\x86\xAD\x87\x39\xE7\x47\x02\xA1\x0E\x84\x7C\x86\x5C\x71\xA0\x84\xE4\x88\x89\x89\xF0\x12\x94\x26\xB2\x4B\x90\x92\x87\x2A\x8F\xCA\x85\xAA\x89\x2C\x87\xAB\x12\xD5\x24\x8B\x39\x93\x27\x8D\x58\x84\x08\x85\xDD\x89\x00\x6B\x40\x0D\x95\x01\x83\x16\x97\x9A\x64\x63\x3C\x6F\x8A\xED\x64\xBF\x89\x89\x0F\xC4\x1C\xB3\x33\x9F\x6A\x8B\x35\x8F\x4F\x8A\xAE\x89\x65\x87\x40\x0F\x8E\x1A\x8B\x15\x80\x7C\x83\xD5\x85\x79\x4D\x64\x82\xCB\x7A\x6A\xBF\x19\x1F\x9A\x45\x63\x97\x83\x31\x8B\x1F\x73\xEA\x89\x6A\x89\xAD\x13\xE2\x23\x98\x2D\x84\x8F\x8D\x20\x8E\x3C\x8B\x83\x88\x57\x87\x24\xD4\x24\xFD\x6C\x2B\x43\xBD\x67\x5A\x84\xF5\x84\x6D\x71\xB6\x86\xE5\x13\xAC\x82\x4B\xFA\x4B\x04\x0A\x3D\x83\x40\x5C\x89\x35\x7D\x64\x94\x54\x69\x93\x21\x0F\x8C\x04\x02\x3F\x74\x12\x04\x6F\x88\xDE\x03\xEF\x13\xA5\xCE\x64\x62\x09\x21\x16\xA9\x01\x83\x7D\xFC\x89\x9B\x52\x83\xE6\x65\x02\xB6\xE8\x23\x78\x2F\x17\x72\x90\x75\x6F\x52\x6E\x85\x4D\x0B\xFE\xF1\x46\x04\x0B\x0E\x80\x38\x77\x3F\x2F\x70\x52\x2F\x6C\x77\xE9\x64\xC5\x49\x04\x0D\x83\x83\x33\x77\x1E\x75\x2C\x66\xD0\x7D\x20\xC1\x26\x27\x90\x44\x5A\x6D\x08\x58\x4F\xE0\x7F\x66\x74\xD4\x53\x27\x01\x57\x20\xB0\x8E\x70\x1C\x89\x78\x76\x1D\x0E\x5C\x26\xC8\x85\x04\x02\x87\x80\x0C\x41\x83\xA1\x83\xD1\x85\x32\x6A\xA7\x0E\x43\x10\x28\x14\xB0\x1F\x94\x37\x0A\x3E\x58\x41\x8A\x81\x8B\xD5\x69\x80\x2D\xEC\x0A\x72\x7D\x58\xC4\x66\x0E\x7C\xDC\x07\x81\x8A\xF4\x72\xEE\x4A\x44\x4D\x4F\xDF\x0C\x72\x1E\xA7\x37\xBC\x06\xBF\x0A\xD6\x6F\xD3\x73\x79\x83\x02\x74\x6E\x48\x61\xA2\x89\x8F\x04\x47\x37\x4F\x57\x22\x8A\x97\x1C\x54\xD9\x59\x9E\x67\xA0\x81\x51\x52\x89\x8B\x0A\x4D\x4A\x1A\x3D\x01\x0D\x1D\x2E\xAA\x18\xA5\x16\x93\x73\x2A\x80\xD2\x05\xD8\x26\x31\x14\x81\xF2\x65\x6E\x26\x0F\x58\x03\x8F\x83\x8A\x0D\x8A\x54\x81\x56\x14\x80\x53\x58\x51\x85\x03\x0B\x91\x2E\x73\x24\x26\x1B\x07\x66\x5E\x14\xC9\x98\x60\x51\x9E\xA0\x85\x8A\x83\x8C\x88\x9D\x1B\x3F\x83\xF6\xA1\x20\x28\xA7\x36\x75\xA1\x84\x45\x8D\xF0\x5A\xE4\x85\x3F\x4B\x6B\x14\xDA\x28\xB5\x36\x20\x5A\x02\x8C\x6B\x73\x26\x7C\x87\xFA\x61\xC0\x11\xFA\x28\x8A\xF4\x1C\xA3\x8D\x7C\x51\x89\x8B\x1F\x8B\x02\x4C\x6B\x14\xED\x28\xA5\x37\x3D\xA2\x87\x28\x8F\x8B\x8B\xC5\x24\x29\x8A\x25\xD2\x47\xC7\x55\x02\x0D\x9F\x8C\x68\x59\xE6\x01\x51\x17\xF0\x0D\x2B\x61\x7E\x1F\x8D\xA5\x77\xC0\x6A\x72\x76\x0D\x07\x36\x55\x61\x2C\xCE\x4B\x45\xB1\x2F\x9B\x3F\x53\x34\x89\x06\xEE\x6C\x83\x41\x3F\x35\x78\x11\x9B\x0F\x05\x50\x91\x02\x49\x7A\x06\x04\x8B\xBD\x84\x4D\x8A\x9C\x14\xEB\x0F\x81\x08\x1F\xA4\x8A\x4A\x8F\x15\x3A\x28\x8B\xBD\x74\x5C\x6D\x4C\x1D\x26\x52\x98\x83\x6E\x49\x8E\xC1\x25\x2F\x8B\xFE\x87\x06\x4E\x2D\x29\xAD\x9F\x30\xA5\x8C\x01\x8A\x22\x8A\x44\x87\xBF\x86\x67\x14\x81\x02\x2C\xA4\x4C\xA1\x88\xAD\x7E\xC5\x26\x53\x7E\xA6\x88\x89\x14\x83\xD9\x78\x42\x78\xA3\x89\x4D\x88\xBA\x05\x6B\x02\x4C\x00\xDC\x14\xE2\xB4\x4C\x37\x0D\x2D\x0F\x3A\x70\x75\x7E\x2E\x8B\x06\x01\x23\x4C\x70\xAB\x0E\xF5\x7B\x25\x7A\x48\x8B\x20\x02\x06\x88\x40\x84\x19\x14\x80\x00\x1A\x02\x01\xA7\x8C\xE6\x69\x9E\x8A\x3F\x55\x06\x8A\x12\x14\x86\x02\x0E\x40\x98\xDC\x7B\x4B\x66\x5C\x72\x05\x6D\xDB\x53\x8E\xD0\x65\x21\x8A\x26\x69\xDC\x7A\x4A\x71\x25\x60\x3A\x54\x7A\x8A\x4E\x08\xFC\x29\xA7\x04\x01\x6D\x29\x50\x89\xFD\x51\x3B\x8A\x39\x7F\xB8\xA5\x50\x1B\x03\x54\x5F\x04\x08\x50\x8D\x1C\x76\x8F\x81\x25\x89\x13\x14\x87\xE6\x4B\xB4\x72\x86\x76\x55\x7E\x64",
"\x89\x8B\x86\xA4\x89\x97\x13\xCA\x26\x9A\x4C\x8C\x9A\x86\x38\x8C\xB8\x85\x96\x81\x10\x87\xAF\x08\xA7\x12\xA6\xCD\x7D\x49\x84\x0E\x7A\x04\x81\x6D\x86\x96\x84\xBF\xF3\x36\x4F\x5A\x54\x82\x8D\x7D\xCD\x74\x31\x7B\xD5\x88\x6B\x87\x29\x0F\xD8\x1D\xB8\x4A\x82\x7D\x82\xAA\x83\x73\x88\xFF\x85\x93\x8A\xC6\x0D\xA4\x04\xBB\x24\x90\x34\x8C\x1E\x8C\xD4\x80\x09\x80\x81\x78\x53\xED\x06\x02\x14\x50\x93\x89\x7B\x51\x88\xDC\x75\x47\x8B\x9B\x8A\x65\x0F\xD7\x1D\xBF\x36\x90\x71\x81\xDC\x82\x29\x85\x19\x86\xA6\x84\xA6\x0F\xFE\x17\x90\xB3\x6D\x5C\x82\xCD\x77\x71\x84\x1D\x8B\x18\x82\x33\x00\xF0\x5B\x4B\x55\x98\x8A\x78\x30\x7E\x62\x86\xAB\x79\x3D\x87\x51\xF4\x04\x10\xB3\x1F\x8D\x7C\x85\x7F\x85\x6B\x89\x6B\x86\x5E\x89\x5F\x07\xCE\x12\x84\x1B\x97\x60\x6F\xDE\x64\x2C\x84\xE9\x70\xFA\x66\x8B\xBF\x63\x2A\x82\x21\x8F\xA2\x76\x34\x8D\x72\x88\x31\x87\x90\x8A\xAD\x0B\x99\x27\x88\x33\x85\xA9\x8E\xF1\x86\x59\x89\x12\x7B\x27\x82\x98\xD9\x7A\x2A\xB0\x28\x90\x86\x7B\x9F\x6C\xA7\x74\xF1\x79\xE8\x86\x85\xF2\x53\x1B\xA8\x1E\x83\x9C\x8A\xD0\x87\x96\x84\x43\x87\xE4\x89\xDA\x0D\xF0\x24\x92\x1C\x75\x91\x85\xA7\x62\xB1\x8B\x73\x79\x69\x7A\xB5\x12\xFB\x24\xB7\x4A\x85\x9E\x89\x2B\x8A\x61\x88\x3E\x87\xC3\x89\xD0\x11\xE6\xE2\x75\xB2\x67\x6E\x83\x54\x8C\x48\x8B\xC0\x68\xEA\x79\xCA\xC9\x34\x5D\x5E\x56\x9F\x8E\x70\x5A\x8F\x5C\x88\x8F\x89\x74\x89\x3B\x15\xBF\x24\xB1\x13\x8C\x84\x74\x54\x75\x50\x88\xC0\x83\xD9\x78\x89\x12\x91\xB1\x65\x4C\x7A\x9B\x8C\x7D\x33\xB6\x8A\x7F\x79\xDA\x8A\x1E\x15\x97\x26\x87\x26\x8C\x4D\x8A\x1F\x8C\x5D\x88\x5B\x83\xC9\x79\x4E\x0E\xB3\x13\x90\x39\x82\x60\x8D\x19\x7C\xB8\x32\x71\x8A\x09\x79\x7C\x15\x94\x27\x9B\x30\x85\x99\x7A\x9B\x85\xA8\x80\xEE\x83\xB7\x89\xBA\x07\xF1\x26\xA5\x35\x91\x16\x89\x41\x7C\xE4\x82\x8E\x87\x09\x86\xDC\x09\xC2\x2B\x8B\x4A\x82\x60\x72\x53\x88\x64\x78\xDE\x68\x26\x79\x68\x15\x85\x26\xAA\x55\x87\x98\x8C\x56\x8D\x3C\x86\x5B\x8A\x49\x87\xA8\x15\xD9\x2A\xA4\x30\x8E\x1D\x8B\x35\x51\x14\x80\x24\x81\xF3\x8A\x4E\xED\x41\x2B\x8B\x6B\x69\x17\x8F\xBC\x42\xB1\x47\x75\x8A\x8E\x80\x5C\xF2\x51\xE1\x4E\x55\x8F\xAB\x70\x55\x8F\x64\x8A\x54\x8B\xB3\x87\x2A\x13\xEA\x1B\xAC\x4C\x9D\xA2\x5B\x4B\x84\x1E\x73\x81\x8A\x35\x86\xD9\x15\xEE\x8A\x5B\x57\x9D\xA7\x7D\xC1\x81\x63\x8A\x60\x8B\x8D\x89\x84\x15\xA5\x1F\x86\x56\x8A\x6F\x46\xE9\x87\xA5\x85\x40\x01\x0B\x8B\x95\xF2\x0C\x2B\xB8\x3F\x8B\xB0\x83\xBA\x77\x6F\x89\xB1\x87\xC0\x89\x2A\x0F\x94\x2B\x9C\x38\x80\xAF\x88\x7C\x84\x61\x89\x80\x87\x00\x37\x05\x0A\xB4\xEC\x28\x58\x8A\x95\x76\x29\x7A\x31\x79\x4D\x8B\xB3\x8A\x16\x0F\x91\xEA\x43\x1F\x9B\x3C\x87\x7B\x86\x57\x83\xF1\x88\x6E\x87\x36\x16\xDD\x25\xA6\x99\x42\x9B\x8B\xDC\x4C\x8D\x87\xA2\x65\xF6\x8A\x1D\xF1\x0A\x2C\x9F\xC4\x6F\xAA\x8E\x62\x88\xE5\x84\x8C\x8A\x9D\x8A\xA4\x15\xBC\x2A\xBA\x2F\x9E\xA9\x89\xC3\x84\xC0\x75\x88\x84\xAE\x6E\x9D\x15\xB3\x2A\x8B\xC9\x6C\x70\x70\x59\x8E\x78\x79\x86\x86\xE4\x79\x2B\x0F\xB7\x1A\xAC\x49\x8D\x78\x88\x59\x8D\xD9\x86\x46\x81\x74\x85\x49\xF0\x50\x1D\xAA\x35\x56\x0D\x6B\x63\x8B\x58\x79\x53\x8B\x29\x8B\x0C\x16\xD5\x2C\x9E\x3E\x83\x9E\x89\xF0\x82\xB5\x87\xC2\x86\x7D\x87\xDB\x12\xF8\x18\xB4\x4E\x81\x1A\x8B\xC9\x86\xF2\x82\x85\x8A\x31\x8B\x97\xF2\x54\xD6\x55\x4C\x82\x74\x7A\x20\x8F\x3E\x88\x39\x86\xEE\x89\x5A\x0B\x8E\x24\x9C\x2D\x90\x90\x8A\x57\x74\x95\x84\xC7\x6D\xA4\x8A\x50\x16\xCC\x2A\xB4\x54\x80\x9E\x8C\xD1\x85\xA4\x7B\xE2\x86\x5A\x86\x32\x16\xC9\x1D\x87\x59\x9F\x79\x80\x57\x8C\xD0\x85\x32\x80\x38\x8B\xC7\xDC\x3D\x19\x8F\x0D\x83\xCC\x65\x67\x89\xB3\x6D\x61\x7A\x91\x79\x20\xEE\x7E\x2A\xAE\x38\x9D\xB0\x88\x53\x85\xAA\x8B\xE8\x87\x10\x8B\xCF\x11\xFA\x2B\x8A\x51\x68\xF6\x7B\x6E\x6F\xD0\x8A\x7B\x8A\x6C\x6A\x23\xF5\x1D\x2D\xB2\x33\x9F\xB4\x88\xD0\x81\xD4\x88\xCB\x86\x1A\x8B\x5D\x09\xE2\x2B\x8A\x1F\x92\xAB\x8C\x7C\x86\x4E\x86\xF5\x75\x30\x8B\xBF\x16\xE0\xAA\x41\x5B\x85\xB3\x8D\xD1\x82\xB2\x8B\x47\x87\xFA\x8A\x21\x0D\xF7\x2B\xBD\x3A\x8A\xB6\x8B\x81\x87\xD4\x88\xEA\x87\x54\x8B\x1C\xF5\x32\x2B\x88\x5A\x9E\xB1\x8C\x69\x8C\xDA\x8A\xA7\x8A\x6B\x8B\x8C\x0F\xFF\x1C\xAD\x55\x83\xB5\x81\x28\x8C\xDB\x89\xBF\x86\x9E\x86\xE8\x07\xD3\xE5\x6A\x1F\x83\x5A\x60\x38\x82\x25\x80\xD2\x86\x71\x8B\xD1\x16\x9E\xEB\x70\x57\x81\xB2\x8C\xE7\x83\xC8\x89\x05\x85\x22",
"\x8B\x9D\x07\xC8\x2D\x9E\x38\x8E\xB7\x8F\x26\x8F\xFC\x81\xDF\x81\x9B\x80\xF3\x16\x97\xD8\x78\xFB\x75\x68\x8C\x13\x87\x9B\x6D\xAB\x8B\xF2\x6E\xC8\x15\x8D\x2C\x9F\x54\x8B\x5D\x89\x34\x89\xB0\x8A\xCE\x89\x2A\x86\x3C\x13\xD7\x18\x88\x4E\x86\x55\x8F\x39\x89\xE1\x8B\x27\x79\xE1\x72\x2B\x0D\xDE\x24\xAD\x02\x6E\x69\x88\x53\x7A\xA9\x8B\xB8\x8A\x56\x79\x5A\xEE\x40\x2C\xB5\x3D\x81\x62\x87\xF7\x82\x8A\x85\x74\x85\x4A\x89\x8E\x0A\xCD\x26\xA9\x32\x83\xB1\x80\x05\x5C\x79\x88\x80\x8A\xDC\x89\x21\x08\xA2\x2E\xB1\x28\x8C\x56\x85\x5D\x89\xF7\x33\xC3\x8A\x2A\x6F\x11\x17\xFA\x2C\x98\x4D\x9C\xB3\x8B\xF3\x86\xCF\x89\xCF\x86\x76\x8B\x5E\x13\xED\x2C\x8F\x3C\x95\x9D\x8D\xF6\x86\xAF\x82\xB6\x84\x1A\x84\x08\x14\xFA\xE5\x27\x24\x1F\xB9\x85\xF6\x49\xC3\x8B\x7B\x62\xB6\x85\xA3\x15\xC6\x2E\xAB\x49\x9A\xB6\x84\xF5\x82\xE9\x8A\xD5\x86\x6F\x8B\xDF\x12\xCB\x07\xA8\x35\x8A\x86\x77\x86\x4B\xAD\x84\x12\x85\xD0\x89\xB0\xE1\x52\xB7\x01\x47\x84\xC2\x62\x06\x8C\xAC\x8B\x9D\x8A\x2F\x79\x54\x16\xC1\x27\xB5\x3B\x84\xBA\x89\x26\x8A\xEB\x88\xD7\x88\xA4\x8B\x6F\x15\xCD\x25\x8E\xA8\x71\x8E\x8F\x69\x82\xA5\x8A\xF4\x78\x96\x8A\x98\xEF\x57\x23\x8C\x33\x85\x5B\x88\xE2\x79\xAB\x85\xDE\x1F\x93\x8B\x07\xF1\x45\xE5\x75\xCF\x6B\xB9\x86\x2C\x8D\xE5\x88\xCE\x89\x29\x86\x17\x17\x9A\x27\x99\x5C\x9C\x9C\x82\xBD\x82\xB5\x89\x3E\x78\x19\x81\x69\xF1\x60\x16\xA1\x97\x43\x27\x7E\x52\x8C\xB9\x84\x52\x8A\xC3\x8B\x17\x14\xF9\x2D\x87\xC5\x6F\xAC\x87\xE1\x80\x45\x7B\x99\x8B\x66\x83\x69\x16\xAB\x1B\x9C\x5D\x8D\x93\x84\x70\x8B\x50\x89\x43\x72\xAB\x6A\xFF\x11\x80\xE7\x70\x10\x99\x88\x71\xDE\x81\xA6\x8A\x40\x01\xB6\x8B\x7B\x15\xC1\x2E\xB2\x5D\x8E\x7A\x84\x77\x8D\x4F\x89\x96\x8A\xDD\x8A\x02\x04\xBE\xE1\x7B\x15\x89\x67\x7F\xF6\x6D\x25\x78\x7C\x87\x76\x76\x5E\x0F\x95\xB0\x56\x48\x84\xA5\x87\xA3\x60\xF7\x8B\x62\x8B\x04\x8B\x8D\x15\x9C\x2A\xB9\x59\x9B\xBD\x80\x38\x8D\xF7\x8A\xD6\x88\xBB\x8B\xC6\x13\xA6\x2B\x90\x3E\x9A\x97\x8B\x71\x8B\x76\x84\x62\x8B\x13\x57\xCE\x17\x9F\x2B\x8E\xD4\x6A\x98\x7C\x78\x8E\x66\x8B\xB1\x88\x52\x86\x4B\x0D\xA6\x19\xB7\x30\x9C\xB2\x8F\xD4\x82\xD7\x8A\x4B\x73\x76\x69\x82\x09\xF5\x94\x61\x5F\x94\xAD\x83\x7E\x8E\xA6\x8A\xD0\x8A\x9C\x8A\x57\x16\xD3\x2A\x98\x4E\x91\xBC\x83\x58\x88\x97\x85\xA9\x8B\x4E\x83\x7C\x17\xBA\x12\x8D\x26\x8D\x37\x8C\xAB\x6E\x49\x81\x17\x6D\x8F\x70\x87\x17\xA2\x2F\xAB\xB1\x76\xBF\x84\x7D\x8F\xC5\x8A\xF5\x8A\xC1\x89\xD8\x16\xD6\x1B\x96\x56\x98\x6E\x8E\x75\x88\x6C\x8A\x67\x85\x1B\x87\xA0\x09\xB9\x1C\xAC\x2F\x83\x4D\x8E\xBE\x87\x3A\x6C\x98\x88\x8C\x8A\x06\x01\x73\x2F\x87\x57\x95\xBF\x8A\x72\x8F\x42\x7B\x86\x8B\xC4\x7A\xB4\x16\xC8\x12\xB6\x5A\x9D\xA9\x83\x79\x8F\xA7\x88\xCD\x8B\xED\x58\x5A\xFB\x48\x7E\x6C\x7F\x7A\xB9\x81\xDA\x75\x74\x2C\x75\x8B\xE9\x89\x09\x18\xD1\x2C\x91\x5F\x8C\xB1\x81\xD2\x77\xFE\x89\x54\x8B\x9C\x8A\xFA\x17\xA2\x2A\x9F\x58\x84\xA9\x8E\x7F\x8A\xEF\x89\xAF\x89\x90\x83\x59\x12\x90\x18\xBF\x57\x9B\xC0\x8B\xE3\x85\x83\x78\x61\x77\x0F\x7A\x1A\x14\xD9\xE7\x61\x60\x88\xBC\x8D\x25\x7D\x26\x7B\xB4\x8B\xD2\x8B\xC8\xF2\x27\x2F\xB6\x1E\x8D\x18\x8F\x5D\x8F\xBA\x84\xDC\x89\x0A\x8C\x72\x13\xA2\xCA\x71\x39\x90\x48\x03\xE7\x85\x79\x88\x07\x7A\x4A\x80\x4F\x18\xA2\xDB\x50\x54\x94\x07\x72\x82\x88\xBB\x8A\xEE\x8A\x61\x8B\x8A\x0F\xE8\x2D\xA0\x5A\x91\xC0\x89\x30\x8A\xE0\x8A\xCB\x87\x24\x8B\x30\x0F\xEF\xD4\x70\x4A\x80\xBF\x84\x85\x8A\xCA\x88\xDC\x8B\xE9\x8B\x70\x18\xC2\x27\x84\x5B\x84\x9E\x88\x7D\x8D\xB4\x8A\x1D\x8D\x85\x89\xAD\x17\x8D\x26\x84\xD6\x4B\x62\x8A\xDA\x6D\x0D\x8C\x82\x8A\xCE\x7A\x8B\x11\x8E\x2B\xBE\xD0\x66\xC1\x86\xF7\x84\x83\x85\x77\x8A\x0F\x86\xEA\x17\xCD\x1A\xAC\x5F\x94\x71\x87\x84\x8A\xBD\x45\x8E\x8A\x3E\x2D\x8E\x18\x98\x2C\xAF\x61\x86\xB7\x83\x6C\x8A\x0E\x8D\xB1\x8A\x3A\x8C\x6E\x13\xDE\x30\xA1\x57\x80\xC3\x83\x5E\x88\xEC\x88\x2F\x87\xA3\x6E\xCD\x00\x91\x26\xB7\x5E\x9D\xC3\x8B\x83\x88\xCF\x89\x8B\x8B\x06\x8C\x56\x16\x8F\x30\xB1\x58\x88\xC5\x84\x38\x88\x5F\x88\xAE\x8A\x4C\x89\x5E\x16\xEE\xCF\x7C\xDA\x76\xBD\x81\x10\x01\x14\x8D\x8A\x8A\xE8\x8B\x2B\x16\xB6\x31\xBD\x60\x98\xC5\x8B\x67\x8B\x10\x8D\x9F\x8B\xD4\x8B\x7F\x16\xEB\x2C\x81\x5A\x8F\x79\x83\x68\x8E\x15\x8F\xB3\x86\xBA\x72\xF7\x04\xA6\x2C\x80\x00\x06\xC6\x8C\x63\x8A\xC5\x88\xFA\x86\xE9\x8B\xB7\x18\x81",
"\x31\xB3\x5D\x8E\xC6\x85\x74\x88\x1A\x8F\xD1\x8A\xED\x8B\xBB\x12\xC6\x30\xB1\x55\x92\xA7\x71\xA4\x82\xDB\x64\x37\x8C\x3B\x8B\x9B\x16\x93\x27\x9A\x58\x95\xC4\x8C\x5D\x88\xEF\x86\x77\x8A\x23\x8B\xE8\x18\xC8\x27\xBF\x5F\x8A\x9E\x8B\xCA\x80\x2D\x6F\x93\x84\x4C\x8B\xB3\x18\x8A\x30\x95\xBA\x6D\x52\x74\x8A\x89\x0E\x8E\x16\x8C\xEA\x86\xBC\x18\x95\x2B\x85\x4E\x85\xC2\x89\x5F\x8F\x05\x8F\xBD\x63\x34\x86\xC7\x18\x98\xC4\x30\x4C\x9B\xE7\x69\x83\x8A\xD3\x8B\x98\x8A\x63\x79\x58\x18\xD2\x1B\x87\x64\x93\xAC\x89\x90\x8B\xC6\x8A\x2A\x8D\x1A\x8B\x89\x18\xB7\x2C\xBB\x5A\x80\x9A\x8E\x27\x7C\x22\x8D\xE8\x8A\x1D\x8C\xC9\x18\xFF\x30\xA1\x63\x85\xC8\x82\x88\x8E\x14\x8C\x21\x8C\x73\x8C\x5B\x17\xF8\x2E\xB8\x57\x86\xA9\x8E\x90\x8F\xFD\x88\x37\x87\x67\x8B\x37\xEB\x6F\x31\xAE\x5A\x9C\xA9\x7A\x3A\x8D\x66\x8A\x28\x87\x9B\x89\xE8\x17\xC9\x25\x8C\x35\x84\x63\x83\xE3\x86\x5C\x86\xFB\x8B\xE3\x57\x9F\x05\xAE\x66\x6A\xAF\x6C\x4E\x6E\xA5\x3C\x16\x8D\x4A\x8C\x2B\x8C\x71\x17\xE2\x31\xBC\x5E\x84\xC7\x85\x77\x88\x26\x8F\xDD\x8B\x7C\x8C\x48\x16\xA1\x32\x8A\x59\x9B\xA1\x4C\xCF\x87\x24\x82\x3F\x86\xD2\x89\x8F\xB6\x05\xE6\x5B\x63\x8E\xCA\x8F\x8D\x8C\x07\x8D\x8C\x76\x1F\x8C\x0E\x16\xC0\x30\x90\x58\x8E\x5E\x80\x4F\x81\xF8\x89\x54\x78\xD9\x85\xD8\xE5\x74\x26\xBE\x34\x8A\x0A\x7A\xAA\x80\x5B\x79\xC3\x8A\xB1\x8C\x3A\x19\x90\x2E\xA4\x60\x84\xC8\x89\x91\x89\xB2\x8B\x46\x8D\x6B\x8B\xEA\x16\xF6\x2B\xB2\x64\x9B\xB6\x8C\x8A\x8B\xD9\x88\xBC\x8A\xDB\x89\x73\x19\xE4\xEA\x6A\x34\x90\x7B\x80\x81\x84\xD6\x55\x5E\x8C\xA0\x8B\x7B\x19\xA4\xD5\x52\x65\x95\xBE\x84\x95\x8E\xF7\x89\x21\x8C\x2D\x8B\x32\x0E\x9B\x31\x86\x65\x95\xC9\x81\xD5\x86\xE6\x88\x13\x8D\x47\x58\x39\x17\xD6\x1A\x9C\xB0\x7F\xAB\x7F\xCD\x6F\x31\x8D\xD5\x8B\x51\x8C\x7D\x19\xE6\x2C\xAB\x4D\x88\xB3\x86\x6C\x8A\xCD\x8B\xEA\x8A\x36\x8B\xFB\x18\x99\x2B\x86\x5C\x8D\xBA\x88\xAA\x86\x79\x88\x1D\x73\x91\x7F\x93\x05\xD1\x2E\x95\x26\x50\x62\x64\x96\x8D\x11\x89\xC5\x77\x49\x8C\x23\xF3\x27\x30\x86\x25\x89\xC1\x80\xAA\x83\x05\x8F\x96\x8B\x16\x8C\x5D\x16\x9C\x33\xA8\x0C\x8C\xB2\x83\x3E\x8D\xE4\x75\xFA\x89\xF4\x72\xD0\x03\xA6\x0B\xAC\x42\x98\x99\x3B\x76\x8B\x90\x56\x08\x8A\x8B\x8C\x89\x16\x80\xDD\x4B\x5A\x8F\x56\x82\x25\x88\x5B\x88\x95\x88\x50\x87\x31\xC9\x42\x24\x9A\x10\x81\x35\x8C\x41\x82\x6C\x84\x85\x74\xEC\x88\x50\xF3\x05\x2F\xA0\x60\x83\x08\x07\x9D\x8E\xED\x89\x3C\x8C\xB4\x89\x7D\x15\xC2\x33\x9E\x2A\x84\xCE\x82\xAE\x83\x69\x88\xB9\x85\xA2\x8C\xD1\x0B\xA9\x2B\x9B\x00\x8B\xAD\x82\x54\x8B\x00\x8C\x75\x89\xCD\x8B\x5E\x02\x9D\x2F\x80\x26\x81\x4A\x87\x41\x87\x24\x05\x7B\x8D\xDC\x8B\x91\x19\xCE\xD5\x69\x66\x95\xB6\x8F\x97\x89\xDD\x88\xC0\x8A\xE3\x83\x87\x18\xA7\x2B\xB4\x64\x95\x71\x8B\xDD\x83\xA3\x49\x77\x87\x17\x82\x31\x14\x83\x24\xB0\xB7\x47\xD0\x8F\x7C\x88\x12\x8E\x5D\x88\xA8\x8C\x80\x18\xAC\x32\xA3\x63\x8E\xC9\x8F\x8C\x8D\x35\x8E\xEA\x8B\xC1\x8C\x5D\x17\xB1\x33\xAE\x59\x9A\xAC\x89\x15\x59\x74\x87\xF1\x8A\x09\x7F\x90\x81\x48\x0D\xA1\x49\x86\x08\x0C\xA1\x8A\xFC\x8A\x5B\x7B\x95\x8C\x0B\x1A\xE7\x2D\x8D\x68\x93\xC3\x81\x98\x89\xDB\x88\x8A\x8C\xD6\x8B\x85\x19\xDD\x2D\x86\x1D\x85\x91\x8C\xB2\x83\xF1\x5D\x8D\x8C\xFA\x8B\x37\x1A\xCB\x31\x93\x66\x8E\xC0\x85\x99\x8F\xFA\x8A\x55\x8D\xEC\x8B\x11\x1A\xDB\x2F\x9D\x4C\x9D\xBE\x86\x54\x8B\x78\x84\x67\x8B\x9B\x75\x47\x1A\xA3\x30\x89\x69\x87\xCB\x8C\x8C\x8B\xE8\x89\x93\x8C\x08\x8C\x3D\x1A\x92\x30\x8B\x64\x97\xAC\x8A\xA2\x8A\x6C\x79\x50\x8A\xCC\x8B\x5E\x0E\x87\x08\x97\x2F\x90\xAD\x81\xC9\x6C\xD6\x55\x96\x8C\x37\x8C\x09\x1A\xFD\xD6\x79\x68\x85\xC5\x8B\xA3\x8F\x14\x8D\x98\x8D\x3A\x8C\x1F\x19\xC9\x2D\x81\x69\x8F\xB7\x81\x9C\x80\x03\x8D\x1E\x82\xE0\x8A\xE9\x15\x83\x2C\xB8\x61\x64\xAE\x86\xA0\x8D\x37\x8D\x35\x88\x49\x8C\x9A\xF4\x71\x2B\xAA\x4D\x93\xAF\x8C\x36\x8D\x23\x8E\xA8\x8A\xAC\x8C\xA4\x16\xEA\x31\xA6\x5A\x8C\xB6\x83\x71\x82\xBA\x8A\xEE\x89\x42\x80\x62\x19\xEF\x34\x8F\x62\x96\xBA\x8F\x65\x64\x1E\x8C\x87\x8B\x4B\x8C\x1E\x16\xFC\x2F\xA0\x58\x8C\xC8\x83\xA1\x8D\x13\x8E\x18\x8D\x07\x86\x1A\xF4\x66\x30\xB8\x1C\x9C\x71\x87\xFC\x63\xBD\x8B\xB0\x76\xF6\x8C\x86\x1A\x9A\x21\x83\x64\x92\xCC\x82\xA2\x8B\x2A\x8C\x89\x8D\x72\x8C\x26\x1A\xD1\x31\xAF\x66\x93\xC6\x88\x87\x8D\x1A\x8C\xA1\x88\xEC\x84\x33\xF4\x15\x29\x9D\x60\x95",
"\x09\x70\x2A\x8A\xE9\x85\x08\x8B\x58\x8D\x80\x11\xB3\x35\x8A\x68\x8A\xD4\x86\x7A\x8B\x35\x8C\xEA\x8B\x5C\x8D\xE7\x18\xD1\x34\xA9\x63\x8D\xC8\x84\xA1\x8B\x51\x81\x8D\x6A\xB8\x5A\x46\x1A\xC8\x35\xB8\x41\x8B\xC0\x85\x82\x89\x38\x8E\xA7\x8C\x14\x8C\xA0\x1A\xB5\x2D\xB6\x67\x82\x6E\x8F\x8B\x8C\xFB\x8A\xCF\x88\x63\x82\x8C\x18\xB7\x94\x5A\x6A\x82\xC5\x81\xA7\x8B\x8A\x77\x9C\x8C\x83\x8C\xCE\x1A\xDB\x30\xAF\x0C\x9D\xC2\x83\x81\x8F\x0B\x8D\x99\x8D\xAF\x8B\xD6\x6C\x1F\x31\x90\x73\x2B\xD7\x81\x91\x8C\x53\x8C\x64\x65\xA3\x89\x14\x17\x80\x2B\xA4\x29\x8C\xCB\x83\x9F\x84\x30\x8F\xBD\x8C\x0B\x8C\x88\x0C\xE1\x2E\xBC\xAF\x61\x97\x8F\xE1\x2D\x50\x8E\x40\x8D\xDF\x8C\x89\x1A\xFC\x2D\xA9\x55\x9D\x73\x8B\x56\x8F\x4E\x8D\x2A\x8D\x7A\x8D\xAB\x18\x87\x36\x99\x6A\x20\x76\x84\x63\x3C\x5F\x8D\x37\x8C\x64\x8C\x65\x19\xCA\x31\x9C\x69\x8B\xD2\x89\x8B\x8F\x4B\x8F\x2E\x8C\x8B\x8D\xBD\x18\xCD\x23\xA5\x6B\x93\xD2\x87\xAE\x8E\xB3\x82\xCB\x89\xE3\x67\xFF\x12\xDA\x31\x9E\x6C\x90\xC7\x87\x91\x8B\xF1\x88\x25\x8C\x96\x8B\x96\x18\xF6\x31\x98\x62\x90\xB9\x87\xCA\x82\xE6\x89\xDF\x86\xE5\x8C\x3F\x13\xD3\xE0\x7C\xD2\x72\xD9\x8A\xAD\x89\x12\x8C\x38\x8C\x25\x8D\xB5\x1A\x94\x33\xB7\x6A\x95\xCA\x80\xAD\x89\x26\x8C\xA4\x8D\x76\x8B\x7B\x1A\x85\x2E\xAC\x63\x8F\x77\x88\xC8\x71\x20\x03\xCC\x8D\x9D\x8C\x65\x15\xEC\xDC\x4C\x60\x84\xD9\x8D\x8C\x8B\x69\x8E\x65\x8D\x27\x8D\x86\x18\xF9\x34\x83\x5C\x91\xDA\x8E\x7A\x89\x61\x8F\x2B\x8D\x89\x8C\x33\x1A\xB0\x35\x8F\x6C\x88\xD4\x8F\x4A\x7D\xFC\x8B\x4F\x8D\xF3\x8B\x4A\x0D\xC2\x32\x99\x62\x84\xCA\x8A\x99\x89\x3F\x8F\x51\x8C\x3E\x79\x24\x19\xC9\xFD\x66\x64\x94\xD1\x85\xB4\x8F\x43\x8E\xE2\x8B\x2B\x8C\xCC\x1A\xD9\x30\xB1\x6B\x88\xC8\x88\xB2\x8A\x21\x8E\x2F\x8C\x52\x8D\x85\x15\xD5\x35\x94\x6A\x97\x89\x60\x29\x7B\xE4\x85\x81\x8D\x63\x8D\x6B\x1B\xC7\x36\xA3\x6C\x89\xDA\x8C\xA4\x8E\x6B\x8E\x93\x8D\xA6\x8D\x57\x19\xD2\x35\xBA\x63\x92\xD4\x81\xF4\x86\xD9\x85\xA3\x77\x76\x86\x25\x17\xEA\x36\xA8\x64\x81\xD9\x8A\x92\x88\x69\x8F\xBB\x8D\x96\x8C\x75\x1A\xAF\x32\x98\x6E\x90\xD2\x82\xB6\x8F\x0E\x8E\x56\x8D\x3C\x8C\x57\x0F\x84\x11\x99\x3D\x9E\xB8\x86\x08\x7D\xDE\x88\xDE\x89\x7B\x8B\xDF\xDC\x57\x36\xBA\x65\x9B\xD2\x81\x27\x79\x5C\x7A\xAC\x8A\x90\x8A\xF4\x19\xC0\x1B\xA3\x6B\x96\xAA\x88\x9F\x8E\x8C\x85\xCB\x8D\xB5\x6D\x5D\x19\xAA\x09\x8C\x4E\x97\xCB\x86\xD8\x77\x48\x32\xEE\x8C\xC8\x8C\xBC\x1B\xA4\x2F\x81\x6E\x9A\xC8\x83\xB8\x8C\x23\x8D\xE1\x8C\x8F\x8C\x18\x1B\xA0\x32\xA4\x6D\x8A\xC4\x83\x37\x8D\xE3\x8B\x33\x8A\x47\x70\x6F\x0F\xA3\x27\x87\x52\x88\xF8\x7E\xA6\x8D\x6F\x8D\x6A\x89\xBF\x8D\x51\x19\x94\x37\xA5\x6C\x96\xDC\x80\xA6\x8F\x41\x8F\x05\x85\xA7\x8D\x49\x17\x9A\x36\xAD\x62\x93\xCD\x85\xC2\x87\x2F\x73\xD3\x05\xDC\x89\x69\x18\xBB\x27\xA8\x0A\x8E\x48\x3F\xBC\x8F\x34\x8D\xBB\x8D\xF1\x76\x12\x1B\xF2\x2B\x94\x6C\x94\xAF\x87\xBD\x8F\x51\x8E\xE6\x8D\xAC\x8C\xDB\x1B\xA2\x32\xBB\x33\x9E\xCC\x8E\x09\x7C\xB2\x79\x55\x87\xE4\x8B\x33\xF2\x52\x27\x92\x5D\x90\xDC\x83\xBA\x8E\x37\x8C\xDB\x8D\x73\x7A\x6E\x1B\xC8\x1A\xA3\x32\x91\xDB\x89\x33\x8B\x28\x8F\xB2\x88\xC4\x8D\x22\x16\x8A\x37\xBB\x32\x98\x63\x7E\xBD\x8F\x2D\x82\x6D\x8D\x77\x85\xE7\x13\xAE\x1F\xA6\xBC\x75\xCE\x88\x51\x43\x85\x88\x76\x8C\x72\x8B\xF2\x18\xD7\x2E\xAA\x2E\x82\x53\x8C\xBA\x83\x60\x8D\x8C\x87\xE7\x85\xC5\x1B\xD8\x2A\x99\xB2\x62\xCF\x87\xB7\x87\xD0\x5D\xE0\x8B\xF3\x8C\x83\x17\xB6\x1B\xAA\x67\x8F\xDC\x8F\x8F\x7E\x7C\x8E\xB5\x57\x0B\x8E\x0F\xF5\x01\x38\x8B\x6A\x83\xE0\x8D\xA8\x8D\x80\x8F\xB1\x8B\xD6\x8D\x88\x18\x89\x38\xB2\xF7\x68\xA9\x8A\xD8\x80\x0E\x82\xE6\x8A\xE5\x86\x50\x13\xD1\x00\x44\x68\x9D\x6E\x73\x10\x06\x85\x8E\x7B\x8D\x9A\x8D\x80\x1B\xCA\x38\x8D\x6B\x8C\xD4\x8C\x9A\x8E\x51\x8F\x13\x8F\xEC\x8D\x7A\x1A\xF2\x37\x86\x66\x80\x79\x81\xFB\x70\x2A\x84\x86\x8D\xAF\x8A\xB4\x17\xE1\x2A\xB5\x29\x7E\xE2\x88\xA0\x89\x7A\x8C\x70\x8D\x58\x8B\xF2\x19\xE0\x15\x81\x6F\x94\xAA\x83\xBC\x8F\xD6\x88\x08\x8F\x5C\x8B\x40\x1B\xD3\xD7\x52\x48\x94\xAB\x86\x6C\x80\xAE\x68\x7D\x86\xC5\x46\x74\x1C\x9D\x34\xBE\x6B\x98\x7B\x62\x64\x8D\x65\x74\xF1\x82\xF7\x8D\x8E\x0F\xF0\x37\xB9\x5D\x94\xD6\x86\xAA\x8D\x61\x74\xED\x84\xDB\x60\x89\x1C\xB6\x34\xAF\x5A\x9F\xAC\x79\xC1\x89\x52\x8A\x68\x7B\x49\x89\xA5\x0C\xBC\x36\xAB\x5F\x88\xCE\x8D\x7E\x89",
"\x90\x8F\x87\x56\xF8\x8B\xC5\x0B\xB7\xD6\x59\x72\x88\xD2\x8B\xC9\x8B\xDF\x89\x27\x8F\x46\x8E\xFD\xED\x0F\x39\x9C\x61\x98\xC7\x87\xC0\x89\x52\x8C\x25\x8F\xD7\x86\x3C\x1C\xA3\x1C\x89\x1E\x45\x71\x88\x9E\x89\x32\x87\x37\x6F\x55\x8E\x5A\x1A\xAD\x39\xA4\x59\x87\xDD\x83\xA2\x89\x75\x8D\x89\x8C\x33\x8E\xAE\x19\xBF\x34\xB0\x66\x9C\xDC\x8C\x8F\x8F\x02\x8F\xBF\x82\xE9\x6F\x80\x1A\xEF\x17\x93\x57\x7C\xD3\x20\xCC\x88\x4E\x8E\x1D\x8F\x88\x8D\xAF\x1C\xFD\x2D\x8E\x72\x84\xB2\x83\xCB\x89\xE0\x88\x14\x8E\x09\x8D\x89\x1B\x95\x39\xA0\x1B\x82\x04\x82\x27\x8E\x58\x83\x0D\x8C\x9A\x62\x45\x1C\x91\x37\xA6\x65\x9D\xDD\x80\x20\x7B\x86\x8C\x9F\x89\xCB\x8D\xC8\x1C\xA7\x34\x92\x72\x93\xC9\x81\xCE\x8B\x1D\x8D\x9F\x8D\x67\x8E\xD3\x02\xCB\x30\x8D\x70\x88\xAF\x80\xE6\x7C\xD6\x55\x35\x8F\x4D\x8D\xA8\x19\xD3\x37\xBE\x65\x95\xDE\x80\x98\x88\x92\x8F\xBA\x8B\x79\x8E\x06\x1B\xCC\x39\xB2\x66\x8E\xE6\x80\x0A\x84\xB3\x76\x28\x80\x14\x86\xDB\x09\xD4\xB5\x45\x6B\x99\xA1\x79\xCE\x8D\x82\x8F\xA1\x8C\xC9\x8D\xEC\x1C\xC0\xE6\x58\x5D\x98\xAD\x8F\x7B\x8B\x5D\x8B\x6E\x8B\x5A\x80\x79\xFE\x25\xB7\x3B\xF9\x6D\x93\x7F\xCF\x8C\x5D\x8F\x35\x8F\xB6\x8D\x37\x1B\x8D\x2F\xB9\x6C\x8E\xB9\x85\xC3\x83\x6E\x8F\x07\x8E\x32\x8D\x0A\x1D\xAB\x34\x96\xB3\x25\xB1\x8B\xB7\x8D\x8B\x8E\x11\x8E\xD0\x88\x22\x1B\x99\x3A\xBE\xD4\x6E\xE7\x89\x75\x88\x6C\x8C\x66\x8C\x1C\x8E\x75\x1B\xC6\x37\xB7\x6D\x81\xC3\x3A\xAF\x8E\x43\x31\x49\x8F\x7E\x8D\x01\x1D\xE2\x38\x82\x6E\x84\xE3\x8F\xAC\x89\x9E\x8E\xAE\x8C\x65\x8E\xBC\x1A\xAF\x37\xBE\x6A\x83\xE1\x88\x07\x64\x61\x8D\xC9\x31\x93\x04\x47\x1D\x9F\x36\x9E\x68\x87\xDF\x89\x30\x7B\x6B\x8E\xFA\x8D\xAE\x8D\xC6\x1C\xB8\x35\x8E\x75\x91\xD6\x8F\xCD\x8A\x4A\x8E\xD3\x89\xF7\x34\x1C\x1B\xD4\x39\xB7\x74\x83\x88\x88\xD1\x8A\x7A\x8E\x52\x8E\xEA\x8D\x4C\x1D\xF2\x35\x88\x14\x94\xE5\x85\xD6\x8B\x5A\x8D\xA9\x8C\x7B\x8E\x3D\xD9\x5F\x2D\x92\xC8\x72\xB3\x8A\xED\x61\xAB\x8C\xCD\x8D\xEC\x8C\xE0\xF2\x6D\x39\x80\x6C\x94\xE1\x85\x71\x8E\x86\x8E\x71\x8D\xCC\x8C\xA4\x1C\x9C\x31\xB8\x75\x86\x06\x7D\x8E\x8C\xA4\x8F\x5A\x8F\xCA\x88\x48\x1C\xE4\x2F\xA9\x74\x86\xBF\x8E\x78\x89\x28\x8D\x07\x8E\x97\x8E\x3B\x13\xBE\x36\xBD\x4C\x83\xEA\x87\x5F\x58\x4B\x79\x07\x62\xBF\x8E\x58\x1B\xEF\x2E\xA0\x68\x98\xD1\x82\xD0\x8A\x35\x8D\x5C\x8E\xC2\x8D\x06\x1D\x82\x33\x88\x74\x89\xD1\x81\xD3\x8B\xE9\x8B\x9B\x8A\xBD\x8E\x8F\x18\xAA\x2D\x99\x47\x63\xCC\x60\xDA\x8B\x77\x8E\x30\x8E\x8C\x8C\xA5\x1D\x8C\x34\x84\x74\x8E\xD0\x8D\xCD\x88\x42\x8D\x5D\x8F\xCD\x8D\xB7\x1C\x93\x35\x93\x6D\x99\xDB\x8D\x6B\x8A\x1B\x8D\x6D\x8E\xE8\x8D\xB7\x1D\xB6\x36\x9E\x6B\x98\xD9\x85\x8F\x8C\xA5\x8D\xDE\x87\x7B\x89\x2A\x1B\xFF\x38\x80\x63\x86\xE5\x89\xC5\x89\x56\x6E\xD4\x89\x16\x8E\x8F\x1D\xA7\x21\x91\x76\x9E\xEA\x84\xCC\x8E\x56\x8D\x58\x8E\xA6\x8D\x63\x1D\xCE\x36\xB5\x72\x90\xDA\x8A\xC6\x8A\x48\x8C\x55\x8E\x99\x87\xA0\x1B\xD1\xEA\x55\x74\x8F\xE1\x88\x72\x8B\x34\x78\x5F\x8D\xDC\x8E\x3A\x1A\xBB\x3B\xBC\x68\x89\xED\x8E\xA3\x8B\xB5\x8C\x90\x8D\xF2\x8E\x7C\x1A\xFF\x1E\xB2\x65\x80\x9D\x8D\x2B\x7E\x52\x87\xA9\x77\xBC\x89\xBF\x1C\xD9\x3B\x96\x01\x7C\xE4\x83\xD9\x8F\x6D\x8D\x65\x8E\x0E\x8E\x90\x17\x9E\x38\x99\x76\x8B\xD9\x87\xD6\x8C\xB3\x8F\xE4\x87\x49\x85\xFC\x1D\xA9\x15\xBE\xBA\x72\x1C\x81\xEC\x76\x9F\x8E\x80\x8F\x58\x60\x81\x1D\x9A\x3A\xBC\x74\x9C\xE8\x87\x99\x88\xF8\x8A\xF5\x82\x1D\x8E\x22\x1C\xFA\xD7\x54\x3E\x8F\x2B\x8A\xAB\x81\xEE\x85\x80\x8E\x75\x8E\x39\x1D\xEE\x3A\x99\x73\x93\xD8\x8E\x6F\x8E\xCF\x84\x7D\x8E\x31\x8D\x87\x1B\xB0\x3A\x81\x77\x9D\xDC\x81\xBB\x8B\x16\x32\x73\x73\xEF\x8D\x1C\x18\x80\x0B\xA3\x6D\x7A\x8C\x7C\x73\x88\x07\x8F\x7A\x8F\x2F\x8E\x80\x1D\xFA\xE9\x7E\x6E\x99\xE3\x86\xBF\x83\x8F\x8F\xFE\x8A\x05\x8F\x18\x17\x9A\x3B\x9A\x5C\x87\xDE\x89\x38\x8B\xC4\x8F\x49\x81\xA7\x8B\x4F\x05\x92\x38\xBB\x66\x87\x09\x07\xDC\x8E\x7F\x8F\x49\x8E\x0C\x8E\x05\x1E\x9A\x38\x80\x65\x88\xF0\x8F\x72\x88\xBA\x8E\xA5\x88\x06\x8F\x33\x17\xA1\x3C\xB9\x75\x8A\xD8\x8A\x02\x6A\xF5\x84\x3F\x38\xE8\x8C\xAD\x0F\xC9\x10\xAB\x70\x82\x6D\x84\x84\x6A\x08\x8A\x45\x8E\x59\x8D\x10\x1B\xA8\x3A\x8B\x77\x8A\xE9\x8D\xDC\x8F\xF1\x89\x97\x8E\x7A\x8D\x63\x1A\x94\x30\xB8\x77\x8E\xF1\x76\x79\x88\xC6\x7F\x90\x88\x35\x8D\x20\x00\xAD\x2A\x8A\x10\x8C\x31\x71\x7F\x8F\x66\x76\x9B\x8E",
"\xF6\x8E\x89\x17\xDD\x3A\x9D\x6B\x98\xE3\x8F\xAD\x8B\x38\x8D\xB8\x8C\x15\x8C\x7D\x1C\xAC\x30\x8A\x79\x94\xBC\x8A\x9F\x8D\x0B\x81\x49\x84\x33\x82\x7E\x17\xA2\x05\x80\x5E\x9D\x6D\x6E\x41\x85\x4A\x8C\x08\x83\xCF\x8B\xEB\x19\x82\x02\x07\x7A\x80\xF2\x80\xC3\x88\x3E\x8E\x76\x8B\x46\x8F\xF3\x19\x8F\x3D\x85\x67\x91\xF4\x87\x9C\x8B\xD2\x8E\x0B\x8C\x31\x8F\x2C\x04\xB3\x0D\xAE\x71\x95\x35\x83\x7B\x8A\x43\x8D\x9D\x65\x51\x8F\x75\x1C\xC9\x3B\xA1\x71\x8B\xF1\x82\xC0\x8D\xC5\x8D\xC5\x8D\x17\x8F\x78\x1A\xE8\x38\xA3\x6D\x9B\xF3\x85\xB6\x88\xF6\x76\x7B\x86\x17\x8D\xBF\xEF\x76\x2A\xB0\xB3\x60\x19\x8A\xDA\x68\xD7\x8E\x22\x8F\xA4\x8E\xBC\x1E\xCB\x38\xBE\x7A\x84\xE0\x80\xEC\x8F\x62\x8D\x9E\x8E\x7B\x8D\xAD\x1D\xF8\x35\x8A\xBF\x64\xD2\x82\x95\x76\x36\x62\xB3\x8E\x4D\x8E\x3C\x19\xD6\x27\xBE\x64\x9A\xF2\x80\xB7\x88\x94\x8D\xFA\x8A\x51\x8E\x9A\x18\x89\x3B\x9B\x66\x90\xF5\x8A\x55\x89\x4C\x7F\x95\x8C\x62\x8C\x00\x00\x5F\x3D\xAC\x72\x81\xF7\x84\xE4\x73\x3B\x8E\xD5\x84\x54\x89\xDB\x13\xAA\x25\x9D\x4F\x8C\x95\x8F\x3D\x8B\xB9\x61\x7A\x89\xEA\x85\x80\x1E\xAF\x2B\xA4\x0A\x99\x5E\x80\x01\x87\x00\x8F\xFA\x74\x51\x8F\x17\x1E\xF6\xB7\x59\x78\x9B\xE9\x83\xD8\x8F\x9D\x8D\xFB\x8D\xDE\x8E\xEF\x1B\xE3\x3B\xB1\x6F\x99\xF6\x88\xB0\x88\x09\x8E\x9F\x8C\x2D\x89\xD1\x1C\x9E\x30\x84\x6A\x87\x09\x02\xEF\x89\x98\x8C\xBD\x8E\x4C\x79\xD7\x13\x96\x26\x99\x4F\x9D\xCE\x8F\x3A\x89\x5B\x88\xA0\x8B\x42\x86\xDC\x12\xB0\x37\xAC\x68\x95\xCA\x7F\xE4\x87\x52\x8D\x94\x87\x83\x8F\xE9\xCC\x09\x3E\xAC\xC3\x62\xF2\x82\xD8\x8F\x77\x8D\xC0\x8C\x23\x8F\x42\x18\xA2\x35\x84\x61\x92\xF1\x87\xD7\x8A\xB8\x8F\x3D\x8E\xDF\x8A\x8F\x00\x99\x3E\xB5\x84\x6E\xD5\x81\xBA\x88\xE1\x8C\x8A\x8F\xD2\x8D\x93\x1B\xDD\x3B\x8A\x6D\x9F\xEE\x8F\xB5\x8B\x75\x8D\xD8\x8C\x61\x8F\xAE\x1B\xD2\x38\xAA\x7C\x9F\xD5\x8B\x29\x89\x58\x8E\x76\x84\x4F\x89\xC4\x1A\xBB\x0E\xA1\x3D\x90\xD2\x32\xF3\x8A\x2E\x78\x81\x8F\x39\x8F\x94\x1D\xAB\x3A\xB6\x79\x8D\xE9\x88\xEE\x8C\x6E\x8E\xBA\x8E\xBB\x8D\xD4\x1D\xB9\xC0\x46\x3A\x8E\x0C\x83\x98\x6D\xE3\x8E\x35\x8E\x5D\x8F\xE9\x1B\xCA\x3E\x95\x6E\x8C\xFA\x80\xCF\x8E\x89\x8D\x32\x8E\xFB\x8E\xCB\x1C\xB3\x3C\x8D\x73\x9E\x95\x80\xCB\x36\x5E\x6C\x3D\x70\xB7\x8F\x00\x1D\xFF\x37\x9B\xC5\x71\xF6\x83\xC6\x8C\x89\x8D\x19\x8E\xBB\x8F\xF2\x1C\x92\x3E\x93\x72\x9D\xF9\x84\xE3\x88\xEC\x82\x16\x86\xD0\x8B\x5C\x1F\xC7\x3E\xA3\x76\x86\xDD\x80\xDF\x8C\x4E\x8E\x7C\x8E\x3B\x8D\xD5\x1E\xA9\x36\x9F\x79\x92\xEE\x86\xAE\x8E\xC1\x8D\xF6\x82\x88\x8C\x5A\x1D\xCC\x01\x92\x1A\x7A\x03\x71\xD7\x65\xEB\x8D\x89\x79\x61\x8E\x95\x1F\xF0\x35\xA7\x76\x96\xDE\x89\xF9\x8E\x70\x8D\x74\x8E\x9E\x8F\xF5\x1C\xBE\xCE\x29\x75\x82\x69\x66\xFA\x88\x47\x7A\x61\x7B\x7D\x7A\x44\x1E\x96\x27\xB8\x7C\x96\xB8\x88\xE4\x8A\xF2\x8A\xAB\x8F\xE4\x8C\xEC\x1E\x9A\x0A\xA0\x7E\x9A\x8C\x71\xB3\x8D\xA6\x8E\xD1\x8F\x37\x8F\xC9\x1A\xF1\x3C\x98\x79\x80\xFB\x86\xE0\x8A\xEC\x8E\x65\x8F\x04\x8F\x98\x1D\xC9\x3C\xA0\x79\x9F\xD9\x81\xFC\x8B\x24\x8E\xD0\x8D\x70\x87\xDA\x18\x80\x3F\xA6\x74\x90\xFB\x81\xA2\x8A\xEE\x8F\xFA\x8C\xBA\x8F\x0F\x1F\xF3\x35\xB4\x75\x90\xFA\x81\xC5\x8C\xD8\x8C\xF7\x8C\x08\x5B\xF3\x00\xF0\x1D\x86\x7A\x95\xFD\x81\x32\x7F\xEB\x8C\xA3\x8E\xE6\x8E\x9F\x1A\xBA\x36\xA1\x6A\x9D\xFD\x8D\x7F\x88\xF6\x8D\x08\x8E\x71\x8E\xDD\x00\xC3\x3F\x92\xB9\x6E\x1A\x83\xDB\x8A\xB1\x46\xF6\x8E\xA4\x8E\x82\x1F\xC6\x23\xB8\x2E\x70\xE5\x89\x13\x7A\x96\x8E\xF8\x8E\x6F\x8E\xE4\x1F\xE0\x39\xB7\x7F\x8B\xEC\x88\xFE\x8C\xD7\x8B\x6E\x6F\xC5\x5F\xFF\x1F\xDA\x3A\x8B\x72\x90\x8F\x71\xF6\x8D\xCE\x8F\xF3\x8F\x3B\x8F\xE3\x1F\xD7\x3D\x99\x6C\x94\xF8\x81\x86\x88\x06\x8D\xE5\x73\xC6\x8D\x38\x19\xF0\x3D\x91\x80\x9F\xEB\x85\xEA\x8D\x27\x8D\xDA\x89\xC2\x8F\xD3\x1E\xCD\x38\xAD\x7E\x98\xDE\x8A\x01\x92\x7B\x8E\xF9\x8E\x05\x8E\x48\x19\xAF\x36\xA4\x71\x4B\xCA\x89\x36\x63\x04\x91\x68\x8F\xF7\x8C\x26\x20\xF1\x33\xA8\x7A\x9A\xE3\x8A\xEA\x8D\x3E\x8F\x48\x8B\xFB\x8C\x41\x1D\xA0\x3C\xB8\x7F\x9D\xCC\x8B\xDF\x8C\x76\x8D\x7F\x8E\x12\x02\x97\x0A\xE0\x32\x94\x02\x7F\xE6\x66\x03\x96\xB6\x8F\xC7\x8E\x45\x8B\x21\x1F\x8C\x2D\x9E\x48\x8E\xB4\x8E\xE9\x81\x76\x88\x78\x8C\x19\x89\x1C\x5B\x2A\xCB\x71\x13\x6B\xDE\x8C\xAA\x82\x2C\x8D\x13\x90\xE4\x8E\x4F\x20\xDA\x33\x91\x81\x9C\xCE\x87\x2D\x8D\xE4\x8F\x77\x8D\x18\x89\x57\x04",
"\xD6\x3D\x4C\x70\x8B\x85\x70\xBE\x8D\x96\x68\x6E\x8C\x92\x56\x24\x17\xEA\x3B\x91\x7E\x88\xFE\x8B\xAD\x8A\x59\x8E\x9C\x8D\xD4\x8F\xA8\x1B\x97\x3F\xAA\x6E\x81\xEF\x89\xB9\x8F\xB7\x8C\x02\x8F\x17\x90\x5B\x19\x91\xEB\x4E\x16\x86\x02\x91\x74\x50\x7F\x8D\x8F\x86\xC2\x70\x5E\x20\xEC\x3F\xAF\x57\x88\xFD\x8F\xD6\x8B\xA0\x8F\xEA\x8F\x82\x8E\x10\x1F\x91\x39\x8A\x7E\x94\xE7\x8B\x00\x96\xE7\x8E\x7E\x8E\xEF\x8D\x27\xD0\x16\x1F\xB0\x6D\x63\xDF\x8C\x35\x3A\x37\x8F\xDC\x4B\x93\x04\x5F\x20\xD6\x3C\x9C\x7F\x84\xED\x8D\x08\x96\xB4\x8E\xE1\x8F\xA6\x8E\x88\x1F\xCF\x3A\xB8\x7D\x91\xEA\x82\xF5\x8B\xAA\x8E\xD9\x8C\x12\x8E\x83\x20\xA9\x1A\x8D\x0F\x83\x2D\x86\x76\x89\x3A\x8C\xFA\x89\xE9\x8C\x45\x2F\x2C\x38\x83\x37\x6A\x04\x90\x6C\x89\xEE\x8C\x1E\x91\x62\x8E\x7A\x20\xC7\x39\xA9\x82\x84\xEB\x89\x00\x96\xAC\x8D\x98\x8F\x55\x4A\xB9\x1C\x99\x3D\xA8\x11\x9B\xF4\x8F\x51\x69\xF3\x75\x2F\x8E\x21\x8E\x85\x1E\xF0\x3D\xA5\x51\x88\xF4\x85\x85\x88\x7D\x8D\xF7\x8F\x5F\x90\xDE\x1D\xC1\x41\xA2\x75\x83\x06\x92\xDE\x8E\x0F\x92\x2D\x8E\xC6\x8F\x30\xC4\x49\x41\x96\x71\x88\x49\x85\x1D\x89\x40\x8F\x4F\x85\x01\x8D\xEF\x11\xD2\xE6\x42\x04\x13\x06\x94\xEA\x8D\xBD\x8F\x8F\x8B\xF7\x8E\xA5\x20\xBA\x3B\x8F\x82\x9C\xED\x87\x00\x96\xB7\x8D\x31\x90\xBB\x8E\xB1\x1F\x8D\x3F\x8B\x6E\x9C\x6E\x83\xA4\x72\xF6\x89\x86\x8D\xA9\x84\x84\x08\xDC\x9B\x7C\x82\x92\xB6\x8E\x0B\x91\x1E\x91\x7C\x8F\x79\x90\xF3\x1D\x91\x41\x87\x74\x93\x04\x99\xD0\x8A\xEF\x8F\x42\x8E\x36\x8E\xC7\x1E\x93\x24\xA3\x25\x95\x90\x85\x96\x84\xD9\x8F\x8D\x64\x76\x90\xB9\x1E\xE1\x40\x8B\x7C\x96\xF7\x8B\xD1\x8C\x0A\x90\x83\x89\x48\x8B\xDE\x13\x93\x2D\xA0\x4F\x86\x70\x62\x97\x81\x6D\x8F\x3A\x91\x81\x90\xFA\x16\x8C\x41\x84\x7E\x8B\xEA\x87\x0A\x92\xAE\x8E\xC6\x86\x3C\x8F\x31\x1E\xFA\x3C\x9C\x80\x93\xDF\x8F\x7A\x89\xDC\x81\xC9\x6E\x0F\x31\x18\x21\xCF\x3D\x81\x80\x9F\x8E\x85\x2B\x6B\xE4\x8D\x19\x91\x7C\x8F\xB0\x13\xFB\x3D\xB2\x4E\x89\xF9\x8A\xF1\x3A\x1C\x91\xE6\x8A\x72\x90\xEE\x06\xC6\x24\xB0\x1B\x9F\x98\x8D\x46\x84\xD6\x55\x4E\x90\x70\x8F\x59\x1B\xF9\xDD\x4B\x7A\x87\xAC\x79\xFB\x8F\xAF\x8B\xEE\x8E\xC3\x8E\xAC\x1E\x88\x3B\xBF\x7E\x85\xE5\x85\xFD\x8B\x01\x81\x09\x86\xC0\x78\x57\x1F\xB6\x05\x92\x73\x9C\x9D\x8C\xA7\x2F\x29\x93\xBC\x8F\xA8\x90\xAD\xF2\x70\x41\xAB\x84\x90\xEB\x8D\x12\x90\xB5\x8E\x42\x90\xD5\x8E\x0C\x21\xAC\x3B\x8E\x84\x92\xE9\x85\x13\x94\x9C\x8F\x0C\x8C\xD1\x8C\x33\xF2\x67\x39\xB2\x19\x63\x08\x06\x16\x96\xE3\x8C\x5A\x91\x94\x8B\x6A\x21\xD9\x3C\x9E\x72\x89\x6A\x86\xEE\x8A\x6E\x8D\xD9\x8F\x97\x8E\x32\x21\xF3\x42\xAE\x76\x9A\x6C\x79\x84\x89\x55\x8F\xCD\x8B\x33\x8C\x02\x16\xE5\xB6\x44\x7D\x92\x03\x9C\x17\x90\x25\x93\xE8\x8B\x3B\x8E\x54\x21\xBB\x40\x85\x79\x9D\x01\x92\xBC\x8F\x07\x90\xB9\x8C\xCE\x8F\x2C\x1B\x9E\x3F\x88\xB5\x76\xF1\x86\xC2\x87\xA1\x8C\xB2\x85\x2E\x89\x78\x21\xAB\x18\x9A\x7D\x8C\xFC\x6B\x47\x8A\xF2\x8E\x35\x90\x52\x90\x6B\x21\x8E\x41\xAD\x85\x8C\xFD\x8F\x16\x95\xBE\x8D\x5C\x91\xFB\x8E\x33\x21\xEB\x38\x87\x56\x97\xD6\x84\x56\x62\x1B\x8D\x5F\x91\xB7\x8F\x1A\x21\xB4\x3E\x9A\x78\x8D\xF8\x8D\xD3\x8E\xE9\x8F\x4F\x8F\xB6\x8C\x1F\x1E\xC2\x2F\xB0\x65\x98\x2A\x79\xAE\x8B\x30\x6F\x6F\x91\xC0\x8F\x57\x1E\xC9\x38\xB1\x86\x86\x05\x99\x02\x97\xF0\x8F\x0A\x90\x03\x8E\xDE\x20\xE4\x3B\xB9\x86\x86\xEF\x8F\x2C\x8F\xF1\x8D\xA8\x8F\x62\x67\x96\x21\xDC\x35\x81\x86\x8C\xFE\x84\xEE\x8F\xC0\x8D\x61\x91\xCB\x8E\x87\x21\x8B\x3C\xA0\x86\x8D\xF0\x89\xF6\x8E\x45\x84\x99\x8E\x74\x7F\x56\x1D\x8E\xBE\x1A\x39\x61\x0F\x96\x07\x96\x5D\x8C\x36\x91\xA5\x8F\xDA\x20\xE0\x3B\x9C\x83\x9D\x03\x97\x0F\x90\xB8\x8C\x38\x91\x9E\x37\xB3\x1F\xB8\x42\xB4\x87\x8A\xFE\x82\x1D\x92\x30\x90\x01\x90\x8C\x87\x06\x20\xF3\x3A\x88\x80\x8D\x01\x99\xC6\x8B\x3B\x91\x7E\x8E\x6F\x89\x44\xF1\x7C\x3A\xAD\xC9\x6F\x0E\x9B\xFD\x89\x38\x93\xED\x8F\x21\x8F\x9A\x21\xBA\x3F\x9C\x86\x9C\xE3\x8E\x19\x94\x78\x8D\x10\x90\xE5\x90\x9D\x13\xB5\xFC\x69\x03\x94\x82\x7E\x1B\x93\x40\x93\x76\x8F\xA9\x90\xB8\x1F\x99\x44\x96\x85\x9B\x10\x97\xE4\x89\xFA\x8E\xEF\x8F\xE9\x8F\x9B\x1D\xED\x43\xA6\x38\x8D\x65\x8D\x41\x64\x42\x90\x00\x91\xE8\x90\x92\x1D\xE4\x43\x83\x86\x9B\xE0\x87\x1E\x90\xFA\x8D\x7A\x90\xE9\x8F\xEB\x21\xC7\x41\x8C\x80\x82\xFE\x88\x6A\x8B\x19\x80\x10\x3C\x14\x6A\x8B\xBF\x36\x44\x92\x80",
"\x90\xF6\x86\x20\x92\x9B\x8D\x2C\x8E\x6E\x8E\xF5\x20\x91\x3E\x99\x87\x93\xF8\x8A\x18\x92\xDB\x8E\xC3\x88\xE2\x8E\x0F\x20\xF4\xC1\x4A\x89\x84\x01\x9E\x0E\x95\xDC\x8A\xF7\x8E\xB0\x8E\xF9\x21\xCD\x3E\xBC\x81\x8C\xDD\x8D\x1F\x97\x0F\x92\x83\x90\xA9\x8D\x10\x21\xD2\xFD\x62\x3C\x81\x01\x90\x90\x88\x3C\x92\x6B\x90\x45\x8F\xE3\x21\xEF\x3F\xB4\x79\x91\xFF\x8E\xDC\x8F\x1E\x8F\x82\x91\x98\x90\xD8\x1E\xD5\x44\x95\x7C\x90\x10\x98\xCE\x54\x06\x93\x5B\x78\x83\x00\x5B\x22\xB7\x40\xA0\x71\x85\x08\x93\x1D\x92\x1E\x93\x6C\x90\x48\x90\x51\x22\x92\x41\x93\x89\x8B\xFC\x89\x0F\x93\xEF\x8F\x25\x91\x78\x8B\x7E\x03\xC4\x9F\x76\x6E\x81\x1C\x60\xE0\x8A\x2C\x8D\xA0\x90\x27\x90\x7F\x21\xEE\x3B\xB4\x6A\x9F\x12\x9E\xA5\x8C\x7D\x8F\xC9\x8D\xEB\x90\x67\x1C\x8C\x44\x83\x7B\x87\x13\x95\xEC\x8D\x7B\x8C\xA4\x90\x84\x8B\x38\x1E\x91\xE1\x54\x34\x8C\xDA\x6F\x54\x87\x71\x8B\x07\x77\xD6\x90\x74\x20\xC6\x36\xAB\x73\x8A\xF1\x8D\x24\x94\xC5\x8F\x36\x8F\x7F\x8B\xB5\x21\xB0\x3C\xAF\x7E\x89\x0C\x9F\x1F\x94\x2E\x92\x88\x8E\x4C\x90\x76\xCB\x25\x3C\x8D\x66\x9F\xE6\x67\x29\x90\x0C\x91\xA6\x91\x77\x90\x9B\x22\xF7\x43\xB3\x7D\x81\x13\x95\xF7\x88\x54\x93\xDD\x8F\xDB\x90\x79\x1F\xBD\x45\x8B\x86\x94\xDF\x8C\x5F\x8F\xC6\x8C\x5F\x7B\xD0\x8C\x10\x1C\xAD\x81\x7D\x78\x88\xE7\x80\x28\x96\x44\x91\x5B\x8E\xCC\x90\x29\x22\xF0\x3F\xA0\x6B\x92\xFF\x82\xAE\x8D\x43\x92\x1F\x8E\xFB\x8F\x80\x1C\xDD\x42\x84\x81\x80\x16\x91\x16\x82\x13\x93\x1B\x91\xE8\x89\x9E\x20\x92\x36\x73\x87\x8F\x13\x96\x56\x89\x4E\x91\x66\x90\x71\x91\x8E\x1E\xE4\x45\x90\x7A\x86\x17\x92\xE9\x88\x46\x93\x92\x8E\xD1\x90\xEE\x21\xE7\x1A\xA4\x4F\x98\x05\x96\x3E\x8D\x66\x79\x5B\x71\x59\x90\x3C\x96\x3A\x41\xB5\x29\x6F\x81\x81\x2B\x96\x6F\x8C\x9C\x91\x64\x91\x06\x21\x96\x3F\x88\x84\x98\xFC\x89\x2B\x91\xD8\x8E\xA8\x91\xA8\x8F\x80\x20\xC2\x5B\x41\x60\x8C\xAD\x8E\x9F\x8C\xA8\x8A\x4A\x84\x50\x76\x30\x15\xED\x44\x80\x00\x0C\x18\x94\x0D\x96\x0F\x8F\xE4\x8F\xA4\x8F\xCA\x22\xDF\x3F\x8C\x8B\x81\xFF\x8A\x20\x96\x1E\x93\xC5\x91\xF2\x8F\xA4\x22\xDD\xC9\x54\x71\x9B\xAF\x8B\x52\x8D\x1C\x91\xBB\x04\xA0\x6F\x9E\x1E\xEE\x23\xA0\x7A\x84\xE2\x8B\x48\x8C\x5E\x92\xD6\x8C\x14\x91\x18\x22\xF8\x45\xA9\x7A\x9A\x17\x9B\xEA\x8C\x5F\x91\xAB\x8E\x7F\x91\x94\x1E\x80\x46\xAD\x47\x9B\xAA\x89\x96\x66\x1F\x90\x1C\x8E\x5B\x8F\x37\xEB\x24\x46\xAD\x83\x89\xF4\x85\x2F\x90\x62\x91\xA1\x91\x83\x90\x87\x22\xF4\x41\xAD\x8C\x92\x12\x95\x26\x97\x1B\x91\xA3\x91\x87\x90\xC6\x1E\x8F\xFC\x48\x7B\x9F\x01\x8E\x41\x8A\x46\x8E\xB1\x8D\x84\x00\x52\x23\x99\x42\x87\x8B\x9E\x12\x99\x32\x90\x4C\x93\xC4\x91\x3D\x90\xFB\x21\xE4\x44\xAF\x8C\x8A\x00\x99\x2E\x93\x08\x92\x8B\x3B\x92\x90\x67\x23\xBD\x46\x8D\x8C\x9C\xEA\x85\x35\x93\x59\x8D\xC4\x90\xD5\x8F\x59\x23\x89\x42\x89\x8A\x8B\x08\x9B\x28\x94\x12\x91\xDD\x91\x21\x91\xE3\x1C\xB4\x24\xB7\x84\x87\x12\x39\x36\x92\x27\x90\x8E\x90\xEE\x8E\x6D\x23\x9D\x45\xA0\x7F\x9F\x14\x95\x31\x96\xDA\x8C\x9E\x91\x0D\x90\x7A\x22\xA7\xD4\x46\x85\x89\xD3\x8C\x00\x83\xC6\x7C\x2F\x8F\x20\x8E\x28\x0E\xEC\xDA\x63\x8C\x9E\x16\x93\x2B\x90\x5C\x91\xD0\x91\x39\x91\xE3\x22\xF5\x44\xBB\x6C\x9E\xF2\x81\x73\x88\x69\x93\xAB\x8E\xBB\x91\x06\x04\xF1\x00\xA0\x85\x9D\x94\x82\x16\x92\xE3\x8D\xCC\x5E\x3E\x2D\x8D\x23\xD0\x42\xA2\x76\x8F\x0D\x94\xF9\x8F\x6F\x91\x1E\x91\xB7\x91\xC2\x20\xCE\x45\x89\x7E\x85\x1C\x9D\x10\x92\x5A\x92\x95\x91\xB0\x91\xA8\xFD\x32\x30\x94\x6B\x7A\x0B\x93\xAE\x72\x64\x20\xE9\x91\x14\x8F\xA6\x23\xB5\x3E\x95\x85\x93\xB5\x8C\x22\x91\xE7\x8C\xFD\x8F\x51\x8D\xE8\x22\xD3\x3B\xAA\x8B\x9A\x94\x8F\x15\x96\x42\x65\x1C\x8B\x61\x6C\xFD\x1C\xDF\xB9\x79\x8E\x87\x0B\x9B\x3B\x97\x61\x92\xDF\x91\xAB\x91\x12\x23\x81\x47\x94\x8C\x83\x1C\x90\x17\x94\x78\x92\x5C\x90\xE3\x91\x7B\x22\xA7\x35\xB4\xAB\x7E\xAF\x82\xF4\x8F\xA9\x83\x44\x8E\xF8\x88\xCE\x23\xBE\x46\x92\x85\x96\x17\x91\x2E\x90\x75\x91\xBE\x90\xD5\x91\xF3\x1F\xAE\x44\xB5\x7F\x9C\x15\x9F\x35\x96\x57\x93\x6E\x91\xC6\x30\xD8\x1A\xF4\xC1\x63\x8F\x9E\x0B\x95\x3E\x95\x6F\x93\x1D\x90\xDF\x91\xC0\x20\xC0\x47\x9B\x83\x82\x1E\x9A\x0A\x90\x5A\x90\x2B\x91\x8C\x91\xAE\x20\x8B\x31\xBF\x4A\x9F\xE8\x6A\xD8\x43\x81\x90\x70\x91\xB5\x91\x31\x1C\x9D\x35\x82\x8D\x9C\x01\x94\x34\x96\x07\x93\x10\x8C\x20\x90\x67\x1F\xC2\x3A\xB2\x88\x99\x62\x89\x30",
"\x81\x6A\x93\xF3\x90\xA4\x8F\x3A\x1D\x9C\x42\x9B\x78\x9E\x08\x9F\x22\x8E\x0A\x90\x1A\x91\x98\x82\x82\x0A\xC9\x32\x81\x74\x51\x0F\x97\xB6\x87\x8E\x8A\xFE\x91\xB4\x90\x56\x23\xB5\x45\xBD\x7A\x97\x15\x9E\xE2\x8D\x72\x92\xE6\x8F\xD6\x91\x41\x22\xD4\x3F\xA3\xD1\x3B\x3B\x8D\x41\x66\x83\x90\x74\x91\x51\x90\xBD\x23\xE8\x47\x80\x8E\x95\x0E\x98\x0A\x94\x82\x90\x31\x91\xB9\x91\xC6\x20\xCA\x48\x88\x8E\x99\xFF\x85\x24\x97\x11\x8E\x84\x90\xCC\x6C\x4E\x24\x95\x44\xA0\x90\x86\xF5\x83\x8F\x8B\x84\x93\x66\x91\x12\x92\x9D\x21\xA7\x48\x9F\x86\x99\x1E\x9D\xF9\x8B\x85\x91\x10\x8E\x75\x80\xAA\xDD\x61\x48\xB7\x88\x90\x22\x98\x32\x90\x82\x91\x36\x90\x09\x92\xFA\x21\xD6\x48\x9D\x83\x9D\x1A\x9A\x1D\x91\x73\x90\x4D\x91\x2B\x91\xFE\x18\xA1\x26\xAE\x90\x9F\x21\x90\x18\x91\x88\x92\x8E\x91\x03\x91\xC9\x11\x89\x44\xAF\x84\x99\x00\x97\x39\x96\x05\x91\xCC\x90\x18\x90\xCB\x19\xBA\x48\xBE\x03\x9C\xFF\x82\x98\x6D\x83\x93\x0B\x93\x93\x91\x31\x24\xE3\x40\xB7\x7B\x8E\x9D\x80\x14\x96\xE4\x8E\x34\x8C\x94\x8F\x82\x16\xB0\x13\x90\x3C\x9F\x07\x02\xF1\x87\x46\x66\x1C\x93\x25\x91\x3B\x21\xF4\x23\xBD\x84\x8D\xB4\x88\xEF\x88\x3F\x89\x39\x87\xE6\x8A\x1F\x1D\xCF\x2B\x8F\xF9\x71\x9A\x84\x53\x87\x74\x88\x58\x25\x4B\x92\xBC\x23\xF5\x48\x92\x91\x9F\x1D\x9A\x3E\x90\x6E\x92\x1E\x92\xFE\x90\x58\x24\xF8\x41\x95\x82\x9A\x07\x97\xDE\x8C\xDB\x7F\xCC\x86\x04\x8C\x68\x23\xB8\x49\xA6\x8F\x8F\x20\x9B\x4B\x91\x82\x91\x2F\x93\xE0\x91\x46\x24\xAE\x3F\x9B\x7E\x8C\x23\x91\x1A\x96\x8D\x91\x4D\x81\xC6\x81\x07\xEF\x1F\x33\xB6\x4D\x9E\xEF\x87\xF4\x82\x09\x91\xD0\x6C\xF1\x91\xCA\x24\x8E\x48\xB6\x87\x96\x23\x98\x1F\x90\x8F\x92\x98\x91\xB8\x91\x4F\x1F\xC1\x49\xBE\x87\x85\x20\x93\x2D\x97\x30\x8F\xD0\x87\x6C\x92\xFB\x1C\x92\x3C\x96\xCB\x62\x36\x5D\x54\x7A\x33\x7A\xAB\x90\x29\x8C\xF9\x23\xFB\x46\x87\x71\x9F\x16\x98\xCD\x8A\x88\x92\xB4\x8E\x22\x92\xBF\x1E\xD1\x49\xAC\x80\x8D\x24\x9D\x20\x96\x8F\x92\x6E\x90\x53\x91\x88\x19\x91\x3C\xB9\x88\x64\x2E\x7E\x4D\x90\x70\x5A\x58\x8D\x53\x92\x5C\x22\xD4\x46\xBF\x8C\x9C\x1F\x97\x3A\x95\x02\x90\x9D\x91\xB1\x8F\xCF\x1D\xB0\x42\xBB\x8A\x99\x13\x90\x3F\x95\x03\x92\x20\x91\x84\x92\x84\x20\xB8\x2E\xB2\x0E\x8D\x28\x9A\xBF\x89\x0A\x8D\x08\x7B\x64\x92\x84\x24\x9A\x45\xA7\x8F\x9E\x27\x98\x02\x90\xA0\x90\xB5\x8E\x81\x92\xD8\x21\xFC\x48\x94\x89\x9D\x28\x9F\x47\x97\x51\x90\x48\x93\x54\x91\x18\xF3\x1B\x41\xB4\x60\x8B\xA7\x61\x2F\x92\x4B\x63\x49\x04\x88\x92\x82\x22\xC1\x3C\x97\x88\x92\x1E\x9A\x22\x94\x7A\x90\x1A\x92\x0E\x91\x6A\x24\x9E\x44\xA9\x90\x82\x02\x9B\x45\x91\x06\x92\xFE\x8E\xD6\x7A\x63\x17\xE9\x2E\x95\x10\x62\x64\x58\xF2\x73\x30\x88\xC1\x90\x85\x6A\x8B\x23\xC4\xCB\x36\x52\x9C\x75\x34\xDB\x31\x95\x90\x82\x89\x55\x92\x53\x20\xAD\x49\x8F\x5A\x9A\xF7\x80\x12\x94\xDF\x8E\x48\x90\x7F\x8F\x9B\x23\xD3\x23\x9E\x8C\x93\x6D\x8E\x34\x7C\xD0\x8D\x2A\x8E\x78\x8F\x5B\x25\x88\xDF\x32\xB8\x38\x01\x92\xEE\x8F\x04\x90\x4B\x90\x2A\x92\x2E\x21\xF6\x25\x9A\x94\x93\x26\x94\x40\x93\x98\x91\x38\x91\x99\x91\xF4\xFD\x2E\x2B\xB6\x8C\x83\x35\x8A\x36\x7D\xD4\x81\x3A\x90\x5B\x92\x01\x01\x71\x4A\xA7\x6C\x53\x2B\x93\x28\x97\x1A\x90\x39\x93\x65\x91\xE6\x24\xCD\x45\xB0\x94\x81\x15\x94\x50\x93\x54\x92\x41\x92\xEE\x90\xC8\x23\xC6\x1B\x16\xC4\x66\xF0\x7F\xDD\x85\xAD\x33\x23\x8B\xEF\x90\x00\x00\x0A\x4B\xA2\xB0\x4C\x2C\x92\x54\x90\xD6\x8B\xBD\x90\xFF\x91\x43\x23\x80\x48\xA5\x8B\x89\x2A\x97\x2E\x95\xAF\x93\xE1\x90\x4B\x90\xB1\x1E\xC5\x2F\xAF\x37\x89\xF6\x84\x11\x97\xAE\x8A\x59\x85\xC1\x6C\xA2\x25\xDE\x0F\x64\x96\x85\x01\x95\x57\x92\x07\x92\x19\x92\x0D\x91\x47\x25\xAD\x44\xBF\x88\x8F\x11\x99\x44\x91\x46\x93\xF6\x90\x5D\x82\x97\x1C\x8B\x7F\x79\x96\x98\x97\x4B\x5B\x95\x4B\x91\x08\x93\x7F\x8D\x36\x1F\x84\x3B\x82\x6C\x87\x2C\x83\x3C\x92\xA6\x90\xA3\x90\xBF\x92\x60\x23\xB1\x4B\x99\xB4\x6F\xF7\x82\x32\x93\xB9\x91\x64\x4B\xE6\x92\x12\x25\xFB\x47\x86\x92\x92\x13\x96\x51\x91\x75\x90\x46\x92\x3B\x91\x2E\x23\x95\x4B\x98\x8C\x8F\x24\x93\xC5\x8F\x4C\x8E\x49\x85\x71\x90\x35\x23\xC9\x42\xB7\x28\x07\x92\x82\xD3\x71\x49\x8B\xA9\x79\x23\x31\xDE\x25\xD9\x33\x60\x97\x95\x06\x9B\x4C\x93\x9C\x91\x33\x93\x3B\x92\xCF\x24\x93\x48\x93\x96\x8F\x16\x9E\x3E\x90\x37\x93\x65\x93\x07\x91\xF2\x23\x97\x3E\x9C\x2B\x0B\x5F\x81\x4F\x92\xB0\x74\xAB",
"\x8C\x86\x77\x1F\x18\xBC\x46\x83\x04\x19\x2F\x99\xFE\x4B\xBF\x92\xC9\x91\x5C\x92\x99\x24\xE3\x3D\xBB\x88\x9B\xF2\x8D\x23\x90\x03\x93\x9D\x91\x8D\x92\x98\x23\xB4\x4A\x87\x94\x8D\xF7\x81\x5D\x8D\x9C\x8C\x6D\x85\x6F\x6E\x14\x26\xBF\x3D\x56\x98\x95\xC5\x80\x43\x94\x56\x93\x21\x92\x27\x91\x05\x20\xD0\x44\x9B\x8D\x8A\x14\x96\x5D\x96\x70\x92\xF6\x90\xD8\x91\x5F\x0B\xD5\x45\xB2\x01\x83\x39\x81\xC1\x87\x31\x93\xAA\x8C\x27\x8C\x87\x20\xD0\x30\x8A\x49\x9E\xF1\x86\x10\x01\xC5\x93\x01\x51\x15\x93\x4F\x19\x98\x4C\xAE\x98\x84\x2F\x9D\xFC\x8E\x02\x90\x97\x8E\xB2\x8F\xAC\x23\xBD\x36\xAE\x8E\x80\xFE\x88\x63\x97\xCF\x8D\xD5\x8E\xFA\x91\xDF\x23\xEF\xFC\x6E\x7C\x97\x1F\x9B\xF5\x8B\xC2\x90\xAF\x38\x24\x93\xA4\x1B\x98\x49\x8B\x99\x87\x2D\x95\x5E\x97\x7F\x93\x79\x93\xD5\x91\x7B\x25\xC8\x48\x94\x93\x8C\x0F\x97\x5C\x95\xDF\x41\x85\x8A\x6D\x8C\x46\x26\xE4\x41\x60\x99\x96\xE0\x8C\x4F\x92\xCE\x8C\x93\x93\xF2\x90\xCE\x1F\xCF\x4C\x99\x94\x8C\x24\x90\x62\x96\x91\x93\x81\x92\x34\x91\x1A\x24\xFD\x3E\x90\x0A\x6A\x2E\x9F\x65\x93\xE4\x35\x03\x93\x89\x92\xE3\x25\xE4\x4C\x8D\x99\x97\x28\x97\x01\x90\xCA\x91\x9A\x92\x29\x93\xC5\x25\xFF\x45\x96\x93\x97\x1B\x45\xD4\x88\xBF\x91\xA1\x93\xAE\x92\x8F\x23\xC0\x46\x84\x95\x9F\x2D\x9B\x22\x91\xB8\x92\xF5\x90\x01\x92\xD8\x23\xAE\x4B\xB7\x98\x8D\x2A\x91\x49\x92\x06\x90\x83\x79\xC1\x48\xB1\x18\xC2\x26\x85\x99\x97\x34\x94\xF5\x33\xE2\x74\x9D\x93\xD2\x91\xFD\x24\xAF\x4C\xB6\x8A\x8F\x12\x98\x2B\x94\x7D\x92\x6D\x91\x02\x93\xD1\x22\xEC\x49\xB2\x01\x4C\x22\x94\x84\x69\xCE\x91\x28\x8A\x43\x93\x74\x25\xF5\x3D\x9A\x92\x9D\x08\x92\x56\x95\x0A\x92\x50\x91\x2B\x90\x69\x20\xA5\xA8\x5C\x82\x78\xC6\x8E\x09\x74\xD0\x90\x97\x37\x48\x36\x4C\x22\xB2\x4D\x83\x91\x94\x35\x95\x44\x96\xD6\x92\xAE\x90\xBE\x92\x1C\x25\xBA\x4D\xB1\x8F\x99\x2F\x65\x68\x8A\x48\x84\x3D\x70\x5F\x93\xAB\x14\xC0\x4D\x8D\x96\x90\x0D\x9C\x52\x97\xAE\x92\x4B\x92\x15\x90\x03\x26\xD5\x4B\xAA\x93\x86\x13\x9F\x67\x95\x54\x91\x03\x90\x4B\x8B\xFF\x18\x90\x3F\x9E\x99\x8F\x36\x9E\xED\x77\xC2\x91\x7F\x92\x00\x8E\xFF\x25\xE5\x49\x81\x98\x99\x23\x99\x6E\x95\x82\x90\xAE\x93\x0B\x92\xEC\x25\xD3\x3E\x85\x93\x82\x42\x82\xDB\x8D\x92\x92\x6D\x60\x70\x93\xBE\x14\xE2\x4D\xA5\x96\x8E\xFF\x8A\x68\x90\xCF\x92\x93\x93\x0E\x93\x8E\x26\xFC\x4C\x98\x9B\x81\x31\x9A\x6D\x96\xA3\x90\xE5\x82\x94\x82\xDA\xCE\x08\x4E\x88\x53\x98\x34\x94\x47\x91\xC3\x92\x5D\x92\xB6\x90\x78\x25\xEE\x42\x96\x9B\x96\x18\x9A\x5E\x90\x66\x91\xBB\x93\xF3\x8F\x1E\x20\xCD\x2D\xAB\x89\x86\x1B\x85\xA7\x62\xE3\x93\x2B\x8A\x85\x93\xBC\x25\xC2\x4D\x9A\x98\x88\x24\x92\x29\x8A\x91\x92\x5E\x92\x89\x93\x6A\x26\xA2\x4D\xAD\x91\x8D\x33\x9E\xB2\x8F\xA9\x91\x95\x62\x3F\x91\xAF\xCF\x2B\x4D\xB4\x9B\x82\x72\x71\x73\x90\xE4\x8F\xCC\x92\x18\x93\x08\x22\xB2\x4C\x8B\x92\x9F\x30\x93\x71\x96\xCF\x92\x88\x92\xCC\x92\x08\x25\xEF\x49\xBF\x85\x7F\xCA\x8C\x09\x93\x21\x34\x8A\x92\x56\x93\x8C\x6E\x19\x4D\x94\x94\x9B\x34\x98\x5A\x94\x84\x92\x6A\x93\x7D\x91\xAC\x25\xFD\x45\x91\x9A\x89\x1A\x93\x69\x96\x73\x8B\xA9\x90\xA2\x87\x8B\x13\xDC\x1E\x8D\x4E\x82\xAE\x87\x4F\x97\xA4\x92\xD0\x93\x76\x37\x5D\x6E\x51\x4D\xB7\x99\x9B\x30\x95\xEE\x8E\xE6\x90\xA5\x89\x28\x93\xA3\x1C\xDB\x42\x8A\x76\x90\x2D\x95\x73\x8E\xC9\x8E\x2A\x83\x07\x84\xFF\x0C\xF1\x40\xBD\x5C\x9C\x3E\x3E\x72\x92\x4D\x47\x9C\x93\x8B\x8E\xB0\x26\xF6\x4C\x8D\x9C\x94\x3B\x96\x1E\x96\xEE\x91\x28\x8E\xBC\x93\xE9\x1E\xFA\x4E\xAB\x7B\x95\x32\x98\xBC\x8B\x0D\x90\xC8\x7E\x56\x78\xD8\x22\xBC\x3C\xB4\xBA\x45\x3C\x9E\xE2\x47\xF0\x90\x9C\x8F\x13\x91\x5B\x27\xC3\x43\x91\x97\x8E\xF8\x84\x39\x93\xE4\x92\xE5\x91\x3E\x93\x05\x25\xCF\x4E\x88\x98\x9C\xCA\x86\x79\x96\x73\x82\xEF\x81\x07\x8E\x98\x0F\xBD\x4A\xB9\xA8\x47\x49\x0C\x79\x95\xE2\x46\xE7\x93\xE4\x8F\xA0\x27\x89\x4D\xBD\x8F\x85\x33\x99\x5A\x97\xCC\x91\x00\x93\xE1\x92\x03\x24\xD9\x4D\x98\x97\x86\x20\x9C\x27\x92\x4B\x6F\xC0\x91\xB4\x86\xAF\xF5\x35\x41\xA9\x79\x88\xBB\x8E\x5A\x7D\x5D\x85\x02\x8B\x8A\x90\xC5\xD0\x0E\xA1\x53\x53\x9A\x44\x81\x12\x6C\x87\x88\xF4\x93\x80\x00\xDF\xE1\x7C\xB4\x18\xA4\x41\x61\x70\x14\x6A\xFB\x7E\x99\x40\x50\x00\xB9\x14\xF4\x2D\xAE\x35\x1A\xD5\x1C\xFE\x7C\x9A\x80\x25\x72\x84\x5D\x7B\xE9\x74\x1A\x98\x7F\x31\x4A\x77\x4A\x8B\x84\x00\x3E\x2C\x88\x71\x75",
"\xE7\x46\x84\x65\x0C\x10\xFF\x76\x6D\x83\x84\x72\xEF\x0B\xBD\x86\x80\xFC\x60\x7B\x46\xA6\x5B\x8B\x6E\x64\x85\x76\x8F\xF8\x93\x27\x27\xE5\x27\xC0\x25\xA7\x9F\x93\x3F\x9A\x20\x6C\x19\x8B\x26\x73\x92\x01\x83\xD0\x7C\xE3\x16\x34\x32\x32\x85\x7D\x91\xE5\x52\x5D\x06\xA8\x88\xA4\xAA\x79\x07\xBD\x08\x99\x2A\x99\x7B\x37\x9D\x88\xAB\x76\x89\x77\x8B\xED\x1F\x4F\xB5\x99\x8B\xFE\x83\x77\x94\xE6\x93\x27\x8E\xC7\x93\xE7\x1E\x90\x4F\xA6\x7D\x92\x3C\x98\xF6\x8B\xEF\x89\x9F\x8E\x47\x83\x8D\x72\x43\x1F\x91\x1A\x8B\x49\x84\x81\x94\xFB\x32\x05\x95\x88\x77\x1F\x10\xAE\x4D\x88\x9E\x90\x1E\x91\x6B\x95\x03\x94\xD2\x93\x44\x92\x4A\x27\xB7\x4E\x8C\x9D\x99\x39\x92\x7C\x97\xB5\x90\x00\x8D\x13\x94\xD4\x0B\xA9\x50\xB2\x36\x99\x5B\x82\xA0\x8B\x78\x87\x16\x8E\x75\x90\x01\x01\x2F\x50\x89\xB6\x78\x40\x93\x01\x97\x38\x8A\x07\x94\xC2\x90\x20\x28\x86\x43\xA2\xA0\x88\x0C\x9D\x83\x93\xD4\x90\xDF\x93\x94\x93\x4C\x23\xB1\x62\x74\x7A\x9F\x07\x97\x6B\x85\xF6\x8A\xC8\x90\x25\x94\xA6\xED\x4C\xDB\x53\xBA\x6F\x35\x94\x83\x92\xF1\x93\xEE\x93\x45\x93\xE6\x25\x8D\x4D\xBB\x99\x9B\x41\x90\x69\x93\xCD\x92\x90\x91\x2B\x94\x89\x23\xE2\x46\x92\x84\x82\x5D\x86\xC8\x8B\xF9\x8A\x2B\x8B\xC4\x50\x27\x09\x60\x50\xB8\xB6\x7E\x73\x76\x21\x96\xB4\x93\x19\x94\x87\x93\x8C\x26\xFA\x4C\xA8\x97\x9C\x1A\x9B\x6E\x96\x6B\x93\xF0\x93\x76\x92\x6E\xB5\x5F\x2F\xAA\x76\x7A\x43\x99\xE0\x76\x2D\x6F\xB8\x93\x28\x92\xE5\x26\xA0\x4E\xA7\x9B\x96\x0E\x9D\x6F\x97\x8A\x91\xC9\x92\xBA\x91\x56\x28\xC4\x49\xA9\x89\x8B\x42\x6C\x5D\x92\xDE\x92\x40\x00\x46\x94\x7D\xEE\x0E\x51\x8B\x9C\x8E\xE5\x81\x89\x92\x36\x91\xC8\x92\xDA\x90\xA6\x27\xC7\x48\xAD\xA1\x9A\x39\x95\x4D\x96\x04\x97\x7E\x8D\xCB\x8B\xEF\x25\xC7\x42\xB1\x97\x85\xC0\x88\x93\x66\xE0\x8C\x53\x8D\x4F\x94\xDC\xEE\x7C\x50\xA3\x91\x99\x01\x97\xEA\x8C\xD3\x92\x51\x93\xAF\x93\x45\x23\xE1\x4E\x87\x8D\x83\x3B\x9F\x3A\x94\xD4\x91\xEC\x91\xEE\x91\xEF\xC4\x75\x47\xBF\x33\x91\x30\x9C\xC5\x88\x17\x95\x53\x7F\x7A\x93\x2C\x26\xE2\x4C\x91\x8F\x82\x3D\x93\x3D\x90\x78\x8D\xF5\x90\xDE\x8F\xA0\x26\xBB\x3E\xAC\xA2\x8C\x33\x94\x79\x90\x80\x79\xA5\x8C\x13\x93\xD3\x15\xB4\x5D\x60\xA2\x81\xDB\x61\x83\x91\x03\x94\xEE\x93\x0D\x94\x05\x22\xD2\x4D\xBF\x93\x94\x36\x91\x50\x91\x15\x96\x34\x92\x1E\x94\x14\x27\x87\x51\x87\x8F\x8D\x7F\x78\xAA\x8E\xBC\x8A\x36\x92\x07\x93\x40\x26\xAD\x35\xA2\xA3\x99\x45\x92\x8A\x95\xE8\x90\x14\x91\xA3\x93\xB3\x26\xB1\x4C\xB5\x9A\x93\x31\x94\x38\x95\xC6\x91\xF1\x91\x8A\x93\x35\x25\xF4\x51\xB3\x8F\x8E\xE8\x8A\xCF\x8C\x0D\x91\x8E\x8E\x2D\x93\xF9\x1B\xA7\xC0\x73\x4D\x7A\xC6\x83\x8E\x92\x1E\x6D\x3F\x94\xE7\x92\x64\x24\xB2\x38\x84\x87\x9C\xF0\x8E\xD3\x8E\xC3\x8F\x52\x84\x10\x91\x54\x1A\xE6\x2A\x7B\x61\x8B\x44\x9C\x8F\x92\xA1\x75\xB0\x92\xA3\x93\x1F\x27\xA6\x51\x93\xA2\x95\x22\x95\x89\x93\x8F\x91\x21\x95\x3E\x92\xAA\x27\x80\x4D\xA4\x58\x8D\x0E\x9A\xD8\x45\x22\x95\x8D\x6E\x5D\x94\x87\x26\xE2\x4B\xAB\x94\x8A\x47\x9D\x52\x94\x1D\x97\x4B\x92\x77\x94\x03\x25\xA8\x4F\x96\x96\x91\x49\x9E\x6E\x90\xC7\x8A\x77\x90\x09\x93\xCE\x28\xB9\xEB\x57\xA4\x81\x2F\x90\x44\x93\x27\x96\x0D\x95\x80\x94\x49\x27\x83\x52\x8B\x9D\x89\x2F\x92\x94\x93\xBD\x93\xC9\x92\x48\x92\xC0\xF0\x26\x4D\xA6\x95\x6E\xB2\x81\x2B\x8E\x9D\x89\x49\x95\xE1\x6C\x39\x29\xCD\x52\x8C\x93\x85\x45\x94\x1D\x93\x25\x95\x5E\x93\xBB\x93\x8F\x26\xF9\x4E\x93\x99\x9C\x0A\x9B\x44\x97\xCB\x8A\x81\x77\x9B\x75\x36\x29\xED\x17\xA5\xA3\x8D\x42\x93\x00\x97\x06\x95\xCD\x93\x1C\x94\x68\x29\xB8\x4E\xAB\xA2\x95\x42\x9B\x73\x95\x1B\x95\xC0\x91\x6B\x8C\xF6\x04\xCD\x4D\xB4\x83\x71\x4B\x99\xE3\x88\x27\x97\x49\x95\x7F\x94\x29\x29\xE5\x52\xBE\xA4\x88\x37\x90\x94\x91\xA6\x93\x4B\x95\x99\x92\x08\x29\xA3\x4C\x9C\x9B\x97\xFE\x80\x31\x8C\x22\x97\x57\x95\x6D\x76\xBB\x28\xBD\x4B\xBD\xA2\x9D\x3A\x97\x46\x90\x18\x96\x09\x92\x9D\x8F\x28\x24\xA4\x50\xAA\x90\x9C\x39\x9E\xA4\x82\x90\x90\xBC\x8E\xC2\x94\xC6\xE4\x60\x52\x87\xA6\x82\x03\x90\x90\x93\xDA\x92\x40\x95\x6A\x93\x04\x29\xED\x47\x86\xA4\x8F\x1F\x91\x99\x90\xEA\x93\x92\x8A\x49\x92\xE3\x9A\x6D\x95\x48\x89\x83\x4C\x97\x99\x97\x94\x75\xC7\x93\x31\x93\x7F\x28\x8C\x4F\xB9\x99\x90\x38\x9B\x86\x94\x2A\x95\xD3\x93\xD4\x93\xB5\x29\xAB\x4F\x96\x7F\x8B\x83\x7F\x7B\x86\x24\x91\x12\x95\xDE\x94\x70\xED\x3F\x53\x93",
"\xA3\x8C\xF8\x83\x7A\x95\x38\x93\x98\x91\x74\x92\x97\x28\xD9\x48\x86\x97\x9E\x4B\x9B\x34\x94\x71\x8D\x42\x70\xC7\x8D\xCD\x28\xCF\x53\x8F\xA3\x84\x3A\x98\x91\x94\x17\x95\x19\x92\xCE\x94\xC0\x25\x9E\x53\xA9\x91\x80\x4D\x9B\x46\x93\x1B\x97\x1B\x94\x4D\x94\x63\x1E\xAF\x31\x9D\xFB\x62\xCB\x88\x9A\x95\x2D\x6E\x49\x95\x47\x94\xBA\x24\xE4\x52\x86\x8A\x87\x45\x98\x28\x91\x36\x97\xAD\x93\xD9\x94\x06\x26\xC4\x52\xA8\x9C\x9F\x28\x92\x75\x96\xAF\x80\xD5\x93\x9D\x92\x4C\xB3\x49\x1E\x84\x99\x9E\x4A\x93\x9E\x92\x06\x96\x06\x95\xC4\x93\x1C\x28\x8B\x4F\x8F\xA1\x9C\x11\x91\x85\x90\x3D\x93\x14\x94\xF5\x90\x6E\x28\xDA\x48\xB0\xA1\x8B\xE0\x85\x04\x90\xA7\x92\x3C\x93\xC8\x81\xAB\x0A\x95\x3C\x9F\x73\x75\x4F\x9E\x11\x8F\x3E\x97\x28\x94\x95\x90\xFA\x29\xD8\x46\xBC\xA7\x9A\x1A\x93\x95\x94\x10\x95\x76\x94\x61\x92\x3E\x28\x8E\x45\x91\x9D\x95\xDF\x8E\x57\x80\xF0\x90\x49\x92\xE8\x80\xCD\x1B\xC4\xCB\x24\xA8\x87\xD3\x6B\x94\x94\xBF\x92\x38\x92\x7C\x93\x29\x2A\xE9\x47\xAB\xA8\x82\x1C\x9E\x9F\x97\xDA\x90\x3C\x94\xA7\x93\xC9\x29\xB2\x52\xBD\x9D\x8C\x17\x91\x16\x91\x76\x82\xB2\x85\x7F\x86\xDB\x22\xFB\x42\x89\xA5\x97\x40\x93\x97\x92\xEE\x92\x84\x94\xBB\x94\x1F\x28\xF8\x52\x8F\x9E\x89\x4B\x91\x79\x93\x2D\x97\xDE\x92\xF8\x94\x33\x2A\xBA\x4C\xBF\x85\x70\xF2\x8F\xCF\x82\xCA\x8F\x27\x91\x93\x00\x3B\x2A\xC2\x21\xBD\xA8\x96\x37\x9F\xA3\x93\xF0\x8D\x90\x95\x29\x92\x66\x29\xA2\x4E\x85\xA9\x84\x39\x95\x95\x96\xE4\x92\x80\x94\xAC\x94\x68\x0C\xDD\x48\xAA\x31\x86\xF3\x86\x84\x81\xE4\x7C\xCD\x79\x64\x78\x52\x25\xEB\xBC\x71\x6A\x7D\xA0\x2C\x3B\x76\x01\x76\x05\x6D\xEC\x93\xD0\x5C\x77\x29\x94\xA9\x88\xD3\x6E\x86\x4A\x61\x93\xCD\x75\x7D\x8A\xC3\xE8\x7B\x21\x9B\x19\x76\x52\x91\x9C\x93\x42\x94\x87\x93\x0A\x95\x3E\x22\x97\x54\x80\x89\x99\x50\x9B\x9D\x90\x97\x8C\x60\x92\xAF\x90\x48\x21\xAB\x50\xA0\x8C\x8D\x41\x97\x92\x00\x52\x97\x96\x7C\x62\x74\x93\x2A\xDE\x4A\x9C\x48\x80\x2B\x98\x2E\x8C\x86\x92\xBA\x89\x10\x89\xCE\x15\x9B\xBE\x5F\xAA\x89\x12\x81\xAA\x95\xA8\x89\x61\x93\xA3\x8A\x6C\xF3\x70\x3D\xA6\xAA\x86\xD3\x72\xA9\x91\xD6\x60\xA5\x95\x8A\x92\x68\x28\xE6\x4C\xAA\xA1\x83\x44\x94\x63\x97\x31\x97\x75\x93\x18\x95\xD9\x25\xA4\x4C\x96\x68\x9D\x07\x9E\xDD\x85\xD6\x8C\x40\x90\x67\x55\x7C\x5A\x3B\x55\xAE\xE9\x63\x47\x7A\x51\x67\x57\x94\xD7\x92\xDE\x93\x5E\x27\xBE\x4F\xAB\x96\x8C\x4F\x9A\x54\x92\x34\x94\x53\x93\x0D\x95\x7F\x09\xF2\x50\x84\x72\x94\x90\x83\xBA\x86\x0E\x96\xB6\x66\x69\x95\xDE\xFF\x28\x55\xBE\xAA\x8A\x55\x9B\x22\x8C\x55\x97\x6D\x8A\x57\x95\xB9\x15\x9E\x3A\xAE\x65\x87\x9D\x7C\xE4\x8C\x36\x61\x72\x92\x7A\x70\xE8\x2A\xDB\x07\xBD\xAA\x95\x56\x9C\xAE\x92\x47\x8A\xBB\x94\x5B\x89\x1C\x29\xC6\x43\x9E\xA4\x97\xAA\x80\x92\x95\x5E\x95\x77\x95\xCD\x8A\xA4\x2A\xA7\x02\x39\xAB\x8C\xD5\x74\xAD\x91\xB5\x62\xB5\x94\x6A\x94\x45\x25\xD6\x51\x9E\x9A\x98\x46\x90\x7C\x91\xD4\x90\x5F\x95\x56\x94\xC8\x20\xB3\x55\x9C\x8F\x88\x0A\x94\x8B\x96\x7A\x7B\xF6\x85\x21\x93\xDC\x22\x83\x02\x0B\xAC\x9E\xD6\x7D\xB0\x91\xBC\x1C\x5D\x94\x67\x67\xC2\x29\x8F\x4E\x98\xAA\x9E\x30\x96\x9C\x97\x48\x94\x72\x94\x79\x94\xDB\x26\x81\x4B\xB3\x0A\x89\x46\x99\x65\x91\xE7\x80\x84\x93\x8D\x8F\x09\x01\x23\x56\xAC\xEB\x65\x59\x9A\x56\x67\x61\x94\x75\x95\x6A\x94\x37\x1F\xD7\x51\x98\x85\x86\x1A\x9A\x15\x96\x4B\x97\xE4\x92\x63\x94\x82\x1C\xC4\x05\x96\x6A\x91\x48\x9F\xF2\x8F\x16\x95\x40\x00\x9D\x95\xE6\x03\xEA\x55\xBC\xAB\x9A\x3A\x9A\x7B\x90\x58\x94\x20\x95\x34\x94\x82\x28\xE8\x4C\xBA\xA5\x8A\x4B\x94\x8C\x94\xCA\x90\xD2\x94\x2B\x93\xC8\x28\x86\x25\x8D\xA9\x82\x73\x81\xA8\x8A\x32\x90\xAD\x56\xA8\x95\xEA\xC5\x52\xD0\x53\x16\x7E\x59\x92\x43\x93\x23\x94\xBC\x95\x8E\x8E\xB0\x2A\xB1\x49\xB0\x25\x9F\xC5\x65\x01\x78\xCB\x92\xB0\x8C\xF0\x91\x9F\x12\xAB\x43\xAA\x7E\x45\x55\x94\xAF\x7C\x52\x71\xAA\x94\xAA\x95\x4E\x29\xD7\x54\x90\xA5\x98\x41\x92\x95\x92\x07\x95\xCB\x95\xBD\x94\xF1\x28\xC8\x55\x84\x9F\x82\x70\x88\x40\x95\x37\x92\xF1\x8F\xA7\x95\x7D\x2B\x9B\x6F\x31\x18\x60\x5C\x93\x96\x94\x27\x96\xB9\x93\xC5\x94\x94\x28\x8D\x53\x94\x96\x95\x53\x98\x89\x95\x2F\x97\xD7\x95\xA5\x3D\x34\x29\xB6\x83\x68\xAD\x9F\x2F\x6A\xB6\x90\xCF\x61\xBF\x95\x32\x89\xFF\x2A\xA2\x2B\x81\xAC\x97\x4E\x97\x1C\x95\x60\x8C\x6D\x94\x98\x95\x16\x27\xDE\xCA\x47\xA5\x81\x4F\x90",
"\x00\x03\x74\x97\xA1\x70\xA9\x95\x0E\x2B\xA7\x57\xB9\x49\x89\x5D\x92\xC9\x85\x5E\x89\x5E\x94\x36\x94\x5C\x2B\x9C\x55\x92\x9A\x84\x4D\x9B\xA5\x80\x37\x95\xC0\x6C\xAE\x94\xAE\x0C\xB5\x57\x91\xAE\x99\x30\x6F\xB7\x92\x3A\x95\x0D\x94\xC1\x95\xAE\x29\xD1\x52\xB0\xA6\x8D\x51\x95\xAC\x97\x45\x97\x3A\x92\xD8\x95\x7A\x07\xEE\x52\x95\x6D\x8A\x5E\x9A\xAB\x7C\x14\x75\xF3\x95\x3E\x94\x0C\x27\x95\x55\x98\xA9\x90\x42\x9A\xA5\x91\x04\x94\x97\x95\x11\x94\x46\x2B\xA5\x50\x9C\xA7\x80\x83\x76\xBC\x96\x61\x6F\xA9\x7E\xE7\x94\xDC\x2B\xA3\xD1\x7E\xAD\x8B\x57\x94\xB9\x96\xBF\x93\x9B\x94\x5E\x92\x43\x2A\xEB\x47\xB3\xA9\x87\x3D\x97\x9C\x93\x28\x95\x92\x95\xA2\x94\xCB\x29\xA3\x44\x83\x6D\x8F\x5C\x91\xBF\x91\x52\x97\x3B\x75\xEF\x95\x99\x29\xB2\x4E\x89\xA6\x9B\x4F\x91\xA7\x90\x15\x97\xFE\x94\x55\x94\xC1\x2B\xEE\x53\x9A\xA8\x80\x53\x9F\x6E\x91\x90\x93\x60\x73\x3A\x65\xB6\x2B\x93\x20\xA9\x1B\x6E\x5E\x96\x86\x96\x6A\x95\xCA\x95\x40\x94\xC4\x29\xC4\x55\x85\xA4\x86\x56\x96\x63\x96\x73\x94\xB8\x95\x52\x93\x3E\x27\xEF\x60\x68\x6D\x99\x1B\x92\xB2\x93\x79\x94\x05\x89\x62\x62\x6C\x2B\xC3\x4D\xB3\x90\x85\x36\x9F\x11\x96\x9C\x86\xA4\x8A\x74\x86\x34\x01\xCC\x42\x91\x3C\x8D\x4E\x9C\xC2\x92\x20\x01\x06\x96\x49\x63\xDE\x2B\xF4\x57\x9C\xB0\x91\x50\x92\xBE\x93\x70\x97\x5D\x95\xC2\x95\xBF\x2B\x87\x57\x91\xB0\x97\x58\x9C\x8D\x97\x73\x96\x37\x94\xEF\x94\x65\x03\xCE\x0F\xB0\xB7\x5F\x61\x9A\x6C\x63\x7E\x97\xD4\x95\x21\x96\xE9\x28\xCF\x52\x91\xAF\x84\x5C\x93\xBD\x96\x70\x96\x8B\x94\xCE\x95\xDA\x29\xC3\x57\xAB\xAF\x9C\x07\x8D\xBE\x94\x9D\x84\xD0\x92\x8F\x7A\x2D\x2C\xDD\x57\x96\xB1\x99\x5D\x95\xBF\x90\x48\x96\xE5\x94\x49\x94\x98\x2B\xAC\x52\x9A\xAE\x84\x30\x90\xA0\x91\xD7\x90\xF6\x94\xC9\x94\x04\x2A\xD8\x49\x93\x9D\x87\x84\x7C\xEE\x7A\x2C\x8C\x15\x97\x78\x71\x41\x2C\xD7\x58\xA0\xAF\x84\x45\x9F\xC6\x92\x25\x95\x1C\x97\xB3\x94\x5B\x2A\xDB\x56\x9D\xA9\x9D\x5A\x9C\x96\x96\x89\x94\xC7\x8B\xB3\x93\xF0\x24\x8E\x52\xAA\x8A\x8B\xB8\x8C\x2A\x97\x9F\x85\xDB\x93\x2F\x6C\x39\x2B\xAE\x58\x9B\xB0\x83\x64\x98\xA2\x95\x90\x96\x62\x95\xD7\x94\xED\x28\x8F\x58\xAF\xA3\x88\x5C\x98\xA4\x97\x8E\x96\x6D\x94\xD6\x93\x7E\x27\xA8\x1A\xB6\xA8\x95\x3A\x95\x3A\x88\x64\x96\x94\x94\xC8\x95\x6A\x2C\x92\x57\x88\xB0\x81\x4B\x95\x48\x91\x70\x95\x11\x97\x2D\x96\x47\x2C\xDD\x58\x89\xB1\x9F\x62\x9D\xBF\x96\x2A\x97\x9D\x95\x40\x90\x1C\x2A\xCC\x54\xB4\x8E\x8E\x52\x93\xF8\x84\x95\x96\xE8\x59\x1C\x95\xB9\x67\x7F\x58\x98\x18\x78\x5D\x96\xB2\x91\x86\x95\x6B\x95\x75\x94\xA0\x2C\xBF\x52\xA2\xB2\x81\x4A\x9D\xCB\x96\x4E\x97\xFF\x95\x01\x95\xC1\x2C\xB1\x41\x99\x82\x81\x9F\x4F\x2E\x91\x39\x86\x99\x94\x79\x91\x0A\x2B\x9A\x59\x93\xAE\x98\x62\x99\x23\x92\x8B\x94\x34\x96\xE9\x95\xA1\x2C\xD4\x57\xA3\xB0\x96\x5E\x9C\x6E\x97\x97\x96\xC0\x93\x57\x90\xC6\x27\xCE\x33\x97\x95\x88\xF3\x89\xC2\x8A\xCD\x8F\x73\x8D\xD2\x7D\xB6\xD0\x34\xFA\x69\xA3\x54\xEA\x7E\xD5\x7C\x75\x70\x58\x5F\x2B\x73\xFA\x0A\x95\x14\x84\x9D\x26\x3B\x7B\x07\x8F\xCB\x73\xBF\x73\x3B\x73\xEA\x0D\x0D\xCD\x5D\x9B\x6A\x3C\x7D\xFE\x7D\xD9\x73\x21\x7E\x4D\x84\x90\xE7\x05\x22\xBD\x22\x0E\x3B\x7A\x3F\x8D\x94\x7D\xC7\x05\x6B\x3A\x43\xF7\x04\xC8\x21\xF1\x6A\x68\x9A\x6C\x74\xA1\x97\x4A\x89\x4B\x7A\x02\xE3\x21\xF1\x53\xD5\x70\x09\x0F\x77\x73\xB0\x07\x03\x04\xF5\x81\x95\xF7\x3B\xCE\x43\x7C\x2B\x34\x79\xD0\x91\x45\x60\x41\x97\x22\x17\x0E\x2D\xF3\x90\x5B\xD6\x65\x69\x93\xD1\x92\xF2\x73\xD2\x73\x15\x71\x9C\xE6\x2C\x5A\x9B\xA7\x62\x40\x99\x78\x73\xF7\x12\x94\x83\x98\x96\x95\xC8\x33\x5A\xB7\x9C\x73\x49\x0C\x7C\x94\xCA\x7B\xC9\x72\x00\x00\x59\xE7\x1E\xCD\x40\x00\x1C\x35\x74\xE0\x82\x84\x82\xCB\x72\x8F\x96\x30\xE7\x40\x5A\x81\x04\x0C\x6A\x97\x7E\x79\xA2\x95\x23\x82\xC0\x73\x44\x2D\x9C\xA1\x67\xE7\x24\x36\x76\x6C\x74\x63\x86\x00\x8B\x56\x39\x2F\x2D\xE5\x9D\x0C\x9E\x61\x08\x0F\x6C\x73\xA4\x95\x00\x8B\xAB\x96\x26\x2D\x9C\x02\x28\x19\x90\x3B\x7A\xDF\x07\xB8\x7A\x52\x97\x4C\x84\x26\x12\xDF\x5A\xBC\x14\x1E\x69\x93\x74\x76\xE3\x72\xB8\x72\x72\x7A\x55\x05\x34\x5A\x85\x9A\x74\x68\x9E\x8E\x81\x17\x86\x7E\x06\xDC\x7A\x4A\x2D\xB2\xCF\x71\xB5\x84\x82\x83\xD7\x95\x0E\x07\x4F\x97\xB1\x96\x00\x00\x02\x5B\xB6\xDF\x76\x6A\x9B\x13\x89\xAD\x95\x66\x74\x61\x88\x81\xBB\x07\x5A\x83\x9E\x55\xBE\x7C\xD1\x96\xD6\x70",
"\x5D\x96\xF1\x7F\x52\x2D\x84\x4F\x78\xB5\x93\x29\x0A\xD7\x92\xDF\x70\xC9\x6D\x31\x7E\x4D\xE7\x7A\x1B\x19\xB4\x8C\x3D\x35\x72\x7D\xB2\x95\xD0\x73\xCB\x96\x8B\xE7\x76\x5A\xB6\x99\x62\x6A\x91\x79\x71\xAB\x95\x45\x97\x94\x96\x97\x07\x57\xE9\x27\xDB\x73\x3E\x36\x6B\x7E\xB4\x97\x40\x96\xAA\x73\x82\xE6\x32\xCE\x5B\xB6\x84\x69\x93\xD4\x97\xDA\x01\x51\x96\x08\x7E\xB1\x2D\xFA\x1B\x12\xD9\x78\xFE\x24\x64\x7E\xB6\x97\x53\x96\xD4\x96\x0D\x2D\x88\x5B\x83\xB7\x9F\xA5\x7C\xD8\x91\x29\x88\xB0\x72\xAF\x73\x07\x23\xF3\xEB\x57\xB4\x9A\x6F\x09\xD4\x92\xE5\x71\x75\x97\x22\x8D\x72\x2D\xBD\x5A\x86\xB6\x95\x6B\x9A\x77\x70\xE9\x1F\x6E\x97\xB3\x96\x8D\x2D\xB5\x5A\xAE\xB6\x82\x36\x7B\xD5\x92\xED\x72\x6F\x69\xEA\x7A\x4D\x2D\xF4\xD2\x47\xB7\x9B\x6E\x98\xD9\x90\xB1\x94\x7A\x97\xAA\x96\xF8\xE6\x12\x5A\xBB\xB5\x96\x69\x94\x90\x84\xAD\x97\xDE\x73\xC1\x53\x6E\x2D\x83\x5B\x80\x1F\x87\x6D\x9C\xDE\x91\xB5\x95\x77\x96\x87\x06\xDF\x2D\x9D\x5B\x90\xB7\x90\x39\x79\x6E\x77\xAF\x95\xE1\x72\xAF\x96\x84\x2D\xDA\x5B\x95\x15\x07\x6C\x9A\xDA\x90\xA0\x15\x80\x97\xDE\x96\x50\x06\x54\xA2\x54\x9E\x78\xA7\x8C\xED\x8C\x00\x88\x35\x8B\x93\x4F\x0B\x4D\x63\x37\x8D\x54\x85\xDD\x77\x51\x88\x29\x95\x40\x00\x0B\x97\x25\x23\xD1\x51\x8A\x99\x93\x4E\x9D\xB6\x95\x3A\x97\xEA\x94\x74\x92\xAD\x2B\xE6\x14\x84\x2B\x9F\xF7\x82\x84\x93\x3D\x8B\xC7\x90\x13\x87\x21\x23\x9E\x51\x9F\xB8\x81\x27\x98\x68\x96\x96\x96\x07\x96\x4B\x95\x75\x27\xE5\x57\x92\xA1\x87\x5F\x94\x85\x91\x71\x95\x26\x95\xBF\x92\xEE\x25\x98\x3D\xB0\x97\x9F\xBB\x83\x58\x95\xD3\x8F\xAD\x94\xFD\x7E\x87\x25\x98\xAB\x67\x24\x00\x71\x93\x35\x96\x47\x95\x8D\x97\xCA\x95\xE6\x2C\xBD\x52\x91\xB3\x8C\x4C\x93\xCD\x96\x31\x94\x3B\x96\x43\x94\x8A\x2B\x88\x51\x99\x96\x99\x42\x9E\xB8\x81\x1D\x4F\xD3\x91\x67\x95\xDB\x2B\xCC\x5C\xAA\x8D\x94\x65\x9A\x52\x90\xCA\x94\xF4\x95\x73\x96\x5C\x2C\xE9\x59\x9E\xB1\x95\x5E\x90\xC6\x90\x46\x97\x8F\x97\x64\x95\x58\x28\x94\xE7\x73\xA1\x8F\xD1\x8A\xEC\x8E\x32\x2C\xA9\x6C\xD5\x6E\x62\x2E\x8E\x47\xA4\xB3\x90\x1C\x9F\x58\x92\x65\x91\x64\x92\x96\x91\xEA\x2C\xB2\x53\xA4\xB0\x87\x48\x96\xCA\x92\x39\x95\x12\x80\x45\x94\x37\xCA\x79\x5C\xBA\x8E\x8B\x4D\x9B\x11\x92\x86\x96\xDB\x94\x1A\x96\x35\x24\xC7\x4D\xB7\x90\x83\x50\x8B\xB7\x80\x95\x8E\x04\x80\x8C\x42\x8A\x2E\xE4\x47\x8C\xBA\x82\x0E\x9F\xB3\x91\x62\x95\xD0\x95\x89\x95\x43\x2B\xC2\x51\x85\xAD\x8C\x64\x9F\xA5\x90\xC8\x97\xC6\x91\xFE\x8C\xB1\x0D\x84\x30\x8F\x26\x86\xC0\x83\xD3\x76\x95\x95\xF3\x90\x81\x00\x99\x2E\x8C\x48\x9B\xBA\x83\x2A\x90\xB1\x96\x17\x96\xC4\x94\xF5\x94\x48\x25\xDC\x55\xAD\x96\x8C\x62\x9F\x9E\x92\x46\x95\x82\x92\x7C\x8E\x38\x0E\xDB\x24\xAA\x6A\x9E\x80\x80\x91\x91\xC8\x92\x1F\x83\x30\x97\x34\x2E\xBA\x52\xA6\xB9\x97\x65\x98\xE6\x91\x97\x96\x9A\x97\x5D\x96\x6C\x2E\xD5\x59\x9D\xAE\x98\x58\x9E\xC8\x97\x60\x94\x38\x5D\x96\x8F\x4C\x2B\xCC\x47\xAF\x8A\x86\x08\x01\xEB\x97\x83\x90\x99\x96\x64\x91\x36\x2E\xD7\x55\x81\xAB\x9D\x3D\x93\xAC\x92\x6B\x94\xF0\x95\x45\x96\xC2\x2B\xE4\x4E\x84\xAF\x80\x35\x84\x1A\x94\x5B\x6F\xD8\x94\x44\x89\x65\x2B\x80\x94\x53\x86\x83\x3C\x9B\xE4\x91\xD9\x96\x58\x94\xFB\x95\x9E\x2C\x8C\x58\x87\xB2\x92\x53\x91\xE8\x97\x3F\x97\xA0\x97\xD7\x95\x59\x2E\xF3\x51\xBF\xBA\x8D\xE8\x8B\xE6\x7F\x84\x87\x69\x91\x88\x8E\x79\x2B\x93\x52\x84\xB0\x9D\x76\x9F\x44\x94\x93\x94\x6E\x8F\x3E\x97\x6E\x23\xFB\x4D\xA7\x93\x9F\x25\x92\x37\x97\xCA\x94\x4C\x95\x6B\x96\x78\x2A\xBE\xF6\x2F\x99\x8B\x78\x96\xEF\x95\x96\x97\xB2\x97\x1B\x97\xE3\x2B\x94\x54\xBA\xB8\x96\x50\x9C\xE3\x90\x43\x96\x04\x97\x4E\x95\x27\x2C\xCA\x18\x9B\x90\x82\x59\x7D\x65\x90\xD6\x95\xC7\x97\x32\x97\xF8\x2E\xD1\x5C\x97\xAE\x93\x72\x99\xB9\x95\xCA\x97\xE6\x94\x69\x97\x61\x2C\xEA\x5D\xA3\xB1\x84\x50\x83\xBB\x90\x09\x94\x00\x00\x86\x97\x62\x24\xDF\x5D\xAC\x8D\x90\x78\x92\x39\x93\x65\x91\xE9\x92\x9B\x97\x74\x2C\xFF\x5D\x81\xA8\x98\x78\x90\xCC\x96\xA9\x92\x9E\x95\x88\x8C\xA2\x1F\xFD\x64\x64\x7E\x9C\x76\x9F\xF2\x90\xDC\x97\xC7\x96\x71\x97\x57\x2B\xC2\x55\x99\xAD\x9F\x3D\x9A\xA9\x94\xB8\x91\xBA\x97\x62\x94\xB2\x1F\xBC\x4D\x83\xB2\x40\x7A\x93\x47\x96\xE1\x96\x72\x8E\x99\x97\x70\x2C\xB4\x5E\xB2\xB1\x88\x7A\x9A\x6E\x96\xE2\x94\x64\x95\x42\x97\x4A\x2A\xC4\x44\xB0\x76\x8A\x63\x8F\x45\x97\xC4\x54\xD9\x96\x54\x92",
"\x6D\x2C\xEE\x54\xB9\xBB\x8A\x51\x9D\xC0\x95\x3F\x95\xBF\x96\x23\x95\xA4\x2C\xAF\x56\x81\xBC\x91\x59\x97\x71\x97\x61\x8A\x91\x78\x6D\x8C\x77\x2F\x91\x4A\x8E\xB9\x8A\x76\x91\xF3\x97\xCC\x96\x94\x96\x74\x96\xD2\x2C\xFF\x5E\xB4\xA9\x98\x79\x9E\xE6\x96\x84\x94\x05\x97\xC9\x94\x20\x13\x97\x58\xB7\xAC\x69\x7C\x91\x54\x96\x1F\x94\x6B\x95\x05\x96\x7C\x2F\xFB\x5D\x8E\xB0\x92\x7C\x9C\xBF\x96\x65\x96\xFF\x94\xB8\x97\x00\x2C\xDC\x48\xB3\xBD\x90\x7A\x97\x24\x96\x97\x86\x6D\x60\xCE\x97\x98\x22\xC2\x5E\x8F\x97\x8C\xE4\x81\xF2\x97\x52\x97\xC8\x97\x4C\x95\x25\x2F\x9B\x55\xA7\xBC\x82\x63\x95\xED\x97\x19\x91\x29\x93\xC1\x6C\xB0\x2F\xC6\x45\xB2\xBE\x99\x48\x92\x42\x90\x3D\x95\xA7\x92\x5C\x97\xC2\x25\xDD\x5E\x81\x9F\x9E\x71\x96\xF9\x96\xD7\x95\x9C\x96\x5A\x92\xE0\x29\xBE\x5E\x81\xBF\x82\x05\x96\xF6\x93\xD7\x8F\xFD\x94\x67\x92\xF9\x2B\xBE\x49\xAD\xA4\x80\x26\x9E\xF6\x97\x58\x97\x9B\x97\xC5\x95\x72\x2F\xEF\x43\xAA\x9A\x5D\x6B\x67\x5F\x94\xB8\x33\xF4\x96\x62\x60\x27\x2B\xC5\xA6\x78\xB8\x8D\x3C\x97\xFB\x94\x65\x94\x2F\x96\xD3\x97\xBE\x2C\xCC\x5E\xAF\xB3\x96\x29\x95\xA0\x95\x36\x8D\xC1\x45\x94\x80\xB7\x1B\xB7\x54\x80\x34\x8E\x75\x9B\xED\x93\x20\x03\xF9\x96\x15\x68\xE9\x2F\xCB\xAA\x46\xB1\x99\x52\x98\xC4\x91\x91\x97\xB9\x96\xF4\x95\xA4\x2E\xC7\x56\xA9\xBC\x95\x7F\x6D\xA1\x94\xFF\x83\xAA\x90\x60\x77\xAD\x22\xB4\x5D\x7F\xBF\x93\xB3\x61\x00\x99\x24\x6F\xFA\x97\xE1\x94\x2B\x2B\x91\x4E\x87\xC0\x9D\x71\x95\xCA\x93\xF0\x95\xEC\x95\x5A\x78\xAD\x27\xBD\x07\xAD\x81\x87\x0B\x7C\x98\x89\xF0\x92\x04\x99\xAA\x97\x43\x2F\xF9\x4D\x90\x96\x92\x78\x92\x59\x93\x8E\x95\xDB\x97\x36\x97\xD7\x2B\x9E\x60\x89\xA4\x8B\x52\x9A\xCD\x97\x7B\x92\x21\x91\xE3\x67\x51\x2A\xAF\x5D\xB3\xB8\x89\x29\x96\xF5\x95\xF1\x94\xB3\x97\xC7\x97\x69\x2E\x91\x5F\xAB\xB9\x8B\x67\x90\x03\x9D\x9D\x96\xFC\x97\x0C\x92\x61\x2A\xB0\x10\x96\x8B\x92\x41\x8E\x2E\x92\xB2\x83\x65\x7A\xD9\x93\xAA\xCE\x75\x5D\xBC\xC0\x89\x81\x97\xFD\x90\xC0\x91\xF6\x96\x68\x92\x2E\x30\xFE\x4D\xB5\xB1\x80\x38\x97\x95\x95\xE9\x94\x0A\x97\xA7\x97\x5A\x1D\xFC\x54\x92\xC3\x5E\x53\x98\xC2\x8E\x60\x92\x62\x8C\x84\x91\x12\x75\x4C\x1B\x06\x37\x18\x65\x46\x40\x8F\x3D\x3A\xF1\x6A\xB2\x82\xBD\x2B\x98\x26\x9B\xAB\x97\x1E\x9A\x8D\x94\xD7\x97\x04\x96\x53\x97\x40\x28\xD2\x23\xAD\x56\x81\xF8\x86\x33\x96\x19\x91\x10\x8F\x18\x97\xC4\xD6\x39\xCF\x31\xC1\x8B\xAE\x8F\x9F\x80\x96\x93\xBC\x94\x79\x82\x4B\x21\x2C\x5C\xB4\x6F\x2A\x41\x96\xAB\x90\x4C\x80\xDF\x85\x31\x81\x44\xAB\x4A\x2B\xA3\x29\x94\x2E\x9A\x05\x9A\xE9\x96\x1D\x96\x19\x98\x78\x2C\xB6\x32\x8F\x25\x97\xD0\x8B\x85\x97\xCB\x95\x17\x94\x39\x8E\xDF\x09\xAC\x49\x9C\x92\x8E\x25\x90\x69\x8E\x86\x95\x48\x90\x1C\x96\xC3\x17\xB3\x24\xA2\xAB\x9D\x01\x85\x57\x8D\xB6\x93\xB2\x8F\x21\x82\xDA\x02\xC4\xCB\x03\xC2\x93\x84\x98\x98\x83\xE3\x7D\x36\x87\x11\x89\x21\x1D\xFB\x1B\x0C\xD8\x2D\x13\x72\x09\x9D\x86\x8C\x25\x98\x4B\x94\x45\x30\xD8\x5C\x9F\xBF\x9A\x72\x9A\x5D\x96\xDD\x8F\x1B\x98\x3E\x2D\xB3\x30\xBE\x61\xB5\xC2\x92\x14\x87\x0B\x9D\x1B\x7A\xA5\x8E\xFE\x8C\x68\x1A\xEA\x4A\x82\x96\x92\x2F\x98\xAC\x03\x29\x91\x7D\x93\x8F\x95\x5E\xD8\x18\x12\xA1\x95\x83\x85\x93\x56\x91\x28\x91\x59\x93\xA1\x90\xA1\x24\xD7\x24\x9F\x02\x93\x59\x94\x52\x75\x66\x97\x83\x93\x23\x7F\x79\x83\x70\x60\x8B\x38\x93\x92\x88\xF6\x87\x9C\x86\xDA\x86\x07\x7F\xC9\x23\xE7\xDA\x77\x85\x99\x16\x91\xA3\x82\xDB\x96\x27\x45\x5E\x98\x85\x1D\xBF\x61\xAE\xA4\x9D\x7E\x95\xC2\x94\xDA\x97\x02\x98\xB0\x95\x3A\x26\xEE\x5D\x83\xB3\x84\x5B\x91\x3E\x94\xA6\x5A\x36\x99\x56\x95\x90\x2E\xAF\x55\xB0\x48\x91\x55\x93\xA7\x84\xE6\x83\x95\x92\x86\x94\xCA\x28\xFA\x5F\x9C\x99\x9B\x22\x8E\x13\x96\x77\x96\x01\x98\x25\x96\xE8\x2E\xBB\x5F\xBA\xBC\x9D\x7D\x92\x92\x93\xED\x8F\x0E\x71\x96\x73\xDC\x67\x49\x61\xB9\xC3\x8B\x86\x95\x45\x87\x78\x80\x0E\x92\xCE\x51\xA1\x2B\x97\x0F\x88\xC4\x9C\x86\x96\x6C\x97\x1B\x98\xB2\x93\x93\x98\x16\x89\x05\x14\xAA\xC3\x88\x99\x8C\xE0\x85\x1D\x9B\x0D\x97\x77\x98\x17\xB7\x29\x58\x8B\x6C\x88\x5E\x9E\x51\x80\x9A\x2E\x48\x99\xE9\x92\x24\x31\x84\x19\x9C\x0C\x83\x4D\x9D\x96\x92\x18\x8E\xF1\x7B\x50\x98\xDB\x30\xDA\x27\xA4\xC2\x84\x2B\x96\x0A\x9E\xAC\x90\x2A\x99\xE5\x90\xFC\x12\xE5\x58\x95\x14\x65\xFE\x82\xD0\x92\x10\x9B\x3A\x98\xEF\x8C\x36\x31\xA7\x61",
"\xB8\xC4\x88\x53\x8D\xD8\x8D\xEA\x81\x48\x99\xAB\x98\x66\x20\xD9\x62\x8E\xC5\x9B\x8A\x9C\x1F\x4A\x03\x3E\xE6\x97\x83\x83\xA2\x30\xCA\x62\x9D\xC3\x9E\x24\x9B\xAB\x88\x94\x90\x35\x8C\x51\x92\x9E\x1B\xB0\xD7\x5D\x14\x91\x85\x96\x15\x9C\x26\x98\x3B\x99\x08\x8B\x69\x0F\x93\x2C\xA8\x6C\x78\x38\x90\x45\x70\x1F\x98\x50\x98\xE6\x8A\xB6\x30\x8F\x1C\xB8\xC2\x8D\x6F\x8A\x26\x97\xBA\x8D\x24\x99\x8A\x98\x72\x30\xE0\x4E\xBA\xBA\x82\x3B\x9F\xF5\x96\x6B\x97\x3F\x99\xCF\x8F\x60\x30\xA5\xE5\x64\xBF\x8D\x63\x8E\x21\x37\x27\x9B\x55\x90\x7D\x98\xDC\x2F\xC1\x61\x97\xBC\x88\x7D\x98\xCD\x93\x5D\x90\x24\x97\x3D\x96\x93\x22\xC5\x96\x74\xC3\x95\xC1\x89\xA9\x86\x20\x98\x32\x98\xB0\x98\x9D\x24\xE7\x40\x8C\xC4\x94\xB4\x8E\xC5\x73\x40\x70\xAA\x90\x07\x98\x94\x2C\x90\x60\x96\xB2\x99\x1B\x47\x10\x9F\x5D\x95\x42\x99\x78\x95\x71\x2B\x87\x61\xBC\x56\x8E\xA9\x74\xA3\x96\xFE\x95\x74\x96\x86\x92\xC6\x2C\xA3\x07\x97\x4D\x75\x8D\x90\xB0\x97\x6D\x95\x87\x8E\x79\x95\xC9\x21\xEF\x32\xA1\x88\x99\x02\x9C\x3B\x83\xD1\x59\x89\x6D\xCC\x93\x03\xF4\x39\x60\xB9\x13\x5E\x8B\x97\x19\x99\x28\x99\x92\x86\xB7\x98\xBD\x1A\xF0\x62\xB5\x78\x97\x0A\x31\x83\x85\x5D\x90\x37\x96\x27\x98\xF0\x22\xC1\x07\xAD\x30\x95\x8C\x98\x1A\x9B\x29\x9A\x37\x99\xA6\x98\xE0\x30\xEF\x62\xA2\xC3\x91\x8B\x92\x41\x61\xAA\x91\xF3\x93\xA9\x92\xC7\xF0\x7F\x54\x96\x95\x88\x3E\x9C\x2E\x07\x3F\x2E\x71\x07\x7B\x55\x6D\x30\xB8\xC6\x53\x38\x86\x50\x8C\xBB\x95\x3C\x9B\x5A\x98\xD5\x98\x72\x2B\xDD\x16\x9A\xAC\x87\x46\x95\xAB\x97\xC5\x97\x33\x90\x40\x98\x02\x08\xFD\x63\xB6\xC5\x98\x8A\x98\x17\x9E\x1D\x9A\x75\x72\x45\x98\xA0\x73\x7F\x33\x98\x71\x8F\x62\x9A\x55\x6F\x08\x95\x30\x40\x3D\x89\x96\x31\xC2\x56\x98\xC6\x95\x78\x9A\x19\x9F\xED\x94\x26\x99\x53\x96\x71\x28\xB2\x3D\x9C\xC2\x9C\x2C\x9E\xAC\x97\x13\x98\x55\x85\xC1\x84\x0A\x32\x8F\x2C\xA9\x4C\x84\xD8\x8A\xE2\x94\xCB\x84\x3C\x98\xD9\x92\x63\x23\xA3\x5C\x65\x8D\x87\xE4\x87\x18\x9A\x76\x78\x62\x98\x42\x98\xF9\x11\x81\x63\xAD\x4A\x83\x8C\x9A\x9E\x80\xD1\x96\x27\x83\x14\x99\x6A\x19\xAB\x64\xB7\x70\x88\x0E\x9F\x91\x92\x39\x99\x48\x94\x47\x98\x96\x2E\xD0\x04\x93\xC7\x80\x92\x99\x7F\x8B\x2D\x8F\x90\x98\xD7\x95\x4B\x2F\x9C\x63\xBF\x25\x30\x90\x9D\x9D\x65\x73\x93\xAE\x6D\x55\x97\xB5\x28\xAD\x5D\x9E\x61\x7B\x54\x86\x23\x99\x2D\x98\xC9\x8F\xD4\x98\x62\x31\xE9\x63\x99\xC7\x8B\x8F\x94\x5E\x8F\x81\x86\x29\x6F\x61\x97\x7F\x05\xC5\x5D\x84\xC6\x74\x8D\x9C\xA7\x2A\x0A\x93\x4A\x98\xB5\x98\x2D\x31\xE8\x63\xAF\xC4\x94\x74\x94\x7C\x8F\x1B\x97\x3C\x99\x00\x86\xCB\x09\x9E\xC4\x2E\xC9\x96\x8D\x9C\x12\x9D\x86\x96\x21\x99\xE4\x98\xF4\x2A\xCA\x46\x83\xB9\x84\x45\x3A\xD4\x77\x92\x81\x43\x95\xCB\x93\x72\x29\xEA\x64\x8C\xBC\x73\x77\x92\x2E\x8C\x49\x9A\x2E\x8C\x2C\x8B\xC7\x31\xB9\x63\x80\xCA\x88\x84\x94\x26\x9C\x31\x91\xDD\x94\x88\x98\xE6\x30\xF9\x51\xB7\xD0\x6A\x78\x9E\xDC\x90\x43\x9A\x7F\x99\x38\x99\x7F\x32\xC5\x64\x81\xCA\x85\x3B\x91\x02\x7E\x23\x9B\x08\x79\x1A\x99\xA6\x12\xDE\x64\xBF\x84\x86\x8F\x9C\x16\x98\xAA\x8C\x76\x98\xA9\x8E\xDA\x31\xC8\xDB\x69\xC4\x88\x8A\x93\x2F\x8F\x46\x98\x2D\x98\xC0\x98\xCC\x30\x82\x63\x98\x81\x8E\x7A\x45\xA0\x84\x38\x9A\xC8\x8E\x55\x99\x16\x31\xE6\x57\x8A\xB2\x88\x80\x9D\x18\x9D\x91\x97\x63\x99\xE2\x95\x5A\x29\xD9\x0C\x7C\x90\x8B\x27\x8E\x28\x9E\x64\x8C\xA4\x99\x8E\x94\xC8\x31\xA2\x65\x94\xCA\x8B\x7B\x56\x14\x9D\x59\x63\x88\x85\x2E\x99\x49\x31\xDF\x64\xAC\xCA\x80\x90\x9A\x1B\x98\xA4\x8F\xC4\x81\x0E\x8D\x75\x2F\xA1\x91\x5E\xCA\x8B\x90\x91\x16\x9D\x41\x9B\x4D\x98\xBD\x98\x9C\xEB\x5D\x62\xBC\x1D\x98\x96\x9F\x26\x9A\x5B\x9B\x7F\x99\x30\x99\x73\x32\x81\x15\xAC\xBA\x96\x60\x9F\x4C\x7F\x5A\x99\xAA\x99\x6C\x99\xAB\x32\xEF\x65\xA6\xCB\x9A\x8A\x98\x2E\x99\x7C\x8B\xBF\x86\x76\x65\xD9\x6D\x3B\x53\xA8\xC5\x97\x97\x9D\x2E\x99\x5F\x98\xA8\x98\x1D\x99\xFD\x1E\xBC\x64\xA3\x92\x9F\x7D\x9A\xA6\x85\x56\x98\xB0\x99\xC4\x98\xC1\x28\x8B\x63\x83\xA3\x85\x96\x95\xEA\x90\xCE\x95\x88\x98\x95\x93\x86\x31\xF6\x65\x8E\xCC\x98\x97\x91\x2C\x9B\xC7\x97\xB0\x98\x0E\x98\x82\x2F\xC3\x61\x82\xBC\x81\x7F\x92\x9F\x97\x98\x91\x0F\x87\x66\x99\x9E\x22\xCF\x65\x82\xAC\x91\x96\x94\xB0\x96\x48\x9A\xC1\x95\xB8\x8C\x10\x1E\xA1\x4A\xB7\xBF\x97\x9B\x84\x29\x90\x77\x8C\x4D\x5A\x2E\x99\x04\x33\xFC\x64\xB0\xC9\x9E\x93",
"\x98\x30\x9F\xAC\x92\xC2\x98\xA6\x8B\x7A\x2C\xFE\x0A\x9C\x81\x82\x51\x97\x33\x9D\x4D\x98\x19\x91\x8E\x99\x24\x2F\x9F\x66\xA6\xBC\x96\x83\x98\xF2\x97\xF2\x95\x1E\x96\x31\x95\x35\x2A\xC2\x45\xA6\xC0\x9C\x55\x8A\x27\x9F\x68\x98\xC4\x99\xCF\x94\x74\x30\xA1\x53\xA9\xAF\x84\x8A\x9C\x11\x9F\x9A\x90\xD4\x98\xDF\x98\x1E\x10\xB7\x60\x8C\xBC\x72\x8E\x92\x98\x6B\x5C\x9A\x8A\x99\x9A\x98\xFB\x32\xE3\x62\xBD\xCB\x8D\x2B\x81\x02\x9E\x39\x9B\xEB\x93\xCB\x87\x03\xF4\x5F\x59\xB8\x36\x88\x99\x93\x39\x92\x65\x98\xEB\x95\x81\x95\x39\x1C\x85\x56\x82\xCA\x84\x63\x99\x2C\x9F\x65\x7B\xF1\x92\xB2\x8B\x82\x86\x32\xFE\x67\x5D\x84\x86\x77\x09\x13\x80\x2E\x71\x06\xA3\x4B\xF9\x31\xD3\x7C\x56\xBF\x78\x99\x9D\xAE\x94\x5D\x9A\xCE\x98\x77\x99\x07\x33\xB9\x65\xBB\xC8\x8E\x86\x97\x41\x86\x0B\x81\x34\x99\x3D\x98\x56\x32\xE5\x33\x96\x47\x80\xE2\x81\x6F\x80\x1A\x93\x5B\x92\x3C\x87\xEE\xD4\x21\x2B\x99\xC8\x80\x75\x9B\x21\x98\x3B\x95\x87\x98\xEF\x97\xCD\x2F\x88\x05\x69\x95\x98\x9C\x97\xC5\x8D\x11\x99\xA5\x96\x5C\x95\xE2\xD7\x1D\x16\xAD\x4E\x62\x9D\x9F\x29\x9C\x67\x9A\xE4\x99\x84\x99\xBB\x32\xEC\x5B\x6D\x71\x83\x91\x90\x27\x84\x0B\x94\x78\x86\x50\x98\xE3\x31\xC7\xC4\x10\x4A\x97\x80\x9A\xB2\x95\xFD\x96\x06\x98\x8C\x98\xC4\x32\x9A\x62\xA0\xBD\x8E\x9A\x9A\x09\x9B\xAE\x88\x2B\x99\x42\x8E\x40\x00\xB4\x64\x9A\xCC\x9E\x57\x9E\x38\x9D\x38\x9B\x6D\x98\xB8\x95\x0B\x31\x81\x64\xAC\xC6\x99\x85\x92\xA6\x78\xFD\x7F\xB7\x3E\x9E\x90\xD5\x33\xAA\x57\x86\xC7\x90\x96\x92\x29\x9A\x5A\x9B\x6E\x98\xC2\x98\x9C\x28\xC6\xAF\x4C\xCE\x94\x9E\x99\x33\x9E\x7A\x99\x9F\x99\x48\x97\x2E\x31\x93\x5D\xA1\xBE\x63\x90\x99\x63\x93\x16\x94\x96\x98\x8F\x95\x4D\x21\xF0\x17\xBC\x69\x23\x9E\x95\xFB\x91\xC7\x95\x01\x98\x61\x99\x1B\x30\xCB\x66\x8C\xBF\x9E\x87\x9C\x3C\x9C\x56\x96\x12\x99\x1D\x93\x0B\x26\x9A\x30\x8D\x98\x90\x0C\x91\xEF\x92\x98\x6C\x33\x94\x6C\x6B\xE0\x33\xED\x67\xA2\xCF\x97\x9E\x91\x29\x99\x7B\x99\xB7\x98\x59\x92\x6D\x02\xFF\x17\xB7\xC9\x93\x93\x8A\x3F\x98\x9A\x2C\xFF\x99\x01\x98\xE4\x2B\xFF\x67\x9E\xCC\x81\xA0\x9A\xFB\x94\x69\x98\xEF\x97\x63\x99\xEC\x2E\xDC\x63\x80\xF9\x66\x94\x91\x11\x99\x38\x9A\x90\x92\x2F\x6C\xA4\x0E\xAB\x55\xA1\xCF\x83\x9D\x98\xFC\x97\xD3\x91\xC5\x95\x3A\x98\x03\x34\xCD\x58\xA8\xD0\x8A\x06\x99\xD4\x73\x1E\x49\xC1\x96\xD3\x90\x5C\x12\x88\x5E\x99\x7D\x9C\x94\x93\xEB\x87\xAB\x93\x0C\x9B\xDA\x99\xF0\x33\xF2\x64\xB2\xCF\x89\x67\x88\xED\x5B\x24\x97\x1E\x41\x08\x9A\x1B\x33\x85\x66\x88\xCD\x98\x7D\x9A\x34\x9D\x84\x99\x0E\x9B\x5E\x97\x16\x33\x8E\x85\x42\x9A\x9A\x2B\x63\x3D\x98\x75\x97\x11\x9A\x72\x99\x60\x32\xE9\x66\xA2\xC9\x90\x95\x95\x29\x99\x5F\x8D\xCF\x97\x55\x8B\x50\x34\xAC\x27\x8F\xCC\x98\x91\x9F\x4A\x95\x67\x9B\x53\x99\xE5\x98\x19\xB0\x52\x62\x94\xFA\x6D\x90\x73\xFA\x88\x55\x99\xE3\x98\x09\x9A\x34\x34\xDA\x55\x8A\xC6\x99\x9A\x9D\x9E\x96\x84\x9B\x46\x99\xB0\x97\xDA\x2B\xA7\x66\x86\xD1\x98\xA3\x98\x44\x9A\x21\x9A\x0D\x93\xD5\x98\x23\x21\xA3\xE5\x51\x88\x8C\x36\x99\x4A\x78\x45\x9B\x20\x9B\x28\x9A\x8F\x33\x86\x66\xB6\xCE\x85\x89\x95\xAB\x81\xD9\x93\x79\x62\xD6\x3F\x69\x34\xD8\x27\xAB\xD1\x97\x95\x95\x08\x9E\x8D\x98\x59\x99\x80\x82\x54\x1B\x82\x69\xB2\xD0\x84\xA4\x90\x46\x9B\x5B\x98\xBC\x99\x25\x9A\x39\x2C\xAD\xE6\x72\xD1\x84\x48\x3B\xC2\x91\x41\x9B\x23\x9A\x35\x9A\x1C\x33\xD7\x66\xAB\xA7\x9C\xA3\x9D\xAD\x93\x6B\x9B\xB7\x95\x02\x9A\x78\x1B\xBE\x0F\x81\x4D\x98\x53\x87\x47\x98\x92\x9A\xFB\x99\x9D\x99\x49\x34\xA1\x65\xAD\xCC\x83\x95\x9B\xEE\x96\xDA\x96\x75\x8F\x5A\x92\xB3\x1D\x99\x69\xBF\xCA\x91\xA5\x9C\x46\x9D\x14\x9A\x30\x9B\xBC\x99\x2E\x33\xFB\x66\x91\xC5\x9D\x9B\x94\x62\x51\xBD\x8C\xC9\x87\x57\x9A\x9A\x34\xCC\x69\x9C\xD2\x99\x91\x97\x3B\x9E\x67\x99\xEE\x98\xE2\x0C\x5A\x20\xA9\x9D\x47\xA8\x89\x0D\x91\xA3\x82\x41\x95\xC3\x8C\x55\x92\x5F\x34\xE7\x66\xB7\xC5\x8C\x91\x9B\x32\x8C\x58\x86\x82\x41\xE4\x8D\x28\x0D\xC3\x66\x91\xC0\x9D\xA0\x9E\x21\x37\x83\x98\x2E\x96\x02\x98\xBA\x2C\x97\x62\xAF\xBF\x81\x7C\x97\xFA\x97\x43\x9A\xA1\x96\xCF\x98\x37\x25\x8D\x27\x52\xCD\x9A\x7F\x92\x78\x96\xB9\x84\x3A\x9A\x52\x9A\xEA\x34\x8C\x64\xAC\xD3\x92\xB0\x8E\x4E\x9B\x2C\x72\x54\x86\x1F\x93\x61\x33\xD0\x63\x86\x0B\x84\x9B\x94\xE1\x80\x9B\x9B\x32\x9A\x29\x9A\xB2\x34\xB9\x5D\xB4\xD2\x9B\x75\x97\x45\x9F\x0E",
"\x99\x16\x9A\x80\x9A\xB4\x19\xB7\x27\xAE\x2B\x90\x3D\x91\x37\x98\x0A\x98\xC3\x3A\x7B\x9A\xCD\x2E\xF8\x69\x8F\xBB\x9A\xA7\x91\xED\x90\xFE\x96\x35\x96\x29\x99\x5E\x30\xD9\x52\xBA\xC4\x85\xF3\x8E\x1E\x98\xE6\x7C\x2D\x91\x13\x8E\x6C\x0D\xAA\x38\x84\x46\x96\x8F\x90\x86\x6D\xA2\x8B\x86\x97\xFD\x73\x89\x5D\x3B\xF9\x3D\xE5\x69\xAF\x7A\xEA\x30\xA5\x95\x35\x53\xC6\x38\x86\x33\x9C\xF7\x24\xEE\x6F\x40\x77\xE1\x93\xF0\x91\x4D\x5C\x72\x66\xDC\xFD\x7E\x73\x5E\xA0\x78\xB2\x53\x90\x7D\x64\x6E\x59\x7E\xE2\x7E\x32\xFB\x7E\xFA\x7A\x33\x6A\xE7\x78\xCB\x77\xAD\x7F\xA5\x6E\x88\x7E\xA7\xFA\x73\xFA\x6A\x81\x5C\x63\x69\x46\x88\x92\x95\xA8\x6E\xBE\x7E\x8A\xE8\x6D\x9A\x5C\x31\x74\x56\x46\xD8\x7E\x43\x57\x64\x7F\x4C\x7D\x71\xFB\x40\xF5\x74\xE9\x4C\xEC\x79\x2C\x4C\x3A\x7E\x3C\x7E\xB8\x9A\x2B\xFD\x03\x79\x57\xF6\x7D\x55\x44\xD0\x7B\x31\x8C\x22\x74\xB4\x9A\x3C\xF9\x08\xFA\x7A\xE4\x5F\x2C\x95\xE9\x6D\x34\x5E\x7B\x7D\xD3\x7E\x6D\xE4\x67\xF9\x52\xED\x70\x23\x74\x56\x9C\xB0\x9A\x29\x51\x6E\x5C\xCB\xFA\x00\x6B\xBF\xE6\x67\xCF\x73\x78\x63\xB0\x9A\x93\x82\x75\x3E\xAF\xBC\x04\xF4\x67\xF5\x79\xAA\x94\xA7\x5C\xB7\x7D\x5D\x9A\x94\x7E\x8B\xE4\x60\x6A\x8C\xE4\x7D\xCF\x77\xDC\x7A\xEF\x7F\x56\x6F\xA3\x3E\x4F\x08\x8B\xF7\x5D\x2B\x58\xEE\x7A\xB7\x7E\xE0\x6C\x03\x16\x84\x6F\x49\x35\xB9\x01\x49\xCE\x99\x52\x56\x7C\x6E\x0B\x6D\x9A\x35\xBE\x8B\x83\x32\xCB\x41\xBD\xC1\x82\xBC\x8D\x39\x98\x41\x98\x71\x8A\xCB\x99\xB1\x28\x9C\x47\xAD\xCE\x88\x9B\x75\x84\x97\x11\x99\x5C\x7D\xDC\x73\x71\xF0\x30\x2F\x9C\x55\x90\x01\x85\x22\x9F\x77\x9B\x89\x99\xE3\x7B\x11\x0E\xBC\x00\x96\x0F\x10\x9E\x93\x23\x9E\x5C\x96\x23\x68\x92\x90\xF7\x2A\xCA\x5A\xAF\xC8\x9B\x2E\x95\x5B\x9B\xA9\x44\x70\x9A\x21\x97\xB2\x28\xC4\x5C\x94\xC3\x9D\x55\x06\x0D\x9A\x44\x92\x2F\x8E\x9A\x5A\xC7\x72\x74\x56\x80\xBB\x99\xC0\x82\xEC\x90\xA2\x99\x9A\x98\x9B\x95\xE8\x30\xD5\x28\xBC\x69\x31\x90\x8A\xB4\x90\x1C\x96\xCB\x8E\x7B\x98\x2C\xD8\x64\xB5\x65\x57\x9D\x31\x97\x8F\x94\x81\x99\x41\x99\xAB\x69\xE9\x35\x8E\x62\xA5\x30\x96\x39\x88\x26\x9D\xCE\x87\x00\x7B\x89\x98\x99\xF9\x62\xB8\x66\xCA\x8B\xA2\x7A\x7C\x77\x9E\x40\x4D\x8F\x6E\x68\x2D\x80\x05\x14\x93\x3F\x40\x9E\x6C\x9C\x88\xE1\x64\x4F\x99\x90\x87\xEF\xE7\x38\xEC\x5C\x27\x62\x9F\x8E\xFE\x6C\x2A\x9B\xBB\x5F\x69\x59\x86\x2F\x9C\x19\x9A\xD7\x94\xEC\x60\x6F\x96\x34\x97\x6B\x6A\xEF\x6E\xD4\x34\xB9\x53\x81\xCC\x8E\x7D\x92\xAF\x7C\xC4\x9A\x2E\x9B\x92\x8C\x10\x36\x81\xD5\x73\x14\x91\x7E\x9D\x6D\x38\xC5\x9B\x4C\x9B\xC7\x81\xD6\x34\xC1\xF2\x6F\xD3\x8A\x9C\x8B\x5A\x71\x34\x9B\xDA\x92\x41\x8D\xFB\x2F\xDE\xB0\x41\xD8\x8D\x8D\x9E\x08\x79\x52\x91\xD8\x58\xB5\x93\xCC\x1B\xA8\x05\x83\xD9\x9C\x8D\x9F\x35\x9A\xA4\x9B\x6F\x99\x90\x8B\xE4\x34\xA4\x63\xBF\x03\x05\xA8\x93\x9C\x7B\xAB\x81\xDB\x99\x6F\x5B\xA0\x19\xA3\x4A\xAE\xD0\x93\x80\x60\x60\x9B\xBE\x99\x23\x78\x42\x99\xAF\x03\xB7\xE1\x4D\xC1\x90\x9E\x8E\xCD\x90\x0A\x9B\x8D\x53\x0D\x9B\xFF\x32\xFB\xBD\x35\xD4\x88\x83\x9A\x6B\x7C\xD0\x40\xA0\x95\xF7\x98\x74\x0A\x3C\x6A\xA5\xF8\x33\xAD\x97\x26\x44\xBD\x7C\x9F\x2D\x67\x9A\x1F\x22\xD1\x69\xBB\x70\x94\x9F\x90\x10\x99\xBE\x92\xA8\x94\x18\x97\x76\x36\xD0\xB9\x38\xD9\x8B\x2A\x9A\x37\x9B\xCF\x99\x90\x96\xBB\x85\xBA\x1C\xBE\x38\x9C\x7A\x98\x19\x97\xE4\x97\xD3\x8D\xAE\x95\x14\x7F\x16\x34\x93\x65\xA7\xCF\x8D\x72\x8B\xAC\x91\xF6\x89\xB3\x94\xDF\x99\x9E\x25\xFD\x4F\x95\xFB\x6C\x99\x90\x4D\x9C\x98\x9B\xCE\x97\xD7\x99\xAB\x30\xD3\x6B\xA4\xAB\x95\x43\x97\x7D\x94\xF9\x8B\xFC\x7A\x49\x97\x88\x34\xAE\x25\x98\xD7\x9E\x91\x94\xE8\x78\xD5\x9A\xF6\x99\x44\x9A\xB3\x24\xA4\x82\x5D\xA2\x83\x12\x48\x37\x99\xCF\x9A\xA7\x9A\x4F\x95\x87\x36\xA2\x1C\xBC\xD0\x84\x71\x88\xBD\x81\xB6\x89\xBB\x7E\x41\x9B\x9E\x34\xEB\x66\x82\xD8\x81\x88\x94\x2B\x87\xDD\x94\x69\x85\xA7\x82\x0F\x34\x9D\xFD\x5C\xDA\x96\xB5\x93\x2D\x9B\xBB\x99\x9C\x89\x0D\x9A\xE6\x1C\xF9\x00\xB7\xD9\x81\xB6\x9D\x50\x9F\x8E\x81\x63\x90\x7B\x94\x0B\x34\xBF\x4C\xA8\x61\x86\x76\x9D\x00\x7C\xA6\x59\xCE\x81\x41\x9B\xDE\x2A\x85\x6D\x85\xD3\x99\xAD\x9D\x43\x9D\xBF\x88\xA6\x99\xBB\x95\x8A\x32\xAE\x09\xBA\xAD\x84\x45\x37\x48\x9F\xD5\x9A\xAA\x9B\xC0\x51\x4E\x34\xA7\x6D\xB1\xCF\x89\xB5\x9F\x33\x98\xE8\x33\x83\x9A\x3D\x33\xED\x36\x97\x68\xB3\xAD\x93\x53\x67\x46\x9B\x07\x45\xAD\x9A\x42",
"\x9B\x7A\x36\xE3\x6D\xBC\xCD\x97\xB1\x99\x03\x78\xE3\x07\x0E\x78\x28\x7B\x1E\x62\x60\x6D\xB6\xD2\x82\xB7\x95\x14\x9D\xF8\x7A\xB5\x99\x48\x37\xFF\x36\xE1\x6D\x81\xDC\x9F\xB4\x9A\x4A\x99\xC5\x99\xD9\x6C\x0F\x9B\x1D\xE5\x2E\x6D\xBA\xDB\x8D\x88\x9A\x62\x61\xC4\x9A\xA1\x8A\x65\x7F\x4A\x34\xF4\x6D\x9F\xD3\x9A\x5E\x83\x7A\x87\xD2\x88\x26\x79\x65\x9B\x00\x37\xB7\x6D\xBB\xD0\x8C\x5F\x96\x71\x98\xB7\x39\x2B\x9A\x9A\x72\x1A\x37\x92\x6D\x9E\xCB\x88\x5C\x7F\x62\x9A\x6F\x8E\x6E\x33\x7C\x9B\x32\x37\x98\x68\xA8\xCF\x98\x98\x98\x4C\x98\x67\x3D\xC4\x9B\x85\x9B\x13\x37\xDD\x66\xB4\x6C\x75\xB0\x96\xA4\x77\x8C\x97\xBA\x81\x84\x9B\xD4\x36\xAE\x64\x8E\xD4\x9C\xB1\x9D\x54\x84\x8F\x95\xA5\x91\x8C\x7F\xC0\x36\xDD\x69\xAF\xD1\x87\x92\x9C\xF6\x81\x68\x98\xD8\x99\x79\x92\x0F\x30\x93\xE1\x76\x93\x92\xB6\x91\x75\x9C\x92\x99\x33\x99\x64\x93\x44\x01\xD9\x6D\xA7\xC1\x89\x47\x00\x65\x9B\x34\x98\x41\x56\x2A\x9B\xAF\x7B\x3F\x6E\x89\xC0\x8A\x5F\x92\x74\x9E\xEC\x91\x40\x9A\x1B\x98\x12\x35\xFE\xEA\x54\xD4\x9F\x4E\x7A\x76\x9C\x62\x9A\x02\x98\x5C\x9A\xF9\xB6\x29\x59\xA8\xC9\x84\x53\x9A\xFF\x92\x6E\x9B\x85\x89\xDC\x33\x0A\x37\xEB\x6E\x9C\xCD\x8B\xB9\x93\x70\x99\x32\x99\xBD\x45\x35\x9B\xEC\x0A\xF0\x63\xB5\xD4\x55\x2A\x9F\x3D\x58\x17\x91\x6C\x9B\x76\x42\x74\x36\x96\x12\x96\xBF\x79\x19\x8D\x2A\x9B\x15\x93\xAB\x99\x56\x90\x89\x30\xAB\x67\x9D\x8C\x93\x86\x9F\x67\x9F\x40\x99\x15\x80\x3E\x2D\x95\x37\x96\x48\x97\xDE\x98\x20\x99\x79\x9C\xCF\x9B\x78\x8D\xCB\x77\x8B\x36\xFA\x16\xB5\xC9\x9E\xCF\x56\x21\x9A\x18\x80\xAE\x98\xAF\x9B\xBA\x32\xC9\x4D\xAE\x93\x6B\xAE\x90\x20\x89\xCA\x9B\x44\x50\xA8\x91\x5B\x03\x9E\xC4\x21\xDE\x9F\x37\x93\x7A\x99\xE0\x90\x12\x98\x65\x95\xEF\xCB\x31\x64\xB2\x7D\x7A\x70\x96\x36\x91\x34\x42\x75\x98\x6D\x89\xBD\x37\xDD\x60\xB3\xBF\x84\xC4\x38\x37\x96\xF8\x9B\xEB\x9A\xA1\x98\x56\x04\xB0\x62\x91\x25\x76\x09\x93\x79\x98\xF4\x98\xB7\x99\x9C\x9B\xB2\x2A\xB9\x6D\xA9\x54\x84\xB7\x9C\x6B\x9C\x4D\x8D\x5B\x78\xA5\x80\xD0\x5C\x3B\x6F\x9B\xC1\x89\xBE\x9E\xCE\x97\xF7\x98\xCD\x91\x0E\x84\x50\xCE\x41\xFC\x6D\xD0\x88\x50\x99\x20\x64\xEB\x9A\xEE\x9B\xEB\x9B\xE6\x33\xB3\x6E\x82\x2F\x91\x87\x98\xED\x94\xDB\x98\xA6\x8D\x4B\x80\xD6\x37\xA7\x69\xA2\xDC\x89\x36\x99\xBE\x85\x00\x70\xB6\x9A\x49\x96\xFC\x1C\x9C\x09\xA0\xDF\x8F\xBF\x9A\x7F\x9E\xDD\x99\xBD\x9A\x4B\x99\x45\xE5\x1C\x25\x9F\x20\x82\xA2\x96\x3F\x93\xDD\x98\x32\x45\xE3\x9B\x27\x1F\xC3\x62\xB7\xD2\x8E\x7E\x9B\xC3\x83\xC1\x9B\x88\x48\x08\x9C\x9F\x24\x92\x70\x8C\xDC\x8D\xBB\x92\x56\x3F\xDE\x9A\xF3\x9B\x4E\x9A\x52\x37\x9F\x69\xA2\x3A\x9D\xB7\x9C\xF6\x88\x03\x9D\x5B\x98\x0D\x9C\x41\x37\x84\x6F\x93\xD3\x84\xB8\x96\xBC\x33\x59\x9A\xE1\x35\x36\x9A\x21\x38\xD6\xCB\x40\x3B\x94\xBC\x90\x7F\x9B\x98\x99\xB3\x9B\x9C\x98\x86\x37\xC6\x05\x98\xDC\x9B\xB4\x90\x82\x98\xF6\x9B\xE4\x98\x4B\x9A\x95\x07\xDE\x4D\x97\x0C\x9C\xA6\x9E\x83\x98\x77\x98\x10\x9D\xF4\x8F\x8D\x02\xF9\x6F\xA2\xD1\x91\x97\x9C\x44\x99\x8E\x99\xCB\x9B\x17\x43\x2F\x37\xD0\xFF\x26\xE0\x8E\x95\x98\x82\x9A\xE5\x98\xDE\x9B\xCE\x8E\x7C\x31\x89\x02\x8F\xDF\x97\x8E\x95\x85\x9F\x06\x9D\xA5\x81\x90\x87\x19\x33\xD4\xFC\x44\xE0\x8B\xC2\x98\x4A\x99\x15\x99\x0E\x93\x27\x9C\x25\xA0\x39\x6C\x90\x12\x73\xC2\x96\x79\x9D\x0B\x9F\xA4\x9A\xA1\x87\x56\x37\xCE\x6C\xB2\x84\x74\x99\x92\x1A\x9A\x33\x7A\x39\x9B\xEE\x47\x6C\x38\xA2\x6F\xAE\xE1\x92\xBF\x90\x34\x9A\x5A\x7A\x91\x9B\x2D\x90\x48\x36\xDD\x40\xB8\xDF\x81\xBF\x95\x83\x9D\xD3\x9A\x17\x9C\x8F\x7F\x0F\x35\xFD\x6B\x8F\xD9\x85\x81\x94\x50\x9B\x00\x9F\x91\x30\xF1\x9B\x96\x30\xDC\x60\xA5\xDF\x91\x95\x94\x2D\x97\x80\x9A\xFD\x8C\xC1\x87\x3B\x1E\xD1\x63\x8E\xE2\x84\x2E\x30\x89\x9C\x1F\x98\xA1\x96\x7F\x9A\x71\x2F\xCF\x66\x96\xE2\x8E\xBA\x83\x83\x81\xCA\x8C\x14\x99\xC2\x81\x9D\x38\xA7\x67\xBD\xC3\x9A\xA1\x97\x85\x9D\xE7\x91\x0E\x9D\xC7\x4B\x62\x30\xC2\xA0\x48\x99\x79\xA9\x96\xCF\x96\xF1\x9A\x9C\x9A\x78\x43\x91\x37\x9D\x5C\xAB\xE1\x82\x92\x97\xD8\x88\xA8\x8D\xCA\x9B\x69\x99\x54\x32\xA3\x29\x5D\xDE\x9F\x83\x96\x7C\x68\x13\x82\xBE\x99\x85\x9A\x79\x31\xAB\x5C\x9A\xDE\x89\x75\x92\x21\x9E\x75\x9B\xEA\x9B\x0A\x99\x49\x2E\xB0\x61\x9C\x9F\x27\xC6\x9F\x24\x9D\x45\x9A\x95\x89\xB5\x87\xCF\x38\x95\x6D\xB4\xDE\x8E\x1A\x9A\xE1\x91\x72\x86\xA6\x9A\x3C\x9C\xBC\x38\xD9",
"\x42\xBE\xE2\x92\xB8\x96\x85\x9C\x02\x9D\xF3\x98\x18\x99\x73\x2E\xB4\x4B\xA5\xAB\x85\xB5\x97\x87\x93\x07\x72\x93\x99\x5E\x9C\x44\x32\xB6\x70\xAF\xE1\x9A\xC3\x8C\x6A\x9C\x65\x82\x42\x9B\x6A\x9C\xED\x34\xCA\x6E\x9F\xE1\x89\x92\x97\xC0\x2C\x4F\x2C\x35\x9C\x78\x9C\x50\x32\x97\x61\xA2\xCC\x9B\xE6\x46\x7A\x9D\x87\x8C\xDD\x41\xCF\x91\x9D\x33\xA1\x47\xAA\xC4\x85\x97\x98\x8C\x9E\x41\x99\xB5\x9A\x25\x53\xEE\xEF\x0A\x68\x80\xE0\x81\xB0\x8D\x40\x9D\xA2\x61\xB2\x9A\x8B\x90\xD3\x38\x91\x67\x85\xE1\x9E\xA6\x92\x7B\x9F\xCD\x67\xD2\x94\xFB\x9B\x4D\x2B\xBC\x61\xA1\xE3\x84\x5A\x93\x8E\x98\xE8\x99\x39\x9D\x8F\x9A\x1B\x2B\x87\x68\x82\xC4\x8B\xC0\x98\xF5\x8F\xA9\x80\xA3\x98\x9E\x83\x23\x39\xA2\x5D\xA5\xE4\x82\xBC\x93\x81\x98\x25\x9C\x81\x99\x03\x9A\x04\x36\xEE\x6B\x86\xD8\x86\x16\x88\x60\x9D\x04\x9D\x4C\x9C\x89\x99\xA3\x2E\xF6\x6E\xAC\xDD\x8A\xC1\x95\xAE\x53\xE3\x96\x09\x80\x0F\x31\xFF\x38\xE2\x71\xB1\xE3\x86\xC4\x93\x8F\x9E\xDE\x9B\xAC\x99\xDC\x9B\x47\x62\x49\x72\xA4\xE4\x8B\xCA\x9C\x6C\x9D\x29\x9E\xE3\x8F\x16\x92\x58\x01\xFE\x71\x9A\xE4\x90\xBE\x96\x12\x9C\x4E\x9A\x3A\x87\x55\x9A\x4D\x16\xF4\x68\x92\xBD\x99\x05\x88\x36\x9D\x21\x9F\xB9\x98\x62\x85\xC0\x0E\xC6\x71\x9B\xE5\x9C\xC2\x91\x7D\x9E\x2B\x9F\x19\x9C\x16\x9C\x24\xAD\x3B\x70\xA9\xDD\x9F\xC9\x9B\x51\x9C\x31\x9A\xF2\x98\xC7\x98\xAD\x38\xA7\x44\x70\x91\x90\x1A\x88\x94\x9B\x2D\x9C\xF2\x9B\x3D\x9C\x3A\x37\xB4\x6E\x99\xBE\x95\x97\x99\x05\x89\xF7\x32\x54\x9C\x99\x9C\x54\x39\xBF\x71\x96\xE5\x81\x9B\x80\x96\x9A\xF9\x54\x25\x93\xCF\x96\x47\x37\xD1\x72\xBE\xE5\x91\xC0\x9D\x96\x9A\x5E\x99\x96\x99\x9A\x9B\xC5\x1D\x94\x78\x7D\xE5\x93\xA4\x9C\x95\x9D\x92\x9A\xF4\x9A\x2C\x82\x60\x38\xBD\x6E\xBF\xDD\x99\xC8\x9C\x99\x9C\x2D\x9D\x57\x9C\xCB\x9C\xC9\x03\xF0\x72\xBE\x1F\x4A\xC3\x95\x53\x84\x2E\x9D\x36\x94\xAD\x99\x34\x39\x9B\x70\x84\xE5\x8E\xBB\x95\xFF\x92\x0E\x9C\x4A\x80\x3A\x9C\x3F\x36\xE5\xB6\x77\xE1\x94\x88\x95\x96\x98\x1F\x9C\x43\x9A\x7D\x9C\x88\x38\xCC\x6E\x9D\x15\x81\xC4\x94\x34\x9D\x76\x82\x56\x9D\xD2\x9C\x7F\x39\x95\x73\x8D\xE1\x95\x07\x69\x88\x9A\xEC\x9A\x2C\x90\xB2\x9B\x8C\x38\xDB\x6C\x9A\x6D\x71\x28\x55\x38\x87\x30\x9C\x50\x9D\x99\x9C\x42\x39\x83\x6F\xB9\xE5\x8D\xF2\x82\xCC\x94\x25\x9F\xB0\x63\x27\x95\xFA\x2F\xF3\x6E\x95\xE7\x93\xCC\x99\x81\x9A\x39\x9D\x2A\x9B\xCC\x59\x7A\x37\xEE\x6B\xBC\xDD\x92\xCE\x9C\x31\x78\xB3\x69\xC3\x98\x86\x9C\xBE\x39\xC9\x71\x80\xE7\x80\xD9\x6D\x98\x9D\xAD\x50\xE2\x9B\xD5\x87\xB3\x38\x83\x67\x85\x21\x87\x5D\x4F\x78\x99\x19\x72\x4F\x9A\x60\x72\x03\x5C\x05\x14\xBC\xCE\x74\x11\x94\x33\x70\x04\x90\xCB\x92\xD7\x7D\xB0\xB0\x62\x63\xAF\x56\x71\xC5\x9B\xF2\x74\x9E\x96\x19\x99\xE7\x9C\xC5\xF0\x7D\x73\xB7\xD8\x95\xA0\x89\xCB\x7F\xB8\x99\xC8\x53\xD9\x9B\x4D\x23\x97\x6D\x9E\xC2\x8E\xAE\x91\x10\x97\x42\x9D\x4B\x89\x6B\x79\x13\x21\xEB\x71\xB6\x96\x98\xC8\x95\xBA\x7B\x17\x9A\xF7\x7B\xB3\x4C\x7E\x14\xCE\x0C\xAD\xBB\x85\xB6\x93\x10\x98\xDE\x97\x58\x90\x54\x81\x26\xB9\x75\xD7\x1F\xE4\x87\x7E\x68\x5F\x9A\x15\x3D\xFF\x9B\xE1\x84\x87\x32\xAE\x4F\x89\xCA\x90\xAF\x95\xC1\x86\x91\x8A\x8A\x9C\x15\x9A\xA5\x21\xB9\x74\xA2\xC0\x8F\x48\x9C\xA3\x99\x39\x85\x4F\x9D\x25\x64\x23\x1D\xC4\xC5\x4F\xE5\x99\xEA\x35\xA0\x80\x3C\x72\x6A\x9C\xA5\x8C\x81\x34\xF7\xF2\x62\xBF\x8C\x78\x72\x97\x98\x30\x87\x5E\x9D\xD2\x7D\x04\x3A\xA6\xC7\x44\x97\x33\xD2\x9D\x0D\x77\x31\x9F\x37\x71\xD2\x7D\x0C\x33\x91\x2A\x86\xE8\x92\x62\x9D\x62\x9C\xE8\x9A\x80\x88\xA3\x9B\xD4\x8A\x61\x69\xBD\x33\x8E\xBA\x96\x33\x9F\x6A\x6A\x7E\x06\x35\x9D\x27\x01\xF2\x69\xB3\xC6\x92\xAF\x9F\x6E\x3C\x34\x92\xDB\x86\x37\x90\xE0\x31\xC9\x13\xA8\xDD\x9D\xB6\x31\x76\x9B\x22\x9E\x48\x92\xF0\x9C\xEC\x39\xA4\x33\xA9\xE8\x94\x09\x46\xA7\x9C\x14\x9F\x98\x9A\xE0\x81\x1D\xF3\x61\xFA\x68\xE1\x96\x78\x47\x9F\x9F\xCC\x8F\x11\x84\x5B\x90\x3A\x35\xB6\x71\xAA\xC1\x9E\x6B\x39\x8B\x9B\x56\x6C\x34\x2F\xF0\x8C\x05\x39\x89\x6D\xBE\x7C\x7E\x64\x7C\x39\x9A\x87\x96\xE7\x99\x4B\x97\xBD\xFD\x18\x75\x9A\xDF\x95\xE2\x81\x5E\x9A\xD3\x8D\x91\x96\x46\x9B\x48\x32\xB0\x67\xBD\x2D\x8A\xDB\x71\x98\x9B\xFE\x9A\x66\x93\x37\x81\x5E\x15\xDD\x71\xA0\x55\x8F\xAE\x94\xDB\x7F\xDD\x99\xAC\x9B\xE0\x9B\xE9\x38\xE4\x46\x84\xDF\x92\x9E\x9D\x6B\x7B\xDF\x98\x89\x88\x55\x6D\xDB\xA8\x13\x6C\xB0\xDA\x99",
"\xA0\x9C\x5D\x9E\xFA\x77\xB1\x38\x51\x9D\xA7\x2E\x97\x67\x9B\xDE\x9C\x83\x93\x5E\x9C\x5B\x05\x79\x9A\xC8\x84\x27\x0E\xDB\xB6\x47\x89\x27\xC0\x94\xF5\x89\x6C\x97\x6F\x8B\x4C\x99\xDB\x36\xEB\x64\xAB\x98\x5C\xD3\x24\xAD\x9D\x2E\x91\x7D\x9A\x68\x9B\x27\x26\xA9\xCA\x57\xEA\x83\xB9\x91\x21\x9B\xBD\x98\x8E\x9D\xF5\x9B\xB6\x37\xCC\x66\x6F\xE4\x88\xCC\x5B\x98\x9C\xA1\x8C\xB0\x8C\xBB\x95\xC6\x36\xC3\x35\x8D\xE0\x84\xA2\x9D\x39\x95\x5D\x9D\x22\x94\xDE\x90\x48\x07\xBD\x75\x9C\xDC\x83\x96\x3E\x81\x9C\x21\x36\xBD\x9D\x0C\x3C\x05\x0A\xC7\x75\xA4\xEB\x8A\x36\x94\x70\x90\x16\x8D\x1D\x9B\x32\x9D\x6B\xE5\x62\x5E\xB4\xE7\x7D\xD6\x90\xCF\x91\x5C\x60\x23\x9A\x46\x86\x88\xE3\x43\x75\xBC\xB8\x62\x60\x98\xFD\x8F\xC4\x98\x1F\x9C\x42\x8B\xF4\x32\xC3\x06\x8A\xEA\x9B\x9E\x9F\x2D\x9D\x92\x6D\xC1\x92\xC8\x9C\x11\x3B\xB6\x75\xA8\x03\x9B\x61\x9B\x4B\x98\x97\x77\xBF\x9D\x62\x98\xD0\x2F\xEC\x44\x91\xF7\x7C\x3E\x3C\xB0\x99\x3E\x95\x9F\x90\xB2\x89\x97\xFE\x1E\xC4\x2D\xEC\x89\x82\x95\x64\x9F\x35\x9A\xA4\x90\xA3\x87\xF6\x16\xFA\x5F\xBB\xE6\x8F\x0D\x57\xB2\x9C\x06\x9B\xC1\x8A\xB4\x93\x47\x36\xFD\x0F\xB9\xE6\x80\x50\x67\xC9\x97\xC6\x53\xCC\x9C\x9F\x9D\x21\x35\x89\x33\x8F\xE7\x80\x8E\x9C\x7E\x9B\xC4\x6C\x07\x7D\x56\x9D\x7D\x38\xA3\x71\x97\xDD\x97\xDF\x81\x77\x98\xCA\x87\xDC\x9A\xA3\x9D\x03\x3B\xFD\x74\x88\xCA\x8E\xAA\x9F\x3C\x88\x51\x9E\x7B\x9D\x39\x7F\x1C\x3B\xAF\x0F\x9D\x68\x8C\xD0\x9A\xD6\x80\xA7\x9A\x7E\x9D\xA5\x73\x85\x33\xB7\x71\x8A\x27\x55\xD4\x96\xFD\x77\xC6\x53\xD4\x9B\x4A\x8F\x95\x33\x97\x3D\x88\xDA\x9B\xB5\x98\xB7\x87\x87\x8D\x93\x81\xCB\x9C\xD9\x11\xED\x76\xBC\x69\x2F\xDB\x90\x54\x89\x59\x9D\x70\x9A\x69\x98\xCC\x3A\x93\x64\xA8\xBE\x68\x72\x9B\x33\x94\x54\x3E\x79\x9C\x33\x9C\x2D\xDB\x1B\x61\x8C\xAB\x8F\xE3\x82\xAB\x99\x8E\x8C\xAD\x9C\x65\x72\xA7\x39\xCB\x73\x93\xDF\x83\xE4\x8F\x3C\x9B\xD4\x99\xF4\x98\xEB\x9A\xC9\xB9\x7C\x76\xA4\xCA\x8D\xA2\x95\x8F\x9B\x63\x9E\x11\x9D\xCF\x9C\x23\x00\xD6\x34\x8F\x94\x7B\xDB\x9A\xF6\x81\x18\x9F\xF0\x87\x8E\x95\x24\x37\xE7\x6B\xBF\x94\x64\xDD\x92\x6C\x9D\xB7\x88\x39\x99\x6B\x9D\xE8\x36\xC5\x74\xA4\x4C\x77\xC8\x90\xA7\x5F\x70\x9C\x54\x98\x50\x9B\xF4\x37\xB3\x74\x8C\xBC\x75\xD1\x9E\xE1\x7A\x73\x9E\xC0\x9A\xE1\x9A\xC4\x36\xE0\x1C\xB1\xEB\x98\x5B\x93\xF4\x8C\xBA\x70\x34\x2E\xDF\x9D\x14\x37\xCB\x75\x8F\xC4\x9F\xA1\x92\xA4\x9E\x6D\x9B\x8E\x9D\x73\x98\x6A\xBF\x47\x74\xAB\x6A\x76\xDD\x90\x47\x9E\x15\x81\xBC\x9A\xFA\x7C\xC8\x3B\x9C\x70\x84\x74\x3D\xD7\x95\xCD\x7F\xEB\x98\xE8\x9C\x06\x56\x0A\x94\x24\xE0\x47\x89\x39\xDE\x93\x9B\x9F\x2B\x9F\xA2\x9D\x90\x39\x2E\x38\xAA\xF1\x14\xEF\x80\x51\x85\x2D\x98\xB7\x61\x15\x79\xD8\x9B\xDF\x3B\x9C\x6C\xA1\x15\x95\xD2\x91\xD8\x79\x72\x9F\x79\x9C\x68\x9D\x57\x3A\xD8\x77\xA2\xE0\x89\x97\x91\x4A\x9D\x7C\x7C\x71\x32\xF2\x9D\xDB\x39\xFF\x52\xBF\xFA\x7E\xD2\x94\xE5\x75\x56\x9C\x00\x9E\x73\x9C\xF2\x00\x8E\x40\x93\x96\x7E\xDC\x9C\x91\x9F\x7B\x9C\x5E\x69\x95\x93\x64\x3A\xEF\x77\xBF\xE0\x91\xDF\x99\x66\x9D\x52\x6C\xCC\x9C\xBA\x6D\x0D\x3C\xEE\x72\xBF\xA6\x30\xD3\x9A\x4A\x83\x9C\x9A\xD9\x9B\x04\x95\xC6\x3B\x9E\xC4\x07\xF0\x96\xC9\x9C\x00\x99\x66\x9A\x87\x94\x4D\x6A\x75\x19\xBB\x02\x82\xE2\x88\x15\x8D\xBB\x9B\x7F\x9D\x49\x81\xE6\x9C\x7E\x3A\xB6\xE6\x53\x0B\x05\xBB\x9A\x19\x7B\x4F\x9D\x9D\x32\xF8\x9D\x1A\x3C\xCC\x73\x97\xD9\x8E\x25\x5F\x1C\x9A\xCB\x99\xD3\x9C\xCB\x65\xAB\x3B\xC7\x77\xAE\xF0\x8C\x9B\x99\x9E\x9A\x11\x9D\x7C\x99\xDF\x81\xDB\x0A\x8A\x74\xA7\xDC\x9E\xCC\x99\xC3\x99\x35\x9F\x2B\x9C\xB1\x8B\x7F\x33\x81\x55\xA5\x5D\x86\xDB\x90\xA9\x9D\x16\x9C\x7D\x99\x64\x02\x6A\x3B\xEC\x1E\x6C\xED\x9B\x8F\x9E\xE1\x7B\x8C\x98\xE6\x9A\xBE\x2F\x99\x3A\xF4\x76\x8A\xDA\x8D\x06\x9C\x5B\x9E\x53\x9E\x6F\x9A\x19\x78\xFC\x32\xCA\x71\xA1\xF1\x9C\xBE\x95\xB7\x99\xF5\x99\x71\x9A\xC3\x92\x85\x3B\xE8\x78\xAA\xCD\x8F\xC8\x91\x5D\x9E\x3F\x8B\x36\x9C\x0D\x9D\x8D\x3B\xB8\x6F\xA8\xFA\x69\xE3\x93\x9F\x99\xB9\x98\x60\x65\x5C\x9D\x32\x32\xBB\x75\x98\xEE\x91\xD9\x97\x24\x36\x8B\x9C\xE9\x9B\x32\x9A\xDB\x1E\xC0\x75\x8F\xED\x92\xCF\x97\x8D\x9E\xD9\x98\xC2\x94\xEB\x77\x5D\x3C\xCC\x70\x9B\xBF\x6F\x45\x9E\xE7\x8F\xF4\x9B\x2E\x8F\x5E\x9B\x6D\x1A\xB0\xE1\x50\x73\x26\xE4\x9E\x7B\x9C\x12\x9E\xBB\x9C\xD9\x91\x2C\x3A\xDE\x73\x9F\xF9\x76\x1D\x94\x53\x59",
"\x92\x9D\x19\x9D\xDB\x9D\xD9\x38\xAC\x3E\xBA\xEE\x95\xA8\x59\x08\x7B\x93\x9E\x24\x9E\xC4\x9D\x00\x1F\xA0\x79\x82\xEF\x8D\xD1\x97\x6C\x9F\x9F\x87\xBA\x9C\x65\x9B\xBF\x39\x8D\x79\x95\x12\x97\x94\x9C\xBC\x98\x5D\x9F\x07\x9F\x7C\x6E\xF4\x3A\x86\x77\xB9\xE3\x9A\xE5\x9A\x60\x98\x5F\x9F\xA1\x86\x16\x74\x8C\x3C\xB3\x27\x9E\xF2\x9C\xFB\x8B\x2A\x3E\xEF\x8C\xE4\x9D\x5C\x9E\xCA\x3C\x88\x79\x9D\x87\x98\xCA\x9B\xC7\x9B\x8E\x9D\x1F\x9F\x57\x87\xF5\x39\x88\x95\x68\x9A\x87\xD8\x95\xAB\x9C\x93\x9E\xF2\x9B\x74\x82\x0A\x3B\xE0\x76\xBC\xF1\x84\xE6\x9D\x32\x8F\x49\x9C\xC9\x68\xFA\x9D\xB5\x3B\xC3\x79\x91\xF3\x98\xC6\x96\x5E\x9F\x1F\x01\xFE\x9C\xC2\x72\xEA\x3C\xC4\x42\x8B\xF3\x9F\x76\x85\x62\x9F\x2C\x99\x35\x9E\x6F\x9E\x93\x38\xD2\x79\xAE\xEC\x83\xE0\x9A\x9B\x94\xC5\x9A\x04\x9F\x71\x9E\xEB\x3C\xA0\x6C\x98\x89\x8B\xE0\x9F\xCF\x9E\x9A\x9C\x39\x9F\x3A\x9E\x33\x36\xAA\x76\xB8\xDB\x87\xCB\x97\xCD\x9E\x5F\x9A\x99\x9C\x0B\x9E\x93\x31\x8C\xC7\x16\xE3\x81\xE8\x9B\x74\x9D\x01\x9B\xCD\x9C\x75\x7F\xFF\x1D\xED\x74\xA8\x0A\x8D\xEF\x7C\xD0\x9F\xA0\x9F\xB5\x84\xE1\x9C\x43\xFE\x72\x74\xBA\xBF\x97\x64\x9C\xD1\x98\xA0\x9E\x3C\x9E\x7D\x9E\x34\x3B\xE0\x6C\x9D\xC7\x99\x55\x81\xBE\x8E\xAC\x78\x94\x86\x1B\x9E\x3E\x37\xF1\x79\xA1\xC3\x8C\xE7\x9C\x1C\x98\x86\x9F\xD6\x9D\xEC\x61\x55\x3B\xAE\x3E\xB3\xDD\x85\xE9\x96\xD0\x9C\xA2\x9F\x6C\x73\x22\x9E\xCE\x39\xEB\x73\xBF\xF0\x85\xC2\x49\xA8\x9A\x0C\x9D\x21\x9F\x57\x9E\xA8\x3C\xE6\x77\xA6\xF3\x9B\x3C\x34\xB6\x99\xF9\x90\x15\x9F\xE5\x93\x84\x33\xDB\xE1\x12\xE8\x81\x57\x3F\x9F\x9D\x9E\x8B\x04\x95\xAA\x78\xD0\x5C\x77\x1F\x9F\x97\x90\x39\x95\x9E\x92\x33\x97\x79\x94\x6C\x95\x9D\x29\xFA\x68\x91\xCC\x95\xCB\x93\x31\x9F\x2E\x9E\xB1\x99\x1F\x94\x94\x3C\xA8\x50\x8B\xC2\x83\x42\x96\xB7\x9E\xA5\x8A\x5B\x92\x50\x9D\x75\xCA\x5A\x7A\xBA\x97\x9C\xEA\x9C\x94\x96\xE3\x96\x0F\x98\x90\x97\x20\x34\xA2\x5E\xA2\xD0\x89\x9A\x94\x42\x9E\xEB\x96\x59\x9F\x8A\x99\x56\xD8\x4B\x71\xAA\x47\x8D\xC6\x94\x5C\x9F\x1C\x92\x11\x95\x68\x9C\xA3\xEC\x5C\xCF\x32\xF5\x95\x30\x94\xD7\x9B\xF1\x97\xBD\x96\x37\x96\x68\x2F\x86\x59\xAA\xBD\x88\x64\x90\x40\x98\x79\x98\xC8\x99\x7E\x9A\x03\x39\x9F\x60\x89\x12\x96\xE3\x99\xA1\x9C\x71\x9C\x82\x94\xB6\x64\x9F\x25\x9E\x5C\x90\xAC\x38\x3A\x9E\xEE\x32\x77\x94\x4A\x9A\x20\x98\xCE\x2E\xC2\x60\x90\xBB\x84\x82\x94\xF9\x91\x06\x99\x66\x9F\x19\x98\xCF\x2F\xAD\x34\x80\xF2\x83\xBE\x9F\xD9\x9D\xF8\x98\xFE\x90\x45\x37\x5C\x25\xAD\x4D\xA6\xA3\x95\x03\x94\x20\x95\x9C\x96\xE3\x97\x99\x97\x90\x2F\xD4\x5C\xA4\xBE\x90\x60\x99\x11\x9E\x8F\x9B\xF2\x98\x04\x9E\x77\x23\xD9\x6B\x84\xB0\x8B\xEC\x9A\x62\x95\xB1\x9C\x9B\x95\x27\x97\x77\x3D\xD8\x5E\x9F\xB0\x98\x5A\x91\xC2\x96\xDC\x96\x65\x9E\x01\x9A\x1D\x30\xAF\x7B\x99\xC2\x81\x57\x99\x3E\x98\xAB\x9E\x87\x30\xE6\x9E\x47\x26\xCE\x7B\xA2\xB8\x97\x37\x9A\xF7\x91\xB2\x9F\x27\x97\xE0\x9E\x35\x2F\xC3\x7B\xA3\xB2\x8B\x62\x9D\x51\x9D\x69\x98\x1E\x99\xB4\x9E\x41\x28\xEB\x7A\xAA\xBA\x88\xC8\x9E\xA9\x9A\x21\x9C\x7B\x8A\xDC\x9E\x72\x25\xE2\x7B\x89\x99\x84\xEF\x92\x00\x90\x65\x94\xF1\x98\x10\x96\x19\x30\xC5\x53\xBB\xD3\x8C\xEF\x99\xDD\x99\x75\x98\xF8\x96\x99\x95\xB2\x3C\xE5\x61\xB1\xEE\x90\xDE\x99\x9C\x84\x76\x9D\x62\x9F\x04\x37\xB9\x3D\xD9\x4E\xBB\xB9\x9A\x34\x95\xEB\x96\xF8\x97\x2F\x94\xB1\x9E\x58\x33\xAF\x73\xBD\xD1\x8D\xEF\x97\x42\x99\x80\x9E\x31\x9B\xEB\x7C\xF5\x37\xB4\x74\xB4\xBA\x40\xEF\x92\x67\x92\xBF\x9D\x98\x93\x11\x97\xCF\x2B\xBF\x60\x80\xF7\x81\x82\x92\xDC\x9B\x08\x9A\xA0\x96\x4F\x9C\x00\x2F\xDA\x7B\xA0\xC8\x80\x55\x9A\x92\x9E\x7B\x93\x82\x9E\x4D\x99\x24\xAD\x37\x79\xBD\xBF\x98\xEF\x9B\x58\x96\xC4\x9C\x19\x95\x16\x93\x24\x2E\x8E\x5D\xA6\xB8\x83\x9F\x9B\x32\x9D\x7C\x9A\x3C\x9D\x8B\x9D\x08\x38\x84\x5E\xA4\x0B\x80\xA2\x95\x60\x9C\x8F\x82\x44\x98\x07\x9C\x71\xF9\x10\x7C\xB9\xF7\x9C\x38\x95\xFD\x94\x50\x91\x15\x98\x7D\x93\x57\x30\x82\x4C\x99\xC1\x80\x86\x9D\xDA\x9E\x08\x98\x4C\x9B\xE5\x9B\x8C\x2B\x98\x1E\x09\xE9\x87\x71\x54\xE2\x9F\xD7\x90\x95\x9F\x04\x96\x28\x29\xBE\x4B\x96\xF8\x97\x75\x98\xE1\x9B\x96\x9A\x86\x9F\x5A\x9A\xB1\x39\xA9\x70\x9E\xF8\x98\x2B\x6B\x45\x98\x17\x83\xE2\x5F\x32\x9F\xE1\x26\xE7\x7C\x83\xBF\x86\x4F\x9A\x91\x93\xC8\x9C\x05\x9A\xF2\x99\x91\x36\xF1\x6F\x90\xED\x80\x3A\x35\x69\x94\xB8\x30\x9E\x9F",
"\x84\x93\x7A\x3E\xB3\x5D\xBE\xA1\x98\xEB\x97\x4F\x99\x84\x99\x3E\x9B\xCA\x9E\x03\x3E\xC5\x7B\x9C\xF8\x9F\xA3\x93\xE7\x9D\xF0\x9B\xEA\x97\xD0\x8F\x06\x3B\xE3\x72\xA7\x48\x80\x79\x3D\xE3\x99\xD1\x9C\x7E\x94\x8F\x93\x6A\x3E\xE0\x7A\xA9\xA7\x8D\xF3\x9A\x51\x9F\xCD\x9C\x47\x9B\x02\x9F\x04\x34\xFF\xDB\x01\x88\x87\x12\x37\xE8\x9B\xE3\x92\x6E\x9F\x0A\x98\x90\xED\x53\x7B\x9A\xBD\x95\xEE\x9C\xF5\x91\xF7\x96\x5F\x9E\xE3\x9E\x78\x39\xC8\x7B\xB2\xD4\x8F\xE2\x9E\xF2\x88\x9D\x9F\x65\x50\x29\x9F\x9D\x3E\xAF\x7D\x8E\xB3\x80\x7D\x92\xA4\x95\xEF\x94\x8B\x94\x17\x9F\xFE\x2E\xB0\x7C\x91\xC9\x80\xC5\x99\xFA\x91\x81\x9D\xB7\x92\x6D\x67\xAD\x3E\xAF\x4E\x9E\xFA\x87\x51\x9F\xF0\x92\x05\x9A\x9F\x96\x16\x98\x80\x2E\xC8\x7D\x80\xBE\x84\xF0\x91\x32\x9E\xC0\x9C\x31\x99\x0A\x96\x83\x39\x9A\x76\xB7\xAC\x71\xF6\x96\x78\x96\xC7\x9F\x0C\x94\x20\x9F\x29\x3E\x8C\x7D\xA9\xD4\x8E\xF4\x9B\x52\x98\xD2\x9D\x4B\x9A\x7E\x9A\xF1\x2F\xDF\x7C\xA6\xDF\x8F\xC8\x8C\xEB\x9F\xB9\x71\x14\x9C\xD6\x90\x9C\x3E\xA3\x4B\xA6\xFB\x8F\x50\x95\x86\x94\x88\x96\xBA\x9E\xD4\x9E\x2A\x35\xAA\x7B\xAC\xD4\x8C\xED\x9E\x52\x9B\xDA\x94\x2B\x9C\x5D\x9F\x58\x38\x8A\x78\xA9\x14\x94\x07\x74\xEE\x9D\xF3\x93\xBE\x9F\x73\x94\x10\x2A\xD9\x58\xBF\xF6\x89\x7B\x98\xDE\x9B\xED\x96\x7A\x9E\x6A\x96\x05\x3F\xB9\x5E\x87\xF7\x84\xE1\x97\xCA\x8F\x26\x8F\x81\x9C\x78\x8F\x0D\x3F\xB6\x4F\x8F\xFC\x9C\xED\x99\x7B\x91\xDC\x95\x85\x9E\x51\x9F\xC7\x2F\xA4\x7D\x89\xBF\x96\xF5\x9B\xFC\x90\xD5\x9F\xC1\x9E\x8E\x9F\x90\x31\x97\x7D\x92\xC6\x9D\x44\x8B\xBF\x8C\x4F\x2D\xC8\x9F\x60\x2C\xA5\x3D\xF9\x5E\xBD\xF7\x8A\x7F\x9D\x3F\x9C\xFD\x97\x5E\x9E\x2A\x9A\x7D\x3D\xAD\x7E\x9D\xFB\x89\xF5\x90\xF3\x9C\x3B\x9F\x67\x98\x03\x95\x6C\x3A\xBA\x76\xA3\xF8\x84\xED\x91\x77\x96\xB4\x9C\xED\x99\x52\x9A\xD6\x39\xE4\x7A\x81\xE5\x9F\xEB\x97\x77\x98\xE1\x9F\x83\x8F\xA3\x9F\x57\x37\xA2\x7A\x81\xEA\x97\x64\x9E\x90\x37\xE6\x9E\xDC\x35\x9C\x9F\x13\x3E\xA1\x4F\x9D\xBA\x96\x75\x9F\xE9\x95\x86\x98\xC5\x94\xE5\x97\x16\x2B\x93\x7D\x9B\xFC\x87\xF0\x99\xCD\x97\xED\x9B\x87\x6F\x96\x9E\xDD\x2C\xA4\xA6\x70\xF4\x8E\x3B\x9C\xEE\x31\xC2\x9C\xD8\x9F\x2A\x9F\x8E\x25\xD6\x7D\x91\xBC\x99\xF2\x9C\x6F\x93\xCB\x9F\x3E\x98\x55\x9C\x9F\x38\xB2\x7C\xBF\xD3\x80\x81\x90\xD4\x99\x86\x9F\xBE\x72\xB1\x99\x24\xAD\x73\x6E\x9D\xFD\x8C\xFA\x90\x6D\x96\xE9\x9E\x6D\x8B\x5F\x9A\x90\x33\xC8\x73\x94\xE6\x96\xDF\x90\xCB\x98\x9C\x99\x73\x98\x2C\x9B\x54\x0D\xF0\x66\x86\x0B\x9E\xBB\x91\x05\x9E\x8C\x34\xDC\x93\xC6\x9F\x3A\x3F\xCA\x69\xBB\xC9\x90\xFC\x92\x49\x99\x98\x99\xD2\x9A\x8F\x9E\xD8\x3C\xE7\x77\xAD\x2A\x51\xE2\x90\x67\x9B\x8A\x9E\xBB\x84\x5A\x9C\xBF\x2D\x89\x6F\xB1\xD9\x93\xD4\x9A\xCA\x7D\xAA\x9F\x4F\x9A\x92\x60\x69\xFC\x26\xE1\x13\xF5\x80\x00\x03\x0C\x06\xF6\x9D\x04\x8B\x52\x9B\x00\x15\xEA\x27\x90\x37\x06\x6E\x07\xFE\x81\xA9\x7C\x9B\x8F\x41\x56\xC5\x3F\xE8\x5A\x8B\x58\x64\x4F\x95\xD7\x98\xE6\x94\x64\x9F\x89\x9F\x92\x3D\x95\x7E\x94\xF6\x83\xA1\x97\xDD\x9E\x8A\x9A\xCB\x9E\x2C\x9A\x81\x3D\xEB\x78\xA5\xEA\x9A\xAD\x90\xA0\x89\x81\x80\x6D\x87\xB7\x9E\x4A\x32\x98\xD4\x6F\x4D\x4E\xC0\x7B\xFC\x9E\x41\x94\xC4\x9F\x7E\x9F\x12\x3F\xAA\x7C\x94\xFC\x8C\xF1\x99\xDE\x9A\xDB\x9F\xE4\x97\x8C\x9F\x95\x2F\xC4\x7E\x99\xFF\x83\xD5\x97\x7E\x9E\x54\x9D\xF7\x9E\xC2\x92\xA9\x3A\x84\x77\x8F\xDA\x92\x71\x94\x05\x4B\x7B\x7A\x9A\x77\xE6\x9F\x3D\x30\xCF\x7F\xAA\xFF\x91\xFE\x9C\xFE\x9E\xE2\x9E\xFB\x9F\xD2\x97\xF0\x3E\xAF\x6A\x8C\xFB\x9D\x8C\x90\x11\x86\x6F\x78\xEF\x99\x58\x9D\x9F\x3D\xDE\x71\xAA\x23\x9C\xFF\x99\xFC\x99\xBC\x96\xFF\x7E\x58\x9F\xC3\xF4\x78\x2F\x8F\xCA\x81\xC2\x87\xF6\x9C\xE5\x9D\xDA\x9F\xEB\x9F\x1E\x35\xEC\x7E\x9C\xF7\x88\xC7\x93\xAE\x91\x44\x9C\x5C\x6B\x24\x2E\xF9\x2C\xAE\xFA\x44\x4D\x46\x9D\x5C\xFD\x47\xB6\x92\x62\x47\x0A\xA0\xCE\x2D\xD7\xAB\x61\xFE\x87\xA8\x9E\x4B\x9B\x82\x9B\xFB\x98\x43\x9A\x31\x37\x82\x7D\xBE\xEA\x9C\x9E\x96\xA2\x9F\x46\x64\x0C\xA1\x40\x98\x23\xD1\x3B\x7B\xB2\x8A\x88\xFF\x9E\xDB\x9B\x00\xA3\x79\x9F\x02\xA0\xD3\x3F\xFC\x7A\x95\xFF\x97\xF5\x9A\xF6\x99\xD7\x9D\xD1\x9F\xC1\x9D\xDD\x3D\xFB\x63\xB4\xD8\x3F\x01\xAC\x80\x93\x0C\x97\xB9\x9E\x69\x94\xE9\x3E\xD2\x7B\xBF\xF7\x94\xEE\x91\xE0\x9A\x84\x97\x8B\x9E\xC0\x9F\x31\x3E\xDE\x7D\x8E\xCF\x7E\xDB\x90\x5E\x98\x78\x9E\xFD\x98\xFA\x9E\xD7\x30",
"\xF9\x67\xA2\x65\x94\x02\xAF\x0C\x8E\xD8\x76\x63\x9E\xBB\x9E\x02\x40\xFF\x7D\xAB\xF8\x89\xED\x9D\xE2\x9B\xB5\x9F\x17\xA1\x2E\x9F\xC2\x30\xE2\x80\x84\xBE\x86\xA0\x98\x7E\x99\x36\x78\xEC\x9D\xE1\x9D\xE9\x36\xB8\x05\xB8\xAC\x8B\x01\xA0\x73\x6F\xFF\x9F\x1B\xA0\xE7\x9F\xE5\x3D\xD0\x7F\x87\x01\xB4\x03\xAD\xFE\x9E\x0E\xA1\xB2\x9E\x30\xA0\xCB\x3E\x82\x7F\xA1\xE2\x87\xC7\x96\x27\x9B\x79\x90\xAD\x56\x36\xA0\xE2\xFF\x06\x81\x8F\xF7\x8C\x7C\x91\x07\xA2\x0B\xA1\xCF\x9E\x0C\x98\xC6\x33\x82\x7C\xAF\xFB\x9C\xF6\x98\xD9\x9A\x0F\xA2\x66\x9F\xFA\x99\x7D\x40\xAB\x68\xBE\xDF\x9C\xAF\x9E\x9C\x9B\x27\x9E\x5F\x7A\x1D\x9F\xF8\x24\xE3\x1F\x7E\xFF\x96\x02\xAC\xEF\x98\xDD\x9D\x07\x96\x4F\xA0\x79\x3D\xB6\x5F\xBF\xFC\x8E\x7F\x93\x0A\xA2\xD2\x9C\x08\xA0\xF7\x9E\x4F\x40\xBC\x68\xA4\x86\x99\xC9\x96\xC4\x9F\xBD\x98\x83\x9F\xEE\x84\x50\x3E\x8C\xEE\x18\x02\xBC\x32\x7A\x09\xA3\xBC\x9D\x9B\x95\x9D\x9F\x02\x30\x8D\x7D\xBA\xF5\x8F\xF4\x94\xFD\x99\xD2\x9D\xF2\x98\x5C\x9F\x67\x3D\xD6\x7E\x89\x29\x76\xC0\x9D\x26\x7B\x19\xA1\xFB\x7F\x66\xA0\xFB\x3D\xCF\x81\xA2\xFE\x96\x9A\x9D\x4C\x9C\x29\x99\xE0\x9B\xEC\x9C\x35\x39\xA2\x80\xA0\x99\x55\xF3\x99\x9F\x86\x36\x62\x37\xA1\x8F\x96\x17\x40\xC3\x7D\xA1\xFA\x83\x77\x99\xAD\x95\xDC\x95\xAD\x9F\x2A\x9A\x4C\x40\xBF\x81\x9D\xF8\x9A\x06\xA0\x0C\x84\x04\x9F\x83\x9F\x02\x94\xF2\x2D\xB1\xAE\x61\xFD\x95\x5A\x98\x0B\xA2\x1A\xA2\x2E\xA0\x6A\xA0\x4A\x40\xD6\x81\x97\xF6\x91\xF7\x9B\x00\xA1\xE3\x95\xCC\x9E\x2E\x9D\x5B\x29\xE2\x72\xB1\x8B\x73\x7A\x98\x23\x6A\xF2\x6B\x0C\xA0\x8B\x9A\xA3\x3F\xB6\x80\x80\xD3\x98\x01\xA3\x6F\x9E\x00\x9E\x58\x2F\x55\x9F\xC4\x65\x6F\x81\xB0\x9C\x60\x07\xA7\xE2\x9C\xBF\x9F\x38\xA1\x4D\x92\x1B\x41\xB8\x63\x81\xFA\x87\xF2\x93\xE8\x9E\x1A\x8D\x3D\x82\x7C\x44\x33\x0A\xF0\x57\xA2\x04\xA7\x3B\x71\x0F\xA6\xF1\x9D\x72\x8A\x5B\x99\xCA\x30\xDB\x70\x89\xE7\x94\xFC\x99\xD4\x98\x7F\x9C\x89\x90\x02\x96\x33\x41\xA3\x59\x7B\xF9\x9E\xEA\x9D\xE7\x98\x68\x96\x74\x93\xEA\x98\x3A\x41\x93\x7F\x8C\xF1\x88\xCD\x99\xBA\x9F\x1F\x01\x96\x9C\x8C\x42\x41\x41\xD4\x5D\x4A\xFA\x81\x5F\x92\x07\xA3\xFD\x9C\x23\xA0\x03\xA0\x8E\x40\xDB\x7D\xBE\x02\xA3\xFA\x9F\xF2\x9A\x1D\xA3\xAE\x9E\x99\x9F\xFB\x1F\xFD\x79\xAB\x5A\x8F\x01\xA3\x0B\xA6\x0D\xA3\x26\xA1\xC7\x9E\x89\x40\xC6\x80\xBA\xBB\x93\xEC\x9C\xEF\x97\x00\xA0\x71\x9F\x6B\xA0\x4D\x40\xD9\x81\x81\x03\xBE\x7D\x9C\xC3\x94\xA2\x8C\x21\xA0\xEA\x93\xB4\x40\xE7\x7F\xB6\x02\xBE\xF7\x95\x10\xA3\xDD\x9F\x34\xA1\x76\x9F\xD5\x40\xBD\x81\xB0\x05\xBA\x07\xA4\xE9\x9C\x1F\xA2\x13\x71\x25\x6A\x27\x01\x6F\xF5\x6B\xE1\x40\x08\xAA\xFC\x9E\xFF\x7F\x3F\x01\x34\x49\x6F\x00\x63\x4F\x51\x05\xA4\x55\x53\xC0\x2B\x4E\x49\x48\x88\xDF\x68\xE3\xA8\x7B\x24\x56\x44\x71\x93\x4C\xDC\x01\x50\x4A\x51\x12\x53\x71\xFB\xE6\x0A\x25\x62\xC2\x10\x40\x96\xB2\x53\x80\x2D\x08\x5E\x2E\x55\x62\x14\xFB\x1B\x19\x4A\x44\x19\x71\xA6\x79\x54\x48\x58\x13\xD4\xA0\xFF\x00\x07\xC8\x4E\x42\x73\x0C\xA6\xB2\x54\x56\x4B\x49\x01\xE9\x4D\x43\x35\xE3\x7F\xB0\xE0\x79\x5E\x21\x05\x41\x58\x4A\x43\x68\x35\x91\xC7\x92\x12\x83\xA5\x05\xB0\x96\x4F\x9F\x2A\x5A\x4A\x27\x38\xCA\x44\x0A\x3D\xA2\x7B\xB4\x06\xAE\xB2\x63\x10\xA6\xE4\x9F\xD8\x9F\x35\x9F\x65\x3F\xAA\x7E\xB6\xD0\x88\xFB\x98\x43\x9C\x30\xA3\xDA\x9F\x6F\x9F\x24\x33\x80\x53\x90\x37\x1B\x97\x42\x1C\xA6\x74\x59\x8C\x38\x61\x72\x38\xF6\x4B\x83\x96\xB3\x5B\xDE\x65\x4C\x76\x3E\x97\x18\x26\x93\x99\x4E\x2B\xFD\x7F\x96\x04\xAD\x0E\xA7\xF5\x97\xE4\x9C\x3D\xA1\xB0\x9E\xF6\x40\xF3\x60\xA6\xFA\x96\xCB\x98\x0D\xA0\xB0\x9C\x76\xA0\x51\x9C\x35\x3B\xC0\x76\x8D\xDD\x9E\xB1\x9D\x5A\x77\x9B\x6E\x78\xA0\xDC\x6A\x42\x40\x8E\x46\xA2\x03\xB4\x01\xA0\x4B\x98\xA3\x99\x39\xA1\xF3\x98\xE7\x40\xD4\x7E\x83\xE5\x95\xF4\x9E\x35\x9E\x35\x9A\x7E\xA1\xE1\x9C\x42\x3B\xC9\x6C\xA6\x94\x98\x64\x97\x17\xA7\xFC\x78\x49\xA1\x1F\x9F\x58\x40\xB7\x81\xAE\x07\xB9\x7A\x94\xEE\x93\xEB\x96\x7C\xA1\x1B\x9A\xB0\x39\xE8\x81\xB2\xE6\x8C\x10\xA5\x75\x9D\xC9\x9A\xD2\x9D\x55\x96\x43\x3D\xC2\x63\xB5\xFC\x90\xE6\x2F\x1F\xA1\x08\xA0\x06\xA0\xB3\x99\x41\x32\xBD\x73\x80\xE4\x93\xE8\x97\xD2\x9C\xA6\x9F\x06\x9F\xCB\x9F\x3C\x3C\x98\x4F\xBE\xF0\x89\xD7\x98\xF1\x7B\x45\xA2\x87\x31\x16\xA1\x32\x40\xEC\x83\x91\xF7\x9B\x10\xA2\xEB\x9D\x43\xA0\xAD\x9F\x0F\xA1\xD4\x41\xA1\x84\x8A\x08",
"\xBA\xCE\x96\x18\xA2\x52\x85\x0D\x98\xEF\x98\xBA\xB3\x3A\x4A\xBC\x08\xB2\x2A\x5F\xB5\x99\xB3\x78\x63\xA0\x0B\xA0\x02\x41\xF8\x7E\xA4\x9B\x9B\x7B\x95\xEC\x9A\xF4\x96\xDF\x96\xB7\xA0\xEB\x3D\xDB\x82\xA5\x02\xB2\xFF\x97\x1F\xA2\xF5\x94\x44\xA0\xB1\x30\x4D\x3D\xCE\x4F\x87\xF1\x90\xFD\x91\xD5\x9C\x3F\x9D\x16\x9F\x80\x00\x8A\x2D\xF7\x0C\xA3\xDF\x7A\x0E\x5E\x08\x69\x4E\xA3\x1E\x95\x09\x97\xA9\x35\xFD\x9A\x7D\xD6\x63\x3C\x5F\x5B\x7F\x0D\x5D\x70\x7B\xDD\x9F\xC9\x00\x3E\x7F\xA7\x07\x83\xE0\x28\x3B\x72\x59\x75\x81\x9C\x8C\x07\xC6\x0D\x4B\x01\x02\x0A\xB7\xFD\x93\xBC\x84\x3B\xA2\xE2\x7D\xE1\x9F\x27\x01\x4D\x01\x0B\x0A\xA3\x0F\x8F\x9F\x2B\x82\x7D\x9D\x71\x37\xA1\x00\x00\x4F\x01\x13\x0A\xA2\xFE\x93\xA2\x99\xFA\x90\xA7\xA0\x44\xA1\x27\x01\x51\x01\x1B\x0A\xB5\x48\x73\xC0\x28\x32\xA0\x7A\x80\x8C\x07\xA6\xBA\x02\x02\x38\x06\xA1\x79\x81\x1C\xA2\xF7\x9F\x7F\x2C\xF0\xA0\xBA\xE1\x6B\xDA\x25\x07\xA5\x51\x97\x1E\xA4\x24\x62\x71\x06\x13\x74\xF1\xE9\x4C\x6A\x8F\x36\x81\x08\x08\x2B\xA1\x5D\x97\xBE\x94\x47\x19\x5E\xFA\x20\xF9\x11\xD5\x9D\x40\x7F\xB0\x7A\x4B\x9D\xEE\x33\x5E\xA1\xFA\x2A\x87\x58\xA4\xA3\x74\xD8\x7E\xD7\x65\xB7\x7C\xB2\xA0\x86\x95\xCC\x2C\xD3\xD0\x48\xE4\x79\x61\x6B\xCD\x79\xB1\x99\x44\x7E\x54\x7D\x76\xFA\x1E\xF5\x4F\x0B\xA4\x59\x91\x2D\xA6\xAE\x1A\x57\x9B\xBB\x9A\x43\xFB\x1C\x6B\x83\xF2\x49\xD9\x7C\xAA\x9D\x1D\x76\xFC\x94\x59\x96\xFE\xC4\x2E\xF6\x6D\xCA\x30\xD9\x7B\x59\x99\x9A\x7E\x56\x9A\x21\x72\x80\xFD\x4C\xA4\x61\xA3\x73\x56\x9D\x2D\xA1\xB0\x19\x5B\x9B\x1D\x39\x6F\x35\xE1\x85\xAE\x0B\xB3\xAB\x9E\xA2\x5B\x5B\xA3\xCE\x95\x7A\xA1\xAE\x35\x76\x6A\xA2\xF4\x62\x24\x7B\x57\x9E\x59\xA2\x38\x97\x5A\x74\x4C\xFB\x45\xF2\x4E\xED\x75\x16\xA2\x9B\x7F\x5A\xA2\x58\x9B\xDF\x3E\xFD\x42\x87\x86\xA9\x0B\xAE\xE8\x77\x58\x99\xBB\x7D\x0C\x8D\x6C\x7D\xAA\xFD\x11\x86\xB1\xB2\x8C\x5E\x93\x31\xA1\x59\x7F\x7F\x03\xB1\x7D\x0C\x43\xAB\x99\x4A\xD6\x80\xED\x75\x59\x9A\x5B\xA2\xC4\xA0\xEF\x1A\xB9\xFD\x1E\xFB\x4D\xE7\x65\xDD\x2E\x59\x9D\x56\x9E\xBF\xA1\xA8\x95\xBF\x42\xE1\x7B\x02\xF7\x63\x18\xAA\x89\x75\xB4\x99\x6E\xA0\x61\x74\xA7\x2A\xB1\x86\x90\xB8\x0D\xEE\x74\x1D\x3E\x11\x6B\xCB\xA1\xB4\x95\xD7\xE8\x3B\x86\xA3\xE8\x6E\x4B\x71\x2F\xA1\xBF\x98\xCE\xA0\x5E\x95\xCA\x42\xDE\x6B\x2C\xD6\x8E\xC9\x7A\xDD\x78\x95\x71\x30\x7E\xAD\x6A\xC6\x0D\x55\x01\x23\x0A\xBE\x92\x67\xCF\x5E\xDF\x78\xA0\x7B\xE4\x7D\x63\xF7\x36\xF4\x07\xD8\x72\x03\x06\xC4\x7A\x5A\x7B\x82\x7A\x72\x7E\xE1\xC7\x7E\xF0\x4B\xE0\x78\xFF\x70\xDD\x01\x86\x7D\xA9\x6C\xAC\xA1\x74\xF8\x32\x7D\x25\xDD\x7D\x1A\xA3\xF0\x68\x89\x7C\x6D\x0C\x25\x7E\x14\xF7\x60\x03\x1F\x80\x80\x15\xA9\x10\x07\x1A\x03\xD4\xA0\x27\x84\x7F\xF8\x6A\xEC\x70\x06\xAE\xC4\x7E\x2A\xA4\xF6\x9E\x41\x01\x6C\x00\x77\x43\xD6\xFF\x5A\x53\x8C\x3D\x68\xB9\x78\xF9\x72\x04\x94\x48\xA1\x91\xD1\x01\x87\xA4\x0A\xBF\xCF\x2D\x74\x7F\x93\x3B\xEE\x9F\x6E\x00\x8A\x43\xF8\x86\xBF\x67\x22\xE4\x77\xA2\x9E\x6F\xA0\x8A\x69\xC8\xA1\x8C\x42\xDA\xAA\x62\xE3\x6E\x2D\x86\x99\x2E\xB8\x04\x5E\x87\xBC\x7F\xB9\xFB\x06\x02\x32\xDF\x74\xCF\x7F\x39\xA6\xB8\x06\x07\x7E\x01\x7B\x68\x43\xCB\xF7\x44\xE0\x7C\x3E\x6E\xBC\x7E\xFB\x63\x85\x02\x04\x7C\xD8\x62\x0A\xF0\x57\xDC\x77\xCB\x75\x3A\xA7\xD5\x2E\xF1\x7D\xF0\x7D\x7E\x0D\x9E\xB6\x24\xEF\x7B\x15\xAA\x8E\x78\x0C\x7D\xFE\x93\xB0\x7B\x81\xDA\x59\x86\xAD\xCA\x3B\x1A\xAC\x82\x79\x21\x03\x03\x64\xE4\x7E\x97\xFC\x51\xF1\x42\xF0\x73\xC6\x7F\x73\x79\x31\xA3\xF8\x53\xDA\xA1\x02\xC8\x19\xF9\x66\xDE\x6C\x1C\xA7\x85\x7C\x76\xA3\x29\x7F\xFA\x7F\x35\xF6\x7E\x73\x66\x0D\xA3\xCC\x50\x3D\xA6\x0D\x6B\xED\xA1\x1F\x7E\x0A\xF7\x62\xEE\x69\x0D\xA4\xBB\x76\x87\x7C\xB3\x5D\xEB\xA0\x34\x64\xB5\x01\xEF\x86\xA6\xD9\x71\x1B\xAA\x3A\x01\x6F\xA1\x13\x7F\xE7\xA1\xD7\x43\xFD\x1A\xB3\x41\x74\xB3\x7B\xC5\x7E\x7A\xA1\x19\x7F\x2C\x7E\xD0\x0D\x39\x7F\xB6\x0F\xB4\xE5\x75\x75\x7C\xCF\x78\x73\x06\xC9\x7B\xFB\x43\x8F\xF8\x7F\xDF\x7B\xEF\x57\x8C\x7A\xDD\x2C\xFC\xA1\xFB\xA1\xD8\x43\xFE\x32\x1B\xF2\x61\x96\x27\x40\xA4\x7F\xA3\x00\xA2\x5B\x7E\xB1\xF7\x29\xED\x4D\x10\xA2\x20\xA5\x82\x7D\x1D\x7E\xAD\xA1\x93\x00\xE3\x00\x18\x87\x99\x0E\xB1\x02\x41\x55\x21\x3D\x56\x6F\x7A\x27\x55\xC5\xD1\x66\x07\x34\x9F\x4B\x3F\x5C\x39\xA5\x74\x2E\x71\x07\x72\x00\x1A\x44\xDD\xC3\x7B\x0E\xBC\x47\x79\x3A",
"\xA0\xE6\x78\xF3\x7C\x99\x7B\xF5\xFB\x2B\xEC\x5E\x9F\x9D\x1C\xA7\x12\x07\x1C\x01\x0A\xA3\x41\xA1\x8E\xFC\x06\x88\xB5\xDB\x74\x21\xA9\xFC\x5B\x8B\x9F\x10\x8F\x73\x9A\xD0\x3D\x9D\x81\x84\x09\xBB\x02\xA3\xEB\x9D\x0B\xA2\x75\x9E\x85\xA0\xD8\x3D\xDC\x82\x98\xFF\x86\xD3\x84\x06\xA3\x6E\x9C\x1B\x9F\x31\x9E\xE6\x19\xF7\x76\xB8\xCF\x84\xBC\x81\x0D\x93\x8B\x87\x80\xA0\x8C\xA0\xE4\x40\xDB\x69\xB0\xE0\x9B\xC8\x93\xC2\x9B\xFE\x9D\x13\xA2\x5D\x9B\x4F\x44\x9B\x75\x9D\x10\x88\xD5\x98\xBB\x9A\x67\x93\xFE\x9F\x6B\x9A\x9C\x40\xE9\x82\x95\x05\xA4\x00\xA7\x15\xA1\x09\xA0\xD0\x9F\x25\xA0\x42\x3F\xE3\x84\x9D\x05\xA5\x13\xA3\x02\xA4\xCB\x95\x57\x8A\x2F\x97\x79\x3C\xE0\x5C\x8F\x59\x90\x03\xAA\x46\xA5\x2F\xA0\xC0\x9E\x76\x9F\x02\x3F\xEE\x7D\x84\xFC\x89\x00\xA6\xF0\x9B\x89\xA3\xC8\x99\x8B\x99\x61\x09\xB3\x7B\xB1\x37\x95\xED\x9C\xAB\x99\x78\x98\x71\x32\x2A\x98\x5C\x42\xF0\x54\x9E\x09\xA7\xF6\x99\x15\xA7\xFD\x9C\x21\xA2\x8D\x9F\x4E\x40\xDE\x82\xAE\x99\x8A\xEE\x95\xE0\x87\x91\xA3\xEC\x96\x0A\x90\xEF\x41\xA3\x7D\xB1\x07\xBB\xA3\x93\x1F\xA5\xAC\x9D\x7D\xA1\xAA\x9F\x73\x41\x8D\x6D\xAF\xA8\x73\xB5\x96\x50\x99\x88\xA1\x1F\xA3\x21\xA2\x9F\x40\xC5\x67\xBB\x02\xA7\x9E\x98\x44\xA6\xFA\x9E\x12\xA3\x10\xA0\x4C\x44\xF9\x60\xB8\xD6\x9B\xFE\x94\x9E\x8D\x48\x8B\x7C\x93\x67\x9D\xF3\x32\xD8\x61\x9A\x3B\x70\x24\xA6\xDE\x9B\x2D\xA2\xF4\x9F\xB6\xA0\x95\x44\x88\x80\xA4\x02\xAC\x08\xA2\x09\xA5\xD9\x9D\x4A\x9D\x54\xA0\x08\x34\xE7\x64\xBA\xE4\x8E\xF2\x91\xA8\x9E\xC1\x9D\xB0\x87\x2B\xA2\xA3\x34\xB5\x80\xB9\xD1\x83\x25\xA3\xD6\x9D\x94\xA3\xD4\x9F\x53\xA2\x0B\x42\xCD\x84\xB9\x8C\x95\x04\xA7\xAC\x72\xEE\x84\x9F\x2C\x62\xA2\x8A\x40\xC6\x89\x88\x01\xA8\x26\xA3\xF0\x9F\x0E\xA0\xFC\x9E\xD7\x9E\xA6\x40\xB0\x7B\x88\xF8\x96\xD6\x91\xF4\x88\x5B\x9D\x64\x90\x79\x97\xE6\x44\xD0\xB9\x28\x13\xAA\x0B\xA1\xFA\x94\x2D\xA3\xE8\x96\x30\xA1\x18\x3F\x97\x89\xB1\xFF\x93\x23\xA7\x48\xA4\xC6\x9C\x34\xA2\x62\xA0\xAD\x40\xD4\x89\xA9\x08\xBA\x80\x71\xCC\x98\x82\x98\x36\xA3\x5E\x9A\x05\x42\x91\x69\x93\xD1\x9C\x05\xA3\x48\xA3\x99\xA2\x02\xA1\x66\xA2\x0C\x40\xC8\x4B\x9C\x03\xA0\xC6\x76\x12\xA4\x40\xA1\x36\x9A\x03\xA1\x5A\x44\xCE\x69\xA7\xFE\x9E\xE9\x95\x16\x9C\x7B\x9C\x1A\x9B\x87\xA2\xEC\x33\xDA\x89\x85\xD2\x8A\x09\xA8\x73\x9A\x07\xA3\xBE\x9D\x36\x7A\xFE\x40\xD7\x89\xAE\x12\xB0\x06\xA6\x01\x99\x96\xA0\x80\x9F\x50\xA0\x5E\x40\x8F\x81\xB8\x01\xBB\x8C\x9D\x10\xA1\xA6\x99\x9E\x94\xB0\xA0\x13\x0A\x97\x6C\xB4\x1B\x88\x29\xAE\x45\x98\xA1\x99\x8C\xA1\x75\x9A\xF1\x39\x8E\x72\x9C\x39\x80\x76\x81\x43\x98\x2D\xA0\x4D\xA3\x58\x9F\x44\x44\xC6\x84\x86\x11\xB7\x07\xA1\xF4\x9F\x03\xA3\x2D\xA2\x60\xA0\x9A\x44\xAE\x71\x80\x15\xBF\x06\x8F\xBE\x90\x93\x53\x39\xA3\x4F\xA2\x4E\x28\xB6\x8A\x9C\x01\xB8\x29\xA7\x44\xA2\x30\xA3\x42\xA1\x8B\xA2\xF1\x44\xDB\x7B\xB9\xD2\x8E\xF5\x7F\x13\xA5\x93\xA1\xEE\x33\x7D\xA2\x6B\x44\x8B\x81\x81\xFC\x95\x03\xAD\x4E\xA2\xA7\xA3\x3B\xA2\x2F\x9F\x3D\x45\xE0\x7C\x98\xBE\x85\xB9\x91\x6F\x90\x8D\xA2\x53\xA3\x93\xA0\xC4\x26\xB7\x80\xAC\x14\xB9\x01\xAC\x12\xA3\x07\xA1\xC7\x9D\x24\x78\x1F\x3B\xDF\x74\x92\x3B\x89\x23\xAF\x54\xA1\x03\xA3\x0F\x8D\x26\x99\xAE\x39\xA0\x84\x9B\xF8\x96\x0E\xA9\x49\xA4\x8E\xA3\x5A\xA3\x66\x86\x75\x41\xB5\x4E\x5D\x14\xB8\x22\xA8\x12\xA1\xF2\x9E\xE9\x9F\x18\x9C\x74\x3C\xFE\x78\x89\xF4\x9F\xF8\x96\x45\xA3\xA6\xA0\x60\xA3\x19\x96\x82\x45\xD8\x67\xAD\x14\xA5\x2C\xAF\x52\xA2\x6C\x9E\xC7\x9D\x70\x8B\x86\x0F\xDF\x8A\x84\xBF\x90\x2E\x96\x14\xA4\xF4\x92\xDD\x98\x14\x97\x75\x37\xCB\x84\xA9\x03\xB6\x2C\xA9\x77\x9E\x84\x9D\xD1\x86\x8C\x9E\xDD\x24\x81\x75\xBB\xEC\x98\x43\x94\x54\xA3\x77\x95\x3A\x9B\xA3\xA2\xF7\x38\xB3\x84\xB2\xF4\x8A\x8F\x96\x23\xA2\x87\x9E\x45\x9F\xA0\x9D\x59\x37\xF5\x49\x83\xD0\x77\x64\x9C\x70\x38\xAE\xA2\x1F\xA3\x39\xA0\x73\x45\x8D\x81\xB5\x15\xBA\x0A\xA3\x18\xA7\xAA\xA3\x3E\xA1\x54\xA2\x0D\x42\xD0\x89\xB7\xE9\x84\x81\x92\xBE\x8B\xA1\xA2\x43\x93\xA1\x86\xB2\x45\xFC\x7C\x85\xBF\x88\xF9\x97\xE1\x9C\x9B\xA1\x86\x9E\xC9\xA2\x70\x3E\xA2\x84\xB2\xF9\x82\x27\xA6\xAC\x85\xF0\x9F\x4D\x9F\x2C\x9B\x80\x3A\xE6\x8B\xA5\x94\x9C\x7F\x94\x5C\xA6\xB4\xA2\x47\xA3\x8B\x9A\x12\x45\x99\x6A\xAB\xFC\x98\x07\xA1\x47\xA4\x99\xA1\x5A\xA3\x19\x9F\x20\x35\xBD\x63\xB6\xE6\x82\xEA\x93\x25\xA6\xF1\x6A\x12",
"\x9E\xD0\x92\xD6\x45\xB0\x89\xB9\x02\xBE\x9F\x98\x10\xA7\x8D\xA1\x2D\xA3\x7C\xA0\xDE\x45\x85\x83\xA0\x17\xA3\xBA\x99\xCD\x9A\xCD\x98\xEB\x9E\x9B\x9A\x81\xEC\x4F\x7A\xB5\xB3\x91\xFD\x91\xA1\x98\x53\xA3\x3A\x01\x1B\xA2\x1B\x44\xA9\xF1\x1B\x07\x91\x15\xA0\xB4\x61\x3C\x83\x49\x74\xE3\x06\xED\x00\x28\x8C\x80\xE8\x9F\xCF\x22\x1B\xA4\x92\x3B\xEE\x9F\x77\x00\x32\x46\xB7\xF9\x49\xDA\x7F\x44\x6D\x4B\x60\x53\xA1\xAB\x46\x1F\xA2\x55\x44\xF0\x57\x93\x05\xA4\x64\x95\x4C\xA5\x9F\xA3\x31\xA3\x7F\xA2\xC9\x44\xEF\x82\xA7\x15\xA5\x24\xA8\x4B\xA3\x0C\xA2\x2E\xA2\x01\x8C\xCC\x38\xEB\x4A\x82\x7A\x9F\xFE\x97\x4D\x71\xC8\xA1\x0F\x96\x34\x9F\x88\x29\xF3\x81\x9C\x08\xB5\x07\xAE\x21\xA4\x94\xA0\x7C\xA3\x53\x9F\x19\x46\xD7\x83\x8E\x19\xB0\xEF\x9A\x07\x9A\x79\x9F\x70\x9A\x9F\x84\xB4\x0D\x9E\x2F\xA7\x11\xB6\x0B\xA2\x24\xA2\x88\xA3\x73\xA0\xF6\xA2\x6C\x3E\xEE\x8B\xAE\xF9\x9F\x32\xA4\x1F\xA1\x2E\xA2\x7D\xA1\x82\xA2\x75\x44\x8C\x17\x9D\xF6\x9D\x84\x99\x47\xA6\x44\x99\x87\x9D\xC5\x5F\x43\x46\x9D\x59\x85\x19\xBD\x12\xAE\x4F\xA7\x4B\xA1\x92\xA3\x30\xA1\xDD\x45\xF2\x88\x86\x12\xBB\x03\xAD\x00\xA1\xD4\x98\x88\x9C\x3A\x94\x97\x3B\xEC\x71\xA5\xB0\x57\x08\xA9\x4D\xA1\xA2\xA0\xE9\x9F\x89\xA2\xB4\x44\xE6\x8A\x89\x11\xAA\x34\xAD\x64\xA4\xD1\xA2\x46\xA2\x6E\x8F\xDB\xA8\x4D\x8A\x9A\x09\xB0\x44\x91\x49\xA0\x7F\x96\xB1\x9E\x22\x95\x17\x3F\xD6\x5C\x90\x02\xA2\xC8\x97\x60\xA3\xF0\x9F\x66\x9E\x7E\x9C\x6D\xF2\x01\x8D\x95\xFB\x97\xF2\x9B\x02\x9C\xEF\x9F\xC4\x97\xED\x97\x1C\x32\xBB\x8A\x9E\xC8\x98\x28\xA3\x25\x9A\xB0\x9D\x2C\x9E\xCD\x8B\xA8\x3B\x85\x3E\x9A\xC9\x9B\x5E\x92\x6B\xA7\xEC\x95\x3A\xA2\x23\xA3\xEB\x44\xC8\x8C\x9B\x17\xB6\x24\xA6\x51\xA4\xC9\xA0\x56\xA2\xDE\xA2\xA8\x40\xAA\x7A\xAA\x02\xBF\xD3\x86\x4F\xA5\x22\x9F\x7C\x6C\x6B\xA2\x0C\x77\x45\x8D\x96\xBF\x85\x35\xA8\xFD\x97\xD4\xA2\xFE\x95\x54\xA3\x37\x2F\xF7\x8A\xB9\x01\xA4\x13\xA8\x67\xA5\xD1\xA1\xEE\x9C\xFB\x9A\xD9\x2E\x83\x81\xAD\x19\xAF\x25\xAF\x66\xA1\x94\xA1\xCA\x9E\x39\xA3\xA5\x3E\xF4\x8C\xA6\x12\xB6\x33\xA8\x4A\xA1\xAB\xA3\x78\x8D\x15\x9D\xB3\x3C\xA2\x79\x84\xC4\x82\xC0\x97\x3B\x90\x9A\x2E\xB6\xA2\x2B\x9F\xDC\x46\xD6\x60\x9E\x1B\xBA\x7E\x9E\xF7\x99\x33\x9A\xAE\xA2\xD4\x99\xE4\x46\x9E\x8D\x91\x1B\xA6\x5C\x38\x6E\x32\x01\x9C\x44\x8F\x96\x9C\xFF\x0C\xD2\x77\xA2\x1A\xB8\x32\xAF\xF9\x92\xCB\xA1\x91\xA0\x2E\xA3\x47\x42\xDE\x8C\x89\x09\xB3\x2C\xA1\x66\xA5\xB2\xA1\xB9\xA3\x4F\xA3\x8D\x2B\xF9\x75\xAA\x9A\x8B\x37\xAD\x58\xA0\x46\xA0\x64\xA2\x19\xA1\x4A\x39\x81\x72\x92\xE2\x87\x82\x93\xCF\x9B\x26\x97\xCA\x97\x49\xA3\x24\x47\xA7\x8B\x8F\xBA\x89\x2D\xA5\x41\x9B\xB5\xA0\x53\x9C\x24\x9F\x66\x34\xD4\x79\x82\x19\xBF\xF4\x90\x9C\x91\xAE\xA2\x3A\xA3\x36\xA2\xEC\x44\x82\x89\xAE\x13\xA2\x28\xA0\x4F\xA1\xE1\xA3\x29\xA0\xAD\xA2\x67\x42\xBB\x48\x82\x15\xAB\x2C\xA1\x73\xA7\xBF\xA1\x46\xA1\x6D\xA2\x5D\x46\xDD\x89\xB2\x1B\xBF\x26\xA4\x6F\xA1\x9C\xA0\x80\x91\x70\x9E\x80\x46\xBC\x8E\x81\xF9\x8F\x66\x9F\x47\xA7\x2F\xA1\x20\xA3\xC0\xA0\x15\x45\xE2\x84\x86\x18\xA6\x3A\xA2\x4F\xA6\x4C\xA3\x22\x9B\xC0\x94\x8D\x34\x9B\x7D\x8D\x1D\xBC\x2C\xA1\x58\xA1\x25\xA2\x6A\xA2\xC2\xA2\x37\x47\xAD\x82\xBD\x63\x8C\x2B\xA3\xC0\x91\x54\x8A\x4D\xA0\x89\x8B\xD4\x31\x9A\x64\xB9\xE1\x9C\xBD\x90\x98\x9E\xB0\xA2\x60\x9C\xBE\xA2\x26\x36\xBB\x8E\x94\xFB\x86\x36\xAC\x4F\xA4\xD0\xA3\x91\xA2\x43\xA3\xCB\x46\xCA\x89\xA2\x1D\xA8\x2B\xA4\x76\xA2\xAD\xA3\x57\xA1\xA4\xA3\x93\x24\xE2\x82\xBD\x7F\x8F\x90\x72\x0F\xA3\x33\x94\x9C\xA3\xE8\xA0\xF0\x46\x83\x8C\x95\x15\xB5\x0E\xAD\x71\xA2\x2E\xA2\xBD\xA3\x3D\x6D\x61\x3A\xEA\x8E\xA3\x1A\xB9\x4F\x91\x70\xA0\xCB\x9F\xC0\xA2\x2C\x98\x6C\x2F\x95\x61\x8A\xFB\x8C\x35\xAD\x78\xA0\xC1\xA2\xB9\xA2\x9E\x9B\x34\x36\xFB\x56\x95\x1E\xBF\xEA\x9E\x6E\xA5\xBD\xA1\xD4\xA3\xF7\xA2\x1B\x47\xF1\x8B\xBA\x16\xA3\x11\xA4\x5F\xA3\x05\x9D\xBD\x9E\x1C\x9B\x68\x3A\xF5\x94\x7F\x1B\xB9\xFB\x94\x6B\xA7\xDA\x9E\xAD\xA3\x16\x98\xA9\x47\xDC\x7C\xA2\x1B\xBC\x29\xAC\x6B\xA6\xA7\xA3\xD5\x9F\x9F\x9D\x91\x2C\xF7\x8B\x9B\x93\x88\x02\x99\xD1\x9A\xE9\x9D\xBF\xA2\x0F\x31\xC3\x47\xDB\x84\x83\x1A\xB2\x24\xA5\x68\xA4\x92\xA1\xE2\xA2\x25\xA3\x9B\x46\xE3\x8E\x84\x14\xAA\x38\xAF\x7C\xA5\x36\x9E\xD2\x9C\xAD\x9F\xFA\x45\x96\xE1\x7C\x17\xBF\x07\xA7\x77\xA0\x2D\x8F\xC4\x8B\xA3\xA0\x7A",
"\x47\xC9\x82\xA5\xE7\x9C\x09\xA5\xBD\x9E\xF2\x9E\x4D\x9E\x1D\x9D\x1F\x17\xE5\xEA\x71\xFD\x82\xAE\x83\xF7\x9F\xF8\x69\xEE\x33\xEC\xA3\xA4\x46\xDB\x8F\xA6\x1A\xB3\x24\xA8\x6A\xA0\xA0\xA2\xAA\xA3\x83\xA3\xAB\x38\x8B\x8D\x87\x1D\xB5\x3C\x96\x5F\xA0\xFF\xA0\x4E\x9F\x1D\xA1\xBF\x3C\x85\x1F\x93\x73\x9E\x37\xAA\x75\xA1\x0B\xA2\x84\xA2\x83\xA0\x14\x46\x80\x83\x89\x04\xBA\x34\xA6\x4B\xA4\xD3\xA3\xB3\xA3\x8F\xA3\x25\x3C\xCF\x84\xA2\xD9\x9F\x8E\x94\x66\x9C\x64\x68\xE7\x9E\x87\x34\x00\x48\xA4\x8F\x82\x20\xBD\x36\xA4\x80\xA7\xDB\xA2\x01\xA5\x70\xA3\x44\x47\xF8\x8A\x8D\x1F\xBA\x2B\xA4\xEF\x9B\xAB\xA0\x14\x9E\x79\x96\x57\x3C\x82\x55\x94\x95\x88\x86\x73\x1F\x98\x70\x9B\x05\x02\x4C\xA1\x70\x2D\x92\x87\xA8\x89\x6E\x6C\x8A\x02\xA3\x20\x01\x10\xA4\xF2\x9F\x23\x06\x93\x8A\x16\x36\x84\xD1\x70\xD7\x4B\x3A\x81\x52\x7B\x9D\x2B\x2F\x46\xA7\x02\x35\x03\x19\x31\xA2\x38\xA4\x48\x7C\x11\xA5\xDB\x70\x98\x42\xE5\x5A\x8D\x54\x93\x13\xAD\xCE\x5E\x11\x6A\x16\xA5\x87\x84\xD7\xF5\x4D\xF4\x74\xFC\x99\x98\x0E\x84\xA5\x43\x95\x77\x7A\xFF\x5C\xC6\x0D\x79\x01\x14\x21\xAE\x0E\x8B\x40\xA7\xFA\x29\x27\x39\xDD\x9F\xFB\x00\x6B\x90\xB3\x2B\x98\x3A\xA6\x7B\x70\x71\xA2\x41\x00\xAA\x96\x42\x48\xD6\x90\xB0\xEE\x65\x42\xA2\x10\x00\x0F\xA5\x33\x7E\xF6\x7A\x75\x48\xE3\x90\x94\x1B\x05\x43\xAE\x5B\xA3\x73\x71\x9D\x03\x28\xA4\x60\xBD\x1B\x88\xA0\xC3\x23\xE0\x29\x9D\x3A\xA3\x5F\x8D\x34\x49\x64\xCF\x52\x1B\x09\x37\x66\x3F\x96\x22\xC9\x7C\x69\x58\xEE\x3C\x47\xA4\x9F\x25\x8C\x15\x0A\x4C\x37\x7F\x3C\x3D\x20\x5C\x29\x36\x84\x41\xA4\xA9\x25\x2C\x8C\x89\xD5\x7E\x44\xA7\xF9\x65\xB5\x02\x69\x75\xCF\x71\xC7\xE3\x27\xF7\x7C\xA3\x77\x68\x3A\xBA\x7F\x75\x3D\x21\x7F\xD6\x7D\x0F\x3C\xBB\x11\x88\xD7\x8B\x6F\x0A\xD1\x5C\x8D\x7E\x48\x96\xFF\x89\xAB\xF7\x38\xF7\x55\x0D\xBA\xDD\x76\x86\x7E\xBB\x05\x2D\xA5\x4A\xA4\x27\xFC\x2D\x16\x89\xF2\x64\xE3\x7E\x40\xA5\x82\xA1\x01\x65\x20\x7E\x1A\x56\x43\xF8\x46\xD8\x65\xC0\x7C\x3E\xA7\xFA\x72\x41\x84\xD8\xA1\xC6\x63\x32\x87\x94\xEF\x76\x09\x57\x8A\xA3\x71\x72\x2B\x7F\x1B\x7E\x7B\xFC\x25\x17\x8E\xE3\x64\x46\xA4\x41\xA6\x8C\x7F\x0B\x7F\x26\x30\x2B\x44\x88\x6E\x87\x89\x35\x46\xA2\x28\x85\x86\x7E\x28\x7F\x5B\xA4\x13\x0F\xA0\x5B\xAF\xF1\x7D\x1D\xA1\xC7\x7D\x96\x7F\x17\x65\x16\xA2\x28\xF8\x2F\x88\xAA\xE0\x65\x1E\xAD\x3A\x2E\x09\x50\x39\xA4\xBE\x9C\x24\xFC\x67\x91\x99\xE3\x6E\xE3\x7B\xC3\x78\x8E\x7D\x0F\x7F\xEF\xA1\xE0\xF8\x74\x90\xA5\x0B\xBD\x72\x0F\x8B\xA7\x1A\xA7\x24\x7E\x7E\xA4\x96\xFC\x6A\x7B\x46\xE1\x71\xB6\x7E\x82\x66\x79\xA0\x35\xA5\x82\xA4\x08\xFC\x69\xF7\x59\x23\xA2\xE3\x7B\x8D\xA5\x8A\x7E\x3F\xA5\x2B\x7E\x7C\x0D\xB8\x87\xAF\xF0\x78\x94\x45\x3D\xA0\x1B\x5F\x3D\xA5\x09\x80\x06\x49\xF6\xE7\x21\xF1\x75\x5D\x85\x91\xA3\x1D\xA5\xF7\xA1\xD5\x68\x00\x49\x91\xF8\x52\x1C\x7B\x1E\xA5\x5A\x76\x17\xA5\x2B\x7F\x88\xA4\xAF\xFC\x13\x92\xA4\x24\xA3\x46\xA6\x91\xA4\x1D\xA7\x3F\xA4\xFA\x7F\xF2\x43\xE1\x87\x81\x0F\xA3\x1F\xA6\xA3\x3B\x6D\xA3\xF9\xA0\x05\x7B\x6A\xF7\x49\xF8\x6B\x0F\xA9\xC0\x70\x1E\x06\x7D\xA1\x56\x1A\x7B\xA4\x10\x49\xF9\x91\x92\x24\xAF\x68\x99\x8E\xA5\x24\xA5\x3F\xA4\x9B\xA4\x18\x49\xBF\x87\x88\xDA\x74\x1F\xA9\x77\x7F\x21\xA7\x4B\xA4\xA5\xA4\x31\x49\xCC\x92\x9A\x23\xB4\x49\xA6\x92\xA1\x7E\xA2\x46\xA4\x46\x64\x68\xFC\x0E\x91\x48\x25\xB7\x4A\xA6\x8E\xA3\x29\xA7\x28\x7E\x5C\xA4\x22\xF8\x27\x92\xAE\x47\x72\x1E\xAA\x7F\x97\x7F\xA0\x8F\xA3\xE4\x5C\x1F\x49\x91\x73\xA5\x25\xB9\x4A\xA7\x96\xA5\x29\xA4\x57\xA5\xA7\xA4\x6A\x49\xBC\xEE\x6C\x25\xA4\x20\xA4\x39\xA3\x30\x5D\x5C\xA4\x85\x7F\xAF\x48\xF4\x92\xA8\x23\xBB\x4A\xA6\xD1\x95\x26\xA7\x30\x7D\x9B\xA4\xDB\xF7\x6D\x7B\x79\x10\xA5\xF5\x23\x96\xA6\x1A\x81\x48\xA5\x60\xA4\xB2\x33\xCE\x92\x89\x24\xB7\x48\xAF\xBD\x79\x25\xA7\x34\x7D\x6B\x5E\x7E\x07\x18\x91\x90\x73\x3F\x4B\xAE\x04\x89\x24\xA5\x1B\xA4\x81\x00\x9D\xFC\x38\xF5\x5C\x26\xA6\xEA\x93\x97\xA0\x1B\xA6\x56\xA4\x8A\xA4\x77\x49\x93\x93\x90\x25\xB5\x4C\xA8\x93\xA7\x2B\xA7\x7C\x69\x70\x7C\x12\x44\xD6\x92\x8E\x26\xB0\x49\xA6\x9A\xA5\x2E\xA4\x61\xA4\xD8\x96\xDC\x48\xBE\x87\xAE\x23\xBD\xBE\x70\x98\x85\x48\x04\x01\x00\x8D\x5E\xC7\x72\x03\x00\x01\x9A\x79\xA1\x26\x3A\x28\xFD\x77\x70\xA5\x35\x2A\x91\x53\x04\xB4\x03\x97\x44\x79\x0D\x81\x2F\x03\x2C\xE4\x00\xA3\x00\x66\x53\x55\xA6\x0D",
"\x62\x64\x9E\x24\x9E\x2F\xA9\x7D\x5F\x67\xDF\xA4\xFF\xF6\x53\xC6\x07\x27\xB4\xA3\x2F\x3E\x2E\x38\xA5\x8A\x57\x15\x2C\x18\xB9\x5F\xB3\x15\x27\xB2\xAE\x99\xAA\x00\x54\x06\xAE\x01\x0B\x2C\xD2\x49\x98\x79\x54\x27\xA0\x5E\x29\x21\x77\x3F\x04\x04\x8A\xB9\x86\xD7\x74\x5F\x81\x3E\x46\x76\x00\x04\x9A\x76\x53\x40\x7D\xA5\x9C\x54\xA4\x18\x17\xA7\x24\x41\x99\x9C\x22\x4B\x8F\x67\x5F\x0A\x2D\xF8\xA4\x35\x6B\x4C\x1D\x32\x27\xA8\x5A\x86\x6B\x02\xA3\x5E\x78\xA4\xE0\x25\xFB\x49\x8D\xA7\x12\x19\x8B\xC1\x2A\x88\xA3\xCF\x83\x22\x68\x04\x00\x9A\x49\xE7\x80\x7E\x0D\x0C\xCF\x27\x66\x86\x3F\xA4\xE5\x29\xF0\x81\x07\x00\x01\x94\x99\x26\xBB\x69\x9E\x7F\xA2\xC3\x33\x0D\x2C\xC5\x00\x0B\x4A\x94\xA7\x36\x4F\x9B\x4E\xA5\x88\x13\x05\x2D\x3E\x85\x8F\x23\x12\x09\xB0\xCE\x71\x4A\x3E\xCF\x5E\x9B\xA2\xA3\x5E\xB0\x9D\x4A\x04\x24\x4A\xF4\x51\x0C\x28\xA3\xD0\x2B\x9C\xA5\x3C\xA4\xE4\x28\x5D\x01\xCE\x49\xA1\xB0\x2C\x27\xAA\x4F\xA7\x39\x2D\x9B\x8A\x20\xA4\xEC\xA4\xC9\xB9\x03\x94\xA7\xDF\x60\x4F\xAE\xA4\x57\x40\xA5\x7A\xA4\xF2\xA4\x91\x0A\x16\xB0\x2D\x2A\x1B\x51\xA5\xCA\x5B\x3D\xA7\x91\xA4\x35\x91\x07\x08\x42\x93\xB0\x06\xAD\x2D\x09\x00\x07\x3D\xA5\x83\xA5\xD2\x7D\xCC\x0E\x0A\x00\x11\x28\xAB\x58\x33\xA1\xA6\x7D\x29\x10\x2B\x10\xA5\xEF\x53\x61\x07\xA3\x26\xB3\x3E\x3F\x91\xA3\x1B\x57\x7A\x2C\x2F\xA5\xF2\x57\x63\x87\x20\x29\xA1\xA2\x24\x89\x03\x4C\xA4\x96\xA1\x58\x29\x27\x4A\x96\xA0\x1B\x2A\x16\x94\x2D\x9A\x75\x12\xA7\x95\xA5\x47\xA1\xC6\xE2\x36\x91\x77\x29\xAA\x39\x99\x61\x9F\x2E\x7F\x61\xA5\xA8\xA4\x46\x2D\xAA\x92\xB3\x0D\xB6\xCC\x2D\x97\xA0\x79\xA2\x42\xA5\x62\xA4\x47\xF8\x3E\x38\x4A\xC1\x36\x52\xA0\x4F\x8B\x08\xA7\x1E\xA4\x43\xA5\x9F\xE6\x16\xED\x52\xB7\x8E\xBF\x71\x3A\xA3\x20\x03\xE8\xA0\x78\x9E\xEC\xC8\x1F\xEC\x41\x2A\xA6\xE5\x78\x40\xA1\x27\xA6\xCB\x7A\xF1\xA1\xAA\x43\xF1\x4E\x1B\x0D\xAC\x1B\xAE\x08\x7F\x6B\xA2\x5E\x7F\x79\x0E\xD3\xFB\x16\xB8\x14\xDE\x5C\x1E\x76\x14\x80\xDB\x79\x5A\xA4\xAF\xA4\xE0\x43\xD9\x87\x8A\x68\x21\x47\xA8\xAB\x7C\x55\xA7\x08\x98\x23\x7B\x35\x49\xF9\x92\x99\xDE\x7B\x4B\xA7\x8C\xA0\x54\xA6\x0B\xA3\xD5\xA1\x91\x35\x74\x91\x83\x04\x07\x1E\xAC\x8B\x84\xFB\x32\xAD\xA5\xFC\xA3\x9B\x4A\xB9\x93\xAD\x23\xBD\x1F\xA6\x41\xA1\x46\x39\x9F\xA4\xDE\xA1\xC7\x4A\xA4\x8C\x99\x21\x7F\x53\xAC\x9A\xA1\x31\xA4\x43\xA4\x92\x60\x96\x42\xC5\x95\x93\x23\x7A\x54\xA0\xDC\x92\x59\xA4\x62\xA4\xA9\xA4\x9D\xF6\x3D\x90\x5D\x24\xA6\xD2\x74\x91\x62\xC2\x78\xB3\x7A\x4C\x7B\x05\xF7\x55\x95\xA0\x2B\xBC\x4D\xA7\x75\x7E\x6A\xA0\x21\x9E\xE2\x32\xD1\x4A\xC4\xE1\x6D\xDA\x70\x55\xAD\x3F\x28\x1E\xA6\xFC\x7D\x2F\x7B\xE5\x43\xE6\x90\x7F\x24\xA3\xB3\x71\x94\xA2\x7D\xA1\x1F\x7D\x66\xA4\x68\xF6\x6D\x90\x7A\x0D\xB8\xB1\x71\xAF\xA6\xD5\x70\x01\x75\xE4\xA1\x1D\xFC\x0B\xF1\x5D\x24\x78\xBB\x7A\xD0\x33\x55\xA6\x25\x65\x6E\xA5\xB9\x4A\xF4\x95\x9B\xDE\x61\x4B\xAE\x67\x7E\x61\xA5\xA8\x7B\x0D\x7E\x12\x4B\xED\x92\x91\xDE\x6F\x4B\xA0\xAD\xA7\x61\xA7\xA4\xA5\xAE\xA4\x9D\x4A\xAE\x93\x86\x0E\x05\x54\xAA\xAD\xA7\xD4\x73\xB2\x7B\x64\xA5\x86\x49\x8B\xF9\x68\x2C\xAC\xC4\x70\xDD\x05\x17\x64\xC1\xA4\x8F\xA5\xDC\xF7\x2A\x93\xBA\x2A\xA7\x1D\xAA\x83\x7B\xDA\x79\xB9\x7A\x9B\x50\x05\x4B\xB7\x5A\x85\x0A\x3A\xB6\x7B\xFF\x4D\xC1\x5C\x85\x5E\x7A\x7B\xF9\xC8\x71\xED\x70\x4F\x81\xC2\x24\x7F\x04\xDC\x79\x42\x01\x0C\x5F\x83\xB9\x39\x96\xB2\xF0\x9F\x58\xA6\x27\x02\xCD\x82\x74\x52\x7A\x64\xF6\xC8\x3F\x96\x87\x22\xA1\x5A\xA0\xE3\x5B\x68\xA4\xB8\x7B\xCF\xA4\x01\x01\x21\x93\xB3\x22\xA1\x31\x00\xB3\xA3\x5E\xA5\xC8\xA5\x58\xA5\x3B\xF8\x7F\xB3\x1B\x0E\xA4\x57\xA2\xD3\x94\xD5\x78\x26\x65\x8C\xA5\xCD\x4A\xE8\x90\xA7\x05\x0C\x54\xAB\xA7\xA7\xF2\x64\x73\x20\x29\xA5\xA6\x35\x96\x87\x83\x26\xB2\x13\xA3\x51\x3F\x0A\xA6\xB1\xA0\xEE\x33\x23\x49\xC2\x91\x85\x26\xBE\xCB\x25\xA9\xA2\x20\x03\xA5\xA4\x64\x9E\xB6\x49\xA8\x93\xBB\x2D\xB8\x4B\xA8\xB6\xA5\x57\xA7\x4E\xA5\x50\xA5\xCB\x48\xAC\x87\x80\x2C\xA7\xC0\x71\xBD\x79\x36\x01\xAA\xA4\x1C\x2E\x94\xB7\x79\x96\x91\x26\xA9\x4D\xAE\xC7\x7D\x1B\xA4\x2A\x7E\x0D\x7C\x1B\x24\xA3\xEE\x4C\x96\x72\x5C\xA2\xF0\x82\x32\xA5\xE5\xA4\xDD\xA4\xCC\x4A\x86\x97\xB8\xC3\x62\x1E\xA6\x45\x03\xA7\x5D\x0C\xA2\x9A\x7B\x38\xF6\x1C\x97\x8E\x12\xB5\xE4\x7F\xB9\xA3\x59\xA7\x03\xA3\x70\xA5\xCE\x4A\xC3\x31\x96\xEC\x92\x49\xAA",
"\xB7\xA0\x37\xA5\xCA\xA5\x85\xA4\x08\xE8\x5F\x91\x92\xF0\x6E\x48\xAA\xD9\x83\x1F\xA4\x29\x7E\xDB\xA5\x20\x4B\xC5\x91\x9E\x23\xB0\x8D\x6C\x91\xA1\x84\x7D\xEA\xA4\x4A\x7E\xEA\x48\x84\x97\x9F\x2D\xB0\xBD\x71\xA6\x7C\x25\xA5\x27\x74\x73\x38\xC8\x4B\x9E\x97\xB3\xF2\x76\x5C\xA9\x40\xA6\x5E\xA6\x10\x7E\xCD\x5E\xF9\x4A\xE1\xEC\x7B\x2B\xB1\xB7\x8E\x36\xA3\x75\x18\xDC\xA0\xA2\xA4\xED\x43\xCC\xF8\x47\x25\xA7\x5E\xA8\x90\xA5\x75\xA7\xB7\xA5\xDD\xA4\x23\xE3\x0C\x96\xBC\xA9\x31\x5C\xA1\xBD\xA4\x72\xA7\xF4\xA4\xD0\xA5\xAF\x4B\x8B\x96\x99\xE2\x62\x08\x0B\x89\x7B\x12\x84\x2C\x7F\xCE\xA5\xEE\x4B\x99\xED\x45\x2E\xBB\x43\x64\xC7\x7B\x20\x02\x1D\x7E\xFB\xA5\xB4\x4B\x93\x97\x83\x2E\xB2\x59\xAB\xBF\xA3\x61\xA4\xC9\xA5\xAD\xA5\xAA\x4B\xA0\x67\xAC\x2E\xB9\x1A\x44\xAD\xA1\x80\x7F\x01\x75\xFD\x71\xA3\x0C\x05\x88\x8C\x26\xA4\x5F\xAF\xBB\xA1\x17\xA4\x01\xA7\xE5\xA5\xD3\x43\xCC\x1B\x1F\xDA\x7D\x5D\xAC\x8D\x05\x7D\xA7\x00\xA6\xF3\xA5\x80\x4A\xA1\x97\xB0\x2E\xB0\x4D\xAA\xCA\x7C\x7D\xA5\xF9\xA5\xF7\xA5\xAE\x4B\xC6\x91\xB0\x2E\xAA\x5B\xAA\xC1\x04\x6D\xA7\xFE\x58\xE8\x73\x36\x05\x5B\x94\x87\x68\x35\x51\xA9\xA4\xA3\x6C\x28\x08\x2C\xE8\xA4\xE3\x49\x89\x71\x4E\x29\xBC\x5D\x2E\xA3\xA7\xB2\x87\x77\x02\x17\xA5\x73\x98\x45\x6A\xBC\x28\xB2\xC1\x2C\xC3\xA7\x43\x9D\x0D\xA7\xAC\x29\x4B\x4A\xCF\x94\xA0\xE3\x5B\x61\xA7\x0D\x6B\xF7\x9F\x7D\xA5\x46\xA5\xD0\x0D\x2D\x94\xB8\xD8\x6F\x62\xAA\x89\x83\x46\xA6\x80\x2C\x1A\xA6\x97\x0A\x68\x94\xB9\x28\xB8\x61\xAC\xA4\xA2\x87\xA5\x8F\xA4\xEB\xA4\x3F\x4A\xC0\x93\x8D\xC1\x71\x51\xA4\xCD\x24\x48\xA4\xD0\x64\x23\xA5\x45\x4C\xC8\x94\x99\x31\xA6\x4F\xAC\xAA\x07\x6E\x01\x17\xA7\x25\xA6\x5F\x4C\xD0\x86\x9F\xE8\x0E\x61\xAD\xB6\xA3\x50\xA5\xE9\x2C\x6A\x7B\x57\x43\x86\x12\x9B\xDB\x7B\x46\x62\xB5\xA7\xC1\x5C\xD5\xA4\xA0\xA5\xAF\x2D\xC4\x96\x8F\x2B\x06\x5A\xA6\x10\x00\x69\xA6\x55\x9A\x83\x84\xED\xF6\x28\x7C\x46\x08\x0F\xB7\x7F\xC7\xA3\x6A\xA5\x20\xA6\x70\x7B\x75\x4C\x91\x99\x92\x32\xB3\x64\xA4\xC9\xA5\x92\xA6\x25\xA7\x4B\xA6\x98\x4C\x99\x99\x9A\x32\xBB\x64\xAC\xC9\xA5\x93\xA6\x27\xA7\x4F\xA6\xA0\x4C\xA1\x99\xA2\x32\xBC\xE1\x50",
};
void WfGetParserBuffer(vl::stream::MemoryStream& stream)
{
vl::stream::MemoryStream compressedStream;
for (vint i = 0; i < parserBufferRows; i++)
{
vint size = i == parserBufferRows - 1 ? parserBufferRemain : parserBufferBlock;
compressedStream.Write((void*)parserBuffer[i], size);
}
compressedStream.SeekFromBegin(0);
vl::stream::LzwDecoder decoder;
vl::stream::DecoderStream decoderStream(compressedStream, decoder);
vl::collections::Array<vl::vuint8_t> buffer(65536);
while (true)
{
vl::vint size = decoderStream.Read(&buffer[0], 65536);
if (size == 0) break;
stream.Write(&buffer[0], size);
}
stream.SeekFromBegin(0);
}
/***********************************************************************
Unescaping Function Foward Declarations
***********************************************************************/
extern void SetDefaultClassMember(vl::collections::List<vl::Ptr<WfDeclaration>>& value, const vl::collections::List<vl::regex::RegexToken>& tokens);
extern void UnescapeFormatString(vl::parsing::ParsingToken& value, const vl::collections::List<vl::regex::RegexToken>& tokens);
extern void UnescapeString(vl::parsing::ParsingToken& value, const vl::collections::List<vl::regex::RegexToken>& tokens);
/***********************************************************************
Parsing Tree Conversion Driver Implementation
***********************************************************************/
class WfTreeConverter : public vl::parsing::ParsingTreeConverter
{
public:
using vl::parsing::ParsingTreeConverter::SetMember;
bool SetMember(WfClassMemberKind& member, vl::Ptr<vl::parsing::ParsingTreeNode> node, const TokenList& tokens)
{
vl::Ptr<vl::parsing::ParsingTreeToken> token=node.Cast<vl::parsing::ParsingTreeToken>();
if(token)
{
if(token->GetValue()==L"Static") { member=WfClassMemberKind::Static; return true; }
else if(token->GetValue()==L"Override") { member=WfClassMemberKind::Override; return true; }
else if(token->GetValue()==L"Normal") { member=WfClassMemberKind::Normal; return true; }
else { member=WfClassMemberKind::Static; return false; }
}
member=WfClassMemberKind::Static;
return false;
}
bool SetMember(WfPredefinedTypeName& member, vl::Ptr<vl::parsing::ParsingTreeNode> node, const TokenList& tokens)
{
vl::Ptr<vl::parsing::ParsingTreeToken> token=node.Cast<vl::parsing::ParsingTreeToken>();
if(token)
{
if(token->GetValue()==L"Void") { member=WfPredefinedTypeName::Void; return true; }
else if(token->GetValue()==L"Object") { member=WfPredefinedTypeName::Object; return true; }
else if(token->GetValue()==L"Interface") { member=WfPredefinedTypeName::Interface; return true; }
else if(token->GetValue()==L"Int") { member=WfPredefinedTypeName::Int; return true; }
else if(token->GetValue()==L"UInt") { member=WfPredefinedTypeName::UInt; return true; }
else if(token->GetValue()==L"Float") { member=WfPredefinedTypeName::Float; return true; }
else if(token->GetValue()==L"Double") { member=WfPredefinedTypeName::Double; return true; }
else if(token->GetValue()==L"String") { member=WfPredefinedTypeName::String; return true; }
else if(token->GetValue()==L"Char") { member=WfPredefinedTypeName::Char; return true; }
else if(token->GetValue()==L"Bool") { member=WfPredefinedTypeName::Bool; return true; }
else { member=WfPredefinedTypeName::Void; return false; }
}
member=WfPredefinedTypeName::Void;
return false;
}
bool SetMember(WfMapWritability& member, vl::Ptr<vl::parsing::ParsingTreeNode> node, const TokenList& tokens)
{
vl::Ptr<vl::parsing::ParsingTreeToken> token=node.Cast<vl::parsing::ParsingTreeToken>();
if(token)
{
if(token->GetValue()==L"Readonly") { member=WfMapWritability::Readonly; return true; }
else if(token->GetValue()==L"Writable") { member=WfMapWritability::Writable; return true; }
else { member=WfMapWritability::Readonly; return false; }
}
member=WfMapWritability::Readonly;
return false;
}
bool SetMember(WfFunctionAnonymity& member, vl::Ptr<vl::parsing::ParsingTreeNode> node, const TokenList& tokens)
{
vl::Ptr<vl::parsing::ParsingTreeToken> token=node.Cast<vl::parsing::ParsingTreeToken>();
if(token)
{
if(token->GetValue()==L"Named") { member=WfFunctionAnonymity::Named; return true; }
else if(token->GetValue()==L"Anonymous") { member=WfFunctionAnonymity::Anonymous; return true; }
else { member=WfFunctionAnonymity::Named; return false; }
}
member=WfFunctionAnonymity::Named;
return false;
}
bool SetMember(WfClassKind& member, vl::Ptr<vl::parsing::ParsingTreeNode> node, const TokenList& tokens)
{
vl::Ptr<vl::parsing::ParsingTreeToken> token=node.Cast<vl::parsing::ParsingTreeToken>();
if(token)
{
if(token->GetValue()==L"Class") { member=WfClassKind::Class; return true; }
else if(token->GetValue()==L"Interface") { member=WfClassKind::Interface; return true; }
else { member=WfClassKind::Class; return false; }
}
member=WfClassKind::Class;
return false;
}
bool SetMember(WfConstructorType& member, vl::Ptr<vl::parsing::ParsingTreeNode> node, const TokenList& tokens)
{
vl::Ptr<vl::parsing::ParsingTreeToken> token=node.Cast<vl::parsing::ParsingTreeToken>();
if(token)
{
if(token->GetValue()==L"Undefined") { member=WfConstructorType::Undefined; return true; }
else if(token->GetValue()==L"SharedPtr") { member=WfConstructorType::SharedPtr; return true; }
else if(token->GetValue()==L"RawPtr") { member=WfConstructorType::RawPtr; return true; }
else { member=WfConstructorType::Undefined; return false; }
}
member=WfConstructorType::Undefined;
return false;
}
bool SetMember(WfEnumKind& member, vl::Ptr<vl::parsing::ParsingTreeNode> node, const TokenList& tokens)
{
vl::Ptr<vl::parsing::ParsingTreeToken> token=node.Cast<vl::parsing::ParsingTreeToken>();
if(token)
{
if(token->GetValue()==L"Normal") { member=WfEnumKind::Normal; return true; }
else if(token->GetValue()==L"Flag") { member=WfEnumKind::Flag; return true; }
else { member=WfEnumKind::Normal; return false; }
}
member=WfEnumKind::Normal;
return false;
}
bool SetMember(WfEnumItemKind& member, vl::Ptr<vl::parsing::ParsingTreeNode> node, const TokenList& tokens)
{
vl::Ptr<vl::parsing::ParsingTreeToken> token=node.Cast<vl::parsing::ParsingTreeToken>();
if(token)
{
if(token->GetValue()==L"Constant") { member=WfEnumItemKind::Constant; return true; }
else if(token->GetValue()==L"Intersection") { member=WfEnumItemKind::Intersection; return true; }
else { member=WfEnumItemKind::Constant; return false; }
}
member=WfEnumItemKind::Constant;
return false;
}
bool SetMember(WfAPConst& member, vl::Ptr<vl::parsing::ParsingTreeNode> node, const TokenList& tokens)
{
vl::Ptr<vl::parsing::ParsingTreeToken> token=node.Cast<vl::parsing::ParsingTreeToken>();
if(token)
{
if(token->GetValue()==L"Readonly") { member=WfAPConst::Readonly; return true; }
else if(token->GetValue()==L"Writable") { member=WfAPConst::Writable; return true; }
else { member=WfAPConst::Readonly; return false; }
}
member=WfAPConst::Readonly;
return false;
}
bool SetMember(WfAPObserve& member, vl::Ptr<vl::parsing::ParsingTreeNode> node, const TokenList& tokens)
{
vl::Ptr<vl::parsing::ParsingTreeToken> token=node.Cast<vl::parsing::ParsingTreeToken>();
if(token)
{
if(token->GetValue()==L"Observable") { member=WfAPObserve::Observable; return true; }
else if(token->GetValue()==L"NotObservable") { member=WfAPObserve::NotObservable; return true; }
else { member=WfAPObserve::Observable; return false; }
}
member=WfAPObserve::Observable;
return false;
}
bool SetMember(WfForEachDirection& member, vl::Ptr<vl::parsing::ParsingTreeNode> node, const TokenList& tokens)
{
vl::Ptr<vl::parsing::ParsingTreeToken> token=node.Cast<vl::parsing::ParsingTreeToken>();
if(token)
{
if(token->GetValue()==L"Normal") { member=WfForEachDirection::Normal; return true; }
else if(token->GetValue()==L"Reversed") { member=WfForEachDirection::Reversed; return true; }
else { member=WfForEachDirection::Normal; return false; }
}
member=WfForEachDirection::Normal;
return false;
}
bool SetMember(WfLiteralValue& member, vl::Ptr<vl::parsing::ParsingTreeNode> node, const TokenList& tokens)
{
vl::Ptr<vl::parsing::ParsingTreeToken> token=node.Cast<vl::parsing::ParsingTreeToken>();
if(token)
{
if(token->GetValue()==L"Null") { member=WfLiteralValue::Null; return true; }
else if(token->GetValue()==L"True") { member=WfLiteralValue::True; return true; }
else if(token->GetValue()==L"False") { member=WfLiteralValue::False; return true; }
else { member=WfLiteralValue::Null; return false; }
}
member=WfLiteralValue::Null;
return false;
}
bool SetMember(WfUnaryOperator& member, vl::Ptr<vl::parsing::ParsingTreeNode> node, const TokenList& tokens)
{
vl::Ptr<vl::parsing::ParsingTreeToken> token=node.Cast<vl::parsing::ParsingTreeToken>();
if(token)
{
if(token->GetValue()==L"Positive") { member=WfUnaryOperator::Positive; return true; }
else if(token->GetValue()==L"Negative") { member=WfUnaryOperator::Negative; return true; }
else if(token->GetValue()==L"Not") { member=WfUnaryOperator::Not; return true; }
else { member=WfUnaryOperator::Positive; return false; }
}
member=WfUnaryOperator::Positive;
return false;
}
bool SetMember(WfBinaryOperator& member, vl::Ptr<vl::parsing::ParsingTreeNode> node, const TokenList& tokens)
{
vl::Ptr<vl::parsing::ParsingTreeToken> token=node.Cast<vl::parsing::ParsingTreeToken>();
if(token)
{
if(token->GetValue()==L"Assign") { member=WfBinaryOperator::Assign; return true; }
else if(token->GetValue()==L"Index") { member=WfBinaryOperator::Index; return true; }
else if(token->GetValue()==L"Union") { member=WfBinaryOperator::Union; return true; }
else if(token->GetValue()==L"Intersect") { member=WfBinaryOperator::Intersect; return true; }
else if(token->GetValue()==L"FailedThen") { member=WfBinaryOperator::FailedThen; return true; }
else if(token->GetValue()==L"Exp") { member=WfBinaryOperator::Exp; return true; }
else if(token->GetValue()==L"Add") { member=WfBinaryOperator::Add; return true; }
else if(token->GetValue()==L"Sub") { member=WfBinaryOperator::Sub; return true; }
else if(token->GetValue()==L"Mul") { member=WfBinaryOperator::Mul; return true; }
else if(token->GetValue()==L"Div") { member=WfBinaryOperator::Div; return true; }
else if(token->GetValue()==L"Mod") { member=WfBinaryOperator::Mod; return true; }
else if(token->GetValue()==L"Shl") { member=WfBinaryOperator::Shl; return true; }
else if(token->GetValue()==L"Shr") { member=WfBinaryOperator::Shr; return true; }
else if(token->GetValue()==L"LT") { member=WfBinaryOperator::LT; return true; }
else if(token->GetValue()==L"GT") { member=WfBinaryOperator::GT; return true; }
else if(token->GetValue()==L"LE") { member=WfBinaryOperator::LE; return true; }
else if(token->GetValue()==L"GE") { member=WfBinaryOperator::GE; return true; }
else if(token->GetValue()==L"EQ") { member=WfBinaryOperator::EQ; return true; }
else if(token->GetValue()==L"NE") { member=WfBinaryOperator::NE; return true; }
else if(token->GetValue()==L"Xor") { member=WfBinaryOperator::Xor; return true; }
else if(token->GetValue()==L"And") { member=WfBinaryOperator::And; return true; }
else if(token->GetValue()==L"Or") { member=WfBinaryOperator::Or; return true; }
else { member=WfBinaryOperator::Assign; return false; }
}
member=WfBinaryOperator::Assign;
return false;
}
bool SetMember(WfRangeBoundary& member, vl::Ptr<vl::parsing::ParsingTreeNode> node, const TokenList& tokens)
{
vl::Ptr<vl::parsing::ParsingTreeToken> token=node.Cast<vl::parsing::ParsingTreeToken>();
if(token)
{
if(token->GetValue()==L"Inclusive") { member=WfRangeBoundary::Inclusive; return true; }
else if(token->GetValue()==L"Exclusive") { member=WfRangeBoundary::Exclusive; return true; }
else { member=WfRangeBoundary::Inclusive; return false; }
}
member=WfRangeBoundary::Inclusive;
return false;
}
bool SetMember(WfSetTesting& member, vl::Ptr<vl::parsing::ParsingTreeNode> node, const TokenList& tokens)
{
vl::Ptr<vl::parsing::ParsingTreeToken> token=node.Cast<vl::parsing::ParsingTreeToken>();
if(token)
{
if(token->GetValue()==L"In") { member=WfSetTesting::In; return true; }
else if(token->GetValue()==L"NotIn") { member=WfSetTesting::NotIn; return true; }
else { member=WfSetTesting::In; return false; }
}
member=WfSetTesting::In;
return false;
}
bool SetMember(WfTypeCastingStrategy& member, vl::Ptr<vl::parsing::ParsingTreeNode> node, const TokenList& tokens)
{
vl::Ptr<vl::parsing::ParsingTreeToken> token=node.Cast<vl::parsing::ParsingTreeToken>();
if(token)
{
if(token->GetValue()==L"Strong") { member=WfTypeCastingStrategy::Strong; return true; }
else if(token->GetValue()==L"Weak") { member=WfTypeCastingStrategy::Weak; return true; }
else { member=WfTypeCastingStrategy::Strong; return false; }
}
member=WfTypeCastingStrategy::Strong;
return false;
}
bool SetMember(WfTypeTesting& member, vl::Ptr<vl::parsing::ParsingTreeNode> node, const TokenList& tokens)
{
vl::Ptr<vl::parsing::ParsingTreeToken> token=node.Cast<vl::parsing::ParsingTreeToken>();
if(token)
{
if(token->GetValue()==L"IsType") { member=WfTypeTesting::IsType; return true; }
else if(token->GetValue()==L"IsNotType") { member=WfTypeTesting::IsNotType; return true; }
else if(token->GetValue()==L"IsNull") { member=WfTypeTesting::IsNull; return true; }
else if(token->GetValue()==L"IsNotNull") { member=WfTypeTesting::IsNotNull; return true; }
else { member=WfTypeTesting::IsType; return false; }
}
member=WfTypeTesting::IsType;
return false;
}
bool SetMember(WfObserveType& member, vl::Ptr<vl::parsing::ParsingTreeNode> node, const TokenList& tokens)
{
vl::Ptr<vl::parsing::ParsingTreeToken> token=node.Cast<vl::parsing::ParsingTreeToken>();
if(token)
{
if(token->GetValue()==L"SimpleObserve") { member=WfObserveType::SimpleObserve; return true; }
else if(token->GetValue()==L"ExtendedObserve") { member=WfObserveType::ExtendedObserve; return true; }
else { member=WfObserveType::SimpleObserve; return false; }
}
member=WfObserveType::SimpleObserve;
return false;
}
bool SetMember(WfModuleType& member, vl::Ptr<vl::parsing::ParsingTreeNode> node, const TokenList& tokens)
{
vl::Ptr<vl::parsing::ParsingTreeToken> token=node.Cast<vl::parsing::ParsingTreeToken>();
if(token)
{
if(token->GetValue()==L"Module") { member=WfModuleType::Module; return true; }
else if(token->GetValue()==L"Unit") { member=WfModuleType::Unit; return true; }
else { member=WfModuleType::Module; return false; }
}
member=WfModuleType::Module;
return false;
}
void Fill(vl::Ptr<WfClassMember> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->kind, obj->GetMember(L"kind"), tokens);
}
void Fill(vl::Ptr<WfType> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
}
void Fill(vl::Ptr<WfExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
}
void Fill(vl::Ptr<WfStatement> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
}
void Fill(vl::Ptr<WfAttribute> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->category, obj->GetMember(L"category"), tokens);
SetMember(tree->name, obj->GetMember(L"name"), tokens);
SetMember(tree->value, obj->GetMember(L"value"), tokens);
}
void Fill(vl::Ptr<WfDeclaration> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->attributes, obj->GetMember(L"attributes"), tokens);
SetMember(tree->name, obj->GetMember(L"name"), tokens);
SetMember(tree->classMember, obj->GetMember(L"classMember"), tokens);
}
void Fill(vl::Ptr<WfPredefinedType> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->name, obj->GetMember(L"name"), tokens);
}
void Fill(vl::Ptr<WfTopQualifiedType> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->name, obj->GetMember(L"name"), tokens);
}
void Fill(vl::Ptr<WfReferenceType> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->name, obj->GetMember(L"name"), tokens);
}
void Fill(vl::Ptr<WfRawPointerType> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->element, obj->GetMember(L"element"), tokens);
}
void Fill(vl::Ptr<WfSharedPointerType> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->element, obj->GetMember(L"element"), tokens);
}
void Fill(vl::Ptr<WfNullableType> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->element, obj->GetMember(L"element"), tokens);
}
void Fill(vl::Ptr<WfEnumerableType> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->element, obj->GetMember(L"element"), tokens);
}
void Fill(vl::Ptr<WfMapType> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->writability, obj->GetMember(L"writability"), tokens);
SetMember(tree->key, obj->GetMember(L"key"), tokens);
SetMember(tree->value, obj->GetMember(L"value"), tokens);
}
void Fill(vl::Ptr<WfFunctionType> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->result, obj->GetMember(L"result"), tokens);
SetMember(tree->arguments, obj->GetMember(L"arguments"), tokens);
}
void Fill(vl::Ptr<WfChildType> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->parent, obj->GetMember(L"parent"), tokens);
SetMember(tree->name, obj->GetMember(L"name"), tokens);
}
void Fill(vl::Ptr<WfNamespaceDeclaration> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->declarations, obj->GetMember(L"declarations"), tokens);
}
void Fill(vl::Ptr<WfFunctionArgument> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->attributes, obj->GetMember(L"attributes"), tokens);
SetMember(tree->name, obj->GetMember(L"name"), tokens);
SetMember(tree->type, obj->GetMember(L"type"), tokens);
}
void Fill(vl::Ptr<WfFunctionDeclaration> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->anonymity, obj->GetMember(L"anonymity"), tokens);
SetMember(tree->arguments, obj->GetMember(L"arguments"), tokens);
SetMember(tree->returnType, obj->GetMember(L"returnType"), tokens);
SetMember(tree->statement, obj->GetMember(L"statement"), tokens);
}
void Fill(vl::Ptr<WfVariableDeclaration> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->type, obj->GetMember(L"type"), tokens);
SetMember(tree->expression, obj->GetMember(L"expression"), tokens);
}
void Fill(vl::Ptr<WfEventDeclaration> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->arguments, obj->GetMember(L"arguments"), tokens);
}
void Fill(vl::Ptr<WfPropertyDeclaration> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->type, obj->GetMember(L"type"), tokens);
SetMember(tree->getter, obj->GetMember(L"getter"), tokens);
SetMember(tree->setter, obj->GetMember(L"setter"), tokens);
SetMember(tree->valueChangedEvent, obj->GetMember(L"valueChangedEvent"), tokens);
}
void Fill(vl::Ptr<WfBaseConstructorCall> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->type, obj->GetMember(L"type"), tokens);
SetMember(tree->arguments, obj->GetMember(L"arguments"), tokens);
}
void Fill(vl::Ptr<WfConstructorDeclaration> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->constructorType, obj->GetMember(L"constructorType"), tokens);
SetMember(tree->baseConstructorCalls, obj->GetMember(L"baseConstructorCalls"), tokens);
SetMember(tree->arguments, obj->GetMember(L"arguments"), tokens);
SetMember(tree->statement, obj->GetMember(L"statement"), tokens);
}
void Fill(vl::Ptr<WfDestructorDeclaration> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->statement, obj->GetMember(L"statement"), tokens);
}
void Fill(vl::Ptr<WfClassDeclaration> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->kind, obj->GetMember(L"kind"), tokens);
SetMember(tree->constructorType, obj->GetMember(L"constructorType"), tokens);
SetMember(tree->baseTypes, obj->GetMember(L"baseTypes"), tokens);
if(SetMember(tree->declarations, obj->GetMember(L"declarations"), tokens))
{
SetDefaultClassMember(tree->declarations, tokens);
}
}
void Fill(vl::Ptr<WfEnumItemIntersection> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->name, obj->GetMember(L"name"), tokens);
}
void Fill(vl::Ptr<WfEnumItem> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->attributes, obj->GetMember(L"attributes"), tokens);
SetMember(tree->name, obj->GetMember(L"name"), tokens);
SetMember(tree->kind, obj->GetMember(L"kind"), tokens);
SetMember(tree->number, obj->GetMember(L"number"), tokens);
SetMember(tree->intersections, obj->GetMember(L"intersections"), tokens);
}
void Fill(vl::Ptr<WfEnumDeclaration> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->kind, obj->GetMember(L"kind"), tokens);
SetMember(tree->items, obj->GetMember(L"items"), tokens);
}
void Fill(vl::Ptr<WfStructMember> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->attributes, obj->GetMember(L"attributes"), tokens);
SetMember(tree->name, obj->GetMember(L"name"), tokens);
SetMember(tree->type, obj->GetMember(L"type"), tokens);
}
void Fill(vl::Ptr<WfStructDeclaration> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->members, obj->GetMember(L"members"), tokens);
}
void Fill(vl::Ptr<WfVirtualDeclaration> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->expandedDeclarations, obj->GetMember(L"expandedDeclarations"), tokens);
}
void Fill(vl::Ptr<WfAutoPropertyDeclaration> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->type, obj->GetMember(L"type"), tokens);
SetMember(tree->configConst, obj->GetMember(L"configConst"), tokens);
SetMember(tree->configObserve, obj->GetMember(L"configObserve"), tokens);
SetMember(tree->expression, obj->GetMember(L"expression"), tokens);
}
void Fill(vl::Ptr<WfCastResultInterfaceDeclaration> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->baseType, obj->GetMember(L"baseType"), tokens);
SetMember(tree->elementType, obj->GetMember(L"elementType"), tokens);
}
void Fill(vl::Ptr<WfBreakStatement> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
}
void Fill(vl::Ptr<WfContinueStatement> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
}
void Fill(vl::Ptr<WfReturnStatement> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->expression, obj->GetMember(L"expression"), tokens);
}
void Fill(vl::Ptr<WfDeleteStatement> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->expression, obj->GetMember(L"expression"), tokens);
}
void Fill(vl::Ptr<WfRaiseExceptionStatement> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->expression, obj->GetMember(L"expression"), tokens);
}
void Fill(vl::Ptr<WfIfStatement> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->type, obj->GetMember(L"type"), tokens);
SetMember(tree->name, obj->GetMember(L"name"), tokens);
SetMember(tree->expression, obj->GetMember(L"expression"), tokens);
SetMember(tree->trueBranch, obj->GetMember(L"trueBranch"), tokens);
SetMember(tree->falseBranch, obj->GetMember(L"falseBranch"), tokens);
}
void Fill(vl::Ptr<WfWhileStatement> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->condition, obj->GetMember(L"condition"), tokens);
SetMember(tree->statement, obj->GetMember(L"statement"), tokens);
}
void Fill(vl::Ptr<WfTryStatement> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->protectedStatement, obj->GetMember(L"protectedStatement"), tokens);
SetMember(tree->name, obj->GetMember(L"name"), tokens);
SetMember(tree->catchStatement, obj->GetMember(L"catchStatement"), tokens);
SetMember(tree->finallyStatement, obj->GetMember(L"finallyStatement"), tokens);
}
void Fill(vl::Ptr<WfBlockStatement> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->statements, obj->GetMember(L"statements"), tokens);
}
void Fill(vl::Ptr<WfVariableStatement> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->variable, obj->GetMember(L"variable"), tokens);
}
void Fill(vl::Ptr<WfExpressionStatement> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->expression, obj->GetMember(L"expression"), tokens);
}
void Fill(vl::Ptr<WfVirtualStatement> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->expandedStatement, obj->GetMember(L"expandedStatement"), tokens);
}
void Fill(vl::Ptr<WfForEachStatement> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->name, obj->GetMember(L"name"), tokens);
SetMember(tree->direction, obj->GetMember(L"direction"), tokens);
SetMember(tree->collection, obj->GetMember(L"collection"), tokens);
SetMember(tree->statement, obj->GetMember(L"statement"), tokens);
}
void Fill(vl::Ptr<WfSwitchCase> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->expression, obj->GetMember(L"expression"), tokens);
SetMember(tree->statement, obj->GetMember(L"statement"), tokens);
}
void Fill(vl::Ptr<WfSwitchStatement> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->expression, obj->GetMember(L"expression"), tokens);
SetMember(tree->caseBranches, obj->GetMember(L"caseBranches"), tokens);
SetMember(tree->defaultBranch, obj->GetMember(L"defaultBranch"), tokens);
}
void Fill(vl::Ptr<WfCoProviderStatement> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->name, obj->GetMember(L"name"), tokens);
SetMember(tree->statement, obj->GetMember(L"statement"), tokens);
}
void Fill(vl::Ptr<WfCoroutineStatement> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
}
void Fill(vl::Ptr<WfCoPauseStatement> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->statement, obj->GetMember(L"statement"), tokens);
}
void Fill(vl::Ptr<WfCoOperatorStatement> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->varName, obj->GetMember(L"varName"), tokens);
SetMember(tree->opName, obj->GetMember(L"opName"), tokens);
SetMember(tree->arguments, obj->GetMember(L"arguments"), tokens);
}
void Fill(vl::Ptr<WfThisExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
}
void Fill(vl::Ptr<WfTopQualifiedExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->name, obj->GetMember(L"name"), tokens);
}
void Fill(vl::Ptr<WfReferenceExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->name, obj->GetMember(L"name"), tokens);
}
void Fill(vl::Ptr<WfOrderedNameExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->name, obj->GetMember(L"name"), tokens);
}
void Fill(vl::Ptr<WfOrderedLambdaExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->body, obj->GetMember(L"body"), tokens);
}
void Fill(vl::Ptr<WfMemberExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->parent, obj->GetMember(L"parent"), tokens);
SetMember(tree->name, obj->GetMember(L"name"), tokens);
}
void Fill(vl::Ptr<WfChildExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->parent, obj->GetMember(L"parent"), tokens);
SetMember(tree->name, obj->GetMember(L"name"), tokens);
}
void Fill(vl::Ptr<WfLiteralExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->value, obj->GetMember(L"value"), tokens);
}
void Fill(vl::Ptr<WfFloatingExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->value, obj->GetMember(L"value"), tokens);
}
void Fill(vl::Ptr<WfIntegerExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->value, obj->GetMember(L"value"), tokens);
}
void Fill(vl::Ptr<WfStringExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
if(SetMember(tree->value, obj->GetMember(L"value"), tokens))
{
UnescapeString(tree->value, tokens);
}
}
void Fill(vl::Ptr<WfUnaryExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->op, obj->GetMember(L"op"), tokens);
SetMember(tree->operand, obj->GetMember(L"operand"), tokens);
}
void Fill(vl::Ptr<WfBinaryExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->op, obj->GetMember(L"op"), tokens);
SetMember(tree->first, obj->GetMember(L"first"), tokens);
SetMember(tree->second, obj->GetMember(L"second"), tokens);
}
void Fill(vl::Ptr<WfLetVariable> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->name, obj->GetMember(L"name"), tokens);
SetMember(tree->value, obj->GetMember(L"value"), tokens);
}
void Fill(vl::Ptr<WfLetExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->variables, obj->GetMember(L"variables"), tokens);
SetMember(tree->expression, obj->GetMember(L"expression"), tokens);
}
void Fill(vl::Ptr<WfIfExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->condition, obj->GetMember(L"condition"), tokens);
SetMember(tree->trueBranch, obj->GetMember(L"trueBranch"), tokens);
SetMember(tree->falseBranch, obj->GetMember(L"falseBranch"), tokens);
}
void Fill(vl::Ptr<WfRangeExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->begin, obj->GetMember(L"begin"), tokens);
SetMember(tree->beginBoundary, obj->GetMember(L"beginBoundary"), tokens);
SetMember(tree->end, obj->GetMember(L"end"), tokens);
SetMember(tree->endBoundary, obj->GetMember(L"endBoundary"), tokens);
}
void Fill(vl::Ptr<WfSetTestingExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->test, obj->GetMember(L"test"), tokens);
SetMember(tree->element, obj->GetMember(L"element"), tokens);
SetMember(tree->collection, obj->GetMember(L"collection"), tokens);
}
void Fill(vl::Ptr<WfConstructorArgument> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->key, obj->GetMember(L"key"), tokens);
SetMember(tree->value, obj->GetMember(L"value"), tokens);
}
void Fill(vl::Ptr<WfConstructorExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->arguments, obj->GetMember(L"arguments"), tokens);
}
void Fill(vl::Ptr<WfInferExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->expression, obj->GetMember(L"expression"), tokens);
SetMember(tree->type, obj->GetMember(L"type"), tokens);
}
void Fill(vl::Ptr<WfTypeCastingExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->strategy, obj->GetMember(L"strategy"), tokens);
SetMember(tree->expression, obj->GetMember(L"expression"), tokens);
SetMember(tree->type, obj->GetMember(L"type"), tokens);
}
void Fill(vl::Ptr<WfTypeTestingExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->test, obj->GetMember(L"test"), tokens);
SetMember(tree->expression, obj->GetMember(L"expression"), tokens);
SetMember(tree->type, obj->GetMember(L"type"), tokens);
}
void Fill(vl::Ptr<WfTypeOfTypeExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->type, obj->GetMember(L"type"), tokens);
}
void Fill(vl::Ptr<WfTypeOfExpressionExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->expression, obj->GetMember(L"expression"), tokens);
}
void Fill(vl::Ptr<WfAttachEventExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->event, obj->GetMember(L"event"), tokens);
SetMember(tree->function, obj->GetMember(L"function"), tokens);
}
void Fill(vl::Ptr<WfDetachEventExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->event, obj->GetMember(L"event"), tokens);
SetMember(tree->handler, obj->GetMember(L"handler"), tokens);
}
void Fill(vl::Ptr<WfObserveExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->parent, obj->GetMember(L"parent"), tokens);
SetMember(tree->observeType, obj->GetMember(L"observeType"), tokens);
SetMember(tree->name, obj->GetMember(L"name"), tokens);
SetMember(tree->expression, obj->GetMember(L"expression"), tokens);
SetMember(tree->events, obj->GetMember(L"events"), tokens);
}
void Fill(vl::Ptr<WfCallExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->function, obj->GetMember(L"function"), tokens);
SetMember(tree->arguments, obj->GetMember(L"arguments"), tokens);
}
void Fill(vl::Ptr<WfFunctionExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->function, obj->GetMember(L"function"), tokens);
}
void Fill(vl::Ptr<WfNewClassExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->type, obj->GetMember(L"type"), tokens);
SetMember(tree->arguments, obj->GetMember(L"arguments"), tokens);
}
void Fill(vl::Ptr<WfNewInterfaceExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->type, obj->GetMember(L"type"), tokens);
if(SetMember(tree->declarations, obj->GetMember(L"declarations"), tokens))
{
SetDefaultClassMember(tree->declarations, tokens);
}
}
void Fill(vl::Ptr<WfVirtualExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->expandedExpression, obj->GetMember(L"expandedExpression"), tokens);
}
void Fill(vl::Ptr<WfBindExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->expression, obj->GetMember(L"expression"), tokens);
}
void Fill(vl::Ptr<WfFormatExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
if(SetMember(tree->value, obj->GetMember(L"value"), tokens))
{
UnescapeFormatString(tree->value, tokens);
}
}
void Fill(vl::Ptr<WfNewCoroutineExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->name, obj->GetMember(L"name"), tokens);
SetMember(tree->statement, obj->GetMember(L"statement"), tokens);
}
void Fill(vl::Ptr<WfMixinCastExpression> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->type, obj->GetMember(L"type"), tokens);
SetMember(tree->expression, obj->GetMember(L"expression"), tokens);
}
void Fill(vl::Ptr<WfModuleUsingFragment> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
}
void Fill(vl::Ptr<WfModuleUsingNameFragment> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->name, obj->GetMember(L"name"), tokens);
}
void Fill(vl::Ptr<WfModuleUsingWildCardFragment> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
}
void Fill(vl::Ptr<WfModuleUsingItem> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->fragments, obj->GetMember(L"fragments"), tokens);
}
void Fill(vl::Ptr<WfModuleUsingPath> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->items, obj->GetMember(L"items"), tokens);
}
void Fill(vl::Ptr<WfModule> tree, vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)
{
SetMember(tree->moduleType, obj->GetMember(L"moduleType"), tokens);
SetMember(tree->name, obj->GetMember(L"name"), tokens);
SetMember(tree->paths, obj->GetMember(L"paths"), tokens);
SetMember(tree->declarations, obj->GetMember(L"declarations"), tokens);
}
vl::Ptr<vl::parsing::ParsingTreeCustomBase> ConvertClass(vl::Ptr<vl::parsing::ParsingTreeObject> obj, const TokenList& tokens)override
{
if(obj->GetType()==L"ClassMember")
{
vl::Ptr<WfClassMember> tree = new WfClassMember;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
return tree;
}
else if(obj->GetType()==L"Attribute")
{
vl::Ptr<WfAttribute> tree = new WfAttribute;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
return tree;
}
else if(obj->GetType()==L"PredefinedType")
{
vl::Ptr<WfPredefinedType> tree = new WfPredefinedType;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfType>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"TopQualifiedType")
{
vl::Ptr<WfTopQualifiedType> tree = new WfTopQualifiedType;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfType>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"ReferenceType")
{
vl::Ptr<WfReferenceType> tree = new WfReferenceType;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfType>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"RawPointerType")
{
vl::Ptr<WfRawPointerType> tree = new WfRawPointerType;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfType>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"SharedPointerType")
{
vl::Ptr<WfSharedPointerType> tree = new WfSharedPointerType;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfType>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"NullableType")
{
vl::Ptr<WfNullableType> tree = new WfNullableType;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfType>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"EnumerableType")
{
vl::Ptr<WfEnumerableType> tree = new WfEnumerableType;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfType>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"MapType")
{
vl::Ptr<WfMapType> tree = new WfMapType;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfType>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"FunctionType")
{
vl::Ptr<WfFunctionType> tree = new WfFunctionType;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfType>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"ChildType")
{
vl::Ptr<WfChildType> tree = new WfChildType;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfType>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"NamespaceDeclaration")
{
vl::Ptr<WfNamespaceDeclaration> tree = new WfNamespaceDeclaration;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfDeclaration>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"FunctionArgument")
{
vl::Ptr<WfFunctionArgument> tree = new WfFunctionArgument;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
return tree;
}
else if(obj->GetType()==L"FunctionDeclaration")
{
vl::Ptr<WfFunctionDeclaration> tree = new WfFunctionDeclaration;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfDeclaration>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"VariableDeclaration")
{
vl::Ptr<WfVariableDeclaration> tree = new WfVariableDeclaration;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfDeclaration>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"EventDeclaration")
{
vl::Ptr<WfEventDeclaration> tree = new WfEventDeclaration;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfDeclaration>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"PropertyDeclaration")
{
vl::Ptr<WfPropertyDeclaration> tree = new WfPropertyDeclaration;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfDeclaration>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"BaseConstructorCall")
{
vl::Ptr<WfBaseConstructorCall> tree = new WfBaseConstructorCall;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
return tree;
}
else if(obj->GetType()==L"ConstructorDeclaration")
{
vl::Ptr<WfConstructorDeclaration> tree = new WfConstructorDeclaration;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfDeclaration>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"DestructorDeclaration")
{
vl::Ptr<WfDestructorDeclaration> tree = new WfDestructorDeclaration;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfDeclaration>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"ClassDeclaration")
{
vl::Ptr<WfClassDeclaration> tree = new WfClassDeclaration;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfDeclaration>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"EnumItemIntersection")
{
vl::Ptr<WfEnumItemIntersection> tree = new WfEnumItemIntersection;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
return tree;
}
else if(obj->GetType()==L"EnumItem")
{
vl::Ptr<WfEnumItem> tree = new WfEnumItem;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
return tree;
}
else if(obj->GetType()==L"EnumDeclaration")
{
vl::Ptr<WfEnumDeclaration> tree = new WfEnumDeclaration;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfDeclaration>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"StructMember")
{
vl::Ptr<WfStructMember> tree = new WfStructMember;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
return tree;
}
else if(obj->GetType()==L"StructDeclaration")
{
vl::Ptr<WfStructDeclaration> tree = new WfStructDeclaration;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfDeclaration>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"AutoPropertyDeclaration")
{
vl::Ptr<WfAutoPropertyDeclaration> tree = new WfAutoPropertyDeclaration;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfVirtualDeclaration>(), obj, tokens);
Fill(tree.Cast<WfDeclaration>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"CastResultInterfaceDeclaration")
{
vl::Ptr<WfCastResultInterfaceDeclaration> tree = new WfCastResultInterfaceDeclaration;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfVirtualDeclaration>(), obj, tokens);
Fill(tree.Cast<WfDeclaration>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"BreakStatement")
{
vl::Ptr<WfBreakStatement> tree = new WfBreakStatement;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfStatement>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"ContinueStatement")
{
vl::Ptr<WfContinueStatement> tree = new WfContinueStatement;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfStatement>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"ReturnStatement")
{
vl::Ptr<WfReturnStatement> tree = new WfReturnStatement;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfStatement>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"DeleteStatement")
{
vl::Ptr<WfDeleteStatement> tree = new WfDeleteStatement;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfStatement>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"RaiseExceptionStatement")
{
vl::Ptr<WfRaiseExceptionStatement> tree = new WfRaiseExceptionStatement;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfStatement>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"IfStatement")
{
vl::Ptr<WfIfStatement> tree = new WfIfStatement;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfStatement>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"WhileStatement")
{
vl::Ptr<WfWhileStatement> tree = new WfWhileStatement;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfStatement>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"TryStatement")
{
vl::Ptr<WfTryStatement> tree = new WfTryStatement;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfStatement>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"BlockStatement")
{
vl::Ptr<WfBlockStatement> tree = new WfBlockStatement;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfStatement>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"VariableStatement")
{
vl::Ptr<WfVariableStatement> tree = new WfVariableStatement;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfStatement>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"ExpressionStatement")
{
vl::Ptr<WfExpressionStatement> tree = new WfExpressionStatement;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfStatement>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"ForEachStatement")
{
vl::Ptr<WfForEachStatement> tree = new WfForEachStatement;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfVirtualStatement>(), obj, tokens);
Fill(tree.Cast<WfStatement>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"SwitchCase")
{
vl::Ptr<WfSwitchCase> tree = new WfSwitchCase;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
return tree;
}
else if(obj->GetType()==L"SwitchStatement")
{
vl::Ptr<WfSwitchStatement> tree = new WfSwitchStatement;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfVirtualStatement>(), obj, tokens);
Fill(tree.Cast<WfStatement>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"CoProviderStatement")
{
vl::Ptr<WfCoProviderStatement> tree = new WfCoProviderStatement;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfVirtualStatement>(), obj, tokens);
Fill(tree.Cast<WfStatement>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"CoPauseStatement")
{
vl::Ptr<WfCoPauseStatement> tree = new WfCoPauseStatement;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfCoroutineStatement>(), obj, tokens);
Fill(tree.Cast<WfStatement>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"CoOperatorStatement")
{
vl::Ptr<WfCoOperatorStatement> tree = new WfCoOperatorStatement;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfCoroutineStatement>(), obj, tokens);
Fill(tree.Cast<WfStatement>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"ThisExpression")
{
vl::Ptr<WfThisExpression> tree = new WfThisExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"TopQualifiedExpression")
{
vl::Ptr<WfTopQualifiedExpression> tree = new WfTopQualifiedExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"ReferenceExpression")
{
vl::Ptr<WfReferenceExpression> tree = new WfReferenceExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"OrderedNameExpression")
{
vl::Ptr<WfOrderedNameExpression> tree = new WfOrderedNameExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"OrderedLambdaExpression")
{
vl::Ptr<WfOrderedLambdaExpression> tree = new WfOrderedLambdaExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"MemberExpression")
{
vl::Ptr<WfMemberExpression> tree = new WfMemberExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"ChildExpression")
{
vl::Ptr<WfChildExpression> tree = new WfChildExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"LiteralExpression")
{
vl::Ptr<WfLiteralExpression> tree = new WfLiteralExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"FloatingExpression")
{
vl::Ptr<WfFloatingExpression> tree = new WfFloatingExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"IntegerExpression")
{
vl::Ptr<WfIntegerExpression> tree = new WfIntegerExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"StringExpression")
{
vl::Ptr<WfStringExpression> tree = new WfStringExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"UnaryExpression")
{
vl::Ptr<WfUnaryExpression> tree = new WfUnaryExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"BinaryExpression")
{
vl::Ptr<WfBinaryExpression> tree = new WfBinaryExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"LetVariable")
{
vl::Ptr<WfLetVariable> tree = new WfLetVariable;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
return tree;
}
else if(obj->GetType()==L"LetExpression")
{
vl::Ptr<WfLetExpression> tree = new WfLetExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"IfExpression")
{
vl::Ptr<WfIfExpression> tree = new WfIfExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"RangeExpression")
{
vl::Ptr<WfRangeExpression> tree = new WfRangeExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"SetTestingExpression")
{
vl::Ptr<WfSetTestingExpression> tree = new WfSetTestingExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"ConstructorArgument")
{
vl::Ptr<WfConstructorArgument> tree = new WfConstructorArgument;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
return tree;
}
else if(obj->GetType()==L"ConstructorExpression")
{
vl::Ptr<WfConstructorExpression> tree = new WfConstructorExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"InferExpression")
{
vl::Ptr<WfInferExpression> tree = new WfInferExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"TypeCastingExpression")
{
vl::Ptr<WfTypeCastingExpression> tree = new WfTypeCastingExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"TypeTestingExpression")
{
vl::Ptr<WfTypeTestingExpression> tree = new WfTypeTestingExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"TypeOfTypeExpression")
{
vl::Ptr<WfTypeOfTypeExpression> tree = new WfTypeOfTypeExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"TypeOfExpressionExpression")
{
vl::Ptr<WfTypeOfExpressionExpression> tree = new WfTypeOfExpressionExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"AttachEventExpression")
{
vl::Ptr<WfAttachEventExpression> tree = new WfAttachEventExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"DetachEventExpression")
{
vl::Ptr<WfDetachEventExpression> tree = new WfDetachEventExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"ObserveExpression")
{
vl::Ptr<WfObserveExpression> tree = new WfObserveExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"CallExpression")
{
vl::Ptr<WfCallExpression> tree = new WfCallExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"FunctionExpression")
{
vl::Ptr<WfFunctionExpression> tree = new WfFunctionExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"NewClassExpression")
{
vl::Ptr<WfNewClassExpression> tree = new WfNewClassExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"NewInterfaceExpression")
{
vl::Ptr<WfNewInterfaceExpression> tree = new WfNewInterfaceExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"BindExpression")
{
vl::Ptr<WfBindExpression> tree = new WfBindExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfVirtualExpression>(), obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"FormatExpression")
{
vl::Ptr<WfFormatExpression> tree = new WfFormatExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfVirtualExpression>(), obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"NewCoroutineExpression")
{
vl::Ptr<WfNewCoroutineExpression> tree = new WfNewCoroutineExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfVirtualExpression>(), obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"MixinCastExpression")
{
vl::Ptr<WfMixinCastExpression> tree = new WfMixinCastExpression;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfVirtualExpression>(), obj, tokens);
Fill(tree.Cast<WfExpression>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"ModuleUsingNameFragment")
{
vl::Ptr<WfModuleUsingNameFragment> tree = new WfModuleUsingNameFragment;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfModuleUsingFragment>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"ModuleUsingWildCardFragment")
{
vl::Ptr<WfModuleUsingWildCardFragment> tree = new WfModuleUsingWildCardFragment;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
Fill(tree.Cast<WfModuleUsingFragment>(), obj, tokens);
return tree;
}
else if(obj->GetType()==L"ModuleUsingItem")
{
vl::Ptr<WfModuleUsingItem> tree = new WfModuleUsingItem;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
return tree;
}
else if(obj->GetType()==L"ModuleUsingPath")
{
vl::Ptr<WfModuleUsingPath> tree = new WfModuleUsingPath;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
return tree;
}
else if(obj->GetType()==L"Module")
{
vl::Ptr<WfModule> tree = new WfModule;
vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules());
Fill(tree, obj, tokens);
return tree;
}
else
return 0;
}
};
vl::Ptr<vl::parsing::ParsingTreeCustomBase> WfConvertParsingTreeNode(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
WfTreeConverter converter;
vl::Ptr<vl::parsing::ParsingTreeCustomBase> tree;
converter.SetMember(tree, node, tokens);
return tree;
}
/***********************************************************************
Parsing Tree Conversion Implementation
***********************************************************************/
vl::Ptr<WfClassMember> WfClassMember::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfClassMember>();
}
vl::Ptr<WfAttribute> WfAttribute::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfAttribute>();
}
vl::Ptr<WfPredefinedType> WfPredefinedType::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfPredefinedType>();
}
vl::Ptr<WfTopQualifiedType> WfTopQualifiedType::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfTopQualifiedType>();
}
vl::Ptr<WfReferenceType> WfReferenceType::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfReferenceType>();
}
vl::Ptr<WfRawPointerType> WfRawPointerType::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfRawPointerType>();
}
vl::Ptr<WfSharedPointerType> WfSharedPointerType::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfSharedPointerType>();
}
vl::Ptr<WfNullableType> WfNullableType::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfNullableType>();
}
vl::Ptr<WfEnumerableType> WfEnumerableType::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfEnumerableType>();
}
vl::Ptr<WfMapType> WfMapType::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfMapType>();
}
vl::Ptr<WfFunctionType> WfFunctionType::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfFunctionType>();
}
vl::Ptr<WfChildType> WfChildType::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfChildType>();
}
vl::Ptr<WfNamespaceDeclaration> WfNamespaceDeclaration::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfNamespaceDeclaration>();
}
vl::Ptr<WfFunctionArgument> WfFunctionArgument::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfFunctionArgument>();
}
vl::Ptr<WfFunctionDeclaration> WfFunctionDeclaration::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfFunctionDeclaration>();
}
vl::Ptr<WfVariableDeclaration> WfVariableDeclaration::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfVariableDeclaration>();
}
vl::Ptr<WfEventDeclaration> WfEventDeclaration::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfEventDeclaration>();
}
vl::Ptr<WfPropertyDeclaration> WfPropertyDeclaration::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfPropertyDeclaration>();
}
vl::Ptr<WfBaseConstructorCall> WfBaseConstructorCall::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfBaseConstructorCall>();
}
vl::Ptr<WfConstructorDeclaration> WfConstructorDeclaration::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfConstructorDeclaration>();
}
vl::Ptr<WfDestructorDeclaration> WfDestructorDeclaration::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfDestructorDeclaration>();
}
vl::Ptr<WfClassDeclaration> WfClassDeclaration::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfClassDeclaration>();
}
vl::Ptr<WfEnumItemIntersection> WfEnumItemIntersection::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfEnumItemIntersection>();
}
vl::Ptr<WfEnumItem> WfEnumItem::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfEnumItem>();
}
vl::Ptr<WfEnumDeclaration> WfEnumDeclaration::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfEnumDeclaration>();
}
vl::Ptr<WfStructMember> WfStructMember::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfStructMember>();
}
vl::Ptr<WfStructDeclaration> WfStructDeclaration::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfStructDeclaration>();
}
vl::Ptr<WfAutoPropertyDeclaration> WfAutoPropertyDeclaration::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfAutoPropertyDeclaration>();
}
vl::Ptr<WfCastResultInterfaceDeclaration> WfCastResultInterfaceDeclaration::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfCastResultInterfaceDeclaration>();
}
vl::Ptr<WfBreakStatement> WfBreakStatement::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfBreakStatement>();
}
vl::Ptr<WfContinueStatement> WfContinueStatement::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfContinueStatement>();
}
vl::Ptr<WfReturnStatement> WfReturnStatement::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfReturnStatement>();
}
vl::Ptr<WfDeleteStatement> WfDeleteStatement::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfDeleteStatement>();
}
vl::Ptr<WfRaiseExceptionStatement> WfRaiseExceptionStatement::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfRaiseExceptionStatement>();
}
vl::Ptr<WfIfStatement> WfIfStatement::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfIfStatement>();
}
vl::Ptr<WfWhileStatement> WfWhileStatement::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfWhileStatement>();
}
vl::Ptr<WfTryStatement> WfTryStatement::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfTryStatement>();
}
vl::Ptr<WfBlockStatement> WfBlockStatement::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfBlockStatement>();
}
vl::Ptr<WfVariableStatement> WfVariableStatement::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfVariableStatement>();
}
vl::Ptr<WfExpressionStatement> WfExpressionStatement::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfExpressionStatement>();
}
vl::Ptr<WfForEachStatement> WfForEachStatement::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfForEachStatement>();
}
vl::Ptr<WfSwitchCase> WfSwitchCase::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfSwitchCase>();
}
vl::Ptr<WfSwitchStatement> WfSwitchStatement::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfSwitchStatement>();
}
vl::Ptr<WfCoProviderStatement> WfCoProviderStatement::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfCoProviderStatement>();
}
vl::Ptr<WfCoPauseStatement> WfCoPauseStatement::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfCoPauseStatement>();
}
vl::Ptr<WfCoOperatorStatement> WfCoOperatorStatement::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfCoOperatorStatement>();
}
vl::Ptr<WfThisExpression> WfThisExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfThisExpression>();
}
vl::Ptr<WfTopQualifiedExpression> WfTopQualifiedExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfTopQualifiedExpression>();
}
vl::Ptr<WfReferenceExpression> WfReferenceExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfReferenceExpression>();
}
vl::Ptr<WfOrderedNameExpression> WfOrderedNameExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfOrderedNameExpression>();
}
vl::Ptr<WfOrderedLambdaExpression> WfOrderedLambdaExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfOrderedLambdaExpression>();
}
vl::Ptr<WfMemberExpression> WfMemberExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfMemberExpression>();
}
vl::Ptr<WfChildExpression> WfChildExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfChildExpression>();
}
vl::Ptr<WfLiteralExpression> WfLiteralExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfLiteralExpression>();
}
vl::Ptr<WfFloatingExpression> WfFloatingExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfFloatingExpression>();
}
vl::Ptr<WfIntegerExpression> WfIntegerExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfIntegerExpression>();
}
vl::Ptr<WfStringExpression> WfStringExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfStringExpression>();
}
vl::Ptr<WfUnaryExpression> WfUnaryExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfUnaryExpression>();
}
vl::Ptr<WfBinaryExpression> WfBinaryExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfBinaryExpression>();
}
vl::Ptr<WfLetVariable> WfLetVariable::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfLetVariable>();
}
vl::Ptr<WfLetExpression> WfLetExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfLetExpression>();
}
vl::Ptr<WfIfExpression> WfIfExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfIfExpression>();
}
vl::Ptr<WfRangeExpression> WfRangeExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfRangeExpression>();
}
vl::Ptr<WfSetTestingExpression> WfSetTestingExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfSetTestingExpression>();
}
vl::Ptr<WfConstructorArgument> WfConstructorArgument::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfConstructorArgument>();
}
vl::Ptr<WfConstructorExpression> WfConstructorExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfConstructorExpression>();
}
vl::Ptr<WfInferExpression> WfInferExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfInferExpression>();
}
vl::Ptr<WfTypeCastingExpression> WfTypeCastingExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfTypeCastingExpression>();
}
vl::Ptr<WfTypeTestingExpression> WfTypeTestingExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfTypeTestingExpression>();
}
vl::Ptr<WfTypeOfTypeExpression> WfTypeOfTypeExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfTypeOfTypeExpression>();
}
vl::Ptr<WfTypeOfExpressionExpression> WfTypeOfExpressionExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfTypeOfExpressionExpression>();
}
vl::Ptr<WfAttachEventExpression> WfAttachEventExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfAttachEventExpression>();
}
vl::Ptr<WfDetachEventExpression> WfDetachEventExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfDetachEventExpression>();
}
vl::Ptr<WfObserveExpression> WfObserveExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfObserveExpression>();
}
vl::Ptr<WfCallExpression> WfCallExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfCallExpression>();
}
vl::Ptr<WfFunctionExpression> WfFunctionExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfFunctionExpression>();
}
vl::Ptr<WfNewClassExpression> WfNewClassExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfNewClassExpression>();
}
vl::Ptr<WfNewInterfaceExpression> WfNewInterfaceExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfNewInterfaceExpression>();
}
vl::Ptr<WfBindExpression> WfBindExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfBindExpression>();
}
vl::Ptr<WfFormatExpression> WfFormatExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfFormatExpression>();
}
vl::Ptr<WfNewCoroutineExpression> WfNewCoroutineExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfNewCoroutineExpression>();
}
vl::Ptr<WfMixinCastExpression> WfMixinCastExpression::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfMixinCastExpression>();
}
vl::Ptr<WfModuleUsingNameFragment> WfModuleUsingNameFragment::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfModuleUsingNameFragment>();
}
vl::Ptr<WfModuleUsingWildCardFragment> WfModuleUsingWildCardFragment::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfModuleUsingWildCardFragment>();
}
vl::Ptr<WfModuleUsingItem> WfModuleUsingItem::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfModuleUsingItem>();
}
vl::Ptr<WfModuleUsingPath> WfModuleUsingPath::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfModuleUsingPath>();
}
vl::Ptr<WfModule> WfModule::Convert(vl::Ptr<vl::parsing::ParsingTreeNode> node, const vl::collections::List<vl::regex::RegexToken>& tokens)
{
return WfConvertParsingTreeNode(node, tokens).Cast<WfModule>();
}
/***********************************************************************
Parser Function
***********************************************************************/
vl::Ptr<vl::parsing::ParsingTreeNode> WfParseCoProviderStatementAsParsingTreeNode(const vl::WString& input, vl::Ptr<vl::parsing::tabling::ParsingTable> table, vl::collections::List<vl::Ptr<vl::parsing::ParsingError>>& errors, vl::vint codeIndex)
{
vl::parsing::tabling::ParsingState state(input, table, codeIndex);
state.Reset(L"_CoProvider");
vl::Ptr<vl::parsing::tabling::ParsingGeneralParser> parser=vl::parsing::tabling::CreateStrictParser(table);
vl::Ptr<vl::parsing::ParsingTreeNode> node=parser->Parse(state, errors);
return node;
}
vl::Ptr<vl::parsing::ParsingTreeNode> WfParseCoProviderStatementAsParsingTreeNode(const vl::WString& input, vl::Ptr<vl::parsing::tabling::ParsingTable> table, vl::vint codeIndex)
{
vl::collections::List<vl::Ptr<vl::parsing::ParsingError>> errors;
return WfParseCoProviderStatementAsParsingTreeNode(input, table, errors, codeIndex);
}
vl::Ptr<WfStatement> WfParseCoProviderStatement(const vl::WString& input, vl::Ptr<vl::parsing::tabling::ParsingTable> table, vl::collections::List<vl::Ptr<vl::parsing::ParsingError>>& errors, vl::vint codeIndex)
{
vl::parsing::tabling::ParsingState state(input, table, codeIndex);
state.Reset(L"_CoProvider");
vl::Ptr<vl::parsing::tabling::ParsingGeneralParser> parser=vl::parsing::tabling::CreateStrictParser(table);
vl::Ptr<vl::parsing::ParsingTreeNode> node=parser->Parse(state, errors);
if(node && errors.Count()==0)
{
return WfConvertParsingTreeNode(node, state.GetTokens()).Cast<WfStatement>();
}
return 0;
}
vl::Ptr<WfStatement> WfParseCoProviderStatement(const vl::WString& input, vl::Ptr<vl::parsing::tabling::ParsingTable> table, vl::vint codeIndex)
{
vl::collections::List<vl::Ptr<vl::parsing::ParsingError>> errors;
return WfParseCoProviderStatement(input, table, errors, codeIndex);
}
vl::Ptr<vl::parsing::ParsingTreeNode> WfParseDeclarationAsParsingTreeNode(const vl::WString& input, vl::Ptr<vl::parsing::tabling::ParsingTable> table, vl::collections::List<vl::Ptr<vl::parsing::ParsingError>>& errors, vl::vint codeIndex)
{
vl::parsing::tabling::ParsingState state(input, table, codeIndex);
state.Reset(L"_Declaration");
vl::Ptr<vl::parsing::tabling::ParsingGeneralParser> parser=vl::parsing::tabling::CreateStrictParser(table);
vl::Ptr<vl::parsing::ParsingTreeNode> node=parser->Parse(state, errors);
return node;
}
vl::Ptr<vl::parsing::ParsingTreeNode> WfParseDeclarationAsParsingTreeNode(const vl::WString& input, vl::Ptr<vl::parsing::tabling::ParsingTable> table, vl::vint codeIndex)
{
vl::collections::List<vl::Ptr<vl::parsing::ParsingError>> errors;
return WfParseDeclarationAsParsingTreeNode(input, table, errors, codeIndex);
}
vl::Ptr<WfDeclaration> WfParseDeclaration(const vl::WString& input, vl::Ptr<vl::parsing::tabling::ParsingTable> table, vl::collections::List<vl::Ptr<vl::parsing::ParsingError>>& errors, vl::vint codeIndex)
{
vl::parsing::tabling::ParsingState state(input, table, codeIndex);
state.Reset(L"_Declaration");
vl::Ptr<vl::parsing::tabling::ParsingGeneralParser> parser=vl::parsing::tabling::CreateStrictParser(table);
vl::Ptr<vl::parsing::ParsingTreeNode> node=parser->Parse(state, errors);
if(node && errors.Count()==0)
{
return WfConvertParsingTreeNode(node, state.GetTokens()).Cast<WfDeclaration>();
}
return 0;
}
vl::Ptr<WfDeclaration> WfParseDeclaration(const vl::WString& input, vl::Ptr<vl::parsing::tabling::ParsingTable> table, vl::vint codeIndex)
{
vl::collections::List<vl::Ptr<vl::parsing::ParsingError>> errors;
return WfParseDeclaration(input, table, errors, codeIndex);
}
vl::Ptr<vl::parsing::ParsingTreeNode> WfParseExpressionAsParsingTreeNode(const vl::WString& input, vl::Ptr<vl::parsing::tabling::ParsingTable> table, vl::collections::List<vl::Ptr<vl::parsing::ParsingError>>& errors, vl::vint codeIndex)
{
vl::parsing::tabling::ParsingState state(input, table, codeIndex);
state.Reset(L"_Expression");
vl::Ptr<vl::parsing::tabling::ParsingGeneralParser> parser=vl::parsing::tabling::CreateStrictParser(table);
vl::Ptr<vl::parsing::ParsingTreeNode> node=parser->Parse(state, errors);
return node;
}
vl::Ptr<vl::parsing::ParsingTreeNode> WfParseExpressionAsParsingTreeNode(const vl::WString& input, vl::Ptr<vl::parsing::tabling::ParsingTable> table, vl::vint codeIndex)
{
vl::collections::List<vl::Ptr<vl::parsing::ParsingError>> errors;
return WfParseExpressionAsParsingTreeNode(input, table, errors, codeIndex);
}
vl::Ptr<WfExpression> WfParseExpression(const vl::WString& input, vl::Ptr<vl::parsing::tabling::ParsingTable> table, vl::collections::List<vl::Ptr<vl::parsing::ParsingError>>& errors, vl::vint codeIndex)
{
vl::parsing::tabling::ParsingState state(input, table, codeIndex);
state.Reset(L"_Expression");
vl::Ptr<vl::parsing::tabling::ParsingGeneralParser> parser=vl::parsing::tabling::CreateStrictParser(table);
vl::Ptr<vl::parsing::ParsingTreeNode> node=parser->Parse(state, errors);
if(node && errors.Count()==0)
{
return WfConvertParsingTreeNode(node, state.GetTokens()).Cast<WfExpression>();
}
return 0;
}
vl::Ptr<WfExpression> WfParseExpression(const vl::WString& input, vl::Ptr<vl::parsing::tabling::ParsingTable> table, vl::vint codeIndex)
{
vl::collections::List<vl::Ptr<vl::parsing::ParsingError>> errors;
return WfParseExpression(input, table, errors, codeIndex);
}
vl::Ptr<vl::parsing::ParsingTreeNode> WfParseModuleAsParsingTreeNode(const vl::WString& input, vl::Ptr<vl::parsing::tabling::ParsingTable> table, vl::collections::List<vl::Ptr<vl::parsing::ParsingError>>& errors, vl::vint codeIndex)
{
vl::parsing::tabling::ParsingState state(input, table, codeIndex);
state.Reset(L"_Module");
vl::Ptr<vl::parsing::tabling::ParsingGeneralParser> parser=vl::parsing::tabling::CreateStrictParser(table);
vl::Ptr<vl::parsing::ParsingTreeNode> node=parser->Parse(state, errors);
return node;
}
vl::Ptr<vl::parsing::ParsingTreeNode> WfParseModuleAsParsingTreeNode(const vl::WString& input, vl::Ptr<vl::parsing::tabling::ParsingTable> table, vl::vint codeIndex)
{
vl::collections::List<vl::Ptr<vl::parsing::ParsingError>> errors;
return WfParseModuleAsParsingTreeNode(input, table, errors, codeIndex);
}
vl::Ptr<WfModule> WfParseModule(const vl::WString& input, vl::Ptr<vl::parsing::tabling::ParsingTable> table, vl::collections::List<vl::Ptr<vl::parsing::ParsingError>>& errors, vl::vint codeIndex)
{
vl::parsing::tabling::ParsingState state(input, table, codeIndex);
state.Reset(L"_Module");
vl::Ptr<vl::parsing::tabling::ParsingGeneralParser> parser=vl::parsing::tabling::CreateStrictParser(table);
vl::Ptr<vl::parsing::ParsingTreeNode> node=parser->Parse(state, errors);
if(node && errors.Count()==0)
{
return WfConvertParsingTreeNode(node, state.GetTokens()).Cast<WfModule>();
}
return 0;
}
vl::Ptr<WfModule> WfParseModule(const vl::WString& input, vl::Ptr<vl::parsing::tabling::ParsingTable> table, vl::vint codeIndex)
{
vl::collections::List<vl::Ptr<vl::parsing::ParsingError>> errors;
return WfParseModule(input, table, errors, codeIndex);
}
vl::Ptr<vl::parsing::ParsingTreeNode> WfParseStatementAsParsingTreeNode(const vl::WString& input, vl::Ptr<vl::parsing::tabling::ParsingTable> table, vl::collections::List<vl::Ptr<vl::parsing::ParsingError>>& errors, vl::vint codeIndex)
{
vl::parsing::tabling::ParsingState state(input, table, codeIndex);
state.Reset(L"_Statement");
vl::Ptr<vl::parsing::tabling::ParsingGeneralParser> parser=vl::parsing::tabling::CreateStrictParser(table);
vl::Ptr<vl::parsing::ParsingTreeNode> node=parser->Parse(state, errors);
return node;
}
vl::Ptr<vl::parsing::ParsingTreeNode> WfParseStatementAsParsingTreeNode(const vl::WString& input, vl::Ptr<vl::parsing::tabling::ParsingTable> table, vl::vint codeIndex)
{
vl::collections::List<vl::Ptr<vl::parsing::ParsingError>> errors;
return WfParseStatementAsParsingTreeNode(input, table, errors, codeIndex);
}
vl::Ptr<WfStatement> WfParseStatement(const vl::WString& input, vl::Ptr<vl::parsing::tabling::ParsingTable> table, vl::collections::List<vl::Ptr<vl::parsing::ParsingError>>& errors, vl::vint codeIndex)
{
vl::parsing::tabling::ParsingState state(input, table, codeIndex);
state.Reset(L"_Statement");
vl::Ptr<vl::parsing::tabling::ParsingGeneralParser> parser=vl::parsing::tabling::CreateStrictParser(table);
vl::Ptr<vl::parsing::ParsingTreeNode> node=parser->Parse(state, errors);
if(node && errors.Count()==0)
{
return WfConvertParsingTreeNode(node, state.GetTokens()).Cast<WfStatement>();
}
return 0;
}
vl::Ptr<WfStatement> WfParseStatement(const vl::WString& input, vl::Ptr<vl::parsing::tabling::ParsingTable> table, vl::vint codeIndex)
{
vl::collections::List<vl::Ptr<vl::parsing::ParsingError>> errors;
return WfParseStatement(input, table, errors, codeIndex);
}
vl::Ptr<vl::parsing::ParsingTreeNode> WfParseTypeAsParsingTreeNode(const vl::WString& input, vl::Ptr<vl::parsing::tabling::ParsingTable> table, vl::collections::List<vl::Ptr<vl::parsing::ParsingError>>& errors, vl::vint codeIndex)
{
vl::parsing::tabling::ParsingState state(input, table, codeIndex);
state.Reset(L"_Type");
vl::Ptr<vl::parsing::tabling::ParsingGeneralParser> parser=vl::parsing::tabling::CreateStrictParser(table);
vl::Ptr<vl::parsing::ParsingTreeNode> node=parser->Parse(state, errors);
return node;
}
vl::Ptr<vl::parsing::ParsingTreeNode> WfParseTypeAsParsingTreeNode(const vl::WString& input, vl::Ptr<vl::parsing::tabling::ParsingTable> table, vl::vint codeIndex)
{
vl::collections::List<vl::Ptr<vl::parsing::ParsingError>> errors;
return WfParseTypeAsParsingTreeNode(input, table, errors, codeIndex);
}
vl::Ptr<WfType> WfParseType(const vl::WString& input, vl::Ptr<vl::parsing::tabling::ParsingTable> table, vl::collections::List<vl::Ptr<vl::parsing::ParsingError>>& errors, vl::vint codeIndex)
{
vl::parsing::tabling::ParsingState state(input, table, codeIndex);
state.Reset(L"_Type");
vl::Ptr<vl::parsing::tabling::ParsingGeneralParser> parser=vl::parsing::tabling::CreateStrictParser(table);
vl::Ptr<vl::parsing::ParsingTreeNode> node=parser->Parse(state, errors);
if(node && errors.Count()==0)
{
return WfConvertParsingTreeNode(node, state.GetTokens()).Cast<WfType>();
}
return 0;
}
vl::Ptr<WfType> WfParseType(const vl::WString& input, vl::Ptr<vl::parsing::tabling::ParsingTable> table, vl::vint codeIndex)
{
vl::collections::List<vl::Ptr<vl::parsing::ParsingError>> errors;
return WfParseType(input, table, errors, codeIndex);
}
/***********************************************************************
Table Generation
***********************************************************************/
vl::Ptr<vl::parsing::tabling::ParsingTable> WfLoadTable()
{
vl::stream::MemoryStream stream;
WfGetParserBuffer(stream);
vl::Ptr<vl::parsing::tabling::ParsingTable> table=new vl::parsing::tabling::ParsingTable(stream);
table->Initialize();
return table;
}
}
}
/***********************************************************************
EXPRESSION\WFEXPRESSION_TRAVERSE.CPP
***********************************************************************/
/***********************************************************************
Vczh Library++ 3.0
Developer: Zihan Chen(vczh)
Parser::WfExpression.parser.txt
This file is generated by: Vczh Parser Generator
***********************************************************************/
namespace vl
{
namespace workflow
{
namespace traverse_visitor
{
/***********************************************************************
TypeVisitor
***********************************************************************/
// Traverse ------------------------------------------
void TypeVisitor::Traverse(vl::parsing::ParsingToken& token)
{
}
void TypeVisitor::Traverse(vl::parsing::ParsingTreeCustomBase* node)
{
}
void TypeVisitor::Traverse(WfPredefinedType* node)
{
}
void TypeVisitor::Traverse(WfType* node)
{
}
void TypeVisitor::Traverse(WfTopQualifiedType* node)
{
}
void TypeVisitor::Traverse(WfReferenceType* node)
{
}
void TypeVisitor::Traverse(WfRawPointerType* node)
{
}
void TypeVisitor::Traverse(WfSharedPointerType* node)
{
}
void TypeVisitor::Traverse(WfNullableType* node)
{
}
void TypeVisitor::Traverse(WfEnumerableType* node)
{
}
void TypeVisitor::Traverse(WfMapType* node)
{
}
void TypeVisitor::Traverse(WfFunctionType* node)
{
}
void TypeVisitor::Traverse(WfChildType* node)
{
}
// Visitor Members -----------------------------------
void TypeVisitor::Visit(WfPredefinedType* node)
{
Traverse(static_cast<WfPredefinedType*>(node));
Traverse(static_cast<WfType*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
}
void TypeVisitor::Visit(WfTopQualifiedType* node)
{
Traverse(static_cast<WfTopQualifiedType*>(node));
Traverse(static_cast<WfType*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
Traverse(node->name);
}
void TypeVisitor::Visit(WfReferenceType* node)
{
Traverse(static_cast<WfReferenceType*>(node));
Traverse(static_cast<WfType*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
Traverse(node->name);
}
void TypeVisitor::Visit(WfRawPointerType* node)
{
Traverse(static_cast<WfRawPointerType*>(node));
Traverse(static_cast<WfType*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->element.Obj());
}
void TypeVisitor::Visit(WfSharedPointerType* node)
{
Traverse(static_cast<WfSharedPointerType*>(node));
Traverse(static_cast<WfType*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->element.Obj());
}
void TypeVisitor::Visit(WfNullableType* node)
{
Traverse(static_cast<WfNullableType*>(node));
Traverse(static_cast<WfType*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->element.Obj());
}
void TypeVisitor::Visit(WfEnumerableType* node)
{
Traverse(static_cast<WfEnumerableType*>(node));
Traverse(static_cast<WfType*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->element.Obj());
}
void TypeVisitor::Visit(WfMapType* node)
{
Traverse(static_cast<WfMapType*>(node));
Traverse(static_cast<WfType*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->key.Obj());
VisitField(node->value.Obj());
}
void TypeVisitor::Visit(WfFunctionType* node)
{
Traverse(static_cast<WfFunctionType*>(node));
Traverse(static_cast<WfType*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->result.Obj());
FOREACH(vl::Ptr<WfType>, listItem, node->arguments)
{
VisitField(listItem.Obj());
}
}
void TypeVisitor::Visit(WfChildType* node)
{
Traverse(static_cast<WfChildType*>(node));
Traverse(static_cast<WfType*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->parent.Obj());
Traverse(node->name);
}
/***********************************************************************
ExpressionVisitor
***********************************************************************/
// Traverse ------------------------------------------
void ExpressionVisitor::Traverse(vl::parsing::ParsingToken& token)
{
}
void ExpressionVisitor::Traverse(vl::parsing::ParsingTreeCustomBase* node)
{
}
void ExpressionVisitor::Traverse(WfThisExpression* node)
{
}
void ExpressionVisitor::Traverse(WfExpression* node)
{
}
void ExpressionVisitor::Traverse(WfTopQualifiedExpression* node)
{
}
void ExpressionVisitor::Traverse(WfReferenceExpression* node)
{
}
void ExpressionVisitor::Traverse(WfOrderedNameExpression* node)
{
}
void ExpressionVisitor::Traverse(WfOrderedLambdaExpression* node)
{
}
void ExpressionVisitor::Traverse(WfMemberExpression* node)
{
}
void ExpressionVisitor::Traverse(WfChildExpression* node)
{
}
void ExpressionVisitor::Traverse(WfLiteralExpression* node)
{
}
void ExpressionVisitor::Traverse(WfFloatingExpression* node)
{
}
void ExpressionVisitor::Traverse(WfIntegerExpression* node)
{
}
void ExpressionVisitor::Traverse(WfStringExpression* node)
{
}
void ExpressionVisitor::Traverse(WfUnaryExpression* node)
{
}
void ExpressionVisitor::Traverse(WfBinaryExpression* node)
{
}
void ExpressionVisitor::Traverse(WfLetExpression* node)
{
}
void ExpressionVisitor::Traverse(WfLetVariable* node)
{
}
void ExpressionVisitor::Traverse(WfIfExpression* node)
{
}
void ExpressionVisitor::Traverse(WfRangeExpression* node)
{
}
void ExpressionVisitor::Traverse(WfSetTestingExpression* node)
{
}
void ExpressionVisitor::Traverse(WfConstructorExpression* node)
{
}
void ExpressionVisitor::Traverse(WfConstructorArgument* node)
{
}
void ExpressionVisitor::Traverse(WfInferExpression* node)
{
}
void ExpressionVisitor::Traverse(WfTypeCastingExpression* node)
{
}
void ExpressionVisitor::Traverse(WfTypeTestingExpression* node)
{
}
void ExpressionVisitor::Traverse(WfTypeOfTypeExpression* node)
{
}
void ExpressionVisitor::Traverse(WfTypeOfExpressionExpression* node)
{
}
void ExpressionVisitor::Traverse(WfAttachEventExpression* node)
{
}
void ExpressionVisitor::Traverse(WfDetachEventExpression* node)
{
}
void ExpressionVisitor::Traverse(WfObserveExpression* node)
{
}
void ExpressionVisitor::Traverse(WfCallExpression* node)
{
}
void ExpressionVisitor::Traverse(WfFunctionExpression* node)
{
}
void ExpressionVisitor::Traverse(WfFunctionDeclaration* node)
{
}
void ExpressionVisitor::Traverse(WfDeclaration* node)
{
}
void ExpressionVisitor::Traverse(WfAttribute* node)
{
}
void ExpressionVisitor::Traverse(WfClassMember* node)
{
}
void ExpressionVisitor::Traverse(WfFunctionArgument* node)
{
}
void ExpressionVisitor::Traverse(WfNewClassExpression* node)
{
}
void ExpressionVisitor::Traverse(WfNewInterfaceExpression* node)
{
}
// VisitField ----------------------------------------
void ExpressionVisitor::VisitField(WfLetVariable* node)
{
if (!node) return;
Traverse(static_cast<WfLetVariable*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
Traverse(node->name);
VisitField(node->value.Obj());
}
void ExpressionVisitor::VisitField(WfConstructorArgument* node)
{
if (!node) return;
Traverse(static_cast<WfConstructorArgument*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->key.Obj());
VisitField(node->value.Obj());
}
void ExpressionVisitor::VisitField(WfFunctionDeclaration* node)
{
if (!node) return;
Traverse(static_cast<WfFunctionDeclaration*>(node));
Traverse(static_cast<WfDeclaration*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
FOREACH(vl::Ptr<WfFunctionArgument>, listItem, node->arguments)
{
VisitField(listItem.Obj());
}
VisitField(node->returnType.Obj());
VisitField(node->statement.Obj());
FOREACH(vl::Ptr<WfAttribute>, listItem, node->attributes)
{
VisitField(listItem.Obj());
}
Traverse(node->name);
VisitField(node->classMember.Obj());
}
void ExpressionVisitor::VisitField(WfAttribute* node)
{
if (!node) return;
Traverse(static_cast<WfAttribute*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
Traverse(node->category);
Traverse(node->name);
VisitField(node->value.Obj());
}
void ExpressionVisitor::VisitField(WfClassMember* node)
{
if (!node) return;
Traverse(static_cast<WfClassMember*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
}
void ExpressionVisitor::VisitField(WfFunctionArgument* node)
{
if (!node) return;
Traverse(static_cast<WfFunctionArgument*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
FOREACH(vl::Ptr<WfAttribute>, listItem, node->attributes)
{
VisitField(listItem.Obj());
}
Traverse(node->name);
VisitField(node->type.Obj());
}
// Visitor Members -----------------------------------
void ExpressionVisitor::Visit(WfThisExpression* node)
{
Traverse(static_cast<WfThisExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
}
void ExpressionVisitor::Visit(WfTopQualifiedExpression* node)
{
Traverse(static_cast<WfTopQualifiedExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
Traverse(node->name);
}
void ExpressionVisitor::Visit(WfReferenceExpression* node)
{
Traverse(static_cast<WfReferenceExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
Traverse(node->name);
}
void ExpressionVisitor::Visit(WfOrderedNameExpression* node)
{
Traverse(static_cast<WfOrderedNameExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
Traverse(node->name);
}
void ExpressionVisitor::Visit(WfOrderedLambdaExpression* node)
{
Traverse(static_cast<WfOrderedLambdaExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->body.Obj());
}
void ExpressionVisitor::Visit(WfMemberExpression* node)
{
Traverse(static_cast<WfMemberExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->parent.Obj());
Traverse(node->name);
}
void ExpressionVisitor::Visit(WfChildExpression* node)
{
Traverse(static_cast<WfChildExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->parent.Obj());
Traverse(node->name);
}
void ExpressionVisitor::Visit(WfLiteralExpression* node)
{
Traverse(static_cast<WfLiteralExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
}
void ExpressionVisitor::Visit(WfFloatingExpression* node)
{
Traverse(static_cast<WfFloatingExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
Traverse(node->value);
}
void ExpressionVisitor::Visit(WfIntegerExpression* node)
{
Traverse(static_cast<WfIntegerExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
Traverse(node->value);
}
void ExpressionVisitor::Visit(WfStringExpression* node)
{
Traverse(static_cast<WfStringExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
Traverse(node->value);
}
void ExpressionVisitor::Visit(WfUnaryExpression* node)
{
Traverse(static_cast<WfUnaryExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->operand.Obj());
}
void ExpressionVisitor::Visit(WfBinaryExpression* node)
{
Traverse(static_cast<WfBinaryExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->first.Obj());
VisitField(node->second.Obj());
}
void ExpressionVisitor::Visit(WfLetExpression* node)
{
Traverse(static_cast<WfLetExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
FOREACH(vl::Ptr<WfLetVariable>, listItem, node->variables)
{
VisitField(listItem.Obj());
}
VisitField(node->expression.Obj());
}
void ExpressionVisitor::Visit(WfIfExpression* node)
{
Traverse(static_cast<WfIfExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->condition.Obj());
VisitField(node->trueBranch.Obj());
VisitField(node->falseBranch.Obj());
}
void ExpressionVisitor::Visit(WfRangeExpression* node)
{
Traverse(static_cast<WfRangeExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->begin.Obj());
VisitField(node->end.Obj());
}
void ExpressionVisitor::Visit(WfSetTestingExpression* node)
{
Traverse(static_cast<WfSetTestingExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->element.Obj());
VisitField(node->collection.Obj());
}
void ExpressionVisitor::Visit(WfConstructorExpression* node)
{
Traverse(static_cast<WfConstructorExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
FOREACH(vl::Ptr<WfConstructorArgument>, listItem, node->arguments)
{
VisitField(listItem.Obj());
}
}
void ExpressionVisitor::Visit(WfInferExpression* node)
{
Traverse(static_cast<WfInferExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->expression.Obj());
VisitField(node->type.Obj());
}
void ExpressionVisitor::Visit(WfTypeCastingExpression* node)
{
Traverse(static_cast<WfTypeCastingExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->expression.Obj());
VisitField(node->type.Obj());
}
void ExpressionVisitor::Visit(WfTypeTestingExpression* node)
{
Traverse(static_cast<WfTypeTestingExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->expression.Obj());
VisitField(node->type.Obj());
}
void ExpressionVisitor::Visit(WfTypeOfTypeExpression* node)
{
Traverse(static_cast<WfTypeOfTypeExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->type.Obj());
}
void ExpressionVisitor::Visit(WfTypeOfExpressionExpression* node)
{
Traverse(static_cast<WfTypeOfExpressionExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->expression.Obj());
}
void ExpressionVisitor::Visit(WfAttachEventExpression* node)
{
Traverse(static_cast<WfAttachEventExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->event.Obj());
VisitField(node->function.Obj());
}
void ExpressionVisitor::Visit(WfDetachEventExpression* node)
{
Traverse(static_cast<WfDetachEventExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->event.Obj());
VisitField(node->handler.Obj());
}
void ExpressionVisitor::Visit(WfObserveExpression* node)
{
Traverse(static_cast<WfObserveExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->parent.Obj());
Traverse(node->name);
VisitField(node->expression.Obj());
FOREACH(vl::Ptr<WfExpression>, listItem, node->events)
{
VisitField(listItem.Obj());
}
}
void ExpressionVisitor::Visit(WfCallExpression* node)
{
Traverse(static_cast<WfCallExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->function.Obj());
FOREACH(vl::Ptr<WfExpression>, listItem, node->arguments)
{
VisitField(listItem.Obj());
}
}
void ExpressionVisitor::Visit(WfFunctionExpression* node)
{
Traverse(static_cast<WfFunctionExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->function.Obj());
}
void ExpressionVisitor::Visit(WfNewClassExpression* node)
{
Traverse(static_cast<WfNewClassExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->type.Obj());
FOREACH(vl::Ptr<WfExpression>, listItem, node->arguments)
{
VisitField(listItem.Obj());
}
}
void ExpressionVisitor::Visit(WfNewInterfaceExpression* node)
{
Traverse(static_cast<WfNewInterfaceExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->type.Obj());
FOREACH(vl::Ptr<WfDeclaration>, listItem, node->declarations)
{
VisitField(listItem.Obj());
}
}
void ExpressionVisitor::Visit(WfVirtualExpression* node)
{
Dispatch(node);
}
/***********************************************************************
StatementVisitor
***********************************************************************/
// Traverse ------------------------------------------
void StatementVisitor::Traverse(vl::parsing::ParsingToken& token)
{
}
void StatementVisitor::Traverse(vl::parsing::ParsingTreeCustomBase* node)
{
}
void StatementVisitor::Traverse(WfBreakStatement* node)
{
}
void StatementVisitor::Traverse(WfStatement* node)
{
}
void StatementVisitor::Traverse(WfContinueStatement* node)
{
}
void StatementVisitor::Traverse(WfReturnStatement* node)
{
}
void StatementVisitor::Traverse(WfDeleteStatement* node)
{
}
void StatementVisitor::Traverse(WfRaiseExceptionStatement* node)
{
}
void StatementVisitor::Traverse(WfIfStatement* node)
{
}
void StatementVisitor::Traverse(WfWhileStatement* node)
{
}
void StatementVisitor::Traverse(WfTryStatement* node)
{
}
void StatementVisitor::Traverse(WfBlockStatement* node)
{
}
void StatementVisitor::Traverse(WfVariableStatement* node)
{
}
void StatementVisitor::Traverse(WfVariableDeclaration* node)
{
}
void StatementVisitor::Traverse(WfDeclaration* node)
{
}
void StatementVisitor::Traverse(WfAttribute* node)
{
}
void StatementVisitor::Traverse(WfClassMember* node)
{
}
void StatementVisitor::Traverse(WfExpressionStatement* node)
{
}
// VisitField ----------------------------------------
void StatementVisitor::VisitField(WfVariableDeclaration* node)
{
if (!node) return;
Traverse(static_cast<WfVariableDeclaration*>(node));
Traverse(static_cast<WfDeclaration*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->type.Obj());
VisitField(node->expression.Obj());
FOREACH(vl::Ptr<WfAttribute>, listItem, node->attributes)
{
VisitField(listItem.Obj());
}
Traverse(node->name);
VisitField(node->classMember.Obj());
}
void StatementVisitor::VisitField(WfAttribute* node)
{
if (!node) return;
Traverse(static_cast<WfAttribute*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
Traverse(node->category);
Traverse(node->name);
VisitField(node->value.Obj());
}
void StatementVisitor::VisitField(WfClassMember* node)
{
if (!node) return;
Traverse(static_cast<WfClassMember*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
}
// Visitor Members -----------------------------------
void StatementVisitor::Visit(WfBreakStatement* node)
{
Traverse(static_cast<WfBreakStatement*>(node));
Traverse(static_cast<WfStatement*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
}
void StatementVisitor::Visit(WfContinueStatement* node)
{
Traverse(static_cast<WfContinueStatement*>(node));
Traverse(static_cast<WfStatement*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
}
void StatementVisitor::Visit(WfReturnStatement* node)
{
Traverse(static_cast<WfReturnStatement*>(node));
Traverse(static_cast<WfStatement*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->expression.Obj());
}
void StatementVisitor::Visit(WfDeleteStatement* node)
{
Traverse(static_cast<WfDeleteStatement*>(node));
Traverse(static_cast<WfStatement*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->expression.Obj());
}
void StatementVisitor::Visit(WfRaiseExceptionStatement* node)
{
Traverse(static_cast<WfRaiseExceptionStatement*>(node));
Traverse(static_cast<WfStatement*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->expression.Obj());
}
void StatementVisitor::Visit(WfIfStatement* node)
{
Traverse(static_cast<WfIfStatement*>(node));
Traverse(static_cast<WfStatement*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->type.Obj());
Traverse(node->name);
VisitField(node->expression.Obj());
VisitField(node->trueBranch.Obj());
VisitField(node->falseBranch.Obj());
}
void StatementVisitor::Visit(WfWhileStatement* node)
{
Traverse(static_cast<WfWhileStatement*>(node));
Traverse(static_cast<WfStatement*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->condition.Obj());
VisitField(node->statement.Obj());
}
void StatementVisitor::Visit(WfTryStatement* node)
{
Traverse(static_cast<WfTryStatement*>(node));
Traverse(static_cast<WfStatement*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->protectedStatement.Obj());
Traverse(node->name);
VisitField(node->catchStatement.Obj());
VisitField(node->finallyStatement.Obj());
}
void StatementVisitor::Visit(WfBlockStatement* node)
{
Traverse(static_cast<WfBlockStatement*>(node));
Traverse(static_cast<WfStatement*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
FOREACH(vl::Ptr<WfStatement>, listItem, node->statements)
{
VisitField(listItem.Obj());
}
}
void StatementVisitor::Visit(WfVariableStatement* node)
{
Traverse(static_cast<WfVariableStatement*>(node));
Traverse(static_cast<WfStatement*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->variable.Obj());
}
void StatementVisitor::Visit(WfExpressionStatement* node)
{
Traverse(static_cast<WfExpressionStatement*>(node));
Traverse(static_cast<WfStatement*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->expression.Obj());
}
void StatementVisitor::Visit(WfVirtualStatement* node)
{
Dispatch(node);
}
void StatementVisitor::Visit(WfCoroutineStatement* node)
{
Dispatch(node);
}
/***********************************************************************
DeclarationVisitor
***********************************************************************/
// Traverse ------------------------------------------
void DeclarationVisitor::Traverse(vl::parsing::ParsingToken& token)
{
}
void DeclarationVisitor::Traverse(vl::parsing::ParsingTreeCustomBase* node)
{
}
void DeclarationVisitor::Traverse(WfNamespaceDeclaration* node)
{
}
void DeclarationVisitor::Traverse(WfDeclaration* node)
{
}
void DeclarationVisitor::Traverse(WfAttribute* node)
{
}
void DeclarationVisitor::Traverse(WfClassMember* node)
{
}
void DeclarationVisitor::Traverse(WfFunctionDeclaration* node)
{
}
void DeclarationVisitor::Traverse(WfFunctionArgument* node)
{
}
void DeclarationVisitor::Traverse(WfVariableDeclaration* node)
{
}
void DeclarationVisitor::Traverse(WfEventDeclaration* node)
{
}
void DeclarationVisitor::Traverse(WfPropertyDeclaration* node)
{
}
void DeclarationVisitor::Traverse(WfConstructorDeclaration* node)
{
}
void DeclarationVisitor::Traverse(WfBaseConstructorCall* node)
{
}
void DeclarationVisitor::Traverse(WfDestructorDeclaration* node)
{
}
void DeclarationVisitor::Traverse(WfClassDeclaration* node)
{
}
void DeclarationVisitor::Traverse(WfEnumDeclaration* node)
{
}
void DeclarationVisitor::Traverse(WfEnumItem* node)
{
}
void DeclarationVisitor::Traverse(WfEnumItemIntersection* node)
{
}
void DeclarationVisitor::Traverse(WfStructDeclaration* node)
{
}
void DeclarationVisitor::Traverse(WfStructMember* node)
{
}
// VisitField ----------------------------------------
void DeclarationVisitor::VisitField(WfAttribute* node)
{
if (!node) return;
Traverse(static_cast<WfAttribute*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
Traverse(node->category);
Traverse(node->name);
VisitField(node->value.Obj());
}
void DeclarationVisitor::VisitField(WfClassMember* node)
{
if (!node) return;
Traverse(static_cast<WfClassMember*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
}
void DeclarationVisitor::VisitField(WfFunctionArgument* node)
{
if (!node) return;
Traverse(static_cast<WfFunctionArgument*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
FOREACH(vl::Ptr<WfAttribute>, listItem, node->attributes)
{
VisitField(listItem.Obj());
}
Traverse(node->name);
VisitField(node->type.Obj());
}
void DeclarationVisitor::VisitField(WfBaseConstructorCall* node)
{
if (!node) return;
Traverse(static_cast<WfBaseConstructorCall*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->type.Obj());
FOREACH(vl::Ptr<WfExpression>, listItem, node->arguments)
{
VisitField(listItem.Obj());
}
}
void DeclarationVisitor::VisitField(WfEnumItem* node)
{
if (!node) return;
Traverse(static_cast<WfEnumItem*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
FOREACH(vl::Ptr<WfAttribute>, listItem, node->attributes)
{
VisitField(listItem.Obj());
}
Traverse(node->name);
Traverse(node->number);
FOREACH(vl::Ptr<WfEnumItemIntersection>, listItem, node->intersections)
{
VisitField(listItem.Obj());
}
}
void DeclarationVisitor::VisitField(WfEnumItemIntersection* node)
{
if (!node) return;
Traverse(static_cast<WfEnumItemIntersection*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
Traverse(node->name);
}
void DeclarationVisitor::VisitField(WfStructMember* node)
{
if (!node) return;
Traverse(static_cast<WfStructMember*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
FOREACH(vl::Ptr<WfAttribute>, listItem, node->attributes)
{
VisitField(listItem.Obj());
}
Traverse(node->name);
VisitField(node->type.Obj());
}
// Visitor Members -----------------------------------
void DeclarationVisitor::Visit(WfNamespaceDeclaration* node)
{
Traverse(static_cast<WfNamespaceDeclaration*>(node));
Traverse(static_cast<WfDeclaration*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
FOREACH(vl::Ptr<WfDeclaration>, listItem, node->declarations)
{
VisitField(listItem.Obj());
}
FOREACH(vl::Ptr<WfAttribute>, listItem, node->attributes)
{
VisitField(listItem.Obj());
}
Traverse(node->name);
VisitField(node->classMember.Obj());
}
void DeclarationVisitor::Visit(WfFunctionDeclaration* node)
{
Traverse(static_cast<WfFunctionDeclaration*>(node));
Traverse(static_cast<WfDeclaration*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
FOREACH(vl::Ptr<WfFunctionArgument>, listItem, node->arguments)
{
VisitField(listItem.Obj());
}
VisitField(node->returnType.Obj());
VisitField(node->statement.Obj());
FOREACH(vl::Ptr<WfAttribute>, listItem, node->attributes)
{
VisitField(listItem.Obj());
}
Traverse(node->name);
VisitField(node->classMember.Obj());
}
void DeclarationVisitor::Visit(WfVariableDeclaration* node)
{
Traverse(static_cast<WfVariableDeclaration*>(node));
Traverse(static_cast<WfDeclaration*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->type.Obj());
VisitField(node->expression.Obj());
FOREACH(vl::Ptr<WfAttribute>, listItem, node->attributes)
{
VisitField(listItem.Obj());
}
Traverse(node->name);
VisitField(node->classMember.Obj());
}
void DeclarationVisitor::Visit(WfEventDeclaration* node)
{
Traverse(static_cast<WfEventDeclaration*>(node));
Traverse(static_cast<WfDeclaration*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
FOREACH(vl::Ptr<WfType>, listItem, node->arguments)
{
VisitField(listItem.Obj());
}
FOREACH(vl::Ptr<WfAttribute>, listItem, node->attributes)
{
VisitField(listItem.Obj());
}
Traverse(node->name);
VisitField(node->classMember.Obj());
}
void DeclarationVisitor::Visit(WfPropertyDeclaration* node)
{
Traverse(static_cast<WfPropertyDeclaration*>(node));
Traverse(static_cast<WfDeclaration*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->type.Obj());
Traverse(node->getter);
Traverse(node->setter);
Traverse(node->valueChangedEvent);
FOREACH(vl::Ptr<WfAttribute>, listItem, node->attributes)
{
VisitField(listItem.Obj());
}
Traverse(node->name);
VisitField(node->classMember.Obj());
}
void DeclarationVisitor::Visit(WfConstructorDeclaration* node)
{
Traverse(static_cast<WfConstructorDeclaration*>(node));
Traverse(static_cast<WfDeclaration*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
FOREACH(vl::Ptr<WfBaseConstructorCall>, listItem, node->baseConstructorCalls)
{
VisitField(listItem.Obj());
}
FOREACH(vl::Ptr<WfFunctionArgument>, listItem, node->arguments)
{
VisitField(listItem.Obj());
}
VisitField(node->statement.Obj());
FOREACH(vl::Ptr<WfAttribute>, listItem, node->attributes)
{
VisitField(listItem.Obj());
}
Traverse(node->name);
VisitField(node->classMember.Obj());
}
void DeclarationVisitor::Visit(WfDestructorDeclaration* node)
{
Traverse(static_cast<WfDestructorDeclaration*>(node));
Traverse(static_cast<WfDeclaration*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->statement.Obj());
FOREACH(vl::Ptr<WfAttribute>, listItem, node->attributes)
{
VisitField(listItem.Obj());
}
Traverse(node->name);
VisitField(node->classMember.Obj());
}
void DeclarationVisitor::Visit(WfClassDeclaration* node)
{
Traverse(static_cast<WfClassDeclaration*>(node));
Traverse(static_cast<WfDeclaration*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
FOREACH(vl::Ptr<WfType>, listItem, node->baseTypes)
{
VisitField(listItem.Obj());
}
FOREACH(vl::Ptr<WfDeclaration>, listItem, node->declarations)
{
VisitField(listItem.Obj());
}
FOREACH(vl::Ptr<WfAttribute>, listItem, node->attributes)
{
VisitField(listItem.Obj());
}
Traverse(node->name);
VisitField(node->classMember.Obj());
}
void DeclarationVisitor::Visit(WfEnumDeclaration* node)
{
Traverse(static_cast<WfEnumDeclaration*>(node));
Traverse(static_cast<WfDeclaration*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
FOREACH(vl::Ptr<WfEnumItem>, listItem, node->items)
{
VisitField(listItem.Obj());
}
FOREACH(vl::Ptr<WfAttribute>, listItem, node->attributes)
{
VisitField(listItem.Obj());
}
Traverse(node->name);
VisitField(node->classMember.Obj());
}
void DeclarationVisitor::Visit(WfStructDeclaration* node)
{
Traverse(static_cast<WfStructDeclaration*>(node));
Traverse(static_cast<WfDeclaration*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
FOREACH(vl::Ptr<WfStructMember>, listItem, node->members)
{
VisitField(listItem.Obj());
}
FOREACH(vl::Ptr<WfAttribute>, listItem, node->attributes)
{
VisitField(listItem.Obj());
}
Traverse(node->name);
VisitField(node->classMember.Obj());
}
void DeclarationVisitor::Visit(WfVirtualDeclaration* node)
{
Dispatch(node);
}
/***********************************************************************
VirtualDeclarationVisitor
***********************************************************************/
// Traverse ------------------------------------------
void VirtualDeclarationVisitor::Traverse(vl::parsing::ParsingToken& token)
{
}
void VirtualDeclarationVisitor::Traverse(vl::parsing::ParsingTreeCustomBase* node)
{
}
void VirtualDeclarationVisitor::Traverse(WfAutoPropertyDeclaration* node)
{
}
void VirtualDeclarationVisitor::Traverse(WfVirtualDeclaration* node)
{
}
void VirtualDeclarationVisitor::Traverse(WfDeclaration* node)
{
}
void VirtualDeclarationVisitor::Traverse(WfAttribute* node)
{
}
void VirtualDeclarationVisitor::Traverse(WfClassMember* node)
{
}
void VirtualDeclarationVisitor::Traverse(WfCastResultInterfaceDeclaration* node)
{
}
// VisitField ----------------------------------------
void VirtualDeclarationVisitor::VisitField(WfAttribute* node)
{
if (!node) return;
Traverse(static_cast<WfAttribute*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
Traverse(node->category);
Traverse(node->name);
VisitField(node->value.Obj());
}
void VirtualDeclarationVisitor::VisitField(WfClassMember* node)
{
if (!node) return;
Traverse(static_cast<WfClassMember*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
}
// Visitor Members -----------------------------------
void VirtualDeclarationVisitor::Visit(WfAutoPropertyDeclaration* node)
{
Traverse(static_cast<WfAutoPropertyDeclaration*>(node));
Traverse(static_cast<WfVirtualDeclaration*>(node));
Traverse(static_cast<WfDeclaration*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->type.Obj());
VisitField(node->expression.Obj());
FOREACH(vl::Ptr<WfDeclaration>, listItem, node->expandedDeclarations)
{
VisitField(listItem.Obj());
}
FOREACH(vl::Ptr<WfAttribute>, listItem, node->attributes)
{
VisitField(listItem.Obj());
}
Traverse(node->name);
VisitField(node->classMember.Obj());
}
void VirtualDeclarationVisitor::Visit(WfCastResultInterfaceDeclaration* node)
{
Traverse(static_cast<WfCastResultInterfaceDeclaration*>(node));
Traverse(static_cast<WfVirtualDeclaration*>(node));
Traverse(static_cast<WfDeclaration*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->baseType.Obj());
VisitField(node->elementType.Obj());
FOREACH(vl::Ptr<WfDeclaration>, listItem, node->expandedDeclarations)
{
VisitField(listItem.Obj());
}
FOREACH(vl::Ptr<WfAttribute>, listItem, node->attributes)
{
VisitField(listItem.Obj());
}
Traverse(node->name);
VisitField(node->classMember.Obj());
}
/***********************************************************************
VirtualStatementVisitor
***********************************************************************/
// Traverse ------------------------------------------
void VirtualStatementVisitor::Traverse(vl::parsing::ParsingToken& token)
{
}
void VirtualStatementVisitor::Traverse(vl::parsing::ParsingTreeCustomBase* node)
{
}
void VirtualStatementVisitor::Traverse(WfForEachStatement* node)
{
}
void VirtualStatementVisitor::Traverse(WfVirtualStatement* node)
{
}
void VirtualStatementVisitor::Traverse(WfStatement* node)
{
}
void VirtualStatementVisitor::Traverse(WfSwitchStatement* node)
{
}
void VirtualStatementVisitor::Traverse(WfSwitchCase* node)
{
}
void VirtualStatementVisitor::Traverse(WfCoProviderStatement* node)
{
}
// VisitField ----------------------------------------
void VirtualStatementVisitor::VisitField(WfSwitchCase* node)
{
if (!node) return;
Traverse(static_cast<WfSwitchCase*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->expression.Obj());
VisitField(node->statement.Obj());
}
// Visitor Members -----------------------------------
void VirtualStatementVisitor::Visit(WfForEachStatement* node)
{
Traverse(static_cast<WfForEachStatement*>(node));
Traverse(static_cast<WfVirtualStatement*>(node));
Traverse(static_cast<WfStatement*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
Traverse(node->name);
VisitField(node->collection.Obj());
VisitField(node->statement.Obj());
VisitField(node->expandedStatement.Obj());
}
void VirtualStatementVisitor::Visit(WfSwitchStatement* node)
{
Traverse(static_cast<WfSwitchStatement*>(node));
Traverse(static_cast<WfVirtualStatement*>(node));
Traverse(static_cast<WfStatement*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->expression.Obj());
FOREACH(vl::Ptr<WfSwitchCase>, listItem, node->caseBranches)
{
VisitField(listItem.Obj());
}
VisitField(node->defaultBranch.Obj());
VisitField(node->expandedStatement.Obj());
}
void VirtualStatementVisitor::Visit(WfCoProviderStatement* node)
{
Traverse(static_cast<WfCoProviderStatement*>(node));
Traverse(static_cast<WfVirtualStatement*>(node));
Traverse(static_cast<WfStatement*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
Traverse(node->name);
VisitField(node->statement.Obj());
VisitField(node->expandedStatement.Obj());
}
/***********************************************************************
CoroutineStatementVisitor
***********************************************************************/
// Traverse ------------------------------------------
void CoroutineStatementVisitor::Traverse(vl::parsing::ParsingToken& token)
{
}
void CoroutineStatementVisitor::Traverse(vl::parsing::ParsingTreeCustomBase* node)
{
}
void CoroutineStatementVisitor::Traverse(WfCoPauseStatement* node)
{
}
void CoroutineStatementVisitor::Traverse(WfCoroutineStatement* node)
{
}
void CoroutineStatementVisitor::Traverse(WfStatement* node)
{
}
void CoroutineStatementVisitor::Traverse(WfCoOperatorStatement* node)
{
}
// Visitor Members -----------------------------------
void CoroutineStatementVisitor::Visit(WfCoPauseStatement* node)
{
Traverse(static_cast<WfCoPauseStatement*>(node));
Traverse(static_cast<WfCoroutineStatement*>(node));
Traverse(static_cast<WfStatement*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->statement.Obj());
}
void CoroutineStatementVisitor::Visit(WfCoOperatorStatement* node)
{
Traverse(static_cast<WfCoOperatorStatement*>(node));
Traverse(static_cast<WfCoroutineStatement*>(node));
Traverse(static_cast<WfStatement*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
Traverse(node->varName);
Traverse(node->opName);
FOREACH(vl::Ptr<WfExpression>, listItem, node->arguments)
{
VisitField(listItem.Obj());
}
}
/***********************************************************************
VirtualExpressionVisitor
***********************************************************************/
// Traverse ------------------------------------------
void VirtualExpressionVisitor::Traverse(vl::parsing::ParsingToken& token)
{
}
void VirtualExpressionVisitor::Traverse(vl::parsing::ParsingTreeCustomBase* node)
{
}
void VirtualExpressionVisitor::Traverse(WfBindExpression* node)
{
}
void VirtualExpressionVisitor::Traverse(WfVirtualExpression* node)
{
}
void VirtualExpressionVisitor::Traverse(WfExpression* node)
{
}
void VirtualExpressionVisitor::Traverse(WfFormatExpression* node)
{
}
void VirtualExpressionVisitor::Traverse(WfNewCoroutineExpression* node)
{
}
void VirtualExpressionVisitor::Traverse(WfMixinCastExpression* node)
{
}
// Visitor Members -----------------------------------
void VirtualExpressionVisitor::Visit(WfBindExpression* node)
{
Traverse(static_cast<WfBindExpression*>(node));
Traverse(static_cast<WfVirtualExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->expression.Obj());
VisitField(node->expandedExpression.Obj());
}
void VirtualExpressionVisitor::Visit(WfFormatExpression* node)
{
Traverse(static_cast<WfFormatExpression*>(node));
Traverse(static_cast<WfVirtualExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
Traverse(node->value);
VisitField(node->expandedExpression.Obj());
}
void VirtualExpressionVisitor::Visit(WfNewCoroutineExpression* node)
{
Traverse(static_cast<WfNewCoroutineExpression*>(node));
Traverse(static_cast<WfVirtualExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
Traverse(node->name);
VisitField(node->statement.Obj());
VisitField(node->expandedExpression.Obj());
}
void VirtualExpressionVisitor::Visit(WfMixinCastExpression* node)
{
Traverse(static_cast<WfMixinCastExpression*>(node));
Traverse(static_cast<WfVirtualExpression*>(node));
Traverse(static_cast<WfExpression*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
VisitField(node->type.Obj());
VisitField(node->expression.Obj());
VisitField(node->expandedExpression.Obj());
}
/***********************************************************************
ModuleUsingFragmentVisitor
***********************************************************************/
// Traverse ------------------------------------------
void ModuleUsingFragmentVisitor::Traverse(vl::parsing::ParsingToken& token)
{
}
void ModuleUsingFragmentVisitor::Traverse(vl::parsing::ParsingTreeCustomBase* node)
{
}
void ModuleUsingFragmentVisitor::Traverse(WfModuleUsingNameFragment* node)
{
}
void ModuleUsingFragmentVisitor::Traverse(WfModuleUsingFragment* node)
{
}
void ModuleUsingFragmentVisitor::Traverse(WfModuleUsingWildCardFragment* node)
{
}
// Visitor Members -----------------------------------
void ModuleUsingFragmentVisitor::Visit(WfModuleUsingNameFragment* node)
{
Traverse(static_cast<WfModuleUsingNameFragment*>(node));
Traverse(static_cast<WfModuleUsingFragment*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
Traverse(node->name);
}
void ModuleUsingFragmentVisitor::Visit(WfModuleUsingWildCardFragment* node)
{
Traverse(static_cast<WfModuleUsingWildCardFragment*>(node));
Traverse(static_cast<WfModuleUsingFragment*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
}
/***********************************************************************
ModuleVisitor
***********************************************************************/
void ModuleVisitor::VisitField(WfModule* node)
{
Traverse(static_cast<WfModule*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
Traverse(node->name);
FOREACH(vl::Ptr<WfModuleUsingPath>, listItem, node->paths)
{
VisitField(listItem.Obj());
}
FOREACH(vl::Ptr<WfDeclaration>, listItem, node->declarations)
{
VisitField(listItem.Obj());
}
}
// Traverse ------------------------------------------
void ModuleVisitor::Traverse(vl::parsing::ParsingToken& token)
{
}
void ModuleVisitor::Traverse(vl::parsing::ParsingTreeCustomBase* node)
{
}
void ModuleVisitor::Traverse(WfModule* node)
{
}
void ModuleVisitor::Traverse(WfModuleUsingPath* node)
{
}
void ModuleVisitor::Traverse(WfModuleUsingItem* node)
{
}
// VisitField ----------------------------------------
void ModuleVisitor::VisitField(WfModuleUsingPath* node)
{
if (!node) return;
Traverse(static_cast<WfModuleUsingPath*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
FOREACH(vl::Ptr<WfModuleUsingItem>, listItem, node->items)
{
VisitField(listItem.Obj());
}
}
void ModuleVisitor::VisitField(WfModuleUsingItem* node)
{
if (!node) return;
Traverse(static_cast<WfModuleUsingItem*>(node));
Traverse(static_cast<vl::parsing::ParsingTreeCustomBase*>(node));
FOREACH(vl::Ptr<WfModuleUsingFragment>, listItem, node->fragments)
{
VisitField(listItem.Obj());
}
}
// VisitField (virtual) ------------------------------
void ModuleVisitor::VisitField(WfType* node)
{
if (!node) return;
node->Accept(static_cast<TypeVisitor*>(this));
}
void ModuleVisitor::VisitField(WfExpression* node)
{
if (!node) return;
node->Accept(static_cast<ExpressionVisitor*>(this));
}
void ModuleVisitor::VisitField(WfStatement* node)
{
if (!node) return;
node->Accept(static_cast<StatementVisitor*>(this));
}
void ModuleVisitor::VisitField(WfDeclaration* node)
{
if (!node) return;
node->Accept(static_cast<DeclarationVisitor*>(this));
}
void ModuleVisitor::VisitField(WfModuleUsingFragment* node)
{
if (!node) return;
node->Accept(static_cast<ModuleUsingFragmentVisitor*>(this));
}
// Dispatch (virtual) --------------------------------
void ModuleVisitor::Dispatch(WfVirtualExpression* node)
{
node->Accept(static_cast<VirtualExpressionVisitor*>(this));
}
void ModuleVisitor::Dispatch(WfVirtualStatement* node)
{
node->Accept(static_cast<VirtualStatementVisitor*>(this));
}
void ModuleVisitor::Dispatch(WfCoroutineStatement* node)
{
node->Accept(static_cast<CoroutineStatementVisitor*>(this));
}
void ModuleVisitor::Dispatch(WfVirtualDeclaration* node)
{
node->Accept(static_cast<VirtualDeclarationVisitor*>(this));
}
}
}
}